Projet

Général

Profil

0002-toulouse_maelis-add-dietcode-webservice-69045.patch

Nicolas Roche, 13 septembre 2022 19:43

Télécharger (12,9 ko)

Voir les différences:

Subject: [PATCH 2/5] toulouse_maelis: add dietcode webservice (#69045)

 passerelle/contrib/toulouse_maelis/models.py  | 19 +++++++++++
 .../Q_update_child_dietcode.xml               | 16 ++++++++++
 .../R_update_child_dietcode.xml               |  5 +++
 tests/test_toulouse_maelis.py                 | 32 +++++++++++++++++++
 4 files changed, 72 insertions(+)
 create mode 100644 tests/data/toulouse_maelis/Q_update_child_dietcode.xml
 create mode 100644 tests/data/toulouse_maelis/R_update_child_dietcode.xml
passerelle/contrib/toulouse_maelis/models.py
147 147
        add_text_value('Situation', data, ['situation'])
148 148
        for rlg in 'RL1', 'RL2':
149 149
            add_text_value('Civility', data, [rlg, 'civility'])
150 150
            add_text_value('Quality', data, [rlg, 'quality'])
151 151
            add_text_value('Complement', data, [rlg, 'adresse', 'numComp'])
152 152
            add_text_value('CSP', data, [rlg, 'profession', 'codeCSP'])
153 153
        for child in data['childList']:
154 154
            add_text_value('Sex', child, ['sexe'])
155
            add_text_value('DietCode', child, ['dietcode'])
155 156
        for kind in ('authorized', 'emergency'):
156 157
            for person in data[kind + 'PersonList']:
157 158
                add_text_value('Civility', person, ['civility'])
158 159
                add_text_value('Quality', person, ['quality'])
159 160
        return data
160 161

  
161 162
    def replace_null_values(self, dico):
162 163
        '''send null fields as empty SOAP tag to tell maelis to empty the value'''
......
577 578
            'dossierNumber': family_id,
578 579
            'categorie': family['category'],
579 580
            'situation': family['situation'],
580 581
            kind + 'PersonList': [{'personList': personList}],
581 582
        }
582 583
        self.call('Family', 'updateFamily', **payload)
583 584
        return {'data': 'ok'}
584 585

  
586
    @endpoint(
587
        display_category='Famille',
588
        description="Créer ou mettre à jour le régime alimentaire d'un enfant",
589
        name='update-child-dietcode',
590
        perm='can_access',
591
        parameters={
592
            'NameID': {'description': 'Publik NameID'},
593
            'child_id': {'description': "Numéro de l'enfant"},
594
            'dietcode': {'description': 'code du régime alimentaire'},
595
        },
596
        methods=['post'],
597
    )
598
    def update_child_dietcode(self, request, NameID, child_id, dietcode):
599
        self.get_link(NameID)
600

  
601
        self.call('Family', 'createOrUpdateChildDiet', personNumber=child_id, code=dietcode)
602
        return {'data': 'ok'}
603

  
585 604

  
586 605
class Link(models.Model):
587 606
    resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)
588 607
    name_id = models.CharField(blank=False, max_length=256)
589 608
    family_id = models.CharField(blank=False, max_length=128)
590 609
    created = models.DateTimeField(auto_now_add=True)
591 610
    updated = models.DateTimeField(auto_now=True)
592 611

  
tests/data/toulouse_maelis/Q_update_child_dietcode.xml
1
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
2
  <soap-env:Header>
3
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
4
      <wsse:UsernameToken>
5
        <wsse:Username>maelis-webservice</wsse:Username>
6
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">maelis-password</wsse:Password>
7
      </wsse:UsernameToken>
8
    </wsse:Security>
9
  </soap-env:Header>
10
  <soap-env:Body>
11
    <ns0:createOrUpdateChildDiet xmlns:ns0="family.ws.maelis.sigec.com">
12
      <personNumber>613878</personNumber>
13
      <code>RSV</code>
14
    </ns0:createOrUpdateChildDiet>
15
  </soap-env:Body>
16
</soap-env:Envelope>
tests/data/toulouse_maelis/R_update_child_dietcode.xml
1
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
2
  <soap:Body>
3
    <ns2:createOrUpdateChildDietResponse xmlns:ns2="family.ws.maelis.sigec.com"/>
4
  </soap:Body>
