215 lines
7.5 KiB
Python
215 lines
7.5 KiB
Python
import json
|
|
import sys
|
|
import shutil
|
|
|
|
from quixote import cleanup
|
|
from wcs import publisher
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
from wcs.qommon.form import *
|
|
from wcs import fields, data_sources
|
|
from wcs.data_sources import NamedDataSource, register_data_source_function
|
|
|
|
from test_widgets import MockHtmlForm, mock_form_submission
|
|
from utilities import create_temporary_pub
|
|
|
|
def setup_module(module):
|
|
cleanup()
|
|
|
|
global pub, req
|
|
|
|
pub = create_temporary_pub()
|
|
|
|
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''})
|
|
pub._set_request(req)
|
|
|
|
|
|
def teardown_module(module):
|
|
shutil.rmtree(pub.APP_DIR)
|
|
|
|
|
|
def test_item_field_python_datasource():
|
|
field = fields.ItemField()
|
|
field.id = 1
|
|
field.data_source = {
|
|
'type': 'formula',
|
|
'value': '''[('1', 'un'), ('2', 'deux')]'''
|
|
}
|
|
form = Form()
|
|
field.add_to_form(form)
|
|
widget = form.get_widget('f1')
|
|
assert widget is not None
|
|
assert widget.options == [('1', 'un', '1'), ('2', 'deux', '2')]
|
|
|
|
form = MockHtmlForm(widget)
|
|
mock_form_submission(req, widget, {'f1': ['1']})
|
|
assert widget.parse() == '1'
|
|
|
|
form = Form()
|
|
field.add_to_view_form(form, value='1')
|
|
widget = form.get_widget('f1')
|
|
|
|
form = MockHtmlForm(widget)
|
|
mock_form_submission(req, widget)
|
|
assert widget.parse() == '1'
|
|
|
|
def test_python_datasource():
|
|
plain_list = [('1', 'foo'), ('2', 'bar')]
|
|
datasource = {'type': 'formula', 'value': repr(plain_list)}
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
assert data_sources.get_structured_items(datasource) == [
|
|
{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]
|
|
|
|
# invalid python expression
|
|
datasource = {'type': 'formula', 'value': 'foobar'}
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# expression not iterable
|
|
datasource = {'type': 'formula', 'value': '2'}
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# three-item tuples
|
|
plain_list = [('1', 'foo', 'a'), ('2', 'bar', 'b')]
|
|
datasource = {'type': 'formula', 'value': repr(plain_list)}
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', 'a'), ('2', 'bar', 'b')]
|
|
|
|
# single-item tuples
|
|
plain_list = [('foo', ), ('bar', )]
|
|
datasource = {'type': 'formula', 'value': repr(plain_list)}
|
|
assert data_sources.get_items(datasource) == [('foo', 'foo', 'foo'), ('bar', 'bar', 'bar')]
|
|
|
|
# list of strings
|
|
plain_list = ['foo', 'bar']
|
|
datasource = {'type': 'formula', 'value': repr(plain_list)}
|
|
assert data_sources.get_items(datasource) == [('foo', 'foo', 'foo'), ('bar', 'bar', 'bar')]
|
|
|
|
def test_json_datasource():
|
|
datasource = {'type': 'json', 'value': ''}
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# missing file
|
|
json_file_path = os.path.join(pub.app_dir, 'test.json')
|
|
datasource = {'type': 'json', 'value': 'file://%s' % json_file_path}
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# invalid json file
|
|
json_file = open(json_file_path, 'w')
|
|
json_file.write(u'foobar'.encode('zlib_codec'))
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# empty json file
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump({}, json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# unrelated json file
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump('foobar', json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# another unrelated json file
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump({'data': 'foobar'}, json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == []
|
|
|
|
# a good json file
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump({'data': [{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]}, json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
assert data_sources.get_structured_items(datasource) == [
|
|
{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]
|
|
|
|
# a json file with additional keys
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump({'data': [{'id': '1', 'text': 'foo', 'more': 'xxx'},
|
|
{'id': '2', 'text': 'bar', 'more': 'yyy'}]}, json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
assert data_sources.get_structured_items(datasource) == [
|
|
{'id': '1', 'text': 'foo', 'more': 'xxx'},
|
|
{'id': '2', 'text': 'bar', 'more': 'yyy'}]
|
|
|
|
# json specified with a variadic url
|
|
class JsonUrlPath(object):
|
|
def get_substitution_variables(self):
|
|
return {'json_url': 'file://%s' % json_file_path}
|
|
pub.substitutions.feed(JsonUrlPath())
|
|
datasource = {'type': 'json', 'value': '[json_url]'}
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
|
|
# a json file with integer as 'id'
|
|
json_file = open(json_file_path, 'w')
|
|
json.dump({'data': [{'id': 1, 'text': 'foo'}, {'id': 2, 'text': 'bar'}]}, json_file)
|
|
json_file.close()
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
assert data_sources.get_structured_items(datasource) == [
|
|
{'id': 1, 'text': 'foo'}, {'id': 2, 'text': 'bar'}]
|
|
|
|
def test_item_field_named_python_datasource():
|
|
NamedDataSource.wipe()
|
|
data_source = NamedDataSource(name='foobar')
|
|
data_source.data_source = {'type': 'formula',
|
|
'value': repr([('1', 'un'), ('2', 'deux')])}
|
|
data_source.store()
|
|
|
|
field = fields.ItemField()
|
|
field.id = 1
|
|
field.data_source = {
|
|
'type': 'foobar', # use the named data source defined earlier
|
|
}
|
|
form = Form()
|
|
field.add_to_form(form)
|
|
widget = form.get_widget('f1')
|
|
assert widget is not None
|
|
assert widget.options == [('1', 'un', '1'), ('2', 'deux', '2')]
|
|
|
|
def test_register_data_source_function():
|
|
def xxx():
|
|
return [('1', 'foo'), ('2', 'bar')]
|
|
register_data_source_function(xxx)
|
|
|
|
datasource = {'type': 'formula', 'value': 'xxx()'}
|
|
assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
|
assert data_sources.get_structured_items(datasource) == [
|
|
{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]
|
|
|
|
def test_data_source_substitution_variables():
|
|
NamedDataSource.wipe()
|
|
data_source = NamedDataSource(name='foobar')
|
|
data_source.data_source = {'type': 'formula', 'value': repr(['un', 'deux'])}
|
|
data_source.store()
|
|
|
|
pub.substitutions.feed(NamedDataSource)
|
|
context = pub.substitutions.get_context_variables()
|
|
assert context.get('data_source').foobar == [
|
|
{'id': 'un', 'text': 'un'}, {'id': 'deux', 'text': 'deux'}]
|
|
|
|
def test_data_source_slug_name():
|
|
NamedDataSource.wipe()
|
|
data_source = NamedDataSource(name='foo bar')
|
|
data_source.store()
|
|
assert data_source.slug == 'foo_bar'
|
|
|
|
def test_optional_item_field_with_data_source():
|
|
NamedDataSource.wipe()
|
|
data_source = NamedDataSource(name='foobar')
|
|
data_source.data_source = {'type': 'formula',
|
|
'value': repr([('1', 'un'), ('2', 'deux')])}
|
|
data_source.store()
|
|
|
|
field = fields.ItemField()
|
|
field.id = 1
|
|
field.required = False
|
|
field.data_source = {
|
|
'type': 'foobar', # use the named data source defined earlier
|
|
}
|
|
form = Form()
|
|
field.add_to_form(form)
|
|
widget = form.get_widget('f1')
|
|
assert widget is not None
|
|
assert widget.options == [('1', 'un', '1'), ('2', 'deux', '2')]
|