353 lines
14 KiB
Python
353 lines
14 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.misc import indent_xml as indent
|
|
from wcs.qommon.template import Template
|
|
from wcs.categories import CardDefCategory
|
|
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 export_to_indented_xml(carddef, include_id=False):
|
|
carddef_xml = ET.fromstring(ET.tostring(carddef.export_to_xml(include_id=include_id)))
|
|
indent(carddef_xml)
|
|
return carddef_xml
|
|
|
|
|
|
def assert_compare_carddef(carddef1, carddef2, include_id=False):
|
|
assert (
|
|
ET.tostring(export_to_indented_xml(carddef1, include_id=include_id)) ==
|
|
ET.tostring(export_to_indented_xml(carddef2, include_id=include_id)))
|
|
assert (
|
|
carddef1.export_to_json(include_id=include_id, indent=2) ==
|
|
carddef2.export_to_json(include_id=include_id, indent=2))
|
|
|
|
|
|
def assert_xml_import_export_works(carddef, include_id=False):
|
|
carddef_xml = carddef.export_to_xml(include_id=include_id)
|
|
carddef2 = CardDef.import_from_xml_tree(carddef_xml, include_id=include_id)
|
|
assert_compare_carddef(carddef, carddef2, include_id=include_id)
|
|
return carddef2
|
|
|
|
|
|
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_xml_export_import_category_reference(pub):
|
|
CardDefCategory.wipe()
|
|
CardDef.wipe()
|
|
|
|
cat = CardDefCategory()
|
|
cat.name = 'test category'
|
|
cat.store()
|
|
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.category_id = cat.id
|
|
f2 = assert_xml_import_export_works(carddef)
|
|
assert f2.category_id == carddef.category_id
|
|
|
|
f2 = assert_xml_import_export_works(carddef, include_id=True)
|
|
assert f2.category_id == carddef.category_id
|
|
|
|
carddef_xml_with_id = carddef.export_to_xml(include_id=True)
|
|
|
|
# check there's no reference to a non-existing category
|
|
CardDefCategory.wipe()
|
|
assert CardDef.import_from_xml_tree(carddef_xml_with_id, include_id=False).category_id is None
|
|
assert CardDef.import_from_xml_tree(carddef_xml_with_id, include_id=True).category_id is None
|
|
|
|
# check an import that is not using id fields will find the category by its
|
|
# name
|
|
cat = CardDefCategory()
|
|
cat.id = '2'
|
|
cat.name = 'test category'
|
|
cat.store()
|
|
assert CardDef.import_from_xml_tree(carddef_xml_with_id, include_id=False).category_id == '2'
|
|
assert CardDef.import_from_xml_tree(carddef_xml_with_id, include_id=True).category_id is None
|
|
|
|
|
|
def test_template_access(pub):
|
|
CardDef.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
StringField(id='1', label='Test', type='string', varname='foo'),
|
|
StringField(id='2', label='key', type='string', varname='key'),
|
|
]
|
|
carddef.store()
|
|
carddef.data_class().wipe()
|
|
|
|
for i in range(10):
|
|
carddata = carddef.data_class()()
|
|
if i % 3 == 0:
|
|
carddata.data = {'1': 'blah'}
|
|
if i % 3 == 1:
|
|
carddata.data = {'1': 'foo'}
|
|
if i % 3 == 2:
|
|
carddata.data = {'1': 'bar'}
|
|
carddata.data['2'] = str(i)
|
|
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) == '4'
|
|
tmpl = Template('{{cards|objects:"foo"|filter_by:"foo"|filter_value:"blah"|count}}')
|
|
assert tmpl.render(context) == '4'
|
|
|
|
pub.custom_view_class.wipe()
|
|
|
|
custom_view1 = pub.custom_view_class()
|
|
custom_view1.title = 'datasource card view'
|
|
custom_view1.formdef = carddef
|
|
custom_view1.columns = {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
|
|
custom_view1.filters = {'filter-1': 'on', 'filter-1-value': 'blah'}
|
|
custom_view1.visibility = 'datasource'
|
|
custom_view1.order_by = '-f2'
|
|
custom_view1.store()
|
|
|
|
custom_view2 = pub.custom_view_class()
|
|
custom_view2.title = 'shared card view'
|
|
custom_view2.formdef = carddef
|
|
custom_view2.columns = {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
|
|
custom_view2.filters = {'filter-1': 'on', 'filter-1-value': 'foo'}
|
|
custom_view2.visibility = 'any'
|
|
custom_view2.order_by = 'f2'
|
|
custom_view2.store()
|
|
|
|
custom_view3 = pub.custom_view_class()
|
|
custom_view3.title = 'private card view'
|
|
custom_view3.formdef = carddef
|
|
custom_view3.columns = {'list': [{'id': 'id'}]}
|
|
custom_view3.filters = {}
|
|
custom_view3.visibility = 'owner'
|
|
custom_view3.usier_id = 42
|
|
custom_view3.order_by = 'id'
|
|
custom_view3.store()
|
|
|
|
tmpl = Template('{{cards.foo.objects|with_custom_view:"datasource-card-view"|count}}')
|
|
assert tmpl.render(context) == '4'
|
|
tmpl = Template('{{cards|objects:"foo"|with_custom_view:"datasource-card-view"|count}}')
|
|
assert tmpl.render(context) == '4'
|
|
tmpl = Template('{% for data in cards|objects:"foo"|with_custom_view:"datasource-card-view" %}{{ data.internal_id }},{% endfor %}')
|
|
assert tmpl.render(context) == '10,7,4,1,'
|
|
|
|
tmpl = Template('{{cards.foo.objects|with_custom_view:"shared-card-view"|count}}')
|
|
assert tmpl.render(context) == '3'
|
|
tmpl = Template('{{cards|objects:"foo"|with_custom_view:"shared-card-view"|count}}')
|
|
assert tmpl.render(context) == '3'
|
|
tmpl = Template('{% for data in cards|objects:"foo"|with_custom_view:"shared-card-view" %}{{ data.internal_id }},{% endfor %}')
|
|
assert tmpl.render(context) == '2,5,8,'
|
|
|
|
tmpl = Template('{{cards.foo.objects|with_custom_view:"private-card-view"|count}}')
|
|
assert tmpl.render(context) == '0'
|
|
tmpl = Template('{{cards|objects:"foo"|with_custom_view:"private-card-view"|count}}')
|
|
assert tmpl.render(context) == '0'
|
|
tmpl = Template('{{cards.foo.objects|with_custom_view:"unknown"|count}}')
|
|
assert tmpl.render(context) == '0'
|
|
tmpl = Template('{{cards|objects:"foo"|with_custom_view:"unknown"|count}}')
|
|
assert tmpl.render(context) == '0'
|
|
|
|
|
|
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') == []
|
|
|
|
|
|
def test_get_data_source_custom_view(pub):
|
|
CardDef.wipe()
|
|
carddef1 = CardDef()
|
|
carddef1.name = 'foo 1'
|
|
carddef1.fields = []
|
|
carddef1.store()
|
|
|
|
carddef2 = CardDef()
|
|
carddef2.name = 'foo 2'
|
|
carddef2.fields = []
|
|
carddef2.store()
|
|
|
|
pub.custom_view_class.wipe()
|
|
|
|
custom_view1 = pub.custom_view_class()
|
|
custom_view1.title = 'view'
|
|
custom_view1.formdef = carddef1
|
|
custom_view1.columns = {'list': [{'id': 'id'}]}
|
|
custom_view1.filters = {}
|
|
custom_view1.visibility = 'datasource'
|
|
custom_view1.store()
|
|
|
|
custom_view2 = pub.custom_view_class()
|
|
custom_view2.title = 'view'
|
|
custom_view2.formdef = carddef2
|
|
custom_view2.columns = {'list': [{'id': 'id'}]}
|
|
custom_view2.filters = {}
|
|
custom_view2.visibility = 'datasource'
|
|
custom_view2.store()
|
|
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-1:view').id == custom_view1.id
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-2:view').id == custom_view2.id
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-1:view', carddef=carddef1).id == custom_view1.id
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-1:view', carddef=carddef2) is None
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-2:view', carddef=carddef2).id == custom_view2.id
|
|
assert CardDef.get_data_source_custom_view('carddef:foo-2:view', carddef=carddef1) is None
|