From 5dc3a8b0ffdfd6cfd3796798cc69c95f252e8e82 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Wed, 2 Sep 2020 12:26:08 +0900
Subject: [PATCH] ZODB Components: erp5_credential: Migrate Unit Test.

---
 ...redentialRequest_checkLoginAvailability.py |   2 +
 .../test.erp5.testERP5Credential.py           |  36 +++---
 .../test.erp5.testERP5Credential.xml          | 110 ++++++++++++++++++
 .../bt/template_document_id_list              |   4 +-
 bt5/erp5_credential/bt/template_test_id_list  |   1 +
 bt5/erp5_credential/bt/test_dependency_list   |   6 +
 6 files changed, 139 insertions(+), 20 deletions(-)
 rename product/ERP5/tests/testERP5Credential.py => bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.py (98%)
 create mode 100644 bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.xml
 create mode 100644 bt5/erp5_credential/bt/template_test_id_list
 create mode 100644 bt5/erp5_credential/bt/test_dependency_list

diff --git a/bt5/erp5_credential/SkinTemplateItem/portal_skins/erp5_credential/CredentialRequest_checkLoginAvailability.py b/bt5/erp5_credential/SkinTemplateItem/portal_skins/erp5_credential/CredentialRequest_checkLoginAvailability.py
index dbd14db79c..6101f3b9c7 100644
--- a/bt5/erp5_credential/SkinTemplateItem/portal_skins/erp5_credential/CredentialRequest_checkLoginAvailability.py
+++ b/bt5/erp5_credential/SkinTemplateItem/portal_skins/erp5_credential/CredentialRequest_checkLoginAvailability.py
@@ -7,6 +7,8 @@ portal = context.getPortalObject()
 if value:
   # Same tag is used as in ERP5 Login _setReference, in order to protect against
   # concurrency between Credential Request and ERP5 Login object too
+  #
+  # XXX: value.encode('hex') may exceed 'tag' column length (255)...
   if context.getPortalObject().portal_activities.countMessageWithTag('set_login_' + value.encode('hex')):
     return False
 
diff --git a/product/ERP5/tests/testERP5Credential.py b/bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.py
similarity index 98%
rename from product/ERP5/tests/testERP5Credential.py
rename to bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.py
index e20980bf92..e1bc34b279 100644
--- a/product/ERP5/tests/testERP5Credential.py
+++ b/bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.py
@@ -165,7 +165,7 @@ class TestERP5Credential(ERP5TypeTestCase):
     self._enablePreference()
 
   # Copied from bt5/erp5_egov/TestTemplateItem/testEGovMixin.py
-  def decode_email(self, file):
+  def decode_email(self, file_):
     # Prepare result
     theMail = {
       'attachment_list': [],
@@ -174,9 +174,9 @@ class TestERP5Credential(ERP5TypeTestCase):
       'headers': {}
     }
     # Get Message
-    msg = email.message_from_string(file)
+    msg = email.message_from_string(file_)
     # Back up original file
-    theMail['__original__'] = file
+    theMail['__original__'] = file_
     # Recode headers to UTF-8 if needed
     for key, value in msg.items():
       decoded_value_list = decode_header(value)
@@ -188,7 +188,7 @@ class TestERP5Credential(ERP5TypeTestCase):
                    'to', 'from', 'cc', 'sender', 'reply-to'):
       header_field = theMail['headers'].get(header)
       if header_field:
-          theMail['headers'][header] = parseaddr(header_field)[1]
+        theMail['headers'][header] = parseaddr(header_field)[1]
     # Get attachments
     body_found = 0
     for part in msg.walk():
@@ -252,7 +252,9 @@ class TestERP5Credential(ERP5TypeTestCase):
     self.tic()
     self.logout()
 
-  def stepSetCredentialAssignmentPropertyList(self, sequence={}):
+  def stepSetCredentialAssignmentPropertyList(self, sequence=None):
+    if sequence is None:
+      sequence = {}
     category_list = sequence.get("category_list",
         ["role/internal", "function/member"])
     self.login()
@@ -321,8 +323,7 @@ class TestERP5Credential(ERP5TypeTestCase):
     from Products.PluggableAuthService.interfaces.plugins import\
                                                       IAuthenticationPlugin
     uf = self.getUserFolder()
-    for plugin_name, plugin in uf._getOb('plugins').listPlugins(
-                                IAuthenticationPlugin):
+    for _, plugin in uf._getOb('plugins').listPlugins(IAuthenticationPlugin):
       if plugin.authenticateCredentials(
                   {'login': login, 'password': password}) is not None:
         break
@@ -450,7 +451,6 @@ class TestERP5Credential(ERP5TypeTestCase):
     self._assertUserDoesNotExists('homie', 'secret')
 
     # check that informations on the person object have been updated
-    person_module = self.portal.getDefaultModule('Person')
     related_login_result = self.portal.portal_catalog(portal_type='ERP5 Login', reference='homie')
     self.assertEqual(len(related_login_result), 1)
     related_person = related_login_result[0].getParentValue()
