Projet

Général

Profil

0001-toulouse_axel-partial-update-38543.patch

Lauréline Guérin, 13 janvier 2020 16:40

Télécharger (35,4 ko)

Voir les différences:

Subject: [PATCH 1/5] toulouse_axel: partial update (#38543)

 functests/toulouse_axel/test_toulouse_axel.py |  20 +-
 passerelle/contrib/toulouse_axel/models.py    | 126 ++++++-
 .../flat_update_family_info.json              |  56 ++-
 .../toulouse_axel/update_family_info.json     |  56 ++-
 tests/test_toulouse_axel.py                   | 353 ++++++++++++++++++
 5 files changed, 597 insertions(+), 14 deletions(-)
functests/toulouse_axel/test_toulouse_axel.py
35 35
    payload['N0TELEDOSSIER'] = '42'
36 36
    payload['DROITALIMAGE'] = 'NON'
37 37
    for key in ['MONTANTTOTAL', 'DATEVALIDITE', 'SFI', 'IREVENUS', 'RNF']:
38
        payload['REVENUS'].pop(key)
38
        payload['REVENUS'].pop(key, None)
39 39
    payload['REVENUS']['CHOIXREVENU'] = ''
40 40
    for enfant in payload['ENFANT']:
41 41
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
42 42
            enfant.pop(key)
43 43
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
44
    flags = [
45
        'maj:adresse',
46
        'maj:rl1', 'maj:rl1_adresse_employeur',
47
        'maj:rl2', 'maj:rl2_adresse_employeur',
48
        'maj:revenus',
49
    ]
50
    for i in range(0, 6):
51
        flags += [
52
            'maj:enfant_%s' % i,
53
            'maj:enfant_%s_sanitaire' % i,
54
            'maj:enfant_%s_sanitaire_medecin' % i,
55
            'maj:enfant_%s_sanitaire_vaccin' % i,
56
            'maj:enfant_%s_sanitaire_allergie' % i,
57
            'maj:enfant_%s_assurance' % i,
58
            'maj:enfant_%s_contact' % i,
59
        ]
60
    for key in flags:
61
        payload[key] = True
44 62

  
45 63
    print("Update family info with the following payload:")
46 64
    pprint.pprint(payload)
passerelle/contrib/toulouse_axel/models.py
78 78
    _indent_children(tree, 0)
79 79

  
80 80

  
81
def encode_bool(obj):
82
    if obj is True or str(obj).lower() in ['true', 'oui', '1']:
83
        return 'OUI'
84
    if obj is False or str(obj).lower() in ['false', 'non', '0']:
85
        return 'NON'
86
    return obj
87

  
88

  
81 89
class AxelSchema(JSONSchemaFromXMLSchema):
82 90
    type_map = {
83 91
        '{urn:AllAxelTypes}DATEREQUIREDType': 'date',
......
126 134
        }
127 135

  
128 136
    def encode_bool(self, obj):
129
        if obj is True or str(obj).lower() in ['true', 'oui', '1']:
130
            return 'OUI'
131
        if obj is False or str(obj).lower() in ['false', 'non', '0']:
132
            return 'NON'
133
        return obj
137
        return encode_bool(obj)
134 138

  
135 139
    def decode_bool(self, data):
136 140
        value = False
......
261 265
    LINK_SCHEMA['properties'].pop('IDPERSONNE')
262 266
    LINK_SCHEMA['required'].remove('IDPERSONNE')
263 267

  
268
    UPDATE_FAMILY_FLAGS = {
269
        'maj:adresse': 'ADRESSE',
270
        'maj:rl1': 'RL1',
271
        'maj:rl1_adresse_employeur': 'RL1/ADREMPLOYEUR',
272
        'maj:rl2': 'RL2',
273
        'maj:rl2_adresse_employeur': 'RL2/ADREMPLOYEUR',
274
        'maj:revenus': 'REVENUS',
275
    }
276
    UPDATE_FAMILY_REQUIRED_FLAGS = [
277
        'maj:adresse',
278
        'maj:rl1',
279
        'maj:rl2',
280
        'maj:revenus',
281
    ]
282
    for i in range(0, 6):
283
        UPDATE_FAMILY_FLAGS.update({
284
            'maj:enfant_%s' % i: 'ENFANT/%s' % i,
285
            'maj:enfant_%s_sanitaire' % i: 'ENFANT/%s/SANITAIRE' % i,
286
            'maj:enfant_%s_sanitaire_medecin' % i: 'ENFANT/%s/SANITAIRE/MEDECIN' % i,
287
            'maj:enfant_%s_sanitaire_vaccin' % i: 'ENFANT/%s/SANITAIRE/VACCIN' % i,
288
            'maj:enfant_%s_sanitaire_allergie' % i: 'ENFANT/%s/SANITAIRE/ALLERGIE' % i,
289
            'maj:enfant_%s_assurance' % i: 'ENFANT/%s/ASSURANCE' % i,
290
            'maj:enfant_%s_contact' % i: 'ENFANT/%s/CONTACT' % i,
291
        })
292
        UPDATE_FAMILY_REQUIRED_FLAGS.append('maj:enfant_%s' % i)
264 293
    UPDATE_FAMILY_SCHEMA = copy.deepcopy(
265 294
        form_maj_famille_dui.request_schema['properties']['PORTAIL']['properties']['DUI'])
266 295
    UPDATE_FAMILY_SCHEMA['properties'].pop('IDDUI')
......
269 298
    UPDATE_FAMILY_SCHEMA['required'].remove('IDDUI')
270 299
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
271 300
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
301
    for flag in sorted(UPDATE_FAMILY_FLAGS.keys()):
302
        flag_type = {
303
            'oneOf': [
304
                {'type': 'boolean'},
305
                {
306
                    'type': 'string',
307
                    'pattern': '[Oo][Uu][Ii]|[Nn][Oo][Nn]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|1|0',
308
                }
309
            ]
310
        }
311
        if flag not in UPDATE_FAMILY_REQUIRED_FLAGS:
312
            flag_type['oneOf'].append({'type': 'null'})
313
            flag_type['oneOf'].append({'type': 'string', 'enum': ['']})
314
        UPDATE_FAMILY_SCHEMA['properties'][flag] = flag_type
315
        UPDATE_FAMILY_SCHEMA['required'].append(flag)
272 316
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
273 317

  
274 318
    @endpoint(
......
417 461

  
418 462
        raise APIError('Child not found', err_code='not-found')
419 463

  
464
    def sanitize_update_family_data(self, name_id, post_data):
465
        # transform ENFANT list to dict, where the key is the field IDPERSONNE
466
        # because children in post_date are maybe not in the same order than on Axel side
467
        children = {}
468
        children_by_index = {}
469
        for i, child in enumerate(post_data.get('ENFANT', [])):
470
            # check if IDPERSONNE is filled
471
            if child['IDPERSONNE']:
472
                children[child['IDPERSONNE']] = child
473
                children_by_index[str(i)] = child['IDPERSONNE']
474
        post_data['ENFANT'] = children
475

  
476
        # sanitize post_data
477
        flags = sorted(self.UPDATE_FAMILY_FLAGS.keys())
478
        for flag in flags:
479
            flag_value = post_data.pop(flag)
480
            flag_value = encode_bool(flag_value)
481

  
482
            # no update for the related block
483
            if flag_value == 'OUI':
484
                continue
485

  
486
            # build the xml elements to cross
487
            key = self.UPDATE_FAMILY_FLAGS[flag]
488
            # special case for ENFANT flags
489
            if key.startswith('ENFANT/'):
490
                # replace the index by IDPERSONNE value
491
                index = key.split('/')[1]
492
                if index not in children_by_index:
493
                    # no child with IDPERSONNE found in post_data
494
                    continue
495
                key = key.replace('ENFANT/%s' % index, 'ENFANT/%s' % children_by_index[index])
496
            elements = key.split('/')
497

  
498
            schema = self.UPDATE_FAMILY_SCHEMA
499
            data = post_data
500
            # find the structure in schema and data containing the element to remove
501
            not_found = False
502
            for element in elements[:-1]:
503
                if schema.get('type') == 'array':
504
                    schema = schema['items']
505
                else:
506
                    schema = schema['properties'][element]
507
                try:
508
                    data = data[element]
509
                except (IndexError, KeyError):
510
                    not_found = True
511
                    break
512
            if not_found:
513
                continue
514

  
515
            element_to_remove = elements[-1]
516
            if element_to_remove == 'ADRESSE':
517
                # empty all subelements
518
                for k in data[element_to_remove].keys():
519
                    data[element_to_remove][k] = None
520
            elif element_to_remove in data:
521
                # remove block
522
                data.pop(element_to_remove)
523

  
524
        # transform ENFANT dict to a list back
525
        post_data['ENFANT'] = post_data['ENFANT'].values()
526

  
527
        # if ENFANT block is empty, remove it
528
        if not post_data['ENFANT']:
529
            post_data.pop('ENFANT')
530

  
420 531
    @endpoint(
421 532
        description=_("Update information about user's family"),
422 533
        perm='can_access',
......
432 543
        })
433 544
    def update_family_info(self, request, NameID, post_data):
434 545
        link = self.get_link(NameID)
546

  
547
        # prepare data
435 548
        post_data['IDDUI'] = link.dui
436 549
        post_data['DATEDEMANDE'] = datetime.date.today().strftime('%Y-%m-%d')
437 550
        if 'RL2' in post_data and post_data['RL2'].get('IDPERSONNE') == link.person_id:
438 551
            post_data['QUIACTUALISEDUI'] = '2'
439 552
        else:
440 553
            post_data['QUIACTUALISEDUI'] = '1'
554

  
555
        self.sanitize_update_family_data(name_id=NameID, post_data=post_data)
556

  
441 557
        try:
442 558
            result = form_maj_famille_dui(self, {'PORTAIL': {'DUI': post_data}})
443 559
        except AxelError as e:
tests/data/toulouse_axel/flat_update_family_info.json
16 16
  "ENFANT/0/AUTORISATIONURGENCEMEDICALE": "OUI",
17 17
  "ENFANT/0/CONTACT/0/CHERCHERLENFANT": "OUI",
18 18
  "ENFANT/0/CONTACT/0/ENCASURGENCE": "OUI",
19
  "ENFANT/0/CONTACT/0/LIENPARENTE": "",
19
  "ENFANT/0/CONTACT/0/LIENPARENTE": "VOI",
20 20
  "ENFANT/0/CONTACT/0/NOM": "foo",
21 21
  "ENFANT/0/CONTACT/0/PRENOM": "foo",
22 22
  "ENFANT/0/CONTACT/0/TELFIXE": "0505050505",
23 23
  "ENFANT/0/CONTACT/0/TELPORTABLE": "0606060606",
24 24
  "ENFANT/0/CONTACT/1/CHERCHERLENFANT": "OUI",
25 25
  "ENFANT/0/CONTACT/1/ENCASURGENCE": "OUI",
26
  "ENFANT/0/CONTACT/1/LIENPARENTE": "",
26
  "ENFANT/0/CONTACT/1/LIENPARENTE": "VOI",
27 27
  "ENFANT/0/CONTACT/1/NOM": "foo",
28 28
  "ENFANT/0/CONTACT/1/PRENOM": "foo",
29 29
  "ENFANT/0/CONTACT/1/TELFIXE": "0505050505",
30 30
  "ENFANT/0/CONTACT/1/TELPORTABLE": "0606060606",
31 31
  "ENFANT/0/CONTACT/2/CHERCHERLENFANT": "OUI",
32 32
  "ENFANT/0/CONTACT/2/ENCASURGENCE": "OUI",
33
  "ENFANT/0/CONTACT/2/LIENPARENTE": "",
33
  "ENFANT/0/CONTACT/2/LIENPARENTE": "VOI",
34 34
  "ENFANT/0/CONTACT/2/NOM": "foo",
35 35
  "ENFANT/0/CONTACT/2/PRENOM": "foo",
36 36
  "ENFANT/0/CONTACT/2/TELFIXE": "0505050505",
......
152 152
  "RL2/PRENOM": "foo",
153 153
  "RL2/PROFESSION": "foo",
154 154
  "RL2/TELPORTABLE": "0606060606",
155
  "TELFIXE": ""
155
  "TELFIXE": "",
156
  "maj:adresse": "OUI",
157
  "maj:enfant_0": "OUI",
158
  "maj:enfant_0_assurance": "OUI",
159
  "maj:enfant_0_contact": "OUI",
160
  "maj:enfant_0_sanitaire": "OUI",
161
  "maj:enfant_0_sanitaire_allergie": "OUI",
162
  "maj:enfant_0_sanitaire_medecin": "OUI",
163
  "maj:enfant_0_sanitaire_vaccin": "OUI",
164
  "maj:enfant_1": "OUI",
165
  "maj:enfant_1_assurance": "OUI",
166
  "maj:enfant_1_contact": "OUI",
167
  "maj:enfant_1_sanitaire": "OUI",
168
  "maj:enfant_1_sanitaire_allergie": "OUI",
169
  "maj:enfant_1_sanitaire_medecin": "OUI",
170
  "maj:enfant_1_sanitaire_vaccin": "OUI",
171
  "maj:enfant_2": "OUI",
172
  "maj:enfant_2_assurance": "OUI",
173
  "maj:enfant_2_contact": "OUI",
174
  "maj:enfant_2_sanitaire": "OUI",
175
  "maj:enfant_2_sanitaire_allergie": "OUI",
176
  "maj:enfant_2_sanitaire_medecin": "OUI",
177
  "maj:enfant_2_sanitaire_vaccin": "OUI",
178
  "maj:enfant_3": "OUI",
179
  "maj:enfant_3_assurance": "OUI",
180
  "maj:enfant_3_contact": "OUI",
181
  "maj:enfant_3_sanitaire": "OUI",
182
  "maj:enfant_3_sanitaire_allergie": "OUI",
183
  "maj:enfant_3_sanitaire_medecin": "OUI",
184
  "maj:enfant_3_sanitaire_vaccin": "OUI",
185
  "maj:enfant_4": "OUI",
186
  "maj:enfant_4_assurance": "OUI",
187
  "maj:enfant_4_contact": "OUI",
188
  "maj:enfant_4_sanitaire": "OUI",
189
  "maj:enfant_4_sanitaire_allergie": "OUI",
190
  "maj:enfant_4_sanitaire_medecin": "OUI",
191
  "maj:enfant_4_sanitaire_vaccin": "OUI",
192
  "maj:enfant_5": "OUI",
193
  "maj:enfant_5_assurance": "OUI",
194
  "maj:enfant_5_contact": "OUI",
195
  "maj:enfant_5_sanitaire": "OUI",
196
  "maj:enfant_5_sanitaire_allergie": "OUI",
197
  "maj:enfant_5_sanitaire_medecin": "OUI",
198
  "maj:enfant_5_sanitaire_vaccin": "OUI",
199
  "maj:revenus": "OUI",
200
  "maj:rl1": "OUI",
201
  "maj:rl1_adresse_employeur": "OUI",
202
  "maj:rl2": "OUI",
203
  "maj:rl2_adresse_employeur": "OUI"
156 204
}
tests/data/toulouse_axel/update_family_info.json
24 24
                {
25 25
                    "CHERCHERLENFANT": "OUI",
26 26
                    "ENCASURGENCE": "OUI",
27
                    "LIENPARENTE": null,
27
                    "LIENPARENTE": "VOI",
28 28
                    "NOM": "foo",
29 29
                    "PRENOM": "foo",
30 30
                    "TELFIXE": "0505050505",
......
33 33
                {
34 34
                    "CHERCHERLENFANT": "OUI",
35 35
                    "ENCASURGENCE": "OUI",
36
                    "LIENPARENTE": null,
36
                    "LIENPARENTE": "VOI",
37 37
                    "NOM": "foo",
38 38
                    "PRENOM": "foo",
39 39
                    "TELFIXE": "0505050505",
......
42 42
                {
43 43
                    "CHERCHERLENFANT": "OUI",
44 44
                    "ENCASURGENCE": "OUI",
45
                    "LIENPARENTE": null,
45
                    "LIENPARENTE": "VOI",
46 46
                    "NOM": "foo",
47 47
                    "PRENOM": "foo",
48 48
                    "TELFIXE": "0505050505",
......
210 210
        "PROFESSION": "foo",
211 211
        "TELPORTABLE": "0606060606"
212 212
    },
213
    "TELFIXE": null
213
    "TELFIXE": null,
214
    "maj:adresse": "OUI",
215
    "maj:enfant_0": "OUI",
216
    "maj:enfant_0_assurance": "OUI",
217
    "maj:enfant_0_contact": "OUI",
218
    "maj:enfant_0_sanitaire": "OUI",
219
    "maj:enfant_0_sanitaire_allergie": "OUI",
220
    "maj:enfant_0_sanitaire_medecin": "OUI",
221
    "maj:enfant_0_sanitaire_vaccin": "OUI",
222
    "maj:enfant_1": "OUI",
223
    "maj:enfant_1_assurance": "OUI",
224
    "maj:enfant_1_contact": "OUI",
225
    "maj:enfant_1_sanitaire": "OUI",
226
    "maj:enfant_1_sanitaire_allergie": "OUI",
227
    "maj:enfant_1_sanitaire_medecin": "OUI",
228
    "maj:enfant_1_sanitaire_vaccin": "OUI",
229
    "maj:enfant_2": "OUI",
230
    "maj:enfant_2_assurance": "OUI",
231
    "maj:enfant_2_contact": "OUI",
232
    "maj:enfant_2_sanitaire": "OUI",
233
    "maj:enfant_2_sanitaire_allergie": "OUI",
234
    "maj:enfant_2_sanitaire_medecin": "OUI",
235
    "maj:enfant_2_sanitaire_vaccin": "OUI",
236
    "maj:enfant_3": "OUI",
237
    "maj:enfant_3_assurance": "OUI",
238
    "maj:enfant_3_contact": "OUI",
239
    "maj:enfant_3_sanitaire": "OUI",
240
    "maj:enfant_3_sanitaire_allergie": "OUI",
241
    "maj:enfant_3_sanitaire_medecin": "OUI",
242
    "maj:enfant_3_sanitaire_vaccin": "OUI",
243
    "maj:enfant_4": "OUI",
244
    "maj:enfant_4_assurance": "OUI",
245
    "maj:enfant_4_contact": "OUI",
246
    "maj:enfant_4_sanitaire": "OUI",
247
    "maj:enfant_4_sanitaire_allergie": "OUI",
248
    "maj:enfant_4_sanitaire_medecin": "OUI",
249
    "maj:enfant_4_sanitaire_vaccin": "OUI",
250
    "maj:enfant_5": "OUI",
251
    "maj:enfant_5_assurance": "OUI",
252
    "maj:enfant_5_contact": "OUI",
253
    "maj:enfant_5_sanitaire": "OUI",
254
    "maj:enfant_5_sanitaire_allergie": "OUI",
255
    "maj:enfant_5_sanitaire_medecin": "OUI",
256
    "maj:enfant_5_sanitaire_vaccin": "OUI",
257
    "maj:revenus": "OUI",
258
    "maj:rl1": "OUI",
259
    "maj:rl1_adresse_employeur": "OUI",
260
    "maj:rl2": "OUI",
261
    "maj:rl2_adresse_employeur": "OUI"
214 262
}
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 copy
18 19
import datetime
19 20
import json
20 21
import mock
......
35 36
    ref_facture_pdf,
36 37
    ref_verif_dui,
37 38
)
39
from passerelle.utils.jsonresponse import APIError
38 40
import utils
39 41

  
40 42

  
......
620 622
    assert 'xml_response' in resp.json['data']
