wcs/tests/test_carddef.py

197 lines
7.4 KiB
Python

import pytest
import xml.etree.ElementTree as ET
from django.utils.six import BytesIO
from wcs.qommon.http_request import HTTPRequest
from wcs.qommon.template import Template
from wcs.carddef import CardDef
from wcs.fields import ItemField
from wcs.fields import StringField
from utilities import create_temporary_pub, clean_temporary_pub
def pytest_generate_tests(metafunc):
if 'pub' in metafunc.fixturenames:
metafunc.parametrize('pub', ['pickle', 'sql'], indirect=True)
@pytest.fixture
def pub(request):
pub = create_temporary_pub(sql_mode=(request.param == 'sql'))
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
pub.set_app_dir(req)
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
return pub
def teardown_module(module):
clean_temporary_pub()
def test_basics(pub):
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.store()
assert CardDef.get(carddef.id).name == 'foo'
carddata_class = carddef.data_class()
carddata = carddata_class()
carddata.data = {'1': 'hello world'}
carddata.just_created()
carddata.store()
assert carddata.status == 'wf-recorded'
assert carddata_class.get(carddata.id).data['1'] == 'hello world'
assert carddata_class.get(carddata.id).status == 'wf-recorded'
def test_advertised_urls(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.store()
assert CardDef.get(carddef.id).name == 'foo'
assert carddef.get_url() == 'http://example.net/backoffice/data/foo/'
assert carddef.get_backoffice_submission_url() == 'http://example.net/backoffice/data/foo/add/'
assert carddef.get_admin_url() == 'http://example.net/backoffice/cards/%s/' % carddef.id
assert carddef.get_api_url() == 'http://example.net/api/cards/foo/'
def test_xml_export_import(pub):
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
ItemField(
id='2', label='card field', type='item',
data_source={'type': 'carddef:foo'})
]
carddef.store()
# define also custom views
pub.custom_view_class.wipe()
custom_view = pub.custom_view_class()
custom_view.title = 'datasource card view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}, {'id': '1'}, {'id': '2'}]}
custom_view.filters = {'filter': 'recorded', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'a'}
custom_view.visibility = 'datasource'
custom_view.order_by = '-receipt_time'
custom_view.store()
custom_view = pub.custom_view_class()
custom_view.title = 'shared card view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
custom_view.filters = {'filter': 'done', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'b'}
custom_view.visibility = 'any'
custom_view.order_by = 'receipt_time'
custom_view.store()
custom_view = pub.custom_view_class()
custom_view.title = 'private card view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': 'id'}]}
custom_view.filters = {}
custom_view.visibility = 'owner'
custom_view.usier_id = 42
custom_view.order_by = 'id'
custom_view.store()
carddef_xml = carddef.export_to_xml()
assert carddef_xml.tag == 'carddef'
carddef.data_class().wipe()
pub.custom_view_class.wipe()
carddef2 = CardDef.import_from_xml(BytesIO(ET.tostring(carddef_xml)))
assert carddef2.name == 'foo'
assert carddef2.fields[1].data_source == {'type': 'carddef:foo'}
assert carddef2._custom_views
custom_views = sorted(carddef2._custom_views, key=lambda a: a.visibility)
assert len(custom_views) == 2
assert custom_views[0].title == 'shared card view'
assert custom_views[0].slug == 'shared-card-view'
assert custom_views[0].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
assert custom_views[0].filters == {'filter': 'done', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'b'}
assert custom_views[0].visibility == 'any'
assert custom_views[0].order_by == 'receipt_time'
assert custom_views[0].formdef_id is None
assert custom_views[0].formdef_type is None
assert custom_views[1].title == 'datasource card view'
assert custom_views[1].slug == 'datasource-card-view'
assert custom_views[1].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}, {'id': '1'}, {'id': '2'}]}
assert custom_views[1].filters == {'filter': 'recorded', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'a'}
assert custom_views[1].visibility == 'datasource'
assert custom_views[1].order_by == '-receipt_time'
assert custom_views[1].formdef_id is None
assert custom_views[1].formdef_type is None
carddef2.store()
custom_views = sorted(pub.custom_view_class.select(), key=lambda a: a.visibility)
assert len(custom_views) == 2
assert custom_views[0].title == 'shared card view'
assert custom_views[0].slug == 'shared-card-view'
assert custom_views[0].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
assert custom_views[0].filters == {'filter': 'done', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'b'}
assert custom_views[0].visibility == 'any'
assert custom_views[0].order_by == 'receipt_time'
assert custom_views[0].formdef_id == carddef2.id
assert custom_views[0].formdef_type == 'carddef'
assert custom_views[1].title == 'datasource card view'
assert custom_views[1].slug == 'datasource-card-view'
assert custom_views[1].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}, {'id': '1'}, {'id': '2'}]}
assert custom_views[1].filters == {'filter': 'recorded', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'a'}
assert custom_views[1].visibility == 'datasource'
assert custom_views[1].order_by == '-receipt_time'
assert custom_views[1].formdef_id == carddef2.id
assert custom_views[1].formdef_type == 'carddef'
def test_template_access(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.store()
carddef.data_class().wipe()
for i in range(10):
carddata = carddef.data_class()()
carddata.data = {'1': 'blah'}
carddata.just_created()
carddata.store()
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{cards.foo.objects|filter_by:"foo"|filter_value:"blah"|count}}')
assert tmpl.render(context) == '10'
tmpl = Template('{{cards|objects:"foo"|filter_by:"foo"|filter_value:"blah"|count}}')
assert tmpl.render(context) == '10'
def test_data_source_access_invalid_id(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.store()
carddef.data_class().wipe()
assert CardDef.get_data_source_items('carddef:foo', get_by_id='424508729041982') == []