"""kid package tests.""" __revision__ = "$Rev: 455 $" __date__ = "$Date: 2006-12-21 01:42:34 -0500 (Thu, 21 Dec 2006) $" __author__ = "Ryan Tomayko (rtomayko@gmail.com)" __copyright__ = "Copyright 2004-2005, Ryan Tomayko" __license__ = "MIT " import os import sys from os.path import exists, join as joinpath, splitext from glob import glob import kid, kid.test from kid.test import template_package, output_dir, template_dir try: from xml.etree import ElementTree except ImportError: from elementtree import ElementTree keep_files = [] def cleanup(): for f in glob(joinpath(output_dir, '*.out')): try: os.unlink(f) except OSError: pass for f in glob(joinpath(template_dir, '*.pyc')): try: os.unlink(f) except OSError: pass for f in glob(joinpath(template_dir, '*.py')): if exists(splitext(f)[0] + '.kid') and not f in keep_files: try: os.unlink(f) except OSError: pass def setup_module(module): cleanup() def teardown_module(module): if not os.environ.get('KID_NOCLEANUP'): cleanup() def assert_template_interface(t): assert hasattr(t, 'pull') assert hasattr(t, 'generate') assert hasattr(t, 'write') assert hasattr(t, 'serialize') def test_import_and_expand(): try: del sys.modules['test.context'] except KeyError: pass kid.disable_import() try: import test.context as c except ImportError: c = None assert c is None kid.enable_import() import test.context as c kid.disable_import() C = c.Template out = joinpath(output_dir, 'context.out') t = C(foo=10, bar='bla bla') it = t.pull() for e in it: pass t.write(out) check_xml_file(out) def test_import_template_func(): assert not sys.modules.has_key(template_package + 'test_def') t = kid.import_template(template_package + 'test_def') assert_template_interface(t) assert sys.modules.has_key(template_package + 'test_def') def test_load_template_func(): t = kid.load_template(joinpath(template_dir, 'test_if.kid'), name='', cache=False) assert_template_interface(t) t2 = kid.load_template(joinpath(template_dir, 'test_if.kid'), name=template_package + 'test_if', cache=True) assert not t is t2 t3 = kid.load_template(joinpath(template_dir, 'test_if.kid'), name=template_package + 'test_if', cache=True) assert t3 is t2 def test_load_template_func_with_ns(): t = kid.load_template(joinpath(template_dir, 'templates.kid'), name='', cache=False) s = """ """ t2 = kid.load_template(s, cache=False, ns={'t': t}) xml = t2.serialize() assert "This is a test" in xml def test_load_template_with_exec_module(): s = """ Hello, World!""" t= kid.load_template(s) assert t.Mickey == 'Mouse' assert not hasattr(t, 'Donald') def exec_module(mod, code): exec code in mod.__dict__ mod.Donald = 'Duck' t = kid.load_template(s, exec_module=exec_module) assert t.Mickey == 'Mouse' assert t.Donald == 'Duck' def test_template_func(): t = kid.Template(name=template_package + 'test_if') assert_template_interface(t) assert isinstance(t, kid.BaseTemplate) def test_generate_func(): def run_test(o): for s in o.generate(encoding='ascii'): assert s is not None and len(s) > 0 run_test(kid.Template(name=template_package + 'test_if')) run_test(kid.load_template(joinpath(template_dir, 'test_if.kid'))) def test_write_func(): class FO: def write(self, text): pass kid.Template(name=template_package+'test_if').write(file=FO()) m = kid.load_template(joinpath(template_dir, 'test_if.kid')) m.write(file=FO()) def test_serialize_func(): def run_test(o): out = o.serialize(encoding='utf-8') assert out is not None and len(out) > 0 out = o.serialize(encoding='ascii') assert out is not None and len(out) > 0 run_test(kid.Template(name=template_package + 'test_if')) run_test(kid.load_template(joinpath(template_dir, 'test_if.kid'))) def test_short_form(): # check that the serializer is outputting short-form elements when # no character data is present text = """ """ template = kid.Template(file=text) #mod.Template() actual = template.serialize().strip() assert actual == text, '%r != %r' % (actual, text) def test_XML_func_fragment(): text = u"""some plain "text" with & entities.""" t = kid.Template(source="

${XML(text)}

", text=text) rslt = t.serialize(fragment=True) assert rslt == '''

some plain "text" with & entities.

''' # another one text = """something

something else

""" t = kid.Template(source="

${XML(text)}

", text=text) actual = t.serialize(fragment=True) expected = '''

something

something else

''' assert actual == expected, '%r != %r' % (actual, expected) def test_XML_ns_fragment(): text = """something

something else

""" t = kid.Template(source='

${XML(text, xmlns="foo")}

', text=text) actual = t.serialize(fragment=True) expected = '''

something

something else

''' assert actual == expected, '%r != %r' % (actual, expected) def test_XML_func_unicode(): s = u"""asdf \u2015 qwer""" t = kid.Template(source="""

${XML(s)}

""", s=s) print repr(t.serialize()) def test_dont_modify_trees(): t = kid.Template(source="$xml") t.xml = ElementTree.fromstring("somenestedelements") expected = "somenestedelements" assert t.serialize(fragment=True) == expected print ElementTree.dump(t.xml) assert t.serialize(fragment=True) == expected def test_comments(): t = kid.Template(source="") rslt = t.serialize(fragment=True) assert rslt == "" def test_kid_files(test='*'): test_files = glob(joinpath(template_dir, 'test_%s.kid' % test)) for f in test_files: out = f[0:-4] + '.out' try: template = kid.Template(file=f, cache=True) template.assume_encoding = "utf-8" template.write(out) check_xml_file(out) except Exception: print '\nTemplate: %s' % f try: kid.compiler.compile_file(f, source=True, force=True, encoding="utf-8") except: print "Corresponding source module could not be created." else: keep_files.append(splitext(f)[0] + '.py') print "The correspoding source module has been created." raise def check_xml_file(filename): dot = kid.test.dot doc = ElementTree.parse(filename).getroot() assert doc.tag == 'testdoc' for t in doc.findall('test'): attempt = t.find('attempt') expect = t.find('expect') if expect.get('type') == 'text': doc = ElementTree.XML(expect.text) expect.append(doc) expect.text = '' try: diff_elm(attempt, expect, diff_this=False) except AssertionError: raise else: dot() kid.test.additional_tests += 1 def diff_elm(elm1, elm2, diff_this=True): for e in [elm1, elm2]: e.tail = e.tail and e.tail.strip() or None e.text = e.text and e.text.strip() or None if diff_this: assert elm1.tag == elm2.tag assert elm1.attrib == elm2.attrib assert elm1.tail == elm2.tail expected = elm2.text actual = elm1.text assert actual == expected, '%r != %r' % (actual, expected) ch1 = elm1.getchildren() ch2 = elm2.getchildren() assert len(ch1) == len(ch2) for elm1, elm2 in zip(ch1, ch2): diff_elm(elm1, elm2) def test_string_templates(): """Test for collisions in templates created with a string (ticket #70).""" t1 = kid.Template(source="") t2 = kid.Template(source="") assert str(t1) == '\n' assert str(t2) == '\n' def test_reserved_names(): """Check for reserved keyword arguments (ticket #181).""" from kid.template_util import TemplateAttrsError try: t = kid.Template('
', content=None) except TemplateAttrsError, e: e = str(e) else: e = 'reserved name was not detected' assert repr('content') in e assert 'reserved name' in e