621 623

  
622 624

  
625
def test_sanitize_update_family_data_adresse(app, resource, update_params):
626
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
627

  
628
    # test maj:adresse
629
    partial_update_params = copy.deepcopy(update_params)
630
    partial_update_params['maj:adresse'] = False
631
    for key in partial_update_params['ADRESSE'].keys():
632
        partial_update_params['ADRESSE'][key] = None  # reset fields
633
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
634
    for value in partial_update_params['ADRESSE'].values():
635
        assert value is None
636

  
637

  
638
def test_sanitize_update_family_data_revenus(app, resource, update_params):
639
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
640

  
641
    # test maj:revenus
642
    partial_update_params = copy.deepcopy(update_params)
643
    partial_update_params['maj:revenus'] = False
644
    for key in partial_update_params['REVENUS'].keys():
645
        partial_update_params['REVENUS'][key] = None  # reset fields
646
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
647
    assert 'REVENUS' not in partial_update_params
648

  
649

  
650
def test_sanitize_update_family_data_rln(app, resource, update_params):
651
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
652

  
653
    # test maj:rln
654
    partial_update_params = copy.deepcopy(update_params)
655
    partial_update_params['maj:rl1'] = False
656
    for key in partial_update_params['RL1'].keys():
657
        partial_update_params['RL1'][key] = None  # reset fields