5
</soap:Envelope>
tests/test_toulouse_maelis.py
59 59
IS_CHILD_EXISTS_FALSE = FakedResponse(
60 60
    content=get_xml_file('R_is_child_exists.xml') % b'false', status_code=200
61 61
)
62 62
CREATE_FAMILY = FakedResponse(content=get_xml_file('R_create_family.xml'), status_code=200)
63 63
CREATE_FAMILY_ERR = FakedResponse(content=get_xml_file('R_create_family_error.xml'), status_code=200)
64 64
UPDATE_FAMILY = FakedResponse(content=get_xml_file('R_update_family.xml'), status_code=200)
65 65
UPDATE_FAMILY_ERR = FakedResponse(content=get_xml_file('R_update_family_error.xml'), status_code=200)
66 66
UPDATE_FAMILY_500 = FakedResponse(content=get_xml_file('R_update_family_soap_error.xml'), status_code=500)
67
UPDATE_DIETCODE = FakedResponse(content=get_xml_file('R_update_child_dietcode.xml'), status_code=200)
67 68

  
68 69

  
69 70
def assert_sent_payload(mocked_post, query_file):
70 71
    soap_sent = etree.tostring(etree.fromstring(mocked_post.call_args.kwargs['data']), pretty_print=True)
71 72
    expected = etree.tostring(etree.fromstring(get_xml_file(query_file)), pretty_print=True)
72 73
    assert soap_sent.decode() == expected.decode()
73 74

  
74 75

  
......
517 518
    mocked_get.return_value = FAMILY_SERVICE_WSDL
518 519
    mocked_post.side_effect = [
519 520
        READ_FAMILY,
520 521
        READ_CATEGORIES,
521 522
        READ_SITUATIONS,
522 523
        READ_CIVILITIES,
523 524
        READ_QUALITIES,
524 525
        READ_CSP,
526
        READ_DIETCODE,
525 527
    ]
526 528
    url = get_endpoint('read-family')
527 529
    Link.objects.create(resource=con, family_id='1312', name_id='local')
528 530

  
529 531
    resp = app.get(url + '?NameID=local')
530 532
    assert resp.json['err'] == 0
531 533
    data = resp.json['data']
532 534
    del data['RL1']
