Projet

Général

Profil

0002-toulouse_axel-update-family-endpoint-38124.patch

Lauréline Guérin, 19 décembre 2019 11:20

Télécharger (35,1 ko)

Voir les différences:

Subject: [PATCH 2/2] toulouse_axel: update family endpoint (#38124)

 functests/toulouse_axel/test_toulouse_axel.py |  24 +-
 passerelle/contrib/toulouse_axel/models.py    |  51 ++++-
 .../xsd/Dui/Q_FormMajFamilleDui.xsd           | 137 +++++++++++
 .../xsd/Dui/R_FormMajFamilleDui.xsd           |  21 ++
 .../flat_update_family_info.json              | 156 +++++++++++++
 .../toulouse_axel/update_family_info.json     | 214 ++++++++++++++++++
 tests/test_toulouse_axel.py                   | 112 +++++++--
 7 files changed, 700 insertions(+), 15 deletions(-)
 create mode 100644 passerelle/contrib/toulouse_axel/xsd/Dui/Q_FormMajFamilleDui.xsd
 create mode 100644 passerelle/contrib/toulouse_axel/xsd/Dui/R_FormMajFamilleDui.xsd
 create mode 100644 tests/data/toulouse_axel/flat_update_family_info.json
 create mode 100644 tests/data/toulouse_axel/update_family_info.json
functests/toulouse_axel/test_toulouse_axel.py
24 24
    url = conn + '/family_info?NameID=%s' % name_id
25 25
    resp = requests.get(url)
26 26
    resp.raise_for_status()
27
    data = resp.json()
28
    assert res['err'] == 0
29
    pprint.pprint(data)
30
    print('\n')
31

  
32
    payload = data['data']
33
    for key in ['SITUATIONFAMILIALE', 'NBENFANTACTIF', 'NBRLACTIF', 'IDDUI', 'CODEMISEAJOUR']:
34
        payload.pop(key)
35
    payload['N0TELEDOSSIER'] = '42'
36
    payload['DROITALIMAGE'] = 'NON'
37
    for key in ['MONTANTTOTAL', 'DATEVALIDITE', 'SFI', 'IREVENUS', 'RNF']:
38
        payload['REVENUS'].pop(key)
39
    payload['REVENUS']['CHOIXREVENU'] = ''
40
    for enfant in payload['ENFANT']:
41
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
42
            enfant.pop(key)
43
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
44

  
45
    print("Update family info with the following payload:")
46
    pprint.pprint(payload)
47
    url = conn + '/update_family_info?NameID=%s' % name_id
48
    resp = requests.post(url, json=payload)
49
    resp.raise_for_status()
27 50
    res = resp.json()
28 51
    assert res['err'] == 0
29 52
    pprint.pprint(res)
30 53
    print('\n')
31 54

  
32
    data = res
33 55
    for child in data['data']['ENFANT']:
34 56
        print("GET child info")
35 57
        url = conn + '/child_info?NameID=%s&idpersonne=%s' % (name_id, child['IDPERSONNE'])
passerelle/contrib/toulouse_axel/models.py
143 143

  
144 144
    def __call__(self, resource, request_data):
145 145
        client = resource.soap_client()
146

  
146 147
        serialized_request = ET.tostring(
147 148
            self.request_converter.encode(request_data))
149
        try:
150
            self.request_converter.xml_schema.validate(serialized_request)
151
        except xmlschema.XMLSchemaValidationError as e:
152
            raise AxelError('invalid request', str(e))
153

  
148 154
        result = client.service.getData(
149 155
            self.operation,
150 156
            force_text(serialized_request),
......
158 164
        try:
159 165
            return self.response_converter.decode(ET.fromstring(result))
160 166
        except xmlschema.XMLSchemaValidationError as e:
161
            raise AxelError('invalid response', e)
167
            raise AxelError('invalid response', str(e))
162 168

  
163 169

  
164 170
ref_verif_dui = Operation('RefVerifDui')
165 171
ref_famille_dui = Operation('RefFamilleDui')
172
form_maj_famille_dui = Operation('FormMajFamilleDui')
166 173
ref_facture_a_payer = Operation('RefFactureAPayer')
167 174
ref_facture_pdf = Operation('RefFacturePDF', prefix='')
168 175

  
......
188 195
    LINK_SCHEMA['properties'].pop('IDPERSONNE')
189 196
    LINK_SCHEMA['required'].remove('IDPERSONNE')
190 197

  
198
    UPDATE_FAMILY_SCHEMA = copy.deepcopy(
199
        form_maj_famille_dui.request_schema['properties']['PORTAIL']['properties']['DUI'])
200
    UPDATE_FAMILY_SCHEMA['properties'].pop('IDDUI')
201
    UPDATE_FAMILY_SCHEMA['properties'].pop('DATEDEMANDE')
202
    UPDATE_FAMILY_SCHEMA['properties'].pop('QUIACTUALISEDUI')
203
    UPDATE_FAMILY_SCHEMA['required'].remove('IDDUI')
204
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
205
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
206
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
207

  
191 208
    @endpoint(
192 209
        description=_('Lock a resource'),
193 210
        perm='can_access',
......
318 335

  
319 336
        raise APIError('Child not found', err='not-found')
320 337

  
338
    @endpoint(
339
        description=_("Update information about user's family"),
340
        perm='can_access',
341
        parameters={
342
            'NameID': {'description': _('Publik ID')},
343
        },
344
        post={
345
            'request_body': {
346
                'schema': {
347
                    'application/json': UPDATE_FAMILY_SCHEMA,
348
                }
349
            }
350
        })
351
    def update_family_info(self, request, NameID, post_data):
352
        try:
353
            link = self.link_set.get(name_id=NameID)
354
        except Link.DoesNotExist:
355
            raise APIError('Person not found', err='not-found')
356

  
357
        post_data['IDDUI'] = link.dui
358
        post_data['DATEDEMANDE'] = datetime.date.today().strftime('%Y-%m-%d')
359
        if 'RL2' in post_data and post_data['RL2'].get('IDPERSONNE') == link.person_id:
360
            post_data['QUIACTUALISEDUI'] = '2'
361
        else:
362
            post_data['QUIACTUALISEDUI'] = '1'
363
        try:
364
            form_maj_famille_dui(self, {'PORTAIL': {'DUI': post_data}})
365
        except AxelError as e:
366
            raise APIError('Axel error: %s' % e, err='error', data={'error_post_data': post_data})
367

  
368
        return {'updated': True, 'dui': link.dui, 'post_data': post_data}
369

  
321 370
    def get_invoices(self, name_id, error_status=200):
322 371
        link = self.get_link(name_id, error_status=error_status)
323 372
        try:
passerelle/contrib/toulouse_axel/xsd/Dui/Q_FormMajFamilleDui.xsd
1
<?xml version="1.0" encoding="utf-8" ?>
2
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:all="urn:AllAxelTypes" xmlns:adr="urn:AdresseDui">
3

  
4
	<xsd:import schemaLocation="../AllAxelTypes.xsd" namespace="urn:AllAxelTypes"  />
5
	
6
	<xsd:import schemaLocation="./AdresseDui.xsd" namespace="urn:AdresseDui"  />
7

  
8
	<xsd:include schemaLocation="./ResponsableDui.xsd"/>
9
	
10
	<xsd:include schemaLocation="./ContactDui.xsd"/>
11
	
12
	<xsd:include schemaLocation="./AssuranceDui.xsd"/>
13
	
14
	<xsd:include schemaLocation="./FicheSanitaireDui.xsd"/>
15

  
16
	<xsd:simpleType name="N0TELEDOSSIERType">
17
		<xsd:restriction base="xsd:string">
18
			<xsd:minLength value="1" />
19
			<xsd:maxLength value="12" />
20
		</xsd:restriction>
21
	</xsd:simpleType>
22
	
23
	<xsd:simpleType name="QUIACTUALISEDUIType">
24
		<xsd:restriction base="xsd:string">
25
			<xsd:enumeration value="1" />
26
			<xsd:enumeration value="2" />
27
		</xsd:restriction>
28
	</xsd:simpleType>
29
	
30
	<xsd:simpleType name="TYPEREGIMEType">
31
		<xsd:restriction base="xsd:string">
32
			<xsd:enumeration value="" />
33
			<xsd:enumeration value="GENE" />
34
			<xsd:enumeration value="ZAU" />
35
			<xsd:enumeration value="MSA" />
36
		</xsd:restriction>
37
	</xsd:simpleType>
38
	
39
	<xsd:simpleType name="NUMEROCAFType">
40
		<xsd:restriction base="xsd:string">
41
			<xsd:minLength value="0" />
42
			<xsd:maxLength value="7" />
43
		</xsd:restriction>
44
	</xsd:simpleType>
45
	
46
	<xsd:simpleType name="ALLOCATAIREType">
47
		<xsd:restriction base="xsd:string">
48
			<xsd:enumeration value="" />
49
			<xsd:enumeration value="1" />
50
			<xsd:enumeration value="2" />
51
		</xsd:restriction>
52
	</xsd:simpleType>
53

  
54
	<xsd:simpleType name="CHOIXREVENUType">
55
		<xsd:restriction base="xsd:string">
56
			<xsd:enumeration value="" />
57
			<xsd:enumeration value="rnf" />
58
			<xsd:enumeration value="cafprooui" />
59
			<xsd:enumeration value="RNF" />
60
			<xsd:enumeration value="CAFPROOUI" />
61
		</xsd:restriction>
62
	</xsd:simpleType>
63
		
64
	<xsd:complexType name="REVENUSType">
65
		<xsd:sequence>
66
			<xsd:element ref="TYPEREGIME" />
67
			<xsd:element ref="NUMEROCAF" />
68
			<xsd:element ref="ALLOCATAIRE" />
69
			<xsd:element ref="CHOIXREVENU" />
70
			<xsd:element ref="NBENFANTSACHARGE" />
71
		</xsd:sequence> 
72
	</xsd:complexType>
73
	
74
	<xsd:complexType name="ENFANTType">
75
		<xsd:sequence>
76
			<xsd:element ref="IDPERSONNE" />
77
			<xsd:element ref="AUTORISATIONURGENCEMEDICALE" />			
78
			<xsd:element ref="ASSURANCE" minOccurs="0" maxOccurs="1"/>
79
			<xsd:element ref="SANITAIRE" minOccurs="0" maxOccurs="1"/>
80
			<xsd:element ref="CONTACT" minOccurs="0" maxOccurs="3"/>
81
		</xsd:sequence> 
82
	</xsd:complexType>
83
	
84
	<xsd:complexType name="DUIType">
85
		<xsd:sequence>
86
			<xsd:element ref="DATEDEMANDE" />
87
			<xsd:element ref="N0TELEDOSSIER" />
88
			<xsd:element ref="IDDUI" />
89
			<xsd:element ref="QUIACTUALISEDUI" />
90
			<xsd:element ref="DROITALIMAGE" />
91
			<xsd:element ref="REACTUALISATIONENLIGNE" />
92
			<xsd:element ref="DEMATFACTURES" />
93
			<xsd:element ref="ADRESSE" minOccurs="1" maxOccurs="1"/>
94
			<xsd:element ref="TELFIXE" />
95
			<xsd:element ref="RL1" minOccurs="0" maxOccurs="1"/>
96
			<xsd:element ref="RL2" minOccurs="0" maxOccurs="1"/>
97
			<xsd:element ref="ENFANT" minOccurs="0" maxOccurs="6"/>
98
			<xsd:element ref="REVENUS" minOccurs="0" maxOccurs="1"/>
99
		</xsd:sequence> 
100
	</xsd:complexType>
101
	
102
	<xsd:complexType name="PORTAILType">
103
		<xsd:sequence>
104
				<xsd:element ref="DUI"/>
105
		</xsd:sequence>	
106
	</xsd:complexType>
107
	
108
	<xsd:element name="DATEDEMANDE" type="all:DATEType"/>
109
	<xsd:element name="N0TELEDOSSIER" type="N0TELEDOSSIERType"/>
110
	<xsd:element name="IDDUI" type="all:IDENTREQUIREDType"/>
111
	<xsd:element name="QUIACTUALISEDUI" type="QUIACTUALISEDUIType"/>
112
	<xsd:element name="DROITALIMAGE" type="all:OUINONREQUIREDType"/>
113
	<xsd:element name="REACTUALISATIONENLIGNE" type="all:OUINONREQUIREDType"/>
114
	<xsd:element name="DEMATFACTURES" type="all:OUINONREQUIREDType"/>
115
	<xsd:element name="ADRESSE" type="adr:ADRESSEType"/>
116
	<xsd:element name="TELFIXE" type="all:TELType"/>
117
	<xsd:element name="RL1" type="RESPONSABLE1Type"/>
118
	<xsd:element name="RL2" type="RESPONSABLE2Type"/>
119
	<xsd:element name="ENFANT" type="ENFANTType"/>
120
	<xsd:element name="REVENUS" type="REVENUSType"/>
121
	
122
	<xsd:element name="IDPERSONNE" type="all:IDENTREQUIREDType"/>
123
	<xsd:element name="AUTORISATIONURGENCEMEDICALE" type="all:OUINONREQUIREDType"/>
124
	<xsd:element name="ASSURANCE" type="ASSURANCEType"/>
125
	<xsd:element name="SANITAIRE" type="SANITAIREType"/>
126
	<xsd:element name="CONTACT" type="CONTACTType"/>
127
	
128
	<xsd:element name="TYPEREGIME" type="TYPEREGIMEType"/>
129
	<xsd:element name="NUMEROCAF" type="NUMEROCAFType"/>
130
	<xsd:element name="ALLOCATAIRE" type="ALLOCATAIREType"/>
131
	<xsd:element name="CHOIXREVENU" type="CHOIXREVENUType"/>
132
	<xsd:element name="NBENFANTSACHARGE" type="all:unsignedInt-or-empty"/>
133
	
134
	<xsd:element name="DUI" type="DUIType"/>
135
	
136
	<xsd:element name="PORTAIL" type="PORTAILType"/>
137
</xsd:schema>
passerelle/contrib/toulouse_axel/xsd/Dui/R_FormMajFamilleDui.xsd
1
<?xml version="1.0" encoding="utf-8" ?>
2
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3

  
4
	<xsd:redefine schemaLocation="../R_ShemaResultat.xsd">
5
	    <xsd:simpleType name="TYPEType">
6
			<xsd:restriction base="TYPEType">
7
				<xsd:enumeration value="FormMajFamilleDui" />
8
			</xsd:restriction>
9
	    </xsd:simpleType>
10
		
11
		<xsd:complexType name="PORTAILType">
12
			<xsd:complexContent>
13
				<xsd:extension base="PORTAILType">
14
					<xsd:sequence>
15
						<xsd:element name="DUI" type="xsd:string" minOccurs="0"/>
16
					</xsd:sequence>	
17
				</xsd:extension>
18
			 </xsd:complexContent>
19
		</xsd:complexType>
20
	</xsd:redefine>		
21
</xsd:schema>
tests/data/toulouse_axel/flat_update_family_info.json
1
{
2
  "ADRESSE/CODEINSEEVILLE": "",
3
  "ADRESSE/CODEPOSTAL": "31400",
4
  "ADRESSE/COMPLEMENT1": "foo",
5
  "ADRESSE/COMPLEMENT2": "",
6
  "ADRESSE/COMPLEMENTVOIE": "",
7
  "ADRESSE/NUMEROSTI": "1234",
8
  "ADRESSE/NUMVOIE": "42",
9
  "ADRESSE/VILLE": "TOULOUSE",
10
  "ADRESSE/VOIE": "RUE bar",
11
  "DEMATFACTURES": "NON",
12
  "DROITALIMAGE": "NON",
13
  "ENFANT/0/ASSURANCE/DATEFIN": "2020-12-31",
14
  "ENFANT/0/ASSURANCE/NOM": "foo",
15
  "ENFANT/0/ASSURANCE/NUMERO": "1234",
16
  "ENFANT/0/AUTORISATIONURGENCEMEDICALE": "OUI",
17
  "ENFANT/0/CONTACT/0/CHERCHERLENFANT": "OUI",
18
  "ENFANT/0/CONTACT/0/ENCASURGENCE": "OUI",
19
  "ENFANT/0/CONTACT/0/LIENPARENTE": "",
20
  "ENFANT/0/CONTACT/0/NOM": "foo",
21
  "ENFANT/0/CONTACT/0/PRENOM": "foo",
22
  "ENFANT/0/CONTACT/0/TELFIXE": "0505050505",
23
  "ENFANT/0/CONTACT/0/TELPORTABLE": "0606060606",
24
  "ENFANT/0/CONTACT/1/CHERCHERLENFANT": "OUI",
25
  "ENFANT/0/CONTACT/1/ENCASURGENCE": "OUI",
26
  "ENFANT/0/CONTACT/1/LIENPARENTE": "",
27
  "ENFANT/0/CONTACT/1/NOM": "foo",
28
  "ENFANT/0/CONTACT/1/PRENOM": "foo",
29
  "ENFANT/0/CONTACT/1/TELFIXE": "0505050505",
30
  "ENFANT/0/CONTACT/1/TELPORTABLE": "0606060606",
31
  "ENFANT/0/CONTACT/2/CHERCHERLENFANT": "OUI",
32
  "ENFANT/0/CONTACT/2/ENCASURGENCE": "OUI",
33
  "ENFANT/0/CONTACT/2/LIENPARENTE": "",
34
  "ENFANT/0/CONTACT/2/NOM": "foo",
35
  "ENFANT/0/CONTACT/2/PRENOM": "foo",
36
  "ENFANT/0/CONTACT/2/TELFIXE": "0505050505",
37
  "ENFANT/0/CONTACT/2/TELPORTABLE": "0606060606",
38
  "ENFANT/0/IDPERSONNE": "4242",
39
  "ENFANT/0/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
40
  "ENFANT/0/SANITAIRE/ALLERGIE/0/NOMALLERGIE": "",
41
  "ENFANT/0/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
42
  "ENFANT/0/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
43
  "ENFANT/0/SANITAIRE/ALLERGIE/1/NOMALLERGIE": "",
44
  "ENFANT/0/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
45
  "ENFANT/0/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
46
  "ENFANT/0/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
47
  "ENFANT/0/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
48
  "ENFANT/0/SANITAIRE/AUTREDIFFICULTE": "",
49
  "ENFANT/0/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
50
  "ENFANT/0/SANITAIRE/ECOLESPECIALISEE": "",
51
  "ENFANT/0/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
52
  "ENFANT/0/SANITAIRE/INDICATEURECOLE": "NON",
53
  "ENFANT/0/SANITAIRE/INDICATEURHANDICAP": "NON",
54
  "ENFANT/0/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
55
  "ENFANT/0/SANITAIRE/INDICATEURPAI": "NON",
56
  "ENFANT/0/SANITAIRE/INFOUTILES": "",
57
  "ENFANT/0/SANITAIRE/MEDECIN/NOM": "foo",
58
  "ENFANT/0/SANITAIRE/MEDECIN/TELMEDECIN": "0505050505",
59
  "ENFANT/0/SANITAIRE/VACCIN/AUTRE": "",
60
  "ENFANT/0/SANITAIRE/VACCIN/BCGAJOUR": "",
61
  "ENFANT/0/SANITAIRE/VACCIN/COQAJOUR": "",
62
  "ENFANT/0/SANITAIRE/VACCIN/DAJOUR": "",
63
  "ENFANT/0/SANITAIRE/VACCIN/HBAJOUR": "",
64
  "ENFANT/0/SANITAIRE/VACCIN/HIBAJOUR": "",
65
  "ENFANT/0/SANITAIRE/VACCIN/IIPAJOUR": "",
66
  "ENFANT/0/SANITAIRE/VACCIN/MENINAJOUR": "",
67
  "ENFANT/0/SANITAIRE/VACCIN/PAJOUR": "",
68
  "ENFANT/0/SANITAIRE/VACCIN/RORAJOUR": "",
69
  "ENFANT/0/SANITAIRE/VACCIN/TAJOUR": "",
70
  "ENFANT/1/ASSURANCE/DATEFIN": "2020-12-31",
71
  "ENFANT/1/ASSURANCE/NOM": "foo",
72
  "ENFANT/1/ASSURANCE/NUMERO": "1234",
73
  "ENFANT/1/AUTORISATIONURGENCEMEDICALE": "OUI",
74
  "ENFANT/1/IDPERSONNE": "3535",
75
  "ENFANT/1/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
76
  "ENFANT/1/SANITAIRE/ALLERGIE/0/NOMALLERGIE": "",
77
  "ENFANT/1/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
78
  "ENFANT/1/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
79
  "ENFANT/1/SANITAIRE/ALLERGIE/1/NOMALLERGIE": "",
80
  "ENFANT/1/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
81
  "ENFANT/1/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
82
  "ENFANT/1/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
83
  "ENFANT/1/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
84
  "ENFANT/1/SANITAIRE/AUTREDIFFICULTE": "",
85
  "ENFANT/1/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
86
  "ENFANT/1/SANITAIRE/ECOLESPECIALISEE": "",
87
  "ENFANT/1/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
88
  "ENFANT/1/SANITAIRE/INDICATEURECOLE": "NON",
89
  "ENFANT/1/SANITAIRE/INDICATEURHANDICAP": "NON",
90
  "ENFANT/1/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
91
  "ENFANT/1/SANITAIRE/INDICATEURPAI": "NON",
92
  "ENFANT/1/SANITAIRE/INFOUTILES": "",
93
  "ENFANT/1/SANITAIRE/MEDECIN/NOM": "foo",
94
  "ENFANT/1/SANITAIRE/MEDECIN/TELMEDECIN": "0505050505",
95
  "ENFANT/1/SANITAIRE/VACCIN/AUTRE": "",
96
  "ENFANT/1/SANITAIRE/VACCIN/BCGAJOUR": "",
97
  "ENFANT/1/SANITAIRE/VACCIN/COQAJOUR": "OUI",
98
  "ENFANT/1/SANITAIRE/VACCIN/DAJOUR": "OUI",
99
  "ENFANT/1/SANITAIRE/VACCIN/HBAJOUR": "OUI",
100
  "ENFANT/1/SANITAIRE/VACCIN/HIBAJOUR": "OUI",
101
  "ENFANT/1/SANITAIRE/VACCIN/IIPAJOUR": "OUI",
102
  "ENFANT/1/SANITAIRE/VACCIN/MENINAJOUR": "OUI",
103
  "ENFANT/1/SANITAIRE/VACCIN/PAJOUR": "OUI",
104
  "ENFANT/1/SANITAIRE/VACCIN/RORAJOUR": "OUI",
105
  "ENFANT/1/SANITAIRE/VACCIN/TAJOUR": "OUI",
106
  "N0TELEDOSSIER": "42",
107
  "REACTUALISATIONENLIGNE": "NON",
108
  "REVENUS/ALLOCATAIRE": "2",
109
  "REVENUS/CHOIXREVENU": "",
110
  "REVENUS/NBENFANTSACHARGE": 2,
111
  "REVENUS/NUMEROCAF": "1234",
112
  "REVENUS/TYPEREGIME": "GENE",
113
  "RL1/ADREMPLOYEUR/CODEINSEEVILLE": "",
114
  "RL1/ADREMPLOYEUR/CODEPOSTAL": "",
115
  "RL1/ADREMPLOYEUR/COMPLEMENT1": "",
116
  "RL1/ADREMPLOYEUR/COMPLEMENT2": "",
117
  "RL1/ADREMPLOYEUR/COMPLEMENTVOIE": "",
118
  "RL1/ADREMPLOYEUR/NUMEROSTI": "",
119
  "RL1/ADREMPLOYEUR/NUMVOIE": "",
120
  "RL1/ADREMPLOYEUR/VILLE": "",
121
  "RL1/ADREMPLOYEUR/VOIE": "",
122
  "RL1/CIVILITE": "M",
123
  "RL1/COURRIEL": "foo@bar.com",
124
  "RL1/CSP": "ETU",
125
  "RL1/DATENAISSANCE": "1980-01-01",
126
  "RL1/IDPERSONNE": "42",
127
  "RL1/INDICATEURRL": "1",
128
  "RL1/NOM": "foo",
129
  "RL1/NOMEMPLOYEUR": "foo",
130
  "RL1/NOMJEUNEFILLE": "",
131
  "RL1/PRENOM": "foo",
132
  "RL1/PROFESSION": "ETUDIANT",
133
  "RL1/TELPORTABLE": "0606060606",
134
  "RL2/ADREMPLOYEUR/CODEINSEEVILLE": "",
135
  "RL2/ADREMPLOYEUR/CODEPOSTAL": "",
136
  "RL2/ADREMPLOYEUR/COMPLEMENT1": "",
137
  "RL2/ADREMPLOYEUR/COMPLEMENT2": "",
138
  "RL2/ADREMPLOYEUR/COMPLEMENTVOIE": "",
139
  "RL2/ADREMPLOYEUR/NUMEROSTI": "",
140
  "RL2/ADREMPLOYEUR/NUMVOIE": "",
141
  "RL2/ADREMPLOYEUR/VILLE": "",
142
  "RL2/ADREMPLOYEUR/VOIE": "",
143
  "RL2/CIVILITE": "MME",
144
  "RL2/COURRIEL": "foo@bar.com",
145
  "RL2/CSP": "EMP",
146
  "RL2/DATENAISSANCE": "1980-01-01",
147
  "RL2/IDPERSONNE": "35",
148
  "RL2/INDICATEURRL": "2",
149
  "RL2/NOM": "foo",
150
  "RL2/NOMEMPLOYEUR": "foo",
151
  "RL2/NOMJEUNEFILLE": "",
152
  "RL2/PRENOM": "foo",
153
  "RL2/PROFESSION": "foo",
154
  "RL2/TELPORTABLE": "0606060606",
155
  "TELFIXE": ""
156
}
tests/data/toulouse_axel/update_family_info.json
1
{
2
    "ADRESSE": {
3
        "CODEINSEEVILLE": null,
4
        "CODEPOSTAL": "31400",
5
        "COMPLEMENT1": "foo",
6
        "COMPLEMENT2": null,
7
        "COMPLEMENTVOIE": null,
8
        "NUMEROSTI": "1234",
9
        "NUMVOIE": "42",
10
        "VILLE": "TOULOUSE",
11
        "VOIE": "RUE bar"
12
    },
13
    "DEMATFACTURES": "NON",
14
    "DROITALIMAGE": "NON",
15
    "ENFANT": [
16
        {
17
            "ASSURANCE": {
18
                "DATEFIN": "2020-12-31",
19
                "NOM": "foo",
20
                "NUMERO": "1234"
21
            },
22
            "AUTORISATIONURGENCEMEDICALE": "OUI",
23
            "CONTACT": [
24
                {
25
                    "CHERCHERLENFANT": "OUI",
26
                    "ENCASURGENCE": "OUI",
27
                    "LIENPARENTE": null,
28
                    "NOM": "foo",
29
                    "PRENOM": "foo",
30
                    "TELFIXE": "0505050505",
31
                    "TELPORTABLE": "0606060606"
32
                },
33
                {
34
                    "CHERCHERLENFANT": "OUI",
35
                    "ENCASURGENCE": "OUI",
36
                    "LIENPARENTE": null,
37
                    "NOM": "foo",
38
                    "PRENOM": "foo",
39
                    "TELFIXE": "0505050505",
40
                    "TELPORTABLE": "0606060606"
41
                },
42
                {
43
                    "CHERCHERLENFANT": "OUI",
44
                    "ENCASURGENCE": "OUI",
45
                    "LIENPARENTE": null,
46
                    "NOM": "foo",
47
                    "PRENOM": "foo",
48
                    "TELFIXE": "0505050505",
49
                    "TELPORTABLE": "0606060606"
50
                }
51
            ],
52
            "IDPERSONNE": "4242",
53
            "SANITAIRE": {
54
                "ALLERGIE": [
55
                    {
56
                        "ALLERGIQUE": "OUI",
57
                        "NOMALLERGIE": null,
58
                        "TYPE": "ASTHME"
59
                    },
60
                    {
61
                        "ALLERGIQUE": "OUI",
62
                        "NOMALLERGIE": null,
63
                        "TYPE": "MEDICAMENTEUSES"
64
                    },
65
                    {
66
                        "ALLERGIQUE": "OUI",
67
                        "NOMALLERGIE": null,
68
                        "TYPE": "ALIMENTAIRES"
69
                    }
70
                ],
71
                "AUTREDIFFICULTE": null,
72
                "DATEFINVALIDITE": "2020-12-31",
73
                "ECOLESPECIALISEE": null,
74
                "INDICATEURAUXILIAIREVS": "NON",
75
                "INDICATEURECOLE": "NON",
76
                "INDICATEURHANDICAP": "NON",
77
                "INDICATEURNOTIFMDPH": "NON",
78
                "INDICATEURPAI": "NON",
79
                "INFOUTILES": null,
80
                "MEDECIN": {
81
                    "NOM": "foo",
82
                    "TELMEDECIN": "0505050505"
83
                },
84
                "VACCIN": {
85
                    "AUTRE": null,
86
                    "BCGAJOUR": null,
87
                    "COQAJOUR": null,
88
                    "DAJOUR": null,
89
                    "HBAJOUR": null,
90
                    "HIBAJOUR": null,
91
                    "IIPAJOUR": null,
92
                    "MENINAJOUR": null,
93
                    "PAJOUR": null,
94
                    "RORAJOUR": null,
95
                    "TAJOUR": null
96
                }
97
            }
98
        },
99
        {
100
            "ASSURANCE": {
101
                "DATEFIN": "2020-12-31",
102
                "NOM": "foo",
103
                "NUMERO": "1234"
104
            },
105
            "AUTORISATIONURGENCEMEDICALE": "OUI",
106
            "IDPERSONNE": "3535",
107
            "SANITAIRE": {
108
                "ALLERGIE": [
109
                    {
110
                        "ALLERGIQUE": "OUI",
111
                        "NOMALLERGIE": null,
112
                        "TYPE": "ASTHME"
113
                    },
114
                    {
115
                        "ALLERGIQUE": "OUI",
116
                        "NOMALLERGIE": null,
117
                        "TYPE": "MEDICAMENTEUSES"
118
                    },
119
                    {
120
                        "ALLERGIQUE": "OUI",
121
                        "NOMALLERGIE": null,
122
                        "TYPE": "ALIMENTAIRES"
123
                    }
124
                ],
125
                "AUTREDIFFICULTE": null,
126
                "DATEFINVALIDITE": "2020-12-31",
127
                "ECOLESPECIALISEE": null,
128
                "INDICATEURAUXILIAIREVS": "NON",
129
                "INDICATEURECOLE": "NON",
130
                "INDICATEURHANDICAP": "NON",
131
                "INDICATEURNOTIFMDPH": "NON",
132
                "INDICATEURPAI": "NON",
133
                "INFOUTILES": null,
134
                "MEDECIN": {
135
                    "NOM": "foo",
136
                    "TELMEDECIN": "0505050505"
137
                },
138
                "VACCIN": {
139
                    "AUTRE": null,
140
                    "BCGAJOUR": null,
141
                    "COQAJOUR": "OUI",
142
                    "DAJOUR": "OUI",
143
                    "HBAJOUR": "OUI",
144
                    "HIBAJOUR": "OUI",
145
                    "IIPAJOUR": "OUI",
146
                    "MENINAJOUR": "OUI",
147
                    "PAJOUR": "OUI",
148
                    "RORAJOUR": "OUI",
149
                    "TAJOUR": "OUI"
150
                }
151
            }
152
        }
153
    ],
154
    "N0TELEDOSSIER": "42",
155
    "REACTUALISATIONENLIGNE": "NON",
156
    "REVENUS": {
157
        "ALLOCATAIRE": "2",
158
        "CHOIXREVENU": "",
159
        "NBENFANTSACHARGE": 2,
160
        "NUMEROCAF": "1234",
161
        "TYPEREGIME": "GENE"
162
    },
163
    "RL1": {
164
        "ADREMPLOYEUR": {
165
            "CODEINSEEVILLE": null,
166
            "CODEPOSTAL": null,
167
            "COMPLEMENT1": null,
168
            "COMPLEMENT2": null,
169
            "COMPLEMENTVOIE": null,
170
            "NUMEROSTI": null,
171
            "NUMVOIE": null,
172
            "VILLE": null,
173
            "VOIE": null
174
        },
175
        "CIVILITE": "M",
176
        "COURRIEL": "foo@bar.com",
177
        "CSP": "ETU",
178
        "DATENAISSANCE": "1980-01-01",
179
        "IDPERSONNE": "42",
180
        "INDICATEURRL": "1",
181
        "NOM": "foo",
182
        "NOMEMPLOYEUR": "foo",
183
        "NOMJEUNEFILLE": null,
184
        "PRENOM": "foo",
185
        "PROFESSION": "ETUDIANT",
186
        "TELPORTABLE": "0606060606"
187
    },
188
    "RL2": {
189
        "ADREMPLOYEUR": {
190
            "CODEINSEEVILLE": null,
191
            "CODEPOSTAL": null,
192
            "COMPLEMENT1": null,
193
            "COMPLEMENT2": null,
194
            "COMPLEMENTVOIE": null,
195
            "NUMEROSTI": null,
196
            "NUMVOIE": null,
197
            "VILLE": null,
198
            "VOIE": null
199
        },
200
        "CIVILITE": "MME",
201
        "COURRIEL": "foo@bar.com",
202
        "CSP": "EMP",
203
        "DATENAISSANCE": "1980-01-01",
204
        "IDPERSONNE": "35",
205
        "INDICATEURRL": "2",
206
        "NOM": "foo",
207
        "NOMEMPLOYEUR": "foo",
208
        "NOMJEUNEFILLE": null,
209
        "PRENOM": "foo",
210
        "PROFESSION": "foo",
211
        "TELPORTABLE": "0606060606"
212
    },
213
    "TELFIXE": null
214
}
tests/test_toulouse_axel.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17
from contextlib import contextmanager
18
import datetime
19
import json
18 20
import mock
19 21
import os
20 22

  
......
25 27
    Link,
26 28
    Lock,
27 29
    ToulouseAxel,
30
    form_maj_famille_dui,
28 31
    ref_famille_dui,
29 32
    ref_facture_a_payer,
30 33
    ref_facture_pdf,
......
42 45

  
43 46

  
44 47
@pytest.fixture
45
def params():
48
def link_params():
46 49
    return {
47 50
        'IDDUI': 'XXX',
48 51
        'PRENOM': 'John',
......
51 54
    }
52 55

  
53 56

  
57
@pytest.fixture
58
def update_params():
59
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/update_family_info.json')
60
    with open(filepath) as jsonfile:
61
        content = jsonfile.read()
62
    return json.loads(content)
63

  
64

  
65
@pytest.fixture
66
def flat_update_params():
67
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/flat_update_family_info.json')
68
    with open(filepath) as jsonfile:
69
        content = jsonfile.read()
70
    return json.loads(content)
71

  
72

  
54 73
def test_lock(app, resource):
55 74
    resp = app.get('/toulouse-axel/test/lock?key=&locker=', status=400)
56 75
    assert resp.json['err_desc'] == "key is empty"
......
160 179
            ref_verif_dui(resource, {
161 180
                'PORTAIL': {
162 181
                    'DUI': {
182
                        'IDDUI': 'XXX',
183
                        'IDPERSONNE': '42',
163 184
                        'PRENOM': 'John',
164 185
                        'NOM': 'Doe',
165 186
                        'NAISSANCE': '2010-10-10',
......
223 244
            })
224 245

  
225 246

  
247
@pytest.mark.parametrize('content', [
248
    '<PORTAIL><DUI/></PORTAIL>',
249
])
250
def test_operation_form_maj_famille_dui(resource, content):
251
    with mock_getdata(content, 'FormMajFamilleDui'):
252
        with pytest.raises(AxelError):
253
            form_maj_famille_dui(resource, {
254
                'PORTAIL': {
255
                    'DUI': {
256
                        'IDDUI': 'XXX',
257
                    }
258
                }
259
            })
260

  
261

  
226 262
@pytest.mark.parametrize('content', [
227 263
    '<PORTAIL><DUI/></PORTAIL>',
228 264
])
......
253 289
            })
254 290

  
255 291

  
256
def test_link_endpoint_nameid_empty(app, resource, params):
257
    resp = app.post_json('/toulouse-axel/test/link?NameID=', params=params, status=400)
292
def test_link_endpoint_nameid_empty(app, resource, link_params):
293
    resp = app.post_json('/toulouse-axel/test/link?NameID=', params=link_params, status=400)
258 294
    assert resp.json['err_desc'] == "NameID is empty"
259 295

  
260 296

  
261
def test_link_endpoint_axel_error(app, resource, params):
297
def test_link_endpoint_axel_error(app, resource, link_params):
262 298
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_verif_dui') as operation:
263 299
        operation.side_effect = AxelError('FooBar')
264
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
300
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
265 301
        assert resp.json['err_desc'] == "Axel error: FooBar"
266 302

  
267 303

  
......
270 306
    '<IDDUI>XXX</IDDUI><IDPERSONNE>42</IDPERSONNE><CODE>1</CODE>',
271 307
    '<IDDUI>XXX</IDDUI><IDPERSONNE>42</IDPERSONNE><CODE>4</CODE>',
272 308
])
273
def test_link_endpoint_no_result(app, resource, params, xml_response):
309
def test_link_endpoint_no_result(app, resource, link_params, xml_response):
274 310
    content = '''<PORTAIL>
275 311
    <DUI>
276 312
        %s
277 313
    </DUI>
278 314
</PORTAIL>''' % xml_response
279 315
    with mock_getdata(content, 'RefVerifDui'):
280
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
316
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
281 317
    assert resp.json['err_desc'] == "Person not found"
282 318

  
283 319

  
284
def test_link_endpoint_conflict(app, resource, params):
320
def test_link_endpoint_conflict(app, resource, link_params):
285 321
    content = '''<PORTAIL>
286 322
    <DUI>
287 323
        <IDDUI>XXX</IDDUI>
......
292 328
    # existing link but dui is wrong
293 329
    link = Link.objects.create(resource=resource, name_id='yyy', dui='YYY', person_id='42')
294 330
    with mock_getdata(content, 'RefVerifDui'):
295
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
331
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
296 332
    assert resp.json['err_desc'] == "Data conflict"
297 333

  
298 334
    # existing link but person_id is wrong
......
300 336
    link.person_id = '35'
301 337
    link.save()
302 338
    with mock_getdata(content, 'RefVerifDui'):
303
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
339
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
304 340
    assert resp.json['err_desc'] == "Data conflict"
305 341

  
306 342

  
307 343
@pytest.mark.parametrize('code', [2, 3])
308
def test_link_endpoint(app, resource, params, code):
344
def test_link_endpoint(app, resource, link_params, code):
309 345
    content = '''<PORTAIL>
310 346
    <DUI>
311 347
        <IDDUI>XXX</IDDUI>
......
314 350
    </DUI>
315 351
</PORTAIL>''' % code
316 352
    with mock_getdata(content, 'RefVerifDui'):
317
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
353
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
318 354
    assert set(resp.json.keys()) == set([
319 355
        'err', 'link', 'created', 'dui'])
320 356
    assert resp.json['err'] == 0
......
323 359

  
324 360
    # again
325 361
    with mock_getdata(content, 'RefVerifDui'):
326
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
362
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
327 363
    assert set(resp.json.keys()) == set([
328 364
        'err', 'link', 'created', 'dui'])
329 365
    assert resp.json['err'] == 0
......
430 466
    ])
431 467

  
432 468

  
469
def test_update_family_info_endpoint_axel_error(app, resource, update_params):
470
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
471
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
472
        operation.side_effect = AxelError('FooBar')
473
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
474
        assert resp.json['err_desc'] == "Axel error: FooBar"
475
        assert 'error_post_data' in resp.json['data']
476

  
477

  
478
def test_update_family_info_endpoint_no_result(app, resource, update_params):
479
    resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
480
    assert resp.json['err_desc'] == "Person not found"
481

  
482

  
483
def test_update_family_info_endpoint(app, resource, update_params):
484
    link = Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
485
    content = "<PORTAIL/>"
486
    with mock_getdata(content, 'FormMajFamilleDui'):
487
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
488
    assert resp.json['err'] == 0
489
    assert resp.json['dui'] == 'XXX'
490
    assert resp.json['updated'] is True
491
    assert 'post_data' in resp.json
492

  
493
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
494
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
495
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['IDDUI'] == 'XXX'
496
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['DATEDEMANDE'] == datetime.date.today().strftime('%Y-%m-%d')
497
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['QUIACTUALISEDUI'] == '1'
498

  
499
    link.person_id = '35'
500
    link.save()
501
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
502
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
503
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['IDDUI'] == 'XXX'
504
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['DATEDEMANDE'] == datetime.date.today().strftime('%Y-%m-%d')
505
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['QUIACTUALISEDUI'] == '2'
506

  
507

  
508
def test_update_family_info_flat_endpoint(app, resource, flat_update_params):
509
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
510
    content = "<PORTAIL/>"
511
    with mock_getdata(content, 'FormMajFamilleDui'):
512
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=flat_update_params)
513
    assert resp.json['err'] == 0
514
    assert resp.json['dui'] == 'XXX'
515
    assert resp.json['updated'] is True
516
    assert 'post_data' in resp.json
517

  
518

  
433 519
def test_invoices_endpoint_axel_error(app, resource):
434 520
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
435 521
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_facture_a_payer') as operation:
436
-