658
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
659
    assert 'RL1' not in partial_update_params
660
    partial_update_params = copy.deepcopy(update_params)
661
    partial_update_params['maj:rl2'] = False
662
    for key in partial_update_params['RL2'].keys():
663
        partial_update_params['RL2'][key] = None  # reset fields
664
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
665
    assert 'RL2' not in partial_update_params
666

  
667

  
668
def test_sanitize_update_family_data_rln_adresse_employeur(app, resource, update_params):
669
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
670

  
671
    # test maj:rln_adresse_employeur
672
    partial_update_params = copy.deepcopy(update_params)
673
    partial_update_params['maj:rl1_adresse_employeur'] = False
674
    for key in partial_update_params['RL1']['ADREMPLOYEUR'].keys():
675
        partial_update_params['RL1']['ADREMPLOYEUR'][key] = None  # reset fields
676
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
677
    assert 'ADREMPLOYEUR' not in partial_update_params['RL1']
678
    partial_update_params = copy.deepcopy(update_params)
679
    partial_update_params['maj:rl2_adresse_employeur'] = False
680
    for key in partial_update_params['RL2']['ADREMPLOYEUR'].keys():
681
        partial_update_params['RL2']['ADREMPLOYEUR'][key] = None  # reset fields
682
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
683
    assert 'ADREMPLOYEUR' not in partial_update_params['RL2']