......
584 586
    assert data == {
585 587
        'num': '613880',
586 588
        'lastname': 'DOE',
587 589
        'firstname': 'JANNIS',
588 590
        'sexe': 'F',
589 591
        'sexe_text': 'Féminin',
590 592
        'birth': {'dateBirth': '1943-01-19T00:00:00+01:00', 'place': None},
591 593
        'dietcode': 'RSV',
594
        'dietcode_text': '3- RÉGIME SANS VIANDE',
592 595
        'bPhoto': False,
593 596
        'bLeaveAlone': False,
594 597
        'authorizedPersonList': [],
595 598
        'indicatorList': [],
596 599
        'subscribeSchoolList': [],
597 600
        'mother': {'num': 613963, 'civility': 'MME', 'firstname': 'JANE', 'lastname': 'DOE'},
598 601
        'father': {'num': 613878, 'civility': 'M.', 'firstname': 'JHON', 'lastname': 'DOE'},
599 602
        'rl': None,
......
679 682
    mocked_get.return_value = FAMILY_SERVICE_WSDL
680 683
    mocked_post.side_effect = [
681 684
        READ_FAMILY,
682 685
        READ_CATEGORIES,
683 686
        READ_SITUATIONS,
684 687
        READ_CIVILITIES,
685 688
        READ_QUALITIES,
686 689
        READ_CSP,
690
        READ_DIETCODE,
687 691
    ]
688 692
    url = get_endpoint('read-rl')
689 693
    Link.objects.create(resource=con, family_id='1312', name_id='local')
690 694

  
691 695
    resp = app.get(url + '?NameID=local&rl_id=613878')
692 696
    assert resp.json['err'] == 0
693 697
    assert resp.json['data']['firstname'] == 'JHON'
694 698

  
......
699 703
    mocked_get.return_value = FAMILY_SERVICE_WSDL
700 704
    mocked_post.side_effect = [
701 705
        READ_FAMILY,
702 706
        READ_CATEGORIES,
703 707
        READ_SITUATIONS,
704 708
        READ_CIVILITIES,
705 709
        READ_QUALITIES,
706 710
        READ_CSP,
711
        READ_DIETCODE,
707 712
    ]
708 713
    url = get_endpoint('read-rl')
709 714
    Link.objects.create(resource=con, family_id='1312', name_id='local')
710 715

  
711 716
    resp = app.get(url + '?NameID=local&rl_id=613879')
712 717
    assert resp.json['err'] == 0
713 718
    assert resp.json['data'] == {
714 719
        'num': '613879',
......
762 767
    mocked_get.return_value = FAMILY_SERVICE_WSDL
763 768
    mocked_post.side_effect = [
764 769
        READ_FAMILY,
765 770
        READ_CATEGORIES,
766 771
        READ_SITUATIONS,
767 772
        READ_CIVILITIES,
768 773
        READ_QUALITIES,
769 774
        READ_CSP,
775
        READ_DIETCODE,
770 776
    ]
771 777
    url = get_endpoint('read-rl')
772 778
    Link.objects.create(resource=con, family_id='1312', name_id='local')
773 779

  
774 780
    resp = app.get(url + '?NameID=local&rl_id=000000')
775 781
    assert resp.json['err'] == 'not-found'
776 782
    assert resp.json['err_desc'] == "no '000000' RL on '1312' family"
777 783

  
......
782 788
    mocked_get.return_value = FAMILY_SERVICE_WSDL
783 789
    mocked_post.side_effect = [
784 790
        READ_FAMILY,
785 791
        READ_CATEGORIES,
786 792
        READ_SITUATIONS,
787 793
        READ_CIVILITIES,
788 794
        READ_QUALITIES,
789 795
        READ_CSP,
796
        READ_DIETCODE,
790 797
    ]
791 798
    url = get_endpoint('read-person')
792 799
    Link.objects.create(resource=con, family_id='1312', name_id='local')
793 800

  
794 801
    resp = app.get(url + '?NameID=local&person_id=614059&kind=emergency')
795 802
    assert resp.json['err'] == 0
796 803
    assert resp.json['data']['firstname'] == 'KENY'
797 804

  
......
818 825
    mocked_get.return_value = FAMILY_SERVICE_WSDL
819 826
    mocked_post.side_effect = [
820 827
        READ_FAMILY,
821 828
        READ_CATEGORIES,
822 829
        READ_SITUATIONS,
823 830
        READ_CIVILITIES,
824 831
        READ_QUALITIES,
825 832
        READ_CSP,
833
        READ_DIETCODE,
826 834
    ]
827 835
    url = get_endpoint('read-person')
828 836
    Link.objects.create(resource=con, family_id='1312', name_id='local')
829 837

  
830 838
    resp = app.get(url + '?NameID=local&person_id=000000&kind=emergency')
831 839
    assert resp.json['err'] == 'not-found'
832 840
    assert resp.json['err_desc'] == "no '000000' emergency person on '1312' family"
833 841

  
......
838 846
    mocked_get.return_value = FAMILY_SERVICE_WSDL
839 847
    mocked_post.side_effect = [
840 848
        READ_FAMILY,
841 849
        READ_CATEGORIES,
842 850
        READ_SITUATIONS,
843 851
        READ_CIVILITIES,
844 852
        READ_QUALITIES,
845 853
        READ_CSP,
854
        READ_DIETCODE,
846 855
    ]
847 856
    url = get_endpoint('read-child')
848 857
    Link.objects.create(resource=con, family_id='1312', name_id='local')
849 858

  
850 859
    resp = app.get(url + '?NameID=local&child_id=613880')
851 860
    assert resp.json['err'] == 0
852 861
    assert resp.json['data']['firstname'] == 'JANNIS'
853 862

  
......
866 875
    mocked_get.return_value = FAMILY_SERVICE_WSDL
867 876
    mocked_post.side_effect = [
868 877
        READ_FAMILY,
869 878
        READ_CATEGORIES,
870 879
        READ_SITUATIONS,
871 880
        READ_CIVILITIES,
872 881
        READ_QUALITIES,
873 882
        READ_CSP,
883
        READ_DIETCODE,
874 884
    ]
875 885
    url = get_endpoint('read-child')
876 886
    Link.objects.create(resource=con, family_id='1312', name_id='local')
877 887

  
878 888
    resp = app.get(url + '?NameID=local&child_id=000000')
879 889
    assert resp.json['err'] == 'not-found'
880 890
    assert resp.json['err_desc'] == "no '000000' child on '1312' family"
881 891

  
......
1358 1368
        'contact/mobile': '0623456789',
1359 1369
        'contact/mail': None,
1360 1370
    }
1361 1371

  
1362 1372
    Link.objects.create(resource=con, family_id='1312', name_id='local')
1363 1373
    resp = app.post_json(url + '?NameID=local&person_id=000000&kind=emergency', params=params)
1364 1374
    assert resp.json['err'] == 'not-found'
1365 1375
    assert resp.json['err_desc'] == "no '000000' authorized person on '1312' family"
1376

  
1377

  
1378
@mock.patch('passerelle.utils.Request.get')
1379
@mock.patch('passerelle.utils.Request.post')
1380
def test_update_child_dietcode(mocked_post, mocked_get, con, app):
1381
    mocked_get.return_value = FAMILY_SERVICE_WSDL
1382
    mocked_post.return_value = UPDATE_DIETCODE
1383
    url = get_endpoint('update-child-dietcode')
1384

  
1385
    Link.objects.create(resource=con, family_id='1312', name_id='local')
1386
    resp = app.post_json(url + '?NameID=local&child_id=613878&dietcode=RSV')
1387
    assert_sent_payload(mocked_post, 'Q_update_child_dietcode.xml')
1388
    assert resp.json['err'] == 0
1389
    assert resp.json['data'] == 'ok'
1390

  
1391

  
1392
def test_update_child_dietcode_not_linked_error(con, app):
1393
    url = get_endpoint('update-child-dietcode')
1394

  
1395
    resp = app.post_json(url + '?NameID=local&child_id=613878&dietcode=RVS')
1396
    assert resp.json['err'] == 'not-linked'
1397
    assert resp.json['err_desc'] == 'User not linked to family'
1366
-