[IMP] document_ftp: improve/sanitize transaction management during tests
authorOlivier Dony <odo@openerp.com>
Wed, 30 Nov 2011 12:02:44 +0000 (13:02 +0100)
committerOlivier Dony <odo@openerp.com>
Wed, 30 Nov 2011 12:02:44 +0000 (13:02 +0100)
Now that spurious commits were removed in document module,
the test would not run properly anymore.
We do need special care with transactions when we test the
FTP layer because operations on the virtual FS are done
in their own transaction, and immediately committed.
In order for test code and FTP operations to be able
to see each other, the transactions need to be synchronized.
The current test transaction needs to be rolled back
or committed after reach FTP operation so it can "see" the
latest changes in the database. Similarly, we must force
a commit of the test transaction whenever we want the
FTP layer to be able to see its effects.

bzr revid: odo@openerp.com-20111130120244-3m15sxdx1x5x1q1x

addons/document_ftp/test/document_ftp_test2.yml
addons/document_ftp/test/document_ftp_test4.yml

index 33ce141..eb86a99 100644 (file)
         fdata = StringIO('abcd')
         ftp.storbinary('STOR test2.txt', fdata)
         ftp.close()
-        cr.commit()
 -
     I look for the "test2.txt" file at the server
 -
     !python {model: ir.attachment }: |
+        cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
         ids = self.search(cr, uid, [('name', '=', 'test2.txt')])
         assert ids, "No test2.txt file found."
 -
         ftp = te.get_ftp_folder(cr, uid, self, 'Documents')
         ftp.delete('test2.txt')
         ftp.close()
-        cr.commit()
 -
     I check at the server that test2.txt is deleted
 -
     !python {model: ir.attachment }: |
+        cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
         ids = self.search(cr, uid, [('name', '=', 'test2.txt')])
         assert not ids, "test2.txt file can still be found."
 -
         fdata = StringIO('abcd')
         ftp.storbinary('STOR test2.txt', fdata)
         ftp.close()
-        cr.commit()
+        cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
 -
     I delete the test2.txt from the server (RPC).
 -
index 0a3ff33..9b311f6 100644 (file)
@@ -4,7 +4,6 @@
     !python {model: ir.attachment}: |
         from document_ftp import test_easyftp as te
         ftp = te.get_plain_ftp(timeout=1.0)
-        cr.commit()
 - |
     I create two partners 'Partner1' and 'Partner2'.
     I create three partner categories: 'none', 'pat1' and 'all'
@@ -54,7 +53,6 @@
         dirs = ftp.nlst()
         for dir in [ 'All Partner1+2', 'No partners', 'Pat 1' ]:
             assert dir in dirs, "Dir %s not in folder" % dir
-        cr.commit()
 -
     I create a 'partners' folder by the first resource one.
 -
@@ -66,6 +64,8 @@
         domain: "[('category_id','in',[active_id])]"
         ressource_parent_type_id : base.model_res_partner_category
 -
+    I commit (because FTP operations are on different transaction)
+-
     !python {model: document.directory, id: }: |
         cr.commit()
 -
@@ -81,7 +81,6 @@
         for dir in correct:
             res = ftp.nlst(dir+'/Partners of Test')
             assert res == correct[dir], "Dir %s falsely contains %s" %(dir, res)
-        cr.commit()
 -
     I create an ir.attachment, attached (not related) to Partner1
 -
         res_model: res.partner
         res_id:  !eval ref("tpartner1")
 -
+    I commit (because FTP operations are on different transaction)
+-
+    !python {model: document.directory, id: }: |
+        cr.commit()
+-
     I check that pat1/Partner1 folder has the file.
     I check that all/Partner1 folder has the file
 -
         ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Partners Testing/Pat 1/Partners of Test/Partner 1')
         fdata = StringIO('abcd')
         ftp.storbinary('STOR pat1-dynamic.txt', fdata)
+        cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
 -
     I check at the server that the file is attached to Partner1
 -
         from cStringIO import StringIO
         ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Partners Testing/Pat 1/Partners of Test/Partner 1')
         ftp.delete('pat1-dynamic.txt')
-        ftp.close()        
+        ftp.close()
+        cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
     
 -
     I delete the Partners Testing folder,  "File of pat1" file, Partner and Partner category.
         partner_categ_pool.unlink(cr, uid, [ref('tpat_categ_all')])
         partner_pool.unlink(cr, uid, [ref('tpartner1')])
         partner_pool.unlink(cr, uid, [ref('tpartner_2')])
-        cr.commit()    
+        cr.commit() #required because all the operations via FTP were committed