684
    # combine with maj:rln
685
    partial_update_params = copy.deepcopy(update_params)
686
    partial_update_params['maj:rl1'] = False
687
    partial_update_params['maj:rl1_adresse_employeur'] = False
688
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
689
    assert 'RL1' not in partial_update_params
690
    partial_update_params = copy.deepcopy(update_params)
691
    partial_update_params['maj:rl2'] = False
692
    partial_update_params['maj:rl2_adresse_employeur'] = False
693
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
694
    assert 'RL2' not in partial_update_params
695

  
696
    # test maj:rln_adresse_employeur not set
697
    for val in [None, '']:
698
        partial_update_params = copy.deepcopy(update_params)
699
        partial_update_params['maj:rl1_adresse_employeur'] = val
700
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
701
        assert 'ADREMPLOYEUR' not in partial_update_params['RL1']
702
        partial_update_params = copy.deepcopy(update_params)
703
        partial_update_params['maj:rl2_adresse_employeur'] = val
704
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
705
        assert 'ADREMPLOYEUR' not in partial_update_params['RL2']
706

  
707

  
708
def test_sanitize_update_family_data_enfant_n(app, resource, update_params):
709
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
710

  
711
    # test maj:enfant_n
712
    partial_update_params = copy.deepcopy(update_params)
