"""
$RCSfile: TestDTDValidator.py,v $
Unit tests for ZopeXMLMethods product

Author: <a href="mailto:cstrong@arielpartners.com">Craeg Strong</a>
Release: 1.0
"""

__cvstag__  = '$Name:  $'[6:-2]
__date__    = '$Date: 2005/09/06 02:08:59 $'[6:-2]
__version__ = '$Revision: 1.3 $'[10:-2]

import os, sys, urllib

if __name__ == '__main__':
    execfile(os.path.join(sys.path[0], 'framework.py'))

# Load fixture
from Testing import ZopeTestCase

ZopeTestCase.installProduct('ZopeXMLMethods')

# ZopeXMLMethods
from Products.ZopeXMLMethods.processors.interfaces import IDTDValidator
from Products.ZopeXMLMethods.processors.ProcessorRegistry import ProcessorRegistry

class DTDValidatorTestCase(ZopeTestCase.ZopeTestCase):
    """

    DTD Validator tests.  This is particularly useful if switching
    from one library to another, for example upgrading 4Suite or
    switching to Pyana or Saxon.

    """

    ################################################################
    # Fixture
    ################################################################

    def afterSetUp(self):
        '''Add object to default fixture'''
        prod               = self.folder.manage_addProduct['ZopeXMLMethods']

        self.registry      = ProcessorRegistry

        # below is an example of how to test only a single processor...
        self.registry.prefer(IDTDValidator, '4Suite 1.0beta', exclusive = 1)
        # ...for now, let's test them all

        if len(self.registry.names(IDTDValidator)) == 0:
            raise Exception('Error: no supported DTD Validator found')

    def afterClear(self):
        '''Clean up after myself'''
        try: del self.prod
        except AttributeError: pass

    ################################################################
    # Test Cases
    ################################################################

    def test_01(self):
        "Test validation of a valid XML document"

        filepath        = 'testfiles/valid.xml'
        xmlURL          = 'file://' + urllib.pathname2url(os.path.abspath(filepath))
        xmlFile         = open(filepath, 'rb')
        xmlContents     = xmlFile.read()

        print
        for processor in self.registry.items(IDTDValidator):
            print "Testing Processor:", processor.name,
            results = processor.dtdValidationResultsString(xmlContents,
                                                           xmlURL)
            self.failIf(results.find("is valid") == -1)
            self.assertEquals(processor.isValidForDTD(xmlContents,
                                                      xmlURL), 1)
            print "...ok"

    def test_02(self):
        "Test for invalid document"

        filepath        = 'testfiles/invalid.xml'
        xmlFile         = open(filepath, 'rb')
        xmlURL          = 'file://' + urllib.pathname2url(os.path.abspath(filepath))
        xmlContents     = xmlFile.read()

        print
        for processor in self.registry.items(IDTDValidator):
            print "Testing Processor:", processor.name,
            results = processor.dtdValidationResultsString(xmlContents,
                                                           xmlURL)
            self.failIf(results.find("parse error") == -1)            
            self.assertEquals(processor.isValidForDTD(xmlContents,
                                                      xmlURL), 0)
            print "...ok"

    ################################################################
    # Test Runner Setup
    ################################################################

if __name__ == '__main__':
    framework(descriptions=1, verbosity=2)
else:
    # While framework.py provides its own test_suite() 
    # method the testrunner utility does not.
    import unittest
    def test_suite():
        suite = unittest.TestSuite()
        suite.addTest(unittest.makeSuite(DTDValidatorTestCase))
        return suite
