From e0da436c0e6d73de25593649ddfb5c7a1a297493 Mon Sep 17 00:00:00 2001 From: Yusei Tahara <yusei@nexedi.com> Date: Fri, 21 Dec 2007 17:03:46 +0000 Subject: [PATCH] Updated unittest. Use file contribution(uploading from contribution tool) and file upload(uploading from view form) instead of using file upload dialog. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@18476 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5OOo/tests/testIngestion.py | 134 +++++++++++++++--- .../tests/test_document/ANOTHE-en-001.doc | Bin 0 -> 104960 bytes .../test_document/TEST-en-002-modified.doc | Bin 0 -> 104448 bytes 3 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 product/ERP5OOo/tests/test_document/ANOTHE-en-001.doc create mode 100644 product/ERP5OOo/tests/test_document/TEST-en-002-modified.doc diff --git a/product/ERP5OOo/tests/testIngestion.py b/product/ERP5OOo/tests/testIngestion.py index 9140468995..0aed3cdd1b 100644 --- a/product/ERP5OOo/tests/testIngestion.py +++ b/product/ERP5OOo/tests/testIngestion.py @@ -319,6 +319,8 @@ class TestIngestion(ERP5TypeTestCase): # PDF has not implemented _convertToBaseFormat() so can not be converted self.assertEquals(context.getExternalProcessingState(), 'uploaded') else: + if context.getExternalProcessingState()=='uploaded': + import pdb;pdb.set_trace() self.assertEquals(context.getExternalProcessingState(), 'converted') # this is how we know if it was ok or not self.assert_('magic' in context.SearchableText()) self.assert_('magic' in str(context.asText())) @@ -539,10 +541,18 @@ class TestIngestion(ERP5TypeTestCase): context = self.getDocument('one') return self.assertEquals(context.getExternalProcessingState(), 'uploaded') + def stepCheckConvertingState(self, sequence=None, sequence_list=None, **kw): + """ + Check if the document is in "converting" processing state + (ie. a file upload has been done and the document is converting) + """ + context = self.getDocument('one') + return self.assertEquals(context.getExternalProcessingState(), 'converting') + def stepCheckConvertedState(self, sequence=None, sequence_list=None, **kw): """ Check if the document is in "converted" processing state - (ie. a file upload has been done and the document has + (ie. a file conversion has been done and the document has been converted) """ context = self.getDocument('one') @@ -568,27 +578,74 @@ class TestIngestion(ERP5TypeTestCase): self.assertEquals(document.getRevision(), '1') document.reindexObject() get_transaction().commit() - self.tic() - def stepDialogUpload(self, sequence=None, sequence_list=None, **kw): + def stepUploadFromViewForm(self, sequence=None, sequence_list=None, **kw): """ - Upload a file using the dialog script Document_uploadFile - and make sure this increases the revision + Upload a file from view form and make sure this increases the revision """ context = self.getDocument('one') f = makeFileUpload('TEST-en-002.doc') revision = context.getRevision() - context.Document_uploadFile(file=f) + context.edit(file=f) + self.assertEquals(context.getRevision(), str(int(revision) + 1)) + context.reindexObject() + get_transaction().commit() + + def stepUploadTextFromContributionTool(self, sequence=None, sequence_list=None, **kw): + """ + Upload a file from contribution. + """ + f = makeFileUpload('TEST-en-002.doc') + self.portal.portal_contributions.newContent(id='one', file=f) + get_transaction().commit() + + def stepReuploadTextFromContributionTool(self, sequence=None, sequence_list=None, **kw): + """ + Upload a file from contribution form and make sure this update existing + document and don't make a new document. + """ + context = self.getDocument('one') + revision = context.getRevision() + number_of_document = len(self.portal.document_module.objectIds()) + self.assert_('This document is modified.' not in context.asText()) + + f = makeFileUpload('TEST-en-002-modified.doc') + f.filename = 'TEST-en-002.doc' + + self.portal.portal_contributions.newContent(file=f) + get_transaction().commit() + self.tic() + get_transaction().commit() self.assertEquals(context.getRevision(), str(int(revision) + 1)) + self.assert_('This document is modified.' in context.asText()) + self.assertEquals(len(self.portal.document_module.objectIds()), + number_of_document) + context.reindexObject() get_transaction().commit() + + def stepUploadAnotherTextFromContributionTool(self, sequence=None, sequence_list=None, **kw): + """ + Upload another file from contribution. + """ + f = makeFileUpload('ANOTHE-en-001.doc') + self.portal.portal_contributions.newContent(id='two', file=f) + + get_transaction().commit() self.tic() + get_transaction().commit() + + context = self.getDocument('two') + self.assert_('This is a another very interesting document.' in context.asText()) + self.assertEquals(context.getReference(), 'ANOTHE') + self.assertEquals(context.getVersion(), '001') + self.assertEquals(context.getLanguage(), 'en') def stepDiscoverFromFilename(self, sequence=None, sequence_list=None, **kw): """ - Upload a file using the dialog script Document_uploadFile. - This should trigger metadata discovery and we should have - basic coordinates immediately, from first stage. + Upload a file using contribution tool. This should trigger metadata + discovery and we should have basic coordinates immediately, + from first stage. """ context = self.getDocument('one') file_name = 'TEST-en-002.doc' @@ -605,7 +662,7 @@ class TestIngestion(ERP5TypeTestCase): self.assertEquals(property_dict['subject_list'], ['keywords']) # Then make sure metadata discovery works f = makeFileUpload(file_name) - context.Document_uploadFile(file=f) + context.edit(file=f) self.assertEquals(context.getReference(), 'TEST') self.assertEquals(context.getLanguage(), 'en') self.assertEquals(context.getVersion(), '002') @@ -639,7 +696,7 @@ class TestIngestion(ERP5TypeTestCase): """ context = self.getDocument('one') f = makeFileUpload('TEST-en-002.doc') - context.Document_uploadFile(file=f) + context.edit(file=f) get_transaction().commit() self.tic() # Then make sure content discover works @@ -990,11 +1047,13 @@ class TestIngestion(ERP5TypeTestCase): ,'stepCreateTextDocument' ,'stepCheckEmptyState' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' ,'stepCheckConvertedState' - ,'stepDialogUpload' + ,'stepUploadFromViewForm' + ,'stepCheckConvertingState' + ,'stepTic' ,'stepCheckConvertedState' - ,'stepDiscoverFromFilename' - ,'stepCheckConvertedContent' ] self.playSequence(step_list, quiet) @@ -1014,8 +1073,9 @@ class TestIngestion(ERP5TypeTestCase): if not run: return if not quiet: printAndLog('test_04_MetadataExtraction') step_list = [ 'stepCleanUp' - ,'stepCreateTextDocument' + ,'stepUploadTextFromContributionTool' ,'stepSetSimulatedDiscoveryScript' + ,'stepTic' ,'stepTestMetadataSetting' ] self.playSequence(step_list, quiet) @@ -1030,7 +1090,10 @@ class TestIngestion(ERP5TypeTestCase): if not quiet: printAndLog('test_04_MetadataEditing') step_list = [ 'stepCleanUp' ,'stepCreateTextDocument' - ,'stepDialogUpload' + ,'stepUploadFromViewForm' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepEditMetadata' ,'stepCheckChangedMetadata' ] @@ -1100,7 +1163,10 @@ class TestIngestion(ERP5TypeTestCase): if not quiet: printAndLog('test_07_SnapshotGeneration') step_list = [ 'stepCleanUp' ,'stepCreateTextDocument' - ,'stepDialogUpload' + ,'stepUploadFromViewForm' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepCheckHasNoSnapshot' ,'stepCreateSnapshot' ,'stepTryRecreateSnapshot' @@ -1149,22 +1215,37 @@ class TestIngestion(ERP5TypeTestCase): step_list = [ 'stepCleanUp' ,'stepCreateTextDocument' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepSetSimulatedDiscoveryScriptForOrdering' ,'stepCheckMetadataSettingOrderFICU' ,'stepCreateTextDocument' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepSetSimulatedDiscoveryScriptForOrdering' ,'stepCheckMetadataSettingOrderCUFI' ,'stepCreateTextDocument' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepSetSimulatedDiscoveryScriptForOrdering' ,'stepCheckMetadataSettingOrderUIFC' ,'stepCreateTextDocument' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepSetSimulatedDiscoveryScriptForOrdering' ,'stepCheckMetadataSettingOrderICUF' ,'stepCreateTextDocument' ,'stepStraightUpload' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' ,'stepSetSimulatedDiscoveryScriptForOrdering' ,'stepCheckMetadataSettingOrderUFCI' ] @@ -1186,6 +1267,25 @@ class TestIngestion(ERP5TypeTestCase): ] self.playSequence(step_list, quiet) + def test_12_UploadTextFromContributionTool(self, quiet=QUIET, run=RUN_ALL_TEST): + """ + Make sure that when upload file from contribution tool, it creates a new + document in document module. when reupload same filename file, then it + does not create a new document and update existing document. + """ + if not run: return + if not quiet: printAndLog('test_12_ReUploadSameFilenameFile') + step_list = [ 'stepCleanUp' + ,'stepUploadTextFromContributionTool' + ,'stepCheckConvertingState' + ,'stepTic' + ,'stepCheckConvertedState' + ,'stepDiscoverFromFilename' + ,'stepTic' + ,'stepReuploadTextFromContributionTool' + ,'stepUploadAnotherTextFromContributionTool' + ] + self.playSequence(step_list, quiet) # Missing tests """ diff --git a/product/ERP5OOo/tests/test_document/ANOTHE-en-001.doc b/product/ERP5OOo/tests/test_document/ANOTHE-en-001.doc new file mode 100644 index 0000000000000000000000000000000000000000..0115ed73a78b857c44a5af900ef890562d51ea41 GIT binary patch literal 104960 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 literal 0 HcmV?d00001 diff --git a/product/ERP5OOo/tests/test_document/TEST-en-002-modified.doc b/product/ERP5OOo/tests/test_document/TEST-en-002-modified.doc new file mode 100644 index 0000000000000000000000000000000000000000..c2c4ae26d0a2160cbd660c9f4b737f25fa99482c GIT binary patch literal 104448 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 literal 0 HcmV?d00001 -- 2.30.9