713
    partial_update_params['maj:enfant_0'] = False
714
    for key in partial_update_params['ENFANT'][0].keys():
715
        if key == 'IDPERSONNE':
716
            continue
717
        partial_update_params['ENFANT'][0][key] = None  # reset fields
718
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
719
    assert len(partial_update_params['ENFANT']) == 1
720
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
721

  
722
    partial_update_params = copy.deepcopy(update_params)
723
    partial_update_params['maj:enfant_1'] = False
724
    for key in partial_update_params['ENFANT'][1].keys():
725
        if key == 'IDPERSONNE':
726
            continue
727
        partial_update_params['ENFANT'][1][key] = None  # reset fields
728
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
729
    assert len(partial_update_params['ENFANT']) == 1
730
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "4242"
731

  
732
    # do not fill IDPERSONNE for the removed child
733
    partial_update_params = copy.deepcopy(update_params)
734
    partial_update_params['maj:enfant_1'] = False
735
    for key in partial_update_params['ENFANT'][1].keys():
736
        partial_update_params['ENFANT'][1][key] = None  # reset fields
737
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
738
    assert len(partial_update_params['ENFANT']) == 1
739
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "4242"
740

  
741
    # remove all children
742
    partial_update_params = copy.deepcopy(update_params)
743
    partial_update_params['maj:enfant_0'] = False
