#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

#    Copyright (c) 2016, Jan Brohl <janbrohl@t-online.de>
#    All rights reserved.
#    See LICENSE.txt

#    Copyright (c) 2004 Colin Stewart (http://www.owlfish.com/)
#    All rights reserved.
#
#    Redistribution and use in source and binary forms, with or without
#    modification, are permitted provided that the following conditions
#    are met:
#    1. Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#    2. Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#    3. The name of the author may not be used to endorse or promote products
#       derived from this software without specific prior written permission.
#
#    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
#    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
#    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
#    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
#    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
#    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
#    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
#    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
#    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#    If you make any bug fixes or feature enhancements please let me know!
"""		
		
		Unit test cases.
		
"""

from __future__ import unicode_literals
import unittest
import os
import io
import logging
import logging.config

from simpletal import simpleTAL, simpleTALES

if (os.path.exists("logging.ini")):
    logging.config.fileConfig("logging.ini")
else:
    logging.basicConfig()


class TALAttributesTestCases(unittest.TestCase):
    def setUp(self):
        self.context = simpleTALES.Context()
        self.context.addGlobal('test', 'testing')
        self.context.addGlobal('link', 'www.owlfish.com')
        self.context.addGlobal('needsQuoting', """Does "this" work?""")
        self.context.addGlobal('number', 5)
        self.context.addGlobal('uniQuote', 'Does "this" work?')
        self.context.addGlobal('anotherdefault', {
            'inhere': simpleTALES.DEFAULTVALUE
        })

    def _runTest_(self, txt, result, errMsg="Error"):
        template = simpleTAL.compileHTMLTemplate(txt)
        file = io.StringIO()
        template.expand(self.context, file)
        realResult = file.getvalue()
        self.assertEqual(
            realResult, result,
            "%s - \npassed in: %s \ngot back %s \nexpected %s\n\nTemplate: %s"
            % (errMsg, txt, realResult, result, template))

    def testAddingAnAttribute(self):
        self._runTest_(
            '<html tal:attributes="link link" href="owlfish.com">Hello</html>',
            '<html link="www.owlfish.com" href="owlfish.com">Hello</html>',
            "Addition of attribute 'link' failed.")

    def testRemovingAnAttribute(self):
        self._runTest_(
            '<html class="test" tal:attributes="href nothing" href="owlfish.com">Hello</html>',
            '<html class="test">Hello</html>',
            "Removal of attribute 'href' failed.")

    def testDefaultAttribute(self):
        self._runTest_(
            '<html class="test" tal:attributes="href default" href="owlfish.com">Hello</html>',
            '<html class="test" href="owlfish.com">Hello</html>',
            "Defaulting of attribute 'href' failed.")

    def testAnotherDefaultAttribute(self):
        self._runTest_(
            '<html class="test" tal:attributes="href anotherdefault/inhere" href="owlfish.com">Hello</html>',
            '<html class="test" href="owlfish.com">Hello</html>',
            "Defaulting of attribute 'href' failed.")

    def testMultipleAttributes(self):
        self._runTest_(
            '<html old="still here" class="test" tal:attributes="href default;class nothing;new test" href="owlfish.com">Hello</html>',
            '<html new="testing" old="still here" href="owlfish.com">Hello</html>',
            "Setting multiple attributes at once failed.")

    def testMultipleAttributesSpace(self):
        self._runTest_(
            '<html old="still here" class="test" tal:attributes="href default ; class string:Hello there; new test" href="owlfish.com">Hello</html>',
            '<html class="Hello there" new="testing" old="still here" href="owlfish.com">Hello</html>',
            "Setting multiple attributes at once, with spaces between semi-colons, failed."
        )

    def testMultipleAttributesEscaped(self):
        self._runTest_(
            '<html old="still &quot; here" class="test" tal:attributes="href default ; class string: Semi-colon;;test;new test " href="owlfish.com">Hello</html>',
            '''<html class="Semi-colon;test" new="testing" old='still " here' href="owlfish.com">Hello</html>''',
            "Setting multiple attributes at once, with spaces between semi-colons, failed."
        )

    def testAttributeEscaping(self):
        self._runTest_(
            '<html existingAtt="&quot;Testing&quot;" tal:attributes="href needsQuoting">Hello</html>',
            """<html href='Does "this" work?' existingatt='"Testing"'>Hello</html>""",
            "Escaping of new attributes failed.")

    def testNumberAttributeEscaping(self):
        self._runTest_(
            '<html existingAtt="&quot;Testing&quot;" tal:attributes="href number">Hello</html>',
            """<html href="5" existingatt='"Testing"'>Hello</html>""",
            "Escaping of new attributes failed.")

    def testNumberAttributeEscaping(self):
        self._runTest_(
            '<html existingAtt="&quot;Testing&quot;" tal:attributes="href uniQuote">Hello</html>',
            """<html href='Does "this" work?' existingatt='"Testing"'>Hello</html>""",
            "Escaping of new attributes failed.")

    def testOriginalAttributes(self):
        self._runTest_(
            '<html existingAtt="&quot;Testing&quot;" tal:attributes="newAtt attrs/existingatt" tal:content="attrs/existingatt">Hello</html>',
            """<html newAtt='"Testing"' existingatt='"Testing"'>"Testing"</html>""",
            "Accessing existing attributes failed.")

    def testMultipleOriginalAttributes(self):
        self._runTest_(
            '<html one="Value One" two="Value two" three="Value three" tal:attributes="four attrs/three" tal:content="attrs/one">Hello</html>',
            """<html four="Value three" one="Value One" two="Value two" three="Value three">Value One</html>""",
            "Accessing multiple existing attributes failed.")

    def testAmpersandEscapeInAttributes(self):
        self._runTest_(
            '<html existingAtt="&amp;Testing&amp;" tal:attributes="newAtt attrs/existingatt" tal:content="attrs/existingatt">Hello</html>',
            """<html newAtt="&amp;Testing&amp;" existingatt="&amp;Testing&amp;">&amp;Testing&amp;</html>""",
            "Accessing existing attributes failed.")

    #~ def testAttributeCase (self):
    #~ self._runTest_ ('<html HREF="Testing" tal:attributes="HREF test">Hello</html>'
    #~ ,"""<html href="testing">Hello</html>"""
    #~ ,"HTML Attributes not treated as case insensitive.")


