From e1ec9fc90d271674de2f0f0f7158261e2ec6bf0c Mon Sep 17 00:00:00 2001
From: Serghei Mihai <smihai@entrouvert.com>
Date: Wed, 28 Aug 2019 17:00:54 +0200
Subject: [PATCH] astregs: return only valid mobile number in linking means
 (#35641)

---
 passerelle/apps/astregs/models.py             | 37 +++++++++++----
 tests/data/astregs/Contact.xml                |  2 +-
 .../ContactWithInternationalMobile.xml        |  1 +
 tests/data/astregs/ContactWithWrongMobile.xml |  1 +
 tests/test_astregs.py                         | 46 +++++++++++++++++--
 5 files changed, 71 insertions(+), 16 deletions(-)
 create mode 100644 tests/data/astregs/ContactWithInternationalMobile.xml
 create mode 100644 tests/data/astregs/ContactWithWrongMobile.xml

diff --git a/passerelle/apps/astregs/models.py b/passerelle/apps/astregs/models.py
index 7dc69281..a8e2dbfe 100644
--- a/passerelle/apps/astregs/models.py
+++ b/passerelle/apps/astregs/models.py
@@ -385,7 +385,7 @@ class AstreGS(BaseResource):
         if NameID and Link.objects.filter(resource=self, name_id=NameID,
                                           association_id=association_id).exists():
                 response['already_paired'] = True
-        data = []
+        response['data'] = []
         # assocation contact is defined in EncodeKeyContact attribute
         if not r.EncodeKeyContact:
             return {'data': data}
@@ -393,17 +393,34 @@ class AstreGS(BaseResource):
         r = self.call('Contact', 'Chargement',
                       ContactCle={'idContact': r.EncodeKeyContact}
         )
+        response['raw_data'] = serialize_object(r)
         if r.AdresseMail:
-            data.append({'id': 'email',
-                         'text': 'par courriel vers %s***@***%s' % (r.AdresseMail[:2], r.AdresseMail[-3:]),
-                         'value': r.AdresseMail,
-                         'type': 'email'})
+            response['data'].append({'id': 'email',
+                                     'text': 'par courriel vers %s***@***%s' % (
+                                         r.AdresseMail[:2],
+                                         r.AdresseMail[-3:]),
+                                     'value': r.AdresseMail,
+                                     'type': 'email'})
         if r.TelephoneMobile:
-            data.append({'id': 'mobile',
-                         'text': 'par SMS vers %s****%s' % (r.TelephoneMobile[:2], r.TelephoneMobile[-3:]),
-                         'value': r.TelephoneMobile,
-                         'type': 'mobile'})
-        response['data'] = data
+            mobile = ''.join((n for n in r.TelephoneMobile if n.isdigit()))
+
+            # remove international prefix marker
+            if mobile.startswith('00'):
+                mobile = mobile[2:]
+
+            if mobile.startswith('33'):
+                mobile = '0' + mobile[2:]
+
+            if not mobile or len(mobile) != 10:
+                return response
+
+            if mobile[:2] in ('06', '07'):
+                response['data'].append({'id': 'mobile',
+                                         'text': 'par SMS vers %s*****%s' % (
+                                             mobile[:2],
+                                             mobile[-3:]),
+                                         'value': mobile,
+                                         'type': 'mobile'})
         return response
 
     @endpoint(description=_('Create link between user and association'),
diff --git a/tests/data/astregs/Contact.xml b/tests/data/astregs/Contact.xml
index fec6cf14..18bd65b9 100644
--- a/tests/data/astregs/Contact.xml
+++ b/tests/data/astregs/Contact.xml
@@ -1 +1 @@
-<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>MARTIN</ns1:Nom><ns1:Prenom>Jean-Marc</ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&amp;#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>0660909980</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>jeanmarcallan@neuf.fr</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Jean-Marc MARTIN</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
+<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>FOO</ns1:Nom><ns1:Prenom>Foo-Marc</ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&amp;#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>06 67 78 89 90</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>foo@example.com</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Foo FOO</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
diff --git a/tests/data/astregs/ContactWithInternationalMobile.xml b/tests/data/astregs/ContactWithInternationalMobile.xml
new file mode 100644
index 00000000..4ad8278a
--- /dev/null
+++ b/tests/data/astregs/ContactWithInternationalMobile.xml
@@ -0,0 +1 @@
+<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>Bar</ns1:Nom><ns1:Prenom></ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&amp;#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>00 33 7 02 03 04 05</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>foo@example.com</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Foo-Marc</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
diff --git a/tests/data/astregs/ContactWithWrongMobile.xml b/tests/data/astregs/ContactWithWrongMobile.xml
new file mode 100644
index 00000000..2e1fb13c
--- /dev/null
+++ b/tests/data/astregs/ContactWithWrongMobile.xml
@@ -0,0 +1 @@
+<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>Bar</ns1:Nom><ns1:Prenom></ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&amp;#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>+33 01 02 03 04 05</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>foo@example.com</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Foo-Marc</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
diff --git a/tests/test_astregs.py b/tests/test_astregs.py
index 7571a9d0..1af79f04 100644
--- a/tests/test_astregs.py
+++ b/tests/test_astregs.py
@@ -130,18 +130,54 @@ def test_association_linking_means(mocked_post, mocked_get, client, connector, a
     resp = app.get('/astregs/test/get-association-link-means', params={'association_id': '42'})
     assert len(resp.json['data']) == 2
     assert resp.json['already_paired'] == False
-    for result in resp.json['data']:
-        assert 'id' in result
-        assert 'text' in result
-        assert 'type' in result
-        assert 'value' in result
+    assert resp.json['data'][0] == {
+        'id': 'email',
+        'text': 'par courriel vers fo***@***com',
+        'value': 'foo@example.com',
+        'type': 'email'
+    }
+    assert resp.json['data'][1] == {
+        'id': 'mobile',
+        'text': 'par SMS vers 06*****990',
+        'value': '0667788990',
+        'type': 'mobile'
+    }
+    assert 'raw_data' in resp.json
 
     Link.objects.create(name_id='user_name_id', association_id='42', resource=connector)
     resp = app.get('/astregs/test/get-association-link-means',
                    params={'association_id': '42', 'NameID': 'user_name_id'})
     assert resp.json['already_paired'] == True
 
+    mocked_post.side_effect = [
+        mock.Mock(content=get_xml_file('Tiers.xml'), status_code=200,
+                  headers={'Content-Type': 'text/xml'}),
+        mock.Mock(content=get_xml_file('ContactWithWrongMobile.xml'),
+                  status_code=200, headers={'Content-Type': 'text/xml'})
+    ]
+    resp = app.get('/astregs/test/get-association-link-means', params={'association_id': '42'})
+    assert len(resp.json['data']) == 1
+    assert resp.json['data'][0] == {
+        'id': 'email',
+        'text': 'par courriel vers fo***@***com',
+        'value': 'foo@example.com',
+        'type': 'email'
+    }
 
+    mocked_post.side_effect = [
+        mock.Mock(content=get_xml_file('Tiers.xml'), status_code=200,
+                  headers={'Content-Type': 'text/xml'}),
+        mock.Mock(content=get_xml_file('ContactWithInternationalMobile.xml'),
+                  status_code=200, headers={'Content-Type': 'text/xml'})
+    ]
+    resp = app.get('/astregs/test/get-association-link-means', params={'association_id': '42'})
+    assert len(resp.json['data']) == 2
+    assert resp.json['data'][1] == {
+        'id': 'mobile',
+        'text': 'par SMS vers 07*****405',
+        'value': '0702030405',
+        'type': 'mobile'
+    }
 
 @mock.patch('passerelle.utils.Request.get', side_effect=search_wsdl_side_effect)
 @mock.patch('passerelle.utils.Request.post', side_effect=contact_search_side_effect)
-- 
2.23.0