744
    partial_update_params['maj:enfant_1'] = False
745
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
746
    assert 'ENFANT' not in partial_update_params
747

  
748
    # unknown child
749
    partial_update_params = copy.deepcopy(update_params)
750
    partial_update_params['maj:enfant_5'] = False
751
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
752
    assert len(partial_update_params['ENFANT']) == 2
753

  
754

  
755
def test_sanitize_update_family_data_enfant_n_assurance(app, resource, update_params):
756
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
757

  
758
    # test maj:enfant_n_assurance
759
    partial_update_params = copy.deepcopy(update_params)
760
    partial_update_params['maj:enfant_1_assurance'] = False
761
    for key in partial_update_params['ENFANT'][1]['ASSURANCE'].keys():
762
        partial_update_params['ENFANT'][1]['ASSURANCE'][key] = None  # reset fields
763
    partial_update_params['maj:enfant_0'] = False  # check that ordering is not a problem
764
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
765
    assert len(partial_update_params['ENFANT']) == 1
766
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
767
    assert 'ASSURANCE' not in partial_update_params['ENFANT'][0]
768
    # combine with maj:enfant_n
769
    partial_update_params = copy.deepcopy(update_params)
770
    partial_update_params['maj:enfant_1'] = False
771
    partial_update_params['maj:enfant_1_assurance'] = False
772
    partial_update_params['maj:enfant_0'] = False
773
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
774
    assert 'ENFANT' not in partial_update_params
775

  
776
    # test maj:enfant_n_assurance not set
777
    for val in [None, '']:
778
        partial_update_params = copy.deepcopy(update_params)
779
        partial_update_params['maj:enfant_1_assurance'] = val
780
        partial_update_params['maj:enfant_0'] = False
781
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
782
        assert 'ASSURANCE' not in partial_update_params['ENFANT'][0]
783

  
784

  
785
def test_sanitize_update_family_data_enfant_n_contact(app, resource, update_params):
786
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
787

  
788
    # test maj:enfant_n_contact
789
    partial_update_params = copy.deepcopy(update_params)
790
    partial_update_params['maj:enfant_0_contact'] = False
