Projet

Général

Profil

0002-toulouse-maelis-apply-direct-debit-order-WS-on-RL1-7.patch

Nicolas Roche, 21 décembre 2022 14:49

Télécharger (20,1 ko)

Voir les différences:

Subject: [PATCH 2/3] toulouse-maelis: apply direct debit order WS on RL1
 (#72563)

 ...n => test_get_rl1_direct_debit_order.json} |   0
 functests/toulouse_maelis/test_invoice.py     |   8 +-
 .../toulouse_maelis/invoice_schemas.py        |  12 +-
 passerelle/contrib/toulouse_maelis/models.py  |  13 +-
 tests/test_toulouse_maelis.py                 | 124 +++++++++++-------
 5 files changed, 88 insertions(+), 69 deletions(-)
 rename functests/toulouse_maelis/data/{test_get_direct_debit_order.json => test_get_rl1_direct_debit_order.json} (100%)
functests/toulouse_maelis/test_invoice.py
2 2

  
3 3
from .conftest import diff, link, unlink
4 4

  
5 5

  
6 6
def test_direct_debit_order(conn, create_data):
7 7
    unlink(conn, create_data['name_id'])
8 8
    link(conn, create_data)
9 9

  
10
    url = conn + '/add-direct-debit-order?NameID=%s' % create_data['name_id']
10
    url = conn + '/add-rl1-direct-debit-order?NameID=%s' % create_data['name_id']
11 11
    payload = {
12
        'numPerson': create_data['rl1_num'],
13 12
        'codeRegie': '1',
14 13
        'bank/bankBIC': 'BDFEFR2T',
15 14
        'bank/bankIBAN': 'FR7630001007941234567890185',
16 15
        'bank/bankRUM': 'xxx',
17 16
        'bank/dateStart': '2023-01-01',
18 17
        'bank/bankAddress': '75049 PARIS cedex 01',
19 18
        'bank/civility': 'x',
20 19
        'bank/lastName': 'Ewing',
21 20
        'bank/firstName': 'John Ross',
22 21
    }
23 22
    resp = requests.post(url, json=payload)
24 23
    resp.raise_for_status()
25 24
    res = resp.json()
26 25
    assert res['data'] == 'ok'
27 26

  
28
    url = conn + '/get-direct-debit-order?NameID=%s' % create_data['name_id']
27
    url = conn + '/get-rl1-direct-debit-order?NameID=%s' % create_data['name_id']
29 28
    payload = {
30
        'numPerson': create_data['rl1_num'],
31 29
        'codeRegie': '1',
32 30
        'dateRef': '2023-01-01',
33 31
    }
34 32
    resp = requests.post(url, json=payload)
35 33
    resp.raise_for_status()
36 34
    res = resp.json()
37 35
    res['data']['numPerson'] = 'N/A'
38
    assert diff(res['data'], 'test_get_direct_debit_order.json')
36
    assert diff(res['data'], 'test_get_rl1_direct_debit_order.json')