@@ -742,7 +742,7 @@ class TestERP5Credential(ERP5TypeTestCase):
       Check an email containing the usernames list as been sent
     '''
     person_list = sequence.get('person_list')
-    email = sequence.get('default_email_text')
+    email_text = sequence.get('default_email_text')
     # after accept, only one email is send containing the reset link
     previous_message = self.portal.MailHost._previous_message
     last_message = self.portal.MailHost._last_message
@@ -760,7 +760,7 @@ class TestERP5Credential(ERP5TypeTestCase):
 
     # check the mail is sent to the requester :
     send_to = decoded_message['headers']['to']
-    self.assertEqual(email, send_to)
+    self.assertEqual(email_text, send_to)
 
   def stepCheckPasswordChange(self, sequence=None, sequence_list=None, **kw):
     """
@@ -782,7 +782,7 @@ class TestERP5Credential(ERP5TypeTestCase):
         url = line[line.find('http:'):]
     url = url.strip()
     self.assertNotEquals(url, None)
-    response = self.publish(url)
+    self.publish(url)
     parameters = cgi.parse_qs(urlparse.urlparse(url)[4])
     self.assertTrue('reset_key' in parameters)
     key = parameters['reset_key'][0]
@@ -1070,8 +1070,8 @@ class TestERP5Credential(ERP5TypeTestCase):
     mfrom, mto, message_text = last_message
     self.assertEqual(mfrom, 'Portal Administrator <postmaster@localhost>')
     self.assertEqual(['Vifib Test <barney@duff.com>'], mto)
-    self.assertNotEquals(re.search("Subject\:.*Welcome", message_text), None)
-    self.assertNotEquals(re.search("Hello\ Vifib\ Test\,", message_text), None)
+    self.assertNotEquals(re.search(r"Subject\:.*Welcome", message_text), None)
+    self.assertNotEquals(re.search(r"Hello\ Vifib\ Test\,", message_text), None)
     decoded_message = self.decode_email(last_message[2])
     body_message = decoded_message['body']
     self.assertNotEquals(re.search("key=%s" % mail_message.getReference(),
@@ -1178,7 +1178,7 @@ class TestERP5Credential(ERP5TypeTestCase):
     sequence = dict(automatic_call=True)
     self.stepSetCredentialRequestAutomaticApprovalPreferences(sequence)
     self.stepSetCredentialAssignmentPropertyList()
-    reference = self.id()
+    reference = self._testMethodName
     self.logout()
     response = self.portal.ERP5Site_newCredentialRequest(reference=reference,
         default_email_text='some@one.com',)
@@ -1238,7 +1238,7 @@ class TestERP5Credential(ERP5TypeTestCase):
 
   def test_no_reset_assignment_ERP5Site_newCredentialUpdate(self):
     """Checks that assignments are left intact after credential update"""
-    reference = self.id()
+    reference = self._testMethodName
     person = self.portal.person_module.newContent(portal_type='Person',
       reference=reference,
       role='internal')
@@ -1300,7 +1300,7 @@ class TestERP5Credential(ERP5TypeTestCase):
     sequence_list.play(self)
 
   def _prepareContractAndPreference(self):
-    self.contract_reference = self.id()
+    self.contract_reference = self._testMethodName
     self.contract_content = 'My contract %s.' % self.contract_reference
     preference = self._getPreference()
     preference.edit(
@@ -1389,13 +1389,13 @@ class TestERP5Credential(ERP5TypeTestCase):
     assignment.open()
     login = person.newContent(
         portal_type='ERP5 Login',
-        reference=self.id(),
+        reference=self._testMethodName,
         password='secret',
     )
     login.validate()
     self.tic()
 
-    ret = self.portal.ERP5Site_newCredentialRecovery(reference=self.id())
+    ret = self.portal.ERP5Site_newCredentialRecovery(reference=self._testMethodName)
     self.assertEqual(
       urlparse.parse_qs(urlparse.urlparse(ret).query)['portal_status_message'],
       ['We have sent you an email to enable you to reset your password. Please check your inbox and your junk/spam mail for this email and follow the link to reset your password.'],
diff --git a/bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.xml b/bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.xml
new file mode 100644
index 0000000000..7e5ae1168e
--- /dev/null
+++ b/bt5/erp5_credential/TestTemplateItem/portal_components/test.erp5.testERP5Credential.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Test Component" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>testERP5Credential</string> </value>
+        </item>
+        <item>
+            <key> <string>default_source_reference</string> </key>
+            <value> <string>Products.ERP5.tests.testERP5Credential</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>test.erp5.testERP5Credential</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Test Component</string> </value>
+        </item>
+        <item>
+            <key> <string>sid</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content_error_message</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content_warning_message</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>erp5</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>component_validation_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>validate</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>validated</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_credential/bt/template_document_id_list b/bt5/erp5_credential/bt/template_document_id_list
index 20d95496f3..b4cce87830 100644
--- a/bt5/erp5_credential/bt/template_document_id_list
+++ b/bt5/erp5_credential/bt/template_document_id_list
@@ -1,2 +1,2 @@
-document.erp5.CredentialRequest
-document.erp5.CredentialRecovery
\ No newline at end of file
+document.erp5.CredentialRecovery
+document.erp5.CredentialRequest
\ No newline at end of file
diff --git a/bt5/erp5_credential/bt/template_test_id_list b/bt5/erp5_credential/bt/template_test_id_list
new file mode 100644
index 0000000000..cbfae6a0a2
--- /dev/null
+++ b/bt5/erp5_credential/bt/template_test_id_list
@@ -0,0 +1 @@
+test.erp5.testERP5Credential
\ No newline at end of file
diff --git a/bt5/erp5_credential/bt/test_dependency_list b/bt5/erp5_credential/bt/test_dependency_list
new file mode 100644
index 0000000000..061c56658f
--- /dev/null
+++ b/bt5/erp5_credential/bt/test_dependency_list
@@ -0,0 +1,6 @@
+erp5_full_text_mroonga_catalog
+erp5_core_proxy_field_legacy
+erp5_jquery
+erp5_ingestion_mysql_innodb_catalog
+erp5_ingestion
+erp5_administration
\ No newline at end of file
-- 
2.30.9