791
    for i, contact in enumerate(partial_update_params['ENFANT'][0]['CONTACT']):
792
        for key in contact.keys():
793
            partial_update_params['ENFANT'][0]['CONTACT'][i][key] = None  # reset fields
794
    partial_update_params['maj:enfant_1'] = False
795
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
796
    assert len(partial_update_params['ENFANT']) == 1
797
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "4242"
798
    assert 'CONTACT' not in partial_update_params['ENFANT'][0]
799
    # combine with maj:enfant_n
800
    partial_update_params = copy.deepcopy(update_params)
801
    partial_update_params['maj:enfant_1'] = False
802
    partial_update_params['maj:enfant_1_contact'] = False
803
    partial_update_params['maj:enfant_0'] = False
804
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
805
    assert 'ENFANT' not in partial_update_params
806

  
807
    # test maj:enfant_n_contact not set
808
    for val in [None, '']:
809
        partial_update_params = copy.deepcopy(update_params)
810
        partial_update_params['maj:enfant_0_contact'] = val
811
        partial_update_params['maj:enfant_1'] = False
812
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
813
        assert 'CONTACT' not in partial_update_params['ENFANT'][0]
814

  
815

  
816
def test_sanitize_update_family_data_enfant_n_sanitaire(app, resource, update_params):
817
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
818

  
819
    # test maj:enfant_n_sanitaire
820
    partial_update_params = copy.deepcopy(update_params)
821
    partial_update_params['maj:enfant_1_sanitaire'] = False
822
    for key in partial_update_params['ENFANT'][1]['SANITAIRE'].keys():
823
        partial_update_params['ENFANT'][1]['SANITAIRE'][key] = None  # reset fields
824
    partial_update_params['maj:enfant_0'] = False
825
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
826
    assert len(partial_update_params['ENFANT']) == 1
827
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
828
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
829
    # combine with maj:enfant_n
830
    partial_update_params = copy.deepcopy(update_params)
831
    partial_update_params['maj:enfant_1'] = False
832
    partial_update_params['maj:enfant_1_sanitaire'] = False
833
    partial_update_params['maj:enfant_0'] = False
834
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
835
    assert 'ENFANT' not in partial_update_params
836

  
837
    # test maj:enfant_n_sanitaire not set
838
    for val in [None, '']:
839
        partial_update_params = copy.deepcopy(update_params)
840
        partial_update_params['maj:enfant_0_sanitaire'] = val
841
        partial_update_params['maj:enfant_1_sanitaire'] = val
842
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
843
        assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
844
        assert 'SANITAIRE' not in partial_update_params['ENFANT'][1]
845

  
846

  
847
def test_sanitize_update_family_data_enfant_n_sanitaire_allergie(app, resource, update_params):
848
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
849

  
850
    # test maj:enfant_n_sanitaire_allergie
851
    partial_update_params = copy.deepcopy(update_params)
852
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
853
    for i, allergie in enumerate(partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']):
854
        for key in allergie.keys():
855
            partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][i][key] = None  # reset fields
856
    partial_update_params['maj:enfant_0'] = False
857
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
858
    assert len(partial_update_params['ENFANT']) == 1
859
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
860
    assert 'ALLERGIE' not in partial_update_params['ENFANT'][0]['SANITAIRE']
861
    # combine with maj:enfant_n_sanitaire
862
    partial_update_params = copy.deepcopy(update_params)
863
    partial_update_params['maj:enfant_1_sanitaire'] = False
864
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
865
    partial_update_params['maj:enfant_0'] = False
866
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
867
    assert len(partial_update_params['ENFANT']) == 1
868
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
869
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
870
    # combine with maj:enfant_n
871
    partial_update_params = copy.deepcopy(update_params)
872
    partial_update_params['maj:enfant_1'] = False
873
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
874
    partial_update_params['maj:enfant_0'] = False
875
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
876
    assert 'ENFANT' not in partial_update_params
877

  
878
    # test maj:enfant_n_sanitaire_allergie not set
879
    for val in [None, '']:
880
        partial_update_params = copy.deepcopy(update_params)
881
        partial_update_params['maj:enfant_0_sanitaire_allergie'] = val
882
        partial_update_params['maj:enfant_1_sanitaire_allergie'] = val
883
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
884
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][0]['SANITAIRE']
885
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][1]['SANITAIRE']
886

  
887

  
888
def test_sanitize_update_family_data_enfant_n_sanitaire_medecin(app, resource, update_params):
889
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
890

  
891
    # test maj:enfant_n_sanitaire_medecin
892
    partial_update_params = copy.deepcopy(update_params)
