Projet

Général

Profil

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

Lauréline Guérin, 19 décembre 2019 09:30

Télécharger (35 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                   | 111 +++++++--
 7 files changed, 699 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')
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

  
476

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

  
481

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

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

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

  
506

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

  
517

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