[CMF-checkins] CVS: CMF/CMFDefault/tests - test_Discussions.py:1.8.28.1 test_Document.py:1.21.4.1 test_Favorite.py:1.2.4.1 test_Image.py:1.3.4.1 test_Link.py:1.4.4.1 test_MetadataTool.py:1.2.34.1 test_NewsItem.py:1.4.28.1 test_all.py:1.10.4.1 test_join.py:1.3.30.1 test_utils.py:1.4.34.1 utils.py:NONE

Shane Hathaway shane@cvs.zope.org
Wed, 20 Feb 2002 15:15:25 -0500


Update of /cvs-repository/CMF/CMFDefault/tests
In directory cvs.zope.org:/tmp/cvs-serv27999/CMFDefault/tests

Modified Files:
      Tag: cmf-pre-1_3-branch
	test_Discussions.py test_Document.py test_Favorite.py 
	test_Image.py test_Link.py test_MetadataTool.py 
	test_NewsItem.py test_all.py test_join.py test_utils.py 
Removed Files:
      Tag: cmf-pre-1_3-branch
	utils.py 
Log Message:
Merged changes from head, with a small change: the types tool does not need
to be extended in such a complex way.  I took out the type_type registry and
the __bobo_traverse__ hook and replaced it with the original code with only
minor mods that give you the same extensibility without all the hacking.
(If anyone actually wants to use the extensibility, which I suspect no one
is actually interested in doing, I will happily provide instructions and
will create a corrected unit test.)


=== CMF/CMFDefault/tests/test_Discussions.py 1.8 => 1.8.28.1 ===
-import unittest, string
+from unittest import TestSuite, makeSuite, main
 
-from AccessControl import SecurityManager
-from Acquisition import aq_base, aq_inner
+from Products.CMFCore.tests.base.testcase import \
+     SecurityTest
+
+from Products.CMFCore.tests.base.utils import \
+     has_path
+
+from Products.CMFCore.tests.base.dummy import \
+     DummyFTI
 
 from Products.CMFCore.CatalogTool import CatalogTool
-from Products.CMFCore.TypesTool import TypesTool, FactoryTypeInformation
+from Products.CMFCore.TypesTool import TypesTool
 from Products.CMFCore.WorkflowTool import WorkflowTool
 
-from Products.CMFDefault.DiscussionTool import DiscussionTool\
-                                             , DiscussionNotAllowed
+from Products.CMFDefault.DiscussionTool import \
+     DiscussionTool, DiscussionNotAllowed
 
 from Products.CMFDefault.Document import Document
 from Products.CMFDefault.URLTool import URLTool
 
-class UnitTestSecurityPolicy:
-    """
-        Stub out the existing security policy for unit testing purposes.
-    """
-    #
-    #   Standard SecurityPolicy interface
-    #
-    def validate( self, accessed, container, name, value, context, roles,
-                 *args, **kw ):
-        return 1
-    
-    def checkPermission( self, permission, object, context ) :
-        return 1
-
-
-class DiscussionTests( unittest.TestCase ):
+class DiscussionTests( SecurityTest ):
 
     def setUp( self ):
-        get_transaction().begin()
-        self._policy = UnitTestSecurityPolicy()
-        self._oldPolicy = SecurityManager.setSecurityPolicy(self._policy)
-        self.connection = Zope.DB.open()
-        self.root = self.connection.root()[ 'Application' ]
-        self.root._setObject( 'portal_discussion', DiscussionTool() )
-        self.discussion_tool = self.root.portal_discussion
-        self.root._setObject( 'portal_catalog', CatalogTool() )
-        self.catalog_tool = self.root.portal_catalog
-        self.root._setObject( 'portal_url', URLTool() )
-        self.url_tool = self.root.portal_url
-        self.root._setObject( 'portal_workflow', WorkflowTool() ) 
-        self.workflow_tool = self.root.portal_workflow
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.types_tool = self.root.portal_types
-    
-    def tearDown( self ):
-        del self.types_tool
-        del self.workflow_tool
-        del self.url_tool
-        del self.discussion_tool
-        del self.catalog_tool
-        del self.root
-        del self._policy
-        get_transaction().abort()
-        self.connection.close()
-        SecurityManager.setSecurityPolicy( self._oldPolicy )
-
+        
+        SecurityTest.setUp(self)
+        
+        root = self.root
+        root._setObject( 'portal_discussion', DiscussionTool() )
+        self.discussion_tool = root.portal_discussion
+        root._setObject( 'portal_catalog', CatalogTool() )
+        self.catalog_tool = root.portal_catalog
+        root._setObject( 'portal_url', URLTool() )
+        self.url_tool = root.portal_url
+        root._setObject( 'portal_workflow', WorkflowTool() ) 
+        self.workflow_tool = root.portal_workflow
+        root._setObject( 'portal_types', TypesTool() )
+        types_tool = self.types_tool = root.portal_types
+        try: root._delObject('test')
+        except AttributeError: pass
+        root._setObject( 'test', Document( 'test' ) )
+            
     def test_policy( self ):
 