if __name__ == '__main__':
    unittest.main()

[((49, 4, 49, 33), 'os.path.exists', 'os.path.exists', ({(49, 19, 49, 32): '"""logging.ini"""'}, {}), "('logging.ini')", False, 'import os\n'), ((50, 4, 50, 44), 'logging.config.fileConfig', 'logging.config.fileConfig', ({(50, 30, 50, 43): '"""logging.ini"""'}, {}), "('logging.ini')", False, 'import logging\n'), ((52, 4, 52, 25), 'logging.basicConfig', 'logging.basicConfig', ({}, {}), '()', False, 'import logging\n'), ((164, 4, 164, 19), 'unittest.main', 'unittest.main', ({}, {}), '()', False, 'import unittest\n'), ((57, 23, 57, 44), 'simpletal.simpleTALES.Context', 'simpleTALES.Context', ({}, {}), '()', False, 'from simpletal import simpleTAL, simpleTALES\n'), ((68, 19, 68, 53), 'simpletal.simpleTAL.compileHTMLTemplate', 'simpleTAL.compileHTMLTemplate', ({(68, 49, 68, 52): 'txt'}, {}), '(txt)', False, 'from simpletal import simpleTAL, simpleTALES\n'), ((69, 15, 69, 28), 'io.StringIO', 'io.StringIO', ({}, {}), '()', False, 'import io\n')]