passerelle/contrib/toulouse_maelis/invoice_schemas.py
58 58
}
59 59

  
60 60

  
61 61
ADD_DIRECT_DEBIT_ORDER_SCHEMA = {
62 62
    '$schema': 'http://json-schema.org/draft-04/schema#',
63 63
    'title': 'Add direct debit order',
64 64
    'description': "Ajout d'autorisation de prélèvement",
65 65
    'type': 'object',
66
    'required': ['numPerson', 'bank', 'codeRegie'],
66
    'required': ['bank', 'codeRegie'],
67 67
    'properties': {
68
        'numPerson': {
69
            'description': 'Numéro MAELIS de la personne',
70
            'type': 'string',
71
        },
72 68
        'bank': PERSON_BANK_SCHEMA,
73 69
        'codeRegie': {
74 70
            'description': 'Code de la régie',
75 71
            'type': 'string',
76 72
        },
77 73
    },
78 74
    'additionalProperties': False,
79 75
    'unflatten': True,
80 76
}
81 77

  
82 78

  
83 79
GET_DIRECT_DEBIT_ORDER_SCHEMA = {
84 80
    '$schema': 'http://json-schema.org/draft-04/schema#',
85 81
    'title': 'Get direct debit order',
86 82
    'description': "Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
87 83
    'type': 'object',
88
    'required': ['numPerson', 'codeRegie', 'dateRef'],
84
    'required': ['codeRegie', 'dateRef'],
89 85
    'properties': {
90
        'numPerson': {
91
            'description': 'Numéro MAELIS de la personne',
92
            'type': 'string',
93
        },
94 86
        'codeRegie': {
95 87
            'description': 'Code de la régie',
96 88
            'type': 'string',
97 89
        },
98 90
        'dateRef': {
99 91
            'description': 'Date de référence ',
100 92
            'type': 'string',
101 93
            'pattern': '^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
passerelle/contrib/toulouse_maelis/models.py
1544 1544
        self.assert_update_indicator_payload_in_referential('ChildIndicator', post_data)
1545 1545

  
1546 1546
        self.call('Family', 'updatePersonIndicatorList', numPerson=child_id, **post_data)
1547 1547
        return {'data': 'ok'}
1548 1548

  
1549 1549
    @endpoint(
1550 1550
        display_category='Facture',
1551 1551
        description="Ajout d'autorisation de prélèvement",
1552
        name='add-direct-debit-order',
1552
        name='add-rl1-direct-debit-order',
1553 1553
        perm='can_access',
1554 1554
        parameters={'NameID': {'description': 'Publik NameID'}},
1555 1555
        post={
1556 1556
            'request_body': {'schema': {'application/json': invoice_schemas.ADD_DIRECT_DEBIT_ORDER_SCHEMA}}
1557 1557
        },
1558 1558
    )
1559
    def add_direct_debit_order(self, request, NameID, post_data):
1559
    def add_rl1_direct_debit_order(self, request, NameID, post_data):
1560 1560
        family_id = self.get_link(NameID).family_id
1561
        family = self.get_family_raw(family_id)
1562

  
1563
        post_data['numPerson'] = family['RL1']['num']
1561 1564
        self.call('Invoice', 'addDirectDebitOrder', dossierNumber=family_id, **post_data)
1562 1565
        return {'data': 'ok'}
1563 1566

  
1564 1567
    @endpoint(
1565 1568
        display_category='Facture',
1566 1569
        description="Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
1567
        name='get-direct-debit-order',
1570
        name='get-rl1-direct-debit-order',
1568 1571
        perm='can_access',
1569 1572
        parameters={'NameID': {'description': 'Publik NameID'}},
1570 1573
        post={
1571 1574
            'request_body': {'schema': {'application/json': invoice_schemas.GET_DIRECT_DEBIT_ORDER_SCHEMA}}
1572 1575
        },
1573 1576
    )
1574
    def get_direct_debit_order(self, request, NameID, post_data):
1577
    def get_rl1_direct_debit_order(self, request, NameID, post_data):
1575 1578
        family_id = self.get_link(NameID).family_id
1579
        family = self.get_family_raw(family_id)
1576 1580

  
1581
        post_data['numPerson'] = family['RL1']['num']
1577 1582
        response = self.call('Invoice', 'getDirectDebitOrder', dossierNumber=family_id, **post_data)
1578 1583
        data = serialize_object(response)
1579 1584
        return {'data': data}
1580 1585

  
1581 1586

  
1582 1587
class Link(models.Model):
1583 1588
    resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)
1584 1589
    name_id = models.CharField(blank=False, max_length=256)
tests/test_toulouse_maelis.py
13 13
# You should have received a copy of the GNU Affero General Public License
14 14
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15 15

  
16 16
import logging
17 17
import os
18 18
from unittest import mock
19 19

  
20 20
import pytest
21
import responses
21 22
from requests.exceptions import ConnectionError
22 23
from zeep import Settings
23 24

  
24 25
from passerelle.contrib.toulouse_maelis.models import Link, Referential, ToulouseMaelis
25 26
from passerelle.utils.jsonresponse import APIError
26 27
from passerelle.utils.soap import SOAPError
27 28
from tests.utils import FakedResponse, ResponsesSoap, generic_endpoint_url, setup_access_rights
28 29

  
......
44 45

  
45 46

  
46 47
def get_endpoint(name):
47 48
    url = generic_endpoint_url('toulouse-maelis', name)
48 49
    assert url == '/toulouse-maelis/test/%s' % name
49 50
    return url
50 51

  
51 52

  
53
@pytest.fixture
54
def requests_mock():
55
    return responses.RequestsMock()
56

  
57

  
52 58
@pytest.fixture()
53
def family_service():
54
    with ResponsesSoap(
59
def family_service(requests_mock):
60
    responses_soap = ResponsesSoap(
55 61
        wsdl_url='https://example.org/FamilyService?wsdl',
56 62
        wsdl_content=get_xml_file('FamilyService.wsdl'),
57 63
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
58
    )() as mock:
59
        yield mock
64
        requests_mock=requests_mock,
65
    )
66
    with responses_soap() as soap_mock:
67
        yield soap_mock
60 68

  
61 69

  
62 70
@pytest.fixture()
63
def activity_service():
64
    with ResponsesSoap(
71
def activity_service(requests_mock):
72
    responses_soap = ResponsesSoap(
65 73
        wsdl_url='https://example.org/ActivityService?wsdl',
66 74
        wsdl_content=get_xml_file('ActivityService.wsdl'),
67 75
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
68
    )() as mock:
69
        yield mock
76
        requests_mock=requests_mock,
77
    )
78
    with responses_soap() as soap_mock:
79
        yield soap_mock
70 80

  
71 81

  
72 82
@pytest.fixture()
73
def invoice_service():
74
    with ResponsesSoap(
83
def invoice_service(requests_mock):
84
    responses_soap = ResponsesSoap(
75 85
        wsdl_url='https://example.org/InvoiceService?wsdl',
76 86
        wsdl_content=get_xml_file('InvoiceService.wsdl'),
77 87
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
78
    )() as mock:
79
        yield mock
88
        requests_mock=requests_mock,
89
    )
90
    with responses_soap() as soap_mock:
91
        yield soap_mock
80 92

  
81 93

  
82 94
@pytest.fixture(scope='module')
83 95
def django_db_setup(django_db_setup, django_db_blocker):
84 96
    with django_db_blocker.unblock():
85 97
        con = setup_access_rights(
86 98
            ToulouseMaelis.objects.get_or_create(
87 99
                slug='test',
......
91 103
            )[0]
92 104
        )
93 105

  
94 106
        family_service = ResponsesSoap(
95 107
            wsdl_url='https://example.org/FamilyService?wsdl',
96 108
            wsdl_content=get_xml_file('FamilyService.wsdl'),
97 109
            settings=Settings(strict=False, xsd_ignore_sequence_order=True),
98 110
        )
99
        with family_service() as mock:
100
            family_service.add_soap_response('readCategoryList', get_xml_file('R_read_category_list.xml'))
101
            family_service.add_soap_response(
111
        with family_service() as soap_mock:
112
            soap_mock.add_soap_response('readCategoryList', get_xml_file('R_read_category_list.xml'))
113
            soap_mock.add_soap_response(
102 114
                'readChildIndicatorList', get_xml_file('R_read_child_indicator_list.xml')
103 115
            )
104
            family_service.add_soap_response('readCivilityList', get_xml_file('R_read_civility_list.xml'))
105
            family_service.add_soap_response('readCountryList', get_xml_file('R_read_country_list.xml'))
106
            family_service.add_soap_response('readCSPList', get_xml_file('R_read_csp_list.xml'))
107
            family_service.add_soap_response('readDietCodeList', get_xml_file('R_read_dietcode_list.xml'))
108
            family_service.add_soap_response('readOrganList', get_xml_file('R_read_organ_list.xml'))
109
            family_service.add_soap_response('readPAIList', get_xml_file('R_read_pai_list.xml'))
110
            family_service.add_soap_response('readQualityList', get_xml_file('R_read_quality_list.xml'))
111
            family_service.add_soap_response('readQuotientList', get_xml_file('R_read_quotient_list.xml'))
112
            family_service.add_soap_response(
113
                'readRLIndicatorList', get_xml_file('R_read_rl_indicator_list.xml')
114
            )
115
            family_service.add_soap_response('readSituationList', get_xml_file('R_read_situation_list.xml'))
116
            family_service.add_soap_response('readStreetList', get_xml_file('R_read_street_list.xml'))
117
            family_service.add_soap_response('readVaccinList', get_xml_file('R_read_vaccin_list.xml'))
116
            soap_mock.add_soap_response('readCivilityList', get_xml_file('R_read_civility_list.xml'))
117
            soap_mock.add_soap_response('readCountryList', get_xml_file('R_read_country_list.xml'))
118
            soap_mock.add_soap_response('readCSPList', get_xml_file('R_read_csp_list.xml'))
119
            soap_mock.add_soap_response('readDietCodeList', get_xml_file('R_read_dietcode_list.xml'))
120
            soap_mock.add_soap_response('readOrganList', get_xml_file('R_read_organ_list.xml'))
121
            soap_mock.add_soap_response('readPAIList', get_xml_file('R_read_pai_list.xml'))
122
            soap_mock.add_soap_response('readQualityList', get_xml_file('R_read_quality_list.xml'))
123
            soap_mock.add_soap_response('readQuotientList', get_xml_file('R_read_quotient_list.xml'))
124
            soap_mock.add_soap_response('readRLIndicatorList', get_xml_file('R_read_rl_indicator_list.xml'))
125
            soap_mock.add_soap_response('readSituationList', get_xml_file('R_read_situation_list.xml'))
126
            soap_mock.add_soap_response('readStreetList', get_xml_file('R_read_street_list.xml'))
127
            soap_mock.add_soap_response('readVaccinList', get_xml_file('R_read_vaccin_list.xml'))
118 128
            con.daily()
119 129

  
120 130
    # reset change in zeep private interface to bypass clear_cache fixture
121 131
    from zeep.cache import InMemoryCache
122 132

  
123 133
    InMemoryCache._cache = {}
124 134

  
125 135

  
......
3255 3265
    resp = app.post_json(url + '?NameID=local&child_id=613880', params=params)
3256 3266
    assert resp.json['err'] == 'wrong-key'
3257 3267
    assert (
3258 3268
        resp.json['err_desc']
3259 3269
        == "indicatorList/0/code key value 'plop' do not belong to 'ChildIndicator' required referential"
3260 3270
    )
3261 3271

  
3262 3272

  
3263
def test_add_direct_debit_order(invoice_service, con, app):
3273
def test_add_rl1_direct_debit_order(family_service, invoice_service, con, app):
3264 3274
    def request_check(request):
3265 3275
        assert request.dossierNumber == 1312
3266 3276

  
3277
    family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
3267 3278
    invoice_service.add_soap_response(
3268
        'addDirectDebitOrder', get_xml_file('R_add_direct_debit_order.xml'), request_check=request_check
3279
        'addDirectDebitOrder',
3280
        get_xml_file('R_add_direct_debit_order.xml'),
3281
        request_check=request_check,
3269 3282
    )
3270
    url = get_endpoint('add-direct-debit-order')
3283
    url = get_endpoint('add-rl1-direct-debit-order')
3271 3284
    params = {
3272
        'numPerson': '613878',
3273 3285
        'codeRegie': '22',
3274 3286
        'bank/bankBIC': 'BDFEFR2T',
3275 3287
        'bank/bankIBAN': 'FR7630001007941234567890185',
3276 3288
        'bank/bankRUM': 'xxx',
3277 3289
        'bank/dateStart': '2023-01-01',
3278 3290
        'bank/bankAddress': '75049 PARIS cedex 01',
3279 3291
        'bank/civility': 'x',
3280 3292
        'bank/lastName': 'Ewing',
......
3282 3294
    }
3283 3295

  
3284 3296
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3285 3297
    resp = app.post_json(url + '?NameID=local', params=params)
3286 3298
    assert resp.json['err'] == 0
3287 3299
    assert resp.json['data'] == 'ok'
3288 3300

  
3289 3301

  
3290
def test_add_direct_debit_order_not_linked_error(con, app):
3291
    url = get_endpoint('add-direct-debit-order')
3302
def test_add_rl1_direct_debit_order_not_linked_error(con, app):
3303
    url = get_endpoint('add-rl1-direct-debit-order')
3292 3304
    params = {
3293
        'numPerson': '613878',
3294 3305
        'codeRegie': '22',
3295 3306
        'bank/bankBIC': 'BDFEFR2T',
3296 3307
        'bank/bankIBAN': 'FR7630001007941234567890185',
3297 3308
        'bank/bankRUM': 'xxx',
3298 3309
        'bank/dateStart': '2023-01-01',
3299 3310
        'bank/bankAddress': '75049 PARIS cedex 01',
3300 3311
        'bank/civility': 'x',
3301 3312
        'bank/lastName': 'Ewing',
3302 3313
        'bank/firstName': 'John Ross',
3303 3314
    }
3304 3315

  
3305 3316
    resp = app.post_json(url + '?NameID=local', params=params)
3306 3317
    assert resp.json['err'] == 'not-linked'
3307 3318
    assert resp.json['err_desc'] == 'User not linked to family'
3308 3319

  
3309 3320

  
3310
def test_add_direct_debit_order_soap_error(invoice_service, con, app):
3321
def test_add_rl1_direct_debit_order_soap_error(family_service, invoice_service, con, app):
3322
    family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
3311 3323
    invoice_service.add_soap_response(
3312 3324
        'addDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3313 3325
    )
3314

  
3315
    url = get_endpoint('add-direct-debit-order')
3326
    url = get_endpoint('add-rl1-direct-debit-order')
3316 3327
    params = {
3317
        'numPerson': '613878',
3318 3328
        'codeRegie': '12345',
3319 3329
        'bank/bankBIC': 'BDFEFR2T',
3320 3330
        'bank/bankIBAN': 'FR7630001007941234567890185',
3321 3331
        'bank/bankRUM': 'xxx',
3322 3332
        'bank/dateStart': '2023-01-01',
3323 3333
        'bank/bankAddress': '75049 PARIS cedex 01',
3324 3334
        'bank/civility': 'x',
3325 3335
        'bank/lastName': 'Ewing',
......
3327 3337
    }
3328 3338

  
3329 3339
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3330 3340
    resp = app.post_json(url + '?NameID=local', params=params)
3331 3341
    assert resp.json['err'] == 'Invoice-addDirectDebitOrder-soap:Server'
3332 3342
    assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
3333 3343

  
3334 3344

  
3335
def test_get_direct_debit_order(invoice_service, con, app):
3345
def test_get_rl1_direct_debit_order(family_service, invoice_service, con, app):
3336 3346
    def request_check(request):
3337 3347
        assert request.dossierNumber == 1312
3338 3348

  
3349
    family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
3339 3350
    invoice_service.add_soap_response(
3340
        'getDirectDebitOrder', get_xml_file('R_get_direct_debit_order.xml'), request_check=request_check
3351
        'getDirectDebitOrder',
3352
        get_xml_file('R_get_direct_debit_order.xml'),
3353
        request_check=request_check,
3341 3354
    )
3342
    url = get_endpoint('get-direct-debit-order')
3355
    url = get_endpoint('get-rl1-direct-debit-order')
3343 3356
    params = {
3344
        'numPerson': '613878',
3345 3357
        'codeRegie': '22',
3346 3358
        'dateRef': '2023-01-01',
3347 3359
    }
3348 3360

  
3349 3361
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3350 3362
    resp = app.post_json(url + '?NameID=local', params=params)
3351 3363
    assert resp.json['err'] == 0
3352 3364
    assert resp.json['data'] == {
......
3356 3368
        'dateStart': '2023-01-01T00:00:00+01:00',
3357 3369
        'bankAddress': '75049 PARIS cedex 01',
3358 3370
        'civility': 'x',
3359 3371
        'lastName': 'Ewing',
3360 3372
        'firstName': 'John Ross',
3361 3373
    }
3362 3374

  
3363 3375

  
3364
def test_get_direct_debit_order_not_linked_error(con, app):
3365
    url = get_endpoint('get-direct-debit-order')
3376
def test_get_rl1_direct_debit_order_parameter_error(con, app):
3377
    url = get_endpoint('get-rl1-direct-debit-order')
3378
    params = {
3379
        'codeRegie': '22',
3380
        'dateRef': 'plop',
3381
    }
3382

  
3383
    resp = app.post_json(url + '?NameID=local', params=params, status=400)
3384
    assert resp.json['err'] == 1
3385
    assert resp.json['err_class'] == 'passerelle.utils.jsonresponse.APIError'
3386
    assert resp.json['err_desc'] == "dateRef: 'plop' does not match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'"
3387

  
3388

  
3389
def test_get_rl1_direct_debit_order_not_linked_error(con, app):
3390
    url = get_endpoint('get-rl1-direct-debit-order')
3366 3391
    params = {
3367
        'numPerson': '613878',
3368 3392
        'codeRegie': '22',
3369 3393
        'dateRef': '2023-01-01',
3370 3394
    }
3371 3395

  
3372 3396
    resp = app.post_json(url + '?NameID=local', params=params)
3373 3397
    assert resp.json['err'] == 'not-linked'
3374 3398
    assert resp.json['err_desc'] == 'User not linked to family'
3375 3399

  
3376 3400

  
3377
def test_get_direct_debit_order_soap_error(invoice_service, con, app):
3401
def test_get_rl1_direct_debit_order_soap_error(family_service, invoice_service, con, app):
3402
    family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
3378 3403
    invoice_service.add_soap_response(
3379 3404
        'getDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3380 3405
    )
3381
    url = get_endpoint('get-direct-debit-order')
3406
    url = get_endpoint('get-rl1-direct-debit-order')
3382 3407
    params = {
3383
        'numPerson': '613878',
3384 3408
        'codeRegie': '12345',
3385 3409
        'dateRef': '2023-01-01',
3386 3410
    }
3387 3411

  
3388 3412
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3389 3413
    resp = app.post_json(url + '?NameID=local', params=params)
3390 3414
    assert resp.json['err'] == 'Invoice-getDirectDebitOrder-soap:Server'
3391 3415
    assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
3392
-