-        self.root._setObject( 'test', Document( 'test' ) )
         test = self.root.test
         self.assertRaises( DiscussionNotAllowed
                          , self.discussion_tool.getDiscussionFor
@@ -76,14 +56,7 @@
 
         del test.talkback
         del test.allow_discussion
-        FTI = FactoryTypeInformation
-        self.types_tool._setObject( 'Document'
-                                  , FTI( 'Document'
-                                       , meta_type=Document.meta_type
-                                       , product='CMFDefault'
-                                       , factory='addDocument'
-                                       )
-                                  )
+        self.types_tool._setObject( 'Document', DummyFTI )
         self.assertRaises( DiscussionNotAllowed
                          , self.discussion_tool.getDiscussionFor
                          , test
@@ -107,7 +80,6 @@
         assert test.talkback
     
     def test_nestedReplies( self ):
-        self.root._setObject( 'test', Document( 'test' ) )
         test = self.root.test
         test.allow_discussion = 1
         talkback = self.discussion_tool.getDiscussionFor( test )
@@ -157,7 +129,6 @@
 
     def test_itemCatloguing( self ):
 
-        self.root._setObject( 'test', Document( 'test' ) )
         test = self.root.test
         catalog = self.catalog_tool._catalog
         test.allow_discussion = 1
@@ -191,7 +162,6 @@
 
     def test_deletePropagation( self ):
 
-        self.root._setObject( 'test', Document( 'test' ) )
         test = self.root.test
 
         test.allow_discussion = 1
@@ -202,25 +172,10 @@
         self.root._delObject( 'test' )
         assert len( self.catalog_tool ) == 0
 
-def has_path( catalog, path ):
-    """
-        Verify that catalog has an object at path.
-    """
-    if type( path ) is type( () ):
-        path = string.join( path, '/' )
-    rids = map( lambda x: x.data_record_id_, catalog.searchResults() )
-    for rid in rids:
-        if catalog.getpath( rid ) == path:
-            return 1
-    return 0
-
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( unittest.makeSuite( DiscussionTests ) )
-    return suite
-
-def run():
-    unittest.TextTestRunner().run( test_suite() )
+    return TestSuite((
+        makeSuite( DiscussionTests ),
+        ))
 
 if __name__ == '__main__':
-    run()
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_Document.py 1.21 => 1.21.4.1 === (431/531 lines abridged)
-from Products.CMFDefault.tests.utils import fakeRequest, fakeResponse
-from Products.CMFDefault.Document import Document
-#" 
-DOCTYPE = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'''
-
-HTML_TEMPLATE = '''\
-<html><head>
- <title>%(title)s</title>
-</head>
-<body bgcolor="#efe843">%(body)s</body>
-</html>
-'''
-
-BASIC_HTML = '''\
-<html>
- <head>
-  <title>Title in tag</title>
-  <meta name="description" content="Describe me">
-  <meta name="contributors" content="foo@bar.com; baz@bam.net;
-    Benotz, Larry J (larry@benotz.stuff)">
-  <meta name="title" content="Title in meta">
-  <meta name="subject" content="content management">
-  <meta name="keywords" content="unit tests, framework; ,zope ">
- </head>
- <body bgcolor="#ffffff">
-  <h1>Not a lot here</h1>
- </body>
-</html>
-'''
-
-SIMPLE_HTML = '''\
-<html>
- <head>
-  <title>Title in tag</title>
-  <meta name="description" content="Describe me">
-  <meta name="contributors" content="foo@bar.com; baz@bam.net;
-    Benotz, Larry J (larry@benotz.stuff)">
-  <meta name="title" content="Title in meta">
-  <meta name="subject" content="content management">
- </head>
- <body bgcolor="#ffffff">
-  <h1>Not a lot here</h1>
- </body>
-</html>
-'''
-
-ENTITY_IN_TITLE = '''\
-<html>
- <head>
-  <title>&Auuml;rger</title>

[-=- -=- -=- 431 lines omitted -=- -=- -=-]

         self.assertEqual( r.status, 204 )
 
     def test_PutHtmlWithDoctype(self):
-        d = Document('foo')
+        
         html = '%s\n\n  \n   %s' % (DOCTYPE, BASIC_HTML)
-        self._request.body = html
-        r = d.PUT(self._request, self._response)
-        self.assertEqual( d.Format(), 'text/html' )
-        self.assertEqual( d.Description(), 'Describe me' )
+        self.REQUEST['BODY'] = html
+        
+        r = self.d.PUT(self.REQUEST, self.RESPONSE)
+        self.assertEqual( self.d.Format(), 'text/html' )
+        self.assertEqual( self.d.Description(), 'Describe me' )
         self.assertEqual( r.status, 204 )
 
     def test_PutHtml(self):
-        d = Document('foo')
-        self._request.body = BASIC_HTML
-        r = d.PUT(self._request, self._response)
-        self.assertEqual( d.Format(), 'text/html' )
-        self.assertEqual( d.Description(), 'Describe me' )
+        
+        self.REQUEST['BODY'] = BASIC_HTML
+        r = self.d.PUT(self.REQUEST, self.RESPONSE)
+        self.assertEqual( self.d.Format(), 'text/html' )
+        self.assertEqual( self.d.Description(), 'Describe me' )
         self.assertEqual( r.status, 204 )
 
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(DocumentTests))
-    suite.addTest(unittest.makeSuite(TestFTPGet))
-    suite.addTest(unittest.makeSuite(TestDocumentPUT))
-    return suite
-
-def run():
-    unittest.TextTestRunner().run(test_suite())
+    return TestSuite((
+        makeSuite(DocumentTests),
+        makeSuite(TestFTPGet),
+        makeSuite(TestDocumentPUT),
+        ))
 
 if __name__ == '__main__':
-    run()
+    main(defaultTest='test_suite')
 


=== CMF/CMFDefault/tests/test_Favorite.py 1.2 => 1.2.4.1 ===
 """
 __version__ = "$Revision$"[11:-2]
+import Zope
+from unittest import TestCase, TestSuite, makeSuite, main
 
+from Products.CMFCore.tests.base.dummy import \
+     DummyTool as DummyURLTool, \
+     DummyObject as DummySite
 
-import unittest
-import Acquisition
-from Acquisition import aq_inner, aq_parent
+from Products.CMFDefault.Favorite import Favorite
 
-class DummyURLTool( Acquisition.Implicit ):
-
-    root = 'DummyTool'
-
-    def __call__( self ):
-        return self.root
-
-    getPortalPath = __call__
-
-    def getPortalObject( self ):
-        return aq_parent( aq_inner( self ) )
-
-    def getIcon( self, relative=0 ):
-        return 'Tool: %s' % relative
-
-class DummySite( Acquisition.Implicit ):
-
-    def __init__( self, **kw ):
-        self.__dict__.update( kw )
-
-    def restrictedTraverse( self, path ):
-        return path and getattr( self, path ) or self
-
-    def getIcon( self, relative=0 ):
-        return 'Site: %s' % relative
-
-class FavoriteTests( unittest.TestCase ):
+class FavoriteTests( TestCase ):
 
     def setUp( self ):
-
         self.tool = DummyURLTool()
         self.site = DummySite( portal_url=self.tool )
 
     def _makeOne( self, *args, **kw ):
 
-        from Products.CMFDefault.Favorite import Favorite
-
         f = apply( Favorite, args, kw )
         return f.__of__( self.site )
 
@@ -101,13 +75,9 @@
 
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( unittest.makeSuite( FavoriteTests ) )
-    return suite
-
-def run():
-    unittest.TextTestRunner().run(test_suite())
+    return TestSuite((
+        makeSuite( FavoriteTests ),
+        ))
 
 if __name__ == '__main__':
-    run()
-
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_Image.py 1.3 => 1.3.4.1 ===
+import Zope
+from unittest import TestCase, TestSuite, makeSuite, main
+
+import os, cStringIO
 
 from Products.CMFDefault.Image import Image
 from Products.CMFDefault import tests
@@ -6,14 +9,7 @@
 TESTS_HOME = tests.__path__[0]
 TEST_JPG = os.path.join(TESTS_HOME, 'TestImage.jpg')
 
-
-class TestImageElement(unittest.TestCase):
-
-    def setUp( self ):
-        get_transaction().begin()
-
-    def tearDown( self ):
-        get_transaction().abort()
+class TestImageElement(TestCase):
 
     def test_EditWithEmptyFile(self):
         """ Test handling of empty file uploads """
@@ -34,19 +30,10 @@
         assert image.get_size() == testfilesize
         
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(TestImageElement))
+    return TestSuite((
+        makeSuite(TestImageElement),
+        ))
     return suite
 
-def run():
-    suite = test_suite()
-    return unittest.TextTestRunner().run(suite)
-
 if __name__ == '__main__':
-    import sys
-    result = run()
-    if result.wasSuccessful():
-        sys.exit(0)
-    else:
-        sys.exit(1)
-        
+    main(defaultTest='test_suite')        


=== CMF/CMFDefault/tests/test_Link.py 1.4 => 1.4.4.1 ===
+import Zope
+from unittest import TestCase, TestSuite, makeSuite, main
+
+from re import compile
+
 from Products.CMFDefault.Link import Link
 
 BASIC_STRUCTUREDTEXT = '''\
@@ -18,7 +22,7 @@
 http://www.zope.org
 '''
 
-class LinkTests(unittest.TestCase):
+class LinkTests(TestCase):
 
     def test_Empty( self ):
         d = Link( 'foo' )
@@ -42,7 +46,7 @@
 
         d = Link('foo')
         d._writeFromPUT( body=STX_W_CONTINUATION )
-        rnlinesplit = re.compile( r'\r?\n?' )
+        rnlinesplit = compile( r'\r?\n?' )
         desc_lines = rnlinesplit.split( d.Description() )
         
         self.assertEqual( d.Title(), 'Zope Community' )
@@ -67,11 +71,10 @@
         self.assertEqual( d.getRemoteUrl(), 'http://baz.com' )
 
 
-
 def test_suite():
-    return unittest.makeSuite(LinkTests)
-
-def main():
-    unittest.TextTestRunner().run(test_suite())
+    return TestSuite((
+        makeSuite(LinkTests),
+        ))
 
-if __name__=='__main__': main()
+if __name__ == '__main__':
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_MetadataTool.py 1.2 => 1.2.34.1 ===
 import Zope
-import unittest, string
-from Products.CMFDefault.MetadataTool import *
+from unittest import TestCase, TestSuite, makeSuite, main
+
+from Products.CMFDefault.MetadataTool import \
+     MetadataElementPolicy, MetadataTool, ElementSpec, \
+     DEFAULT_ELEMENT_SPECS, MetadataError
+
 from Products.CMFDefault.DublinCore import DefaultDublinCoreImpl
 
-class TestMetadataElementPolicy( unittest.TestCase ):
+class TestMetadataElementPolicy( TestCase ):
 
     def setUp( self ):
-        get_transaction().begin()
         self.sv_policy = MetadataElementPolicy( 0 )
         self.mv_policy = MetadataElementPolicy( 1 )
 
     def tearDown( self ):
         del self.sv_policy
         del self.mv_policy
-        get_transaction().abort()
 
     def test_emptySV( self ):
         assert not self.sv_policy.isMultiValued()
@@ -52,7 +53,7 @@
         assert 'xxx' in self.mv_policy.allowedVocabulary()
         assert 'yyy' in self.mv_policy.allowedVocabulary()
 
-class TestElementSpec( unittest.TestCase ):
+class TestElementSpec( TestCase ):
 
     def setUp( self ):
         self.sv_spec    = ElementSpec( 0 )
@@ -91,7 +92,7 @@
     def Type( self ):
         return 'Bar'
 
-class TestMetadataTool( unittest.TestCase ):
+class TestMetadataTool( TestCase ):
 
     def setUp( self ):
         self.tool = MetadataTool()
@@ -358,13 +359,11 @@
 
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( unittest.makeSuite( TestMetadataElementPolicy ) )
-    suite.addTest( unittest.makeSuite( TestElementSpec ) )
-    suite.addTest( unittest.makeSuite( TestMetadataTool ) )
-    return suite
-
-def main():
-    unittest.TextTestRunner().run(test_suite())
+    return TestSuite((
+        makeSuite(TestMetadataElementPolicy),
+        makeSuite(TestElementSpec),
+        makeSuite(TestMetadataTool),
+        ))
 
-if __name__=='__main__': main()
+if __name__ == '__main__':
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_NewsItem.py 1.4 => 1.4.28.1 ===
-from utils import fakeRequest, fakeResponse
+from unittest import makeSuite, main
+
 from Products.CMFDefault.NewsItem import NewsItem
-#" 
-DOCTYPE = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'''
 
-BASIC_HTML = '''\
-<html>
- <head>
-  <title>Title in tag</title>
-  <meta name="description" content="Describe me">
-  <meta name="contributors" content="foo@bar.com; baz@bam.net">
- </head>
- <body bgcolor="#ffffff">
-  <h1>Not a lot here</h1>
- </body>
-</html>
-'''
-
-ENTITY_IN_TITLE = '''\
-<html>
- <head>
-  <title>&Auuml;rger</title>
- </head>
- <bOdY>
-  <h2>Not a lot here either</h2>
- </bodY>
-</html>
-'''
-
-BASIC_STRUCTUREDTEXT = '''\
-Title: My NewsItem
-Description: A news item by me
-Contributors: foo@bar.com; baz@bam.net; no@yes.maybe
-
-This is the header and it supercedes the title
-
-  Body body body body body
-  body body body.
-
-   o What does this do
-   
-   o if it happens to you?
-'''
+from Products.CMFCore.tests.base.testcase import \
+     RequestTest
 
-class NewsItemTests(unittest.TestCase):
+from Products.CMFCore.tests.base.content import \
+     DOCTYPE, BASIC_HTML, ENTITY_IN_TITLE, BASIC_STRUCTUREDTEXT
 
-    def setUp( self ):
-        get_transaction().begin()
+class NewsItemTests(RequestTest):
 
-    def tearDown( self ):
-        get_transaction().abort()
+    def setUp(self):
+        RequestTest.setUp(self)
+        self.d = NewsItem('foo')
 
     def test_Empty(self):
         d = NewsItem('foo', text_format='structured-text')
@@ -59,91 +22,80 @@
         assert d.text_format == 'structured-text'
 
     def test_BasicHtml(self):
-        REQUEST = fakeRequest()
-        REQUEST['BODY']=BASIC_HTML
-        d = NewsItem('foo')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        self.REQUEST['BODY']=BASIC_HTML
+        d = self.d
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Format() == 'text/html', d.Format()
         assert d.title == 'Title in tag'
-        assert string.find(d.text, '</body>') == -1
+        self.assertEqual(d.text.find('</body>'),-1)
         assert d.Description() == 'Describe me'
-        assert len(d.Contributors()) == 2
+        self.assertEqual(len(d.Contributors()),3)
 
     def test_UpperedHtml(self):
-        REQUEST = fakeRequest()
-        REQUEST['BODY'] = string.upper(BASIC_HTML)
-        d = NewsItem('foo')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        self.REQUEST['BODY'] = BASIC_HTML.upper()
+        d = self.d
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Format() == 'text/html'
         assert d.title == 'TITLE IN TAG'
-        assert string.find(d.text, '</BODY') == -1
+        self.assertEqual( d.text.find('</BODY'),-1)
         assert d.Description() == 'DESCRIBE ME'
-        assert len(d.Contributors()) == 2
+        assert len(d.Contributors()) == 3
 
     def test_EntityInTitle(self):
-        REQUEST = fakeRequest()
-        REQUEST['BODY'] = ENTITY_IN_TITLE
-        d = NewsItem('foo')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        self.REQUEST['BODY'] = ENTITY_IN_TITLE
+        d = self.d
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.title == '&Auuml;rger', "Title '%s' being lost" % (
             d.title )
 
     def test_HtmlWithDoctype(self):
-        REQUEST = fakeRequest()
-        d = NewsItem('foo')
-        REQUEST['BODY'] = '%s\n%s' % (DOCTYPE, BASIC_HTML)
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        d = self.d
+        self.REQUEST['BODY'] = '%s\n%s' % (DOCTYPE, BASIC_HTML)
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Description() == 'Describe me'
 
     def test_HtmlWithoutNewlines(self):
-        REQUEST = fakeRequest()
-        d = NewsItem('foo')
-        REQUEST['BODY'] = string.join(string.split(BASIC_HTML, '\n'), '')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        d = self.d
+        self.REQUEST['BODY'] = ''.join(BASIC_HTML.split('\n'))
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Format() == 'text/html'
         assert d.Description() == 'Describe me'
 
     def test_StructuredText(self):
-        REQUEST = fakeRequest()
-        REQUEST['BODY'] = BASIC_STRUCTUREDTEXT
-        d = NewsItem('foo')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        self.REQUEST['BODY'] = BASIC_STRUCTUREDTEXT
+        d = self.d
+        d.PUT(self.REQUEST, self.RESPONSE)
         
         assert d.Format() == 'text/plain'
-        assert d.Title() == 'My NewsItem'
-        assert d.Description() == 'A news item by me'
+        self.assertEqual(d.Title(),'My Document')
+        self.assertEqual(d.Description(),'A document by me')
         assert len(d.Contributors()) == 3
-        assert string.find(d.cooked_text, '<p>') >= 0
+        self.failUnless(d.cooked_text.find('<p>') >= 0)
 
     def test_Init(self):
-        REQUEST = fakeRequest()
-        REQUEST['BODY'] = BASIC_STRUCTUREDTEXT
+        self.REQUEST['BODY'] = BASIC_STRUCTUREDTEXT
         d = NewsItem('foo', text='')
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Format() == 'text/plain'
-        assert d.Title() == 'My NewsItem', d.Title()
-        assert d.Description() == 'A news item by me'
+        self.assertEqual(d.Title(),'My Document')
+        self.assertEqual(d.Description(),'A document by me')
         assert len(d.Contributors()) == 3
-        assert string.find(d.cooked_text, '<p>') >= 0
+        self.failUnless(d.cooked_text.find('<p>') >= 0)
 
         d = NewsItem('foo', text='')
-        REQUEST['BODY'] = BASIC_HTML
-        d.PUT(REQUEST, RESPONSE=fakeResponse())
+        self.REQUEST['BODY'] = BASIC_HTML
+        d.PUT(self.REQUEST, self.RESPONSE)
         assert d.Format() == 'text/html'
         assert d.Title() == 'Title in tag'
-        assert len(d.Contributors()) == 2
+        assert len(d.Contributors()) == 3
 
         d = NewsItem('foo', text_format='structured-text', title='Foodoc')
         assert d.text == ''
         assert d.title == 'Foodoc'
         assert d.Format() == 'text/plain'
 
-
-
 def test_suite():
-    return unittest.makeSuite(NewsItemTests)
-
-def main():
-    unittest.TextTestRunner().run(test_suite())
+    return makeSuite(NewsItemTests)
 
-if __name__=='__main__': main()
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_all.py 1.10 => 1.10.4.1 ===
-import unittest
-
-from Products.CMFDefault.tests import test_Discussions
-from Products.CMFDefault.tests import test_Document
-from Products.CMFDefault.tests import test_NewsItem
-from Products.CMFDefault.tests import test_Link
-from Products.CMFDefault.tests import test_Favorite
-from Products.CMFDefault.tests import test_Image
-from Products.CMFDefault.tests import test_MetadataTool
-from Products.CMFDefault.tests import test_utils
-# test_join is broken, because it tries to use a shortcut.
-#from Products.CMFDefault.tests import test_join  
+from unittest import main
+from Products.CMFCore.tests.base.utils import build_test_suite
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( test_Discussions.test_suite() )
-    suite.addTest( test_Document.test_suite() )
-    suite.addTest( test_NewsItem.test_suite() )
-    suite.addTest( test_Link.test_suite() )
-    suite.addTest( test_Favorite.test_suite() )
-    suite.addTest( test_Image.test_suite() )
-    suite.addTest( test_MetadataTool.test_suite() )
-    suite.addTest( test_utils.test_suite() )
-    #suite.addTest( test_join.test_suite() )
-    return suite
 
-def run():
-    if hasattr( unittest, 'JUnitTextTestRunner' ):
-        unittest.JUnitTextTestRunner().run( test_suite() )
-    else:
-        unittest.TextTestRunner( verbosity=0 ).run( test_suite() )
+    return build_test_suite('Products.CMFDefault.tests',[
+        'test_Discussions',
+        'test_Document',
+        'test_NewsItem',
+        'test_Link',
+        'test_Favorite',
+        'test_Image',
+        'test_MetadataTool',
+        'test_utils',
+        'test_join',
+        ])
 
 if __name__ == '__main__':
-    run()
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_join.py 1.3 => 1.3.30.1 ===
-import unittest
-import Products.CMFCore
-import Products.CMFDefault
-
-class MembershipTests( unittest.TestCase ):
-
-    def setUp( self ):
-        get_transaction().begin()
-        self.connection = Zope.DB.open()
-        self.root = self.connection.root()[ 'Application' ]
-
-    def tearDown( self ):
-        get_transaction().abort()
-        self.connection.close()
+from unittest import TestSuite, makeSuite, main
+
+from Products.CMFCore.tests.base.testcase import \
+     TransactionalTest
+
+class MembershipTests( TransactionalTest ):
 
     def test_join( self ):
         self.root.manage_addProduct[ 'CMFDefault' ].manage_addCMFSite( 'site' )
@@ -27,12 +19,9 @@
 
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( unittest.makeSuite( MembershipTests ) )
-    return suite
-
-def run():
-    unittest.TextTestRunner().run(test_suite())
+    return TestSuite((
+        makeSuite(MembershipTests),
+        ))
 
 if __name__ == '__main__':
-    run()
+    main(defaultTest='test_suite')


=== CMF/CMFDefault/tests/test_utils.py 1.4 => 1.4.34.1 ===
+from unittest import TestCase,makeSuite,main
+
 from Products.CMFDefault.utils import parseHeadersBody
-from string import split
 
-class DefaultUtilsTests(unittest.TestCase):
+class DefaultUtilsTests(TestCase):
     COMMON_HEADERS = '''Author: Tres Seaver
 Title: Test Products.PTKDemo.utils.parseHeadersBody'''
 
@@ -15,12 +15,6 @@
 Header: value
 '''
 
-    def setUp( self ):
-        get_transaction().begin()
-
-    def tearDown( self ):
-        get_transaction().abort()
-    
     def test_NoBody( self ):
         headers, body = parseHeadersBody( '%s\n\n' % self.COMMON_HEADERS )
         assert( len( headers ) == 2, '%d!' % len( headers ) )
@@ -37,7 +31,7 @@
                                         )
         assert( len( headers ) == 3, '%d!' % len( headers )  )
         assert( 'Description' in headers.keys() )
-        desc_len = len( split( headers[ 'Description' ], '\n' ) )
+        desc_len = len( headers[ 'Description' ].split('\n') )
         assert( desc_len == 2, '%d!' % desc_len )
         assert( len( body ) == 0, '%d!' % len( body ) )
     
@@ -64,8 +58,8 @@
         assert( preloaded[ 'text_format' ] == headers[ 'text_format' ] )
 
 def test_suite():
-    return unittest.makeSuite(DefaultUtilsTests)
+    return makeSuite(DefaultUtilsTests)
 
 if __name__ == '__main__':
-    result = unittest.TextTestRunner().run(test_suite())
+    main(defaultTest='test_suite')
 

=== Removed File CMF/CMFDefault/tests/utils.py ===