test_loaders.py :  » Web-Frameworks » Nevow » Nevow-0.10.0 » nevow » test » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Web Frameworks » Nevow 
Nevow » Nevow 0.10.0 » nevow » test » test_loaders.py
# Copyright (c) 2004-2009 Divmod.
# See LICENSE for details.

import os

from twisted.trial import unittest,util

from nevow import context
from nevow import flat
from nevow.flat.flatstan import _PrecompiledSlot
from nevow import loaders
from nevow import tags

class TestDocFactories(unittest.TestCase):

    def _preprocessorTest(self, docFactory):
        def preprocessor(uncompiled):
            self.assertEquals(len(uncompiled), 1)
            uncompiled = uncompiled[0]
            self.assertEquals(uncompiled.tagName, 'div')
            self.assertEquals(len(uncompiled.children), 2)
            self.assertEquals(uncompiled.children[0].tagName, 'span')
            self.assertEquals(uncompiled.children[0].children, ['Hello'])
            self.assertEquals(uncompiled.children[1].tagName, 'span')
            self.assertEquals(uncompiled.children[1].children, ['world'])
            return t.div['goodbye.']
        doc = docFactory.load(preprocessors=[preprocessor])
        self.assertEquals(doc, ['<div>goodbye.</div>'])


    def test_stanPreprocessors(self):
        """
        Test that the stan loader properly passes uncompiled documents to
        preprocessors it is given.
        """
        factory = loaders.stan(
            t.div[t.span['Hello'], t.span['world']])
        return self._preprocessorTest(factory)


    def test_stan(self):
        doc = t.ul(id='nav')[t.li['one'], t.li['two'], t.li['three']]
        df = loaders.stan(doc)
        self.assertEquals(df.load()[0], '<ul id="nav"><li>one</li><li>two</li><li>three</li></ul>')


    def test_stanPrecompiled(self):
        """
        Test that a stan loader works with precompiled documents.

        (This behavior will probably be deprecated soon, but we need to test
        that it works right until we remove it.)
        """
        doc = flat.precompile(t.ul(id='nav')[t.li['one'], t.li['two'], t.slot('three')])
        df = loaders.stan(doc)
        loaded = df.load()
        self.assertEqual(loaded[0], '<ul id="nav"><li>one</li><li>two</li>')
        self.failUnless(isinstance(loaded[1], _PrecompiledSlot))
        self.assertEqual(loaded[1].name, 'three')
        self.assertEqual(loaded[2], '</ul>')


    def test_htmlstr(self):
        doc = '<ul id="nav"><li>a</li><li>b</li><li>c</li></ul>'
        df = loaders.htmlstr(doc)
        self.assertEquals(df.load()[0], doc)
    test_htmlstr.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlstr is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]


    def test_htmlfile(self):
        doc = '<ul id="nav"><li>a</li><li>b</li><li>c</li></ul>'
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(doc)
        f.close()
        df = loaders.htmlfile(temp)
        self.assertEquals(df.load()[0], doc)
    test_htmlfile.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlfile is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]


    def test_htmlfile_slots(self):
        doc = '<nevow:slot name="foo">Hi there</nevow:slot>'
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(doc)
        f.close()
        df = loaders.htmlfile(temp)
        self.assertEquals(df.load()[0].children, ['Hi there'])
    test_htmlfile_slots.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlfile is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]


    def test_xmlstr(self):
        doc = '<ul id="nav"><li>a</li><li>b</li><li>c</li></ul>'
        df = loaders.xmlstr(doc)
        self.assertEquals(df.load()[0], doc)


    def test_xmlstrPreprocessors(self):
        """
        Test that the xmlstr loader properly passes uncompiled documents to
        preprocessors it is given.
        """
        factory = loaders.xmlstr(
            '<div><span>Hello</span><span>world</span></div>')
        return self._preprocessorTest(factory)


    def test_xmlfile(self):
        doc = '<ul id="nav"><li>a</li><li>b</li><li>c</li></ul>'
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(doc)
        f.close()
        df = loaders.xmlfile(temp)
        self.assertEquals(df.load()[0], doc)


    def test_xmlfilePreprocessors(self):
        """
        Test that the xmlstr loader properly passes uncompiled documents to
        preprocessors it is given.
        """
        xmlFile = self.mktemp()
        f = file(xmlFile, 'w')
        f.write('<div><span>Hello</span><span>world</span></div>')
        f.close()
        factory = loaders.xmlfile(xmlFile)
        return self._preprocessorTest(factory)


    def test_patterned(self):
        """Test fetching a specific part (a pattern) of the document.
        """
        doc = t.div[t.p[t.span(pattern='inner')['something']]]
        df = loaders.stan(doc, pattern='inner')
        self.assertEquals(df.load()[0].tagName, 'span')
        self.assertEquals(df.load()[0].children[0], 'something')


    def test_ignoreDocType(self):
        doc = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html><body><p>Hello.</p></body></html>'''
        df = loaders.xmlstr(doc, ignoreDocType=True)
        self.assertEquals(flat.flatten(df), '<html><body><p>Hello.</p></body></html>')

    def test_ignoreComment(self):
        doc = '<!-- skip this --><p>Hello.</p>'
        df = loaders.xmlstr(doc, ignoreComment=True)
        self.assertEquals(flat.flatten(df), '<p>Hello.</p>')


class TestDocFactoriesCache(unittest.TestCase):

    doc = '''
    <div>
    <p nevow:pattern="1">one</p>
    <p nevow:pattern="2">two</p>
    </div>
    '''

    nsdoc = '''
    <div xmlns:nevow="http://nevow.com/ns/nevow/0.1">
    <p nevow:pattern="1">one</p>
    <p nevow:pattern="2">two</p>
    </div>
    '''

    stan = t.div[t.p(pattern='1')['one'],t.p(pattern='2')['two']]

    def test_stan(self):

        loader = loaders.stan(self.stan)
        self.assertEquals( id(loader.load()), id(loader.load()) )

        loader = loaders.stan(self.stan, pattern='1')
        self.assertEquals( id(loader.load()), id(loader.load()) )

        l1 = loaders.stan(self.stan, pattern='1')
        l2 = loaders.stan(self.stan, pattern='1')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

        l1 = loaders.stan(self.stan, pattern='1')
        l2 = loaders.stan(self.stan, pattern='2')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )


    def test_htmlstr(self):
        loader = loaders.htmlstr(self.doc)
        self.assertEquals( id(loader.load()), id(loader.load()) )

        loader = loaders.htmlstr(self.doc, pattern='1')
        self.assertEquals( id(loader.load()), id(loader.load()) )

        l1 = loaders.htmlstr(self.doc, pattern='1')
        l2 = loaders.htmlstr(self.doc, pattern='1')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

        l1 = loaders.htmlstr(self.doc, pattern='1')
        l2 = loaders.htmlstr(self.doc, pattern='2')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )
    test_htmlstr.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlstr is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]


    def test_htmlfile(self):
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(self.doc)
        f.close()

        loader = loaders.htmlfile(temp)
        self.assertEquals( id(loader.load()), id(loader.load()) )

        l1 = loaders.htmlfile(temp, pattern='1')
        l2 = loaders.htmlfile(temp, pattern='1')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

        l1 = loaders.htmlfile(temp, pattern='1')
        l2 = loaders.htmlfile(temp, pattern='2')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )
    test_htmlfile.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlfile is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]


    def test_htmlfileReload(self):
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(self.doc)
        f.close()

        loader = loaders.htmlfile(temp)
        r = loader.load()
        self.assertEquals(id(r), id(loader.load()))
        os.utime(temp, (os.path.getatime(temp), os.path.getmtime(temp)+5))
        self.assertNotEqual(id(r), id(loader.load()))
    test_htmlfileReload.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlfile is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]



    def test_xmlstr(self):

        loader = loaders.xmlstr(self.nsdoc)
        self.assertEquals( id(loader.load()), id(loader.load()) )

        loader = loaders.xmlstr(self.nsdoc, pattern='1')
        self.assertEquals( id(loader.load()), id(loader.load()) )

        l1 = loaders.xmlstr(self.nsdoc, pattern='1')
        l2 = loaders.xmlstr(self.nsdoc, pattern='1')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

        l1 = loaders.xmlstr(self.nsdoc, pattern='1')
        l2 = loaders.xmlstr(self.nsdoc, pattern='2')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )


    def test_xmlSlotDefault(self):
        """
        An I{nevow:slot} tag in an XML template may have a I{default}
        attribute specifying a value for the slot if it is not otherwise
        given one.
        """
        slotsdoc = '''
        <div xmlns:nevow="http://nevow.com/ns/nevow/0.1">
        <nevow:slot name="1" />
        <nevow:slot name="2" default="3" />
        </div>
        '''
        loader = loaders.xmlstr(slotsdoc)
        loaded = loader.load()
        self.assertEquals(loaded[1].default, None)
        self.assertEquals(loaded[3].default, "3")


    def test_xmlfile(self):

        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(self.nsdoc)
        f.close()

        loader = loaders.xmlfile(temp)
        self.assertEquals( id(loader.load()), id(loader.load()) )

        loader = loaders.xmlfile(temp, pattern='1')
        self.assertEquals( id(loader.load()), id(loader.load()) )

        l1 = loaders.xmlfile(temp, pattern='1')
        l2 = loaders.xmlfile(temp, pattern='1')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

        l1 = loaders.xmlfile(temp, pattern='1')
        l2 = loaders.xmlfile(temp, pattern='2')
        self.assertNotEqual( id(l1.load()), id(l2.load()) )

    def test_xmlfileReload(self):

        temp = self.mktemp()
        f = file(temp, 'w')
        f.write(self.nsdoc)
        f.close()

        loader = loaders.xmlfile(temp)
        r = loader.load()
        self.assertEquals(id(r), id(loader.load()))
        os.utime(temp, (os.path.getatime(temp), os.path.getmtime(temp)+5))
        self.assertNotEqual(id(r), id(loader.load()))

    def test_reloadAfterPrecompile(self):
        """
        """
        # Get a filename
        temp = self.mktemp()

        # Write some content
        f = file(temp, 'w')
        f.write('<p>foo</p>')
        f.close()

        # Precompile the doc
        ctx = context.WovenContext()
        doc = loaders.htmlfile(temp)
        pc = flat.precompile(flat.flatten(doc), ctx)

        before = ''.join(flat.serialize(pc, ctx))


        # Write the file with different content and make sure the
        # timestamp changes
        f = file(temp, 'w')
        f.write('<p>bar</p>')
        f.close()
        os.utime(temp, (os.path.getatime(temp), os.path.getmtime(temp)+5))

        after = ''.join(flat.serialize(pc, ctx))

        self.assertIn('foo', before)
        self.assertIn('bar', after)
        self.failIfEqual(before, after)
    test_reloadAfterPrecompile.todo = \
        'Fix so that disk templates are reloaded even after a precompile. ' \
        'Probably just a matter of making the DocSerializer really lazy'


class TestContext(unittest.TestCase):
    """Check that each of the standard loaders supports load with and without a
    context.
    """

    def test_stan(self):
        doc = t.p['hello']
        self._withAndWithout(loaders.stan(doc))

    def test_xmlstr(self):
        doc = '<p>hello</p>'
        self._withAndWithout(loaders.xmlstr(doc))

    def test_xmlfile(self):
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write('<p>hello</p>')
        f.close()
        self._withAndWithout(loaders.xmlfile(temp))

    def test_htmlstr(self):
        doc = '<p>hello</p>'
        self._withAndWithout(loaders.htmlstr(doc))
    test_htmlstr.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlstr is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]

    def test_htmlfile(self):
        temp = self.mktemp()
        f = file(temp, 'w')
        f.write('<p>hello</p>')
        f.close()
        self._withAndWithout(loaders.htmlfile(temp))
    test_htmlfile.suppress = [
        util.suppress(message=
                      r"\[v0.8\] htmlfile is deprecated because it's buggy. "
                      "Please start using xmlfile and/or xmlstr.")]

    def _withAndWithout(self, loader):
        ctx = context.WovenContext()
        self.assertEquals(loader.load(), ['<p>hello</p>'])
        self.assertEquals(loader.load(ctx), ['<p>hello</p>'])


class TestParsing(unittest.TestCase):

    def test_missingSpace(self):
        doc = '<p xmlns:nevow="http://nevow.com/ns/nevow/0.1"><nevow:slot name="foo"/> <nevow:slot name="foo"/></p>'
        ## This used to say htmlstr, and this test failed because microdom ignores whitespace;
        ## This test passes fine using xmlstr. I am not going to fix this because microdom is too
        ## hard to fix. If you need this, switch to xmlstr.
        result = loaders.xmlstr(doc).load()
        # There should be a space between the two slots
        self.assertEquals(result[2], ' ')
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.