[Zope-Checkins] SVN: Zope/branches/2.9/ - Collector #2062: Fix manage_historyCopy, which was broken, and write tests for it.

Chris Withers chris at simplistix.co.uk
Mon May 1 11:39:49 EDT 2006


Log message for revision 67804:
  - Collector #2062: Fix manage_historyCopy, which was broken, and write tests for it.
  
  

Changed:
  U   Zope/branches/2.9/doc/CHANGES.txt
  U   Zope/branches/2.9/lib/python/OFS/History.py
  A   Zope/branches/2.9/lib/python/OFS/tests/testHistory.py

-=-
Modified: Zope/branches/2.9/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.9/doc/CHANGES.txt	2006-05-01 15:20:47 UTC (rev 67803)
+++ Zope/branches/2.9/doc/CHANGES.txt	2006-05-01 15:39:48 UTC (rev 67804)
@@ -18,6 +18,9 @@
 
    Bugs fixed
 
+      - Collector #2062: Fix manage_historyCopy, which was broken, and write
+        tests for it.
+
       - Collector #2061: Fix problems where windows line endings are passed
         to restricted code compilers.
 

Modified: Zope/branches/2.9/lib/python/OFS/History.py
===================================================================
--- Zope/branches/2.9/lib/python/OFS/History.py	2006-05-01 15:20:47 UTC (rev 67803)
+++ Zope/branches/2.9/lib/python/OFS/History.py	2006-05-01 15:39:48 UTC (rev 67804)
@@ -144,15 +144,12 @@
         if serial != self._p_serial:
             self.manage_beforeHistoryCopy()
             state=self._p_jar.oldstate(self, serial)
-            # Scrub the object before restoring the old state
             base = aq_base(self)
-            base._p_changed=0
-            base._p_deactivate()
-            base.__setstate__(state)
-            base._p_changed=1
-
+            base._p_activate()       # make sure we're not a ghost 
+            base.__setstate__(state) # change the state
+            base._p_changed = True   # marke object as dirty 
             self.manage_afterHistoryCopy()
-
+            
         if RESPONSE is not None and URL1 is not None:
             RESPONSE.redirect(URL1+'/manage_workspace')
 

Added: Zope/branches/2.9/lib/python/OFS/tests/testHistory.py
===================================================================
--- Zope/branches/2.9/lib/python/OFS/tests/testHistory.py	2006-05-01 15:20:47 UTC (rev 67803)
+++ Zope/branches/2.9/lib/python/OFS/tests/testHistory.py	2006-05-01 15:39:48 UTC (rev 67804)
@@ -0,0 +1,97 @@
+import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
+import os
+import shutil
+import transaction
+import tempfile
+import ZODB
+
+from OFS.Application import Application
+from Products.PythonScripts.PythonScript import manage_addPythonScript
+from ZODB.FileStorage import FileStorage
+
+class HistoryTests(unittest.TestCase):
+
+    def setUp(self):
+        # set up a zodb
+        # we can't use DemoStorage here 'cos it doesn't support History
+        self.dir = tempfile.mkdtemp()
+        self.s = FileStorage(os.path.join(self.dir,'testHistory.fs'),create=True)
+        self.connection = ZODB.DB(self.s).open()
+        r = self.connection.root()
+        a = Application()
+        r['Application'] = a
+        self.root = a
+        # create a python script
+        manage_addPythonScript(a,'test')
+        self.ps = ps = a.test
+        # commit some changes
+        ps.write('return 1')
+        t = transaction.get()
+        # undo note made by Application instantiation above.
+        t.description = None 
+        t.note('Change 1')
+        t.commit()
+        ps.write('return 2')
+        t = transaction.get()
+        t.note('Change 2')
+        t.commit()
+        ps.write('return 3')
+        t = transaction.get()
+        t.note('Change 3')
+        t.commit()
+
+    def tearDown(self):
+        # get rid of ZODB
+        transaction.abort()
+        self.connection.close()
+        self.s.close()
+        del self.root
+        del self.connection
+        del self.s
+        shutil.rmtree(self.dir)
+        
+    def test_manage_change_history(self):
+        r = self.ps.manage_change_history()
+        self.assertEqual(len(r),3) # three transactions
+        for i in range(3):
+            entry = r[i]
+            # check no new keys show up without testing
+            self.assertEqual(len(entry.keys()),7)
+            # the transactions are in newest-first order
+            self.assertEqual(entry['description'],'Change %i' % (3-i))
+            self.failUnless('key' in entry) 
+            # lets not assume the size will stay the same forever
+            self.failUnless('size' in entry) 
+            self.failUnless('tid' in entry) 
+            self.failUnless('time' in entry) 
+            if i:
+                # check times are increasing
+                self.failUnless(entry['time']<r[i-1]['time'])
+            self.assertEqual(entry['user_name'],'')
+            self.assertEqual(entry['version'],'')
+            
+    def test_manage_historyCopy(self):
+        # we assume this works 'cos it's tested above
+        r = self.ps.manage_change_history()
+        # now we do the copy
+        self.ps.manage_historyCopy(
+            keys=[r[2]['key']]
+                  )
+        # do a commit, just like ZPublisher would
+        transaction.commit()
+        # check the body is as it should be, we assume (hopefully not foolishly)
+        # that all other attributes will behave the same
+        self.assertEqual(self.ps._body,
+                         'return 1\n')
+                                
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest( unittest.makeSuite( HistoryTests ) )
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/branches/2.9/lib/python/OFS/tests/testHistory.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Zope-Checkins mailing list