import py here = py.path.local(__file__).dirpath() py.std.sys.path.append(str(here.dirpath())) try: from templess.templess import * from templess.convert import * from templess.util import * from templess.parse import * except ImportError: from templess import * from convert import * from util import * from parse import * def test_start_node(): node = elnode('foo', {'foo': 'bar'}, None) s = xmlgenerator(node) assert list(s._start_node(node, node.attrs, True)) == [ ''] assert list(s._start_node(node, node.attrs, False)) == [ ''] def test_handle_cond(): node = templessnode('foo', {}, None, {}) s = convertor(node) assert s._handle_cond(node, {}) node = templessnode('foo', {}, None, {'cond': 'foo'}) s = convertor(node) assert not s._handle_cond(node, {'foo': False}) node = templessnode('foo', {}, None, {'cond': 'foo'}) s = convertor(node) assert s._handle_cond(node, {'foo': True}) node = templessnode('foo', {}, None, {'not': 'foo'}) s = convertor(node) assert not s._handle_cond(node, {'foo': True}) node = templessnode('foo', {}, None, {'not': 'foo'}) s = convertor(node) assert s._handle_cond(node, {'foo': False}) node = templessnode('foo', {}, None, {'cond': 'foo'}) s = convertor(node) assert not s._handle_cond(node, {'foo': []}) def test_handle_cond_not_existing(): node = templessnode('foo', {}, None, {'cond': 'foo'}) s = convertor(node) assert not s._handle_cond(node, {}) node = templessnode('foo', {}, None, {'not': 'foo'}) s = convertor(node) assert s._handle_cond(node, {}) def test_get_content(): node = templessnode('foo', {}, None, {}) s = convertor(node) assert not s._get_content(node) node = templessnode('foo', {}, None, {'content': 'foo'}) s = convertor(node) assert s._get_content(node) == 'foo' def test_get_replace(): node = templessnode('foo', {}, None, {}) s = convertor(node) assert not s._get_replace(node) node = templessnode('foo', {}, None, {'replace': 'foo'}) s = convertor(node) assert s._get_replace(node) == 'foo' def test_basic_rendering(): node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) s.convert({'bar': 'baz'}) ret = s.unicode() assert ret == u'baz' def test_list_rendering(): node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) nodes = s.convert({'bar': ['1', '2']}) ret1 = s._unicode(nodes[0]) assert ret1 == '1' ret2 = s._unicode(nodes[1]) assert ret2 == '2' def test_entitizing(): node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) s.convert({'bar': 'x < 1'}) ret = s.unicode() assert ret == 'x < 1' def test_xmlstring(): node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) s.convert({'bar': xmlstring('')}) ret = s.unicode() assert ret == '' def test_generator(): def somegenerator(): for x in [1, 2, 3]: yield x node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) nodes = s.convert({'bar': somegenerator()}) for i, n in enumerate(nodes): assert s._unicode(n) == '%s' % (i + 1,) def test_list_of_dicts(): node = templessnode('foo', {}, None, {'content': 'fooc'}) # add some ignorable whitespace and some children textnode(' ', node) templessnode('bar', {}, node, {'content': 'barc'}) templessnode('baz', {}, node, {'content': 'bazc'}) s = xmlserializer(node) nodes = s.convert( {'fooc': [ {'barc': 'r1', 'bazc': 'z1'}, {'barc': 'r2', 'bazc': 'z2'}, ]} ) print repr(nodes) assert s._unicode(nodes[0]) == u' r1z1' assert s._unicode(nodes[1]) == u' r2z2' def test_dict(): node = templessnode('foo', {}, None, {'content': 'fooc'}) templessnode('bar', {}, node, {'content': 'barc'}) templessnode('baz', {}, node, {'content': 'bazc'}) s = xmlserializer(node) # shouldn't this return a single node instead? nodes = s.convert({'fooc': {'barc': 'r1', 'bazc': 'z1'}}) print repr(nodes) assert s._unicode(nodes[0]) == u'r1z1' def test_basic_attrs(): node = templessnode('foo', {}, None, {'attr': 'value bar'}) s = xmlserializer(node) node = s.convert({'bar': 'baz'}) assert s.unicode() == '' def test_attr_basic(): node = templessnode('foo', {}, None, {'attr': 'bar baz'}) s = xmlserializer(node) s.convert({'baz': 'qux'}) assert s.unicode() == u'' def test_attr_false(): node = templessnode('foo', {}, None, {'attr': 'bar baz'}) s = xmlserializer(node) s.convert({'baz': False}) assert s.unicode() == u'' def test_attr_remove_xmlns(): #py.test.skip('done by parser nowadays - write test there') node = parse_from_xml( '', 'utf-8') s = xmlserializer(node) s.convert({}) assert s.unicode() == u'' def test_attr_remove_xmlns_leave_other(): node = templessnode('foo', {'xmlns:q': 'foo'}, None, {}) node = parse_from_xml( '', 'utf-8') s = xmlserializer(node) s.convert({}) assert s.unicode() == u'' def test_attr_false_empty_string(): node = templessnode('foo', {}, None, {'attr': 'bar baz'}) s = xmlserializer(node) s.convert({'baz': ''}) assert s.unicode() == u'' def test_attr_false_replacing(): node = templessnode('foo', {'bar': 'baz'}, None, {'attr': 'bar baz'}) s = xmlserializer(node) s.convert({'baz': False}) assert s.unicode() == u'' def test_list_with_attrs(): # XXX not entirely sure about this behaviour yet... node = templessnode( 'foo', {}, None, {'content': 'bar', 'attr': 'value baz'}) s = xmlserializer(node) nodes = s.convert({'baz': 'top', 'bar': [{'baz': 1}, {'baz': 2}]}) assert len(nodes) == 2 assert s._unicode(nodes[0]) == u'' assert s._unicode(nodes[1]) == u'' def test_cdata(): node = cdatanode(' foo ', None) s = xmlserializer(node) assert s.unicode() == u'' def test_find(): '' foo = elnode('foo', {}, None) bar1 = elnode('bar', {'id': "bar1"}, foo) baz = elnode('baz', {}, bar1) bar2 = elnode('bar', {'id': "bar2"}, baz) bar3 = elnode('bar', {'id': "bar3"}, foo) bar4 = elnode('bar', {'id': "bar4"}, bar2) ids = [el.attrs['id'] for el in list(foo.find('bar'))] assert ids == ['bar1', 'bar2', 'bar4', 'bar3'] class container(object): def __init__(self, **kwargs): self.__dict__.update(kwargs) def test_objectcontext_regular(): c = container(foo=1) assert str(c.foo) == '1' py.test.raises(TypeError, "c['foo']") oc = objectcontext(c) assert str(oc['foo']) == '1' py.test.raises(KeyError, "oc['bar']") def test_objectcontext_dict(): oc = objectcontext({'foo': 1}) assert str(oc['foo']) == '1' def test_objectcontext_nested(): ci = container(bar=1) c = container(foo=ci) oc = objectcontext(c) assert str(oc['foo']['bar']) == '1' def test_objectcontext_callable(): c = container(foo=lambda: 1) oc = objectcontext(c) assert str(oc['foo']) == '1' def test_objectcontext_nested_list(): c = container(foo=[container(bar=1), container(bar=2)]) oc = objectcontext(c) for i, item in enumerate(oc['foo']): assert isinstance(item, objectcontext) assert str(item['bar']) == str(i+1) def test_objectcontext_nested_iterable(): c = container(foo=(container(bar=x) for x in [1, 2])) oc = objectcontext(c) for i, item in enumerate(oc['foo']): assert isinstance(item, objectcontext) assert str(item['bar']) == str(i+1) def test_generate(): t = template('') ret = '' i = 0 for chunk in t.generate({'foo': 'bar'}): i += 1 ret += chunk assert i > 1 assert ret == ('bar') def test_generate_list(): t = template( '') ret = ''.join(list(t.generate({'bar': [1, 2]}))) assert ret == '12' def test_generate_singleton(): t = template( '' '') ret = ''.join(list(t.generate({'bar': []}))) assert ret == '' def test_generate_cond(): t = template( '' '') ret = ''.join(list(t.generate({'baz': True}))) assert ret == '' ret = ''.join(list(t.generate({'baz': False}))) assert ret == '' def test_generate_not(): t = template( '' '') ret = ''.join(list(t.generate({'baz': True}))) assert ret == '' ret = ''.join(list(t.generate({'baz': False}))) assert ret == '' def test_generate_content_list_of_dicts(): t = template( '' '') ret = ''.join(list(t.generate( {'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]}))) assert ret == ( 'foobar') def test_generate_replace_list_of_dicts(): t = template( '' '') ret = ''.join(list(t.generate( {'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]}))) assert ret == ( 'foobar') def test_generate_list_of_dicts_replace_inner(): t = template( '' '') ret = ''.join(list(t.generate( {'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]}))) assert ret == ( 'foobar') def test_generate_content_dict(): t = template('' '') ret = ''.join(list(t.generate({'spam': {'eggs': 'eggs'}}))) assert ret == 'eggs' def test_generate_replace_dict(): t = template('' '') ret = ''.join(list(t.generate({'spam': {'eggs': 'eggs'}}))) assert ret == 'eggs' def test_generate_html_non_singletons(): t = template( '' '' def test_generate_html_singleton(): t = template( '' '
') html = ''.join(list(t.generate({'foo': 'bar'}, True))) assert html == '
bar' html = ''.join(list(t.generate({'foo': None}, True))) assert html == '
' def test_generate_html_singleton_non_templess_el(): t = template('
') s = xmlgenerator(t.tree) s.convert({}) html = ''.join(list(s.generate(True))) assert html == '
' t = template('
bar') html = ''.join(list(t.generate({}, True))) assert html == '
bar' def test_elnode_repr(): node = elnode('bar', {}, None) s = xmlserializer(node) xml = s.unicode() assert xml == '' def test_templessnode_repr(): node = templessnode('bar', {}, None, {}) s = xmlserializer(node) s.convert({}) xml = s.unicode() assert xml == '' def test_unicode_noxmlns(): t = template('') s = xmlserializer(t) s.convert({}) xml = s.unicode() assert xml == '' def test_html_output(): t = template('') s = xmlserializer(t) s.convert({}) xml = s.unicode() assert xml == u'' html = ''.join(list(t.generate({}, html=True))) assert html == u'' def test_str_subclass_is_str(): class mystr(str): pass node = templessnode('foo', {}, None, {'content': 'bar'}) s = xmlserializer(node) s.convert({'bar': mystr('baz')}) assert s.unicode() == u'baz' def test_force_str(): node = templessnode('foo', {}, None, {'content': 'bar:str'}) s = xmlserializer(node) s.convert({'bar': ['baz']}) assert s.unicode() == u'%s' % (['baz'],) def test_force_iter(): node = templessnode('foo', {}, None, {}); templessnode('bar', {}, node, {'content': 'bar:iter'}) s = xmlserializer(node) s.convert({'bar': 'baz'}) assert s.unicode() == u'baz' def test_force_ctx(): class myctx(object): def __getitem__(self, name): if name == 'spam': return 'eggs' raise KeyError(name) node = templessnode('foo', {}, None, {'content': 'bar:ctx'}); templessnode('bar', {}, node, {'content': 'spam'}) s = xmlserializer(node) nodes = s.convert({'bar': myctx()}) assert s._unicode(nodes[0]) == u'eggs' def test_replace_with_node_iterator(): t = templess.template( '' '') t2 = templess.template( 'foobar') converted = t2.convert({}) rendered = ''.join(t.generate({'els': list(converted.find('el'))})) assert rendered == 'foobar' def test_convert_generate_tree_not_in_place_converted(): t = templess.template( '' '') g = xmlgenerator(t) s = ''.join(g.convert_generate({'bar': [1, 2], 'baz': [3, 4]})) s2 = ''.join(g.convert_generate({'bar': [1, 2], 'baz': [3, 4]})) assert s == '1234' assert s == s2 def test_double_replace_textnode(): t = templess.template( '' ' ' '') g = xmlgenerator(t) s = ''.join(g.convert_generate({'bar': [{'baz': 1, 'qux': 2}]})) assert s == '1 2' def test_double_replace_elnode(): t = templess.template( '' '' '' '') g = xmlgenerator(t) s = ''.join(g.convert_generate({'bar': [{'baz': 1, 'qux': 2, 'quux': 3}]})) assert s == '123'