893
    partial_update_params['maj:enfant_1_sanitaire_medecin'] = False
894
    for key in partial_update_params['ENFANT'][1]['SANITAIRE']['MEDECIN'].keys():
895
        partial_update_params['ENFANT'][1]['SANITAIRE']['MEDECIN'][key] = None  # reset fields
896
    partial_update_params['maj:enfant_0'] = False
897
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
898
    assert len(partial_update_params['ENFANT']) == 1
899
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
900
    assert 'MEDECIN' not in partial_update_params['ENFANT'][0]['SANITAIRE']
901
    # combine with maj:enfant_n_sanitaire
902
    partial_update_params = copy.deepcopy(update_params)
903
    partial_update_params['maj:enfant_1_sanitaire'] = False
904
    partial_update_params['maj:enfant_1_sanitaire_medecin'] = False
905
    partial_update_params['maj:enfant_0'] = False
906
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
907
    assert len(partial_update_params['ENFANT']) == 1
908
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
909
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
910
    # combine with maj:enfant_n
911
    partial_update_params = copy.deepcopy(update_params)
912
    partial_update_params['maj:enfant_1'] = False
913
    partial_update_params['maj:enfant_1_sanitaire_medecin'] = False
914
    partial_update_params['maj:enfant_0'] = False
915
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
916
    assert 'ENFANT' not in partial_update_params
917

  
918
    # test maj:enfant_n_sanitaire_medecin not set
919
    for val in [None, '']:
920
        partial_update_params = copy.deepcopy(update_params)
921
        partial_update_params['maj:enfant_0_sanitaire_medecin'] = val
922
        partial_update_params['maj:enfant_1_sanitaire_medecin'] = val
923
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
924
        assert 'MEDECIN' not in partial_update_params['ENFANT'][0]['SANITAIRE']
925
        assert 'MEDECIN' not in partial_update_params['ENFANT'][1]['SANITAIRE']
926

  
927

  
928
def test_sanitize_update_family_data_enfant_n_sanitaire_vaccin(app, resource, update_params):
929
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
930

  
931
    # test maj:enfant_n_sanitaire_vaccin
932
    partial_update_params = copy.deepcopy(update_params)
933
    partial_update_params['maj:enfant_1_sanitaire_vaccin'] = False
934
    for key in partial_update_params['ENFANT'][1]['SANITAIRE']['VACCIN'].keys():
935
        partial_update_params['ENFANT'][1]['SANITAIRE']['VACCIN'][key] = None  # reset fields
936
    partial_update_params['maj:enfant_0'] = False
937
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
938
    assert len(partial_update_params['ENFANT']) == 1
939
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
940
    assert 'VACCIN' not in partial_update_params['ENFANT'][0]['SANITAIRE']
941
    # combine with maj:enfant_n_sanitaire
942
    partial_update_params = copy.deepcopy(update_params)
943
    partial_update_params['maj:enfant_1_sanitaire'] = False
944
    partial_update_params['maj:enfant_1_sanitaire_vaccin'] = False
945
    partial_update_params['maj:enfant_0'] = False
946
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
947
    assert len(partial_update_params['ENFANT']) == 1
948
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
949
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
950
    # combine with maj:enfant_n
951
    partial_update_params = copy.deepcopy(update_params)
952
    partial_update_params['maj:enfant_1'] = False
953
    partial_update_params['maj:enfant_1_sanitaire_vaccin'] = False
954
    partial_update_params['maj:enfant_0'] = False
955
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
956
    assert 'ENFANT' not in partial_update_params
957

  
958
    # test maj:enfant_n_sanitaire_vaccin not set
959
    for val in [None, '']:
960
        partial_update_params = copy.deepcopy(update_params)
961
        partial_update_params['maj:enfant_0_sanitaire_vaccin'] = val
962
        partial_update_params['maj:enfant_1_sanitaire_vaccin'] = val
963
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
964
        assert 'VACCIN' not in partial_update_params['ENFANT'][0]['SANITAIRE']
965
        assert 'VACCIN' not in partial_update_params['ENFANT'][1]['SANITAIRE']
966

  
967

  
968
def test_update_family_info_endpoint_sanitize_axel_error(app, resource, update_params):
969
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
970
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.sanitize_update_family_data') as sanitize:
971
        sanitize.side_effect = APIError('Axel error: FooBar')
972
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
973
        assert resp.json['err_desc'] == "Axel error: FooBar"
974

  
975

  
623 976
def test_invoices_endpoint_axel_error(app, resource):
624 977
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
625 978
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_facture_a_payer') as operation:
626
-