Projet

Général

Profil

0001-dpark-remove-hardcoding-of-the-service-binding-72638.patch

Benjamin Dauvergne, 20 décembre 2022 12:01

Télécharger (39,8 ko)

Voir les différences:

Subject: [PATCH] dpark: remove hardcoding of the service binding (#72638)

 passerelle/contrib/dpark/models.py |  16 +-
 tests/test_dpark.py                | 881 +++++++++++++++--------------
 2 files changed, 449 insertions(+), 448 deletions(-)
passerelle/contrib/dpark/models.py
46 46
        return False
47 47

  
48 48

  
49
SERVICE_BINDING = '{urn:Webservice_Residants}Webservice_ResidantsSOAPBinding'
50

  
51

  
52 49
DOCUMENT_CODES = {
53 50
    'justif_domicile': '2',
54 51
    'assurance': '4',
......
195 192
    }
196 193

  
197 194

  
198
def get_client(instance):
199
    return instance.soap_client()
195
def get_service(instance):
196
    client = instance.soap_client()
197
    service_name = list(client.wsdl.services)[0]
198
    port_name = list(client.wsdl.services[service_name].ports)[0]
199
    binding_name = str(client.wsdl.services[service_name].ports[port_name].binding.name)
200
    return client.create_service(binding_name, instance.operation_url)
200 201

  
201 202

  
202 203
class DPark(BaseResource):
......
224 225
        return '%s - %s' % (self.slug, self.wsdl_url)
225 226

  
226 227
    def call(self, operation, *args, **kwargs):
227
        client = get_client(self)
228
        proxy_service = client.create_service(SERVICE_BINDING, self.operation_url)
228
        service = get_service(self)
229 229
        bypass_erroneous_reply = kwargs.pop('bypass_erroneous_reply', False)
230 230
        try:
231
            reply = getattr(proxy_service, operation)(*args, **kwargs)
231
            reply = getattr(service, operation)(*args, **kwargs)
232 232
        except (WebFault,) as exc:
233 233
            raise APIError('ServiceError: %s' % exc)
234 234
        except (Exception,) as exc:
tests/test_dpark.py
83 83

  
84 84

  
85 85
class MockedService:
86
    def __init__(self, success, error_class, replydata):
86
    def __init__(self, success=True, error_class=None, replydata=None):
87 87
        self.success = success
88 88
        self.error_class = error_class
89 89
        self.replydata = replydata
......
106 106
        return self.return_response
107 107

  
108 108

  
109
def get_client(success=True, error_class=None, replydata=None):
110
    service = MockedService(success, error_class, replydata)
111

  
112
    def create_service(binging, operation_endpoint):
113
        return service
114

  
115
    return mock.Mock(create_service=create_service, service=service)
116

  
117

  
118
def test_call_service_error(dpark, app):
119
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
120
        client.return_value = get_client(error_class=WebFault)
121
        resp = app.get('/dpark/test/ping/')
122
        assert 'ServiceError: ' in resp.json['err_desc']
123
        client.return_value = get_client(error_class=TransportError)
124
        resp = app.get('/dpark/test/ping/')
125
        assert 'Error: connection error occured' in resp.json['err_desc']
126
        client.return_value = get_client(error_class=Exception)
127
        resp = app.get('/dpark/test/ping/')
128
        assert 'Error: random error' in resp.json['err_desc']
129
        client.return_value = get_client(error_class=WebFaultHavingLatin1)
130
        resp = app.get('/dpark/test/ping/')
131
        assert 'ServiceError: éêè' in resp.json['err_desc']
109
@pytest.fixture
110
def get_service():
111
    with mock.patch('passerelle.contrib.dpark.models.get_service') as get_service:
112
        yield get_service
113

  
114

  
115
def test_call_service_error(dpark, app, get_service):
116
    get_service.return_value = MockedService(error_class=WebFault)
117
    resp = app.get('/dpark/test/ping/')
118
    assert 'ServiceError: ' in resp.json['err_desc']
119
    get_service.return_value = MockedService(error_class=TransportError)
120
    resp = app.get('/dpark/test/ping/')
121
    assert 'Error: connection error occured' in resp.json['err_desc']
122
    get_service.return_value = MockedService(error_class=Exception)
123
    resp = app.get('/dpark/test/ping/')
124
    assert 'Error: random error' in resp.json['err_desc']
125
    get_service.return_value = MockedService(error_class=WebFaultHavingLatin1)
126
    resp = app.get('/dpark/test/ping/')
127
    assert 'ServiceError: éêè' in resp.json['err_desc']
128

  
129

  
130
def test_ping(dpark, app, get_service):
131
    get_service.return_value = MockedService(replydata={'Code_Retour': '01', 'Lib_Retour': 'whatever'})
132
    resp = app.get('/dpark/test/ping/')
133
    assert resp.json['data'] is True
132 134

  
133 135

  
134
def test_ping(dpark, app):
135
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
136
        client.return_value = get_client(replydata={'Code_Retour': '01', 'Lib_Retour': 'whatever'})
137
        resp = app.get('/dpark/test/ping/')
138
        assert resp.json['data'] is True
136
def test_search(dpark, app, get_service):
137
    params = {
138
        'lastname': 'bar',
139
        'firstnames': 'foo',
140
        'filenumber': '1' * 9,
141
        'cardnumber': '3' * 9,
142
    }
143
    # missing lastname
144
    app.get('/dpark/test/search/', params={'firstnames': 'toto'}, status=400)
145
    # unknown file
146
    get_service.return_value = MockedService(
147
        replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}
148
    )
149
    resp = app.get('/dpark/test/search/', params=params)
150
    assert resp.json['err'] == 1
151
    assert resp.json['code'] == 'unknown-file'
152
    # invalid cardnumber
153
    get_service.return_value = MockedService(
154
        replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
155
    )
156
    resp = app.get('/dpark/test/search/', params=params)
157
    assert resp.json['err'] == 1
158
    assert resp.json['code'] == 'support-number-unknown'
159
    # valid data
160
    get_service.return_value = MockedService(
161
        replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}
162
    )
163
    resp = app.get('/dpark/test/search/', params=params)
164
    assert resp.json['err'] == 0
139 165

  
140 166

  
141
def test_search(dpark, app):
142
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
143
        params = {
144
            'lastname': 'bar',
145
            'firstnames': 'foo',
146
            'filenumber': '1' * 9,
147
            'cardnumber': '3' * 9,
148
        }
149
        # missing lastname
150
        app.get('/dpark/test/search/', params={'firstnames': 'toto'}, status=400)
151
        # unknown file
152
        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'})
153
        resp = app.get('/dpark/test/search/', params=params)
154
        assert resp.json['err'] == 1
155
        assert resp.json['code'] == 'unknown-file'
156
        # invalid cardnumber
157
        client.return_value = get_client(
158
            replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
159
        )
160
        resp = app.get('/dpark/test/search/', params=params)
161
        assert resp.json['err'] == 1
162
        assert resp.json['code'] == 'support-number-unknown'
163
        # valid data
164
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
165
        resp = app.get('/dpark/test/search/', params=params)
166
        assert resp.json['err'] == 0
167

  
168

  
169
def test_link(dpark, app):
170
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
171
        params = {
172
            'lastname': 'bar ',
173
            'firstnames': ' foo',
174
            'filenumber': ' ' + '1' * 9,
175
        }
176
        # missing nameid
177
        app.post_json('/dpark/test/link/', params=params, status=400)
178
        params['nameid'] = 'abcd' * 8
179
        # unknown file
180
        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'})
181
        resp = app.post_json('/dpark/test/link/', params=params)
182
        assert resp.json['err'] == 1
183
        assert resp.json['code'] == 'unknown-file'
184
        # invalid cardnumber
185
        client.return_value = get_client(
186
            replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
187
        )
188
        resp = app.post_json('/dpark/test/link/', params=params)
189
        assert resp.json['err'] == 1
190
        assert resp.json['code'] == 'support-number-unknown'
191
        # valid data
192
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
193
        resp = app.post_json('/dpark/test/link/', params=params)
194
        assert resp.json['err'] == 0
195
        assert Pairing.objects.count() == 1
196
        pairing = Pairing.objects.get(resource=dpark)
197
        assert pairing.nameid == 'abcd' * 8
198
        assert pairing.filenumber == '1' * 9
199
        assert pairing.firstnames == 'foo'
200
        assert pairing.lastname == 'bar'
201

  
202

  
203
def test_unlink(dpark, app):
204
    with mock.patch('passerelle.contrib.dpark.models.get_client', get_client()):
205
        nameid = 'abcd' * 8
206
        params = {'nameid': nameid}
207
        # missing nameid
208
        app.post_json('/dpark/test/unlink/', params={}, status=400)
209
        # no pairing exists
210
        resp = app.post_json('/dpark/test/unlink/', params=params)
211
        assert resp.json['err'] == 1
212
        assert resp.json['err_desc'] == 'No pairing exists'
213
        # pairing exist
214
        Pairing.objects.create(
215
            resource=dpark,
216
            nameid=nameid,
217
            lastname='bar',
218
            firstnames='foo',
219
            filenumber='1' * 9,
220
            badgenumber='2' * 9,
221
            cardnumber='3' * 9,
222
        )
223
        resp = app.post_json('/dpark/test/unlink/', params=params)
224
        assert resp.json['data'] is True
225
        assert Pairing.objects.count() == 0
167
def test_link(dpark, app, get_service):
168
    params = {
169
        'lastname': 'bar ',
170
        'firstnames': ' foo',
171
        'filenumber': ' ' + '1' * 9,
172
    }
173
    # missing nameid
174
    app.post_json('/dpark/test/link/', params=params, status=400)
175
    params['nameid'] = 'abcd' * 8
176
    # unknown file
177
    get_service.return_value = MockedService(
178
        replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}
179
    )
180
    resp = app.post_json('/dpark/test/link/', params=params)
181
    assert resp.json['err'] == 1
182
    assert resp.json['code'] == 'unknown-file'
183
    # invalid cardnumber
184
    get_service.return_value = MockedService(
185
        replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
186
    )
187
    resp = app.post_json('/dpark/test/link/', params=params)
188
    assert resp.json['err'] == 1
189
    assert resp.json['code'] == 'support-number-unknown'
190
    # valid data
191
    get_service.return_value = MockedService(
192
        replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}
193
    )
194
    resp = app.post_json('/dpark/test/link/', params=params)
195
    assert resp.json['err'] == 0
196
    assert Pairing.objects.count() == 1
197
    pairing = Pairing.objects.get(resource=dpark)
198
    assert pairing.nameid == 'abcd' * 8
199
    assert pairing.filenumber == '1' * 9
200
    assert pairing.firstnames == 'foo'
201
    assert pairing.lastname == 'bar'
202

  
203

  
204
def test_unlink(dpark, app, get_service):
205
    get_service.return_value = MockedService()
206
    nameid = 'abcd' * 8
207
    params = {'nameid': nameid}
208
    # missing nameid
209
    app.post_json('/dpark/test/unlink/', params={}, status=400)
210
    # no pairing exists
211
    resp = app.post_json('/dpark/test/unlink/', params=params)
212
    assert resp.json['err'] == 1
213
    assert resp.json['err_desc'] == 'No pairing exists'
214
    # pairing exist
215
    Pairing.objects.create(
216
        resource=dpark,
217
        nameid=nameid,
218
        lastname='bar',
219
        firstnames='foo',
220
        filenumber='1' * 9,
221
        badgenumber='2' * 9,
222
        cardnumber='3' * 9,
223
    )
224
    resp = app.post_json('/dpark/test/unlink/', params=params)
225
    assert resp.json['data'] is True
226
    assert Pairing.objects.count() == 0
226 227

  
227 228

  
228 229
def test_address_eligibility(dpark, app):
......
271 272
    assert content['address']['address_locality'] == 'Toulouse'
272 273

  
273 274

  
274
def test_subscriber_infos(dpark, app):
275
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
276
        nameid = 'abcd' * 8
277
        url = '/dpark/test/infos/%s/' % nameid
278
        params = {
279
            'nameid': nameid,
280
            'firstnames': 'spam eggs',
281
            'lastname': 'bar',
282
            'filenumber': '1' * 9,
283
            'badgenumber': '2' * 9,
284
        }
285
        Pairing.objects.create(resource=dpark, **params)
286
        # unknown subscriber
287
        resp = app.get('/dpark/test/infos/toto/')
288
        assert resp.json['data'] == []
289
        # unknown file
290
        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'})
291
        resp = app.get(url)
292
        assert resp.json['data'] == []
293
        # known file
294
        replydata = {
295
            'CodeRetour': '01',
296
            'MessageRetour': 'Dossier existant',
297
            "Adresse_BoitePostaleLieuDit": None,
298
            "Adresse_CodePostal": "44000",
299
            "Adresse_CodeSTI": "315553609651",
300
            "Adresse_EtageEscalierAppartement": None,
301
            "Adresse_Extension": 1,
302
            "Adresse_ImmeubleBatimentResidence": None,
303
            "Adresse_Localite": "Nantes",
304
            "Adresse_NomVoie": "All\u00e9es Jean Jaur\u00e8s",
305
            "Adresse_NumeroVoie": 80,
306
            "Adresse_Quartier": "PERI",
307
            "Demande_DateDebutAbo": "20180625",
308
            "Demande_DateFinAbo": "20190624",
309
            "Demande_DelaiAutorise": 30,
310
            "Demande_ImmatVehicule1": "CX453AD",
311
            "Demande_ImmatVehicule2": None,
312
            "Demande_MarqueVehicule1": "CITROEN",
313
            "Demande_MarqueVehicule2": None,
314
            "Demande_ModeleVehicule1": "GS",
315
            "Demande_ModeleVehicule2": None,
316
            "Demande_NumeroDossier": 22952,
317
            "Demandeur_Civilite": 1,
318
            "Demandeur_Email": "spameggs@example.net",
319
            "Demandeur_NomUsuel": "BAR",
320
            "Demandeur_Prenom": "Foo Spam",
321
            "Demandeur_TelephoneFixe": "0611111111",
322
            "Demandeur_TelephonePortable": None,
323
        }
324
        client.return_value = get_client(replydata=replydata)
325
        resp = app.get(url)
326
        data = resp.json['data']
327
        assert data[0]['id'] == '22952'
328
        assert data[0]['text'] == '22952 - BAR Foo Spam - CX453AD'
329
        assert data[0]['adresse_codepostal'] == '44000'
330
        assert data[0]['adresse_codesti'] == '315553609651'
331
        assert data[0]['adresse_localite'] == 'Nantes'
332
        assert data[0]['demande_numerodossier'] == 22952
333
        assert data[0]['demandeur_email'] == 'spameggs@example.net'
334
        assert data[0]['demandeur_telephonefixe'] == '0611111111'
335
        assert data[0]['demande_datedebutabo'] == '2018-06-25'
336
        assert data[0]['demande_datefinabo'] == '2019-06-24'
337

  
338
        # mutiple pairing
339
        Pairing.objects.create(
340
            resource=dpark,
341
            nameid=nameid,
342
            firstnames='monty',
343
            lastname='eggs',
344
            filenumber='5' * 9,
345
            badgenumber='6' * 9,
346
            cardnumber='7' * 9,
347
        )
348
        replydata2 = {
349
            'CodeRetour': '01',
350
            'MessageRetour': 'Dossier existant',
351
            "Adresse_BoitePostaleLieuDit": None,
352
            "Adresse_CodePostal": "94000",
353
            "Adresse_CodeSTI": "315553609651",
354
            "Adresse_EtageEscalierAppartement": None,
355
            "Adresse_Extension": 1,
356
            "Adresse_ImmeubleBatimentResidence": None,
357
            "Adresse_Localite": "Creteil",
358
            "Adresse_NomVoie": "Allée les sablons",
359
            "Adresse_NumeroVoie": 5,
360
            "Adresse_Quartier": "HOOLI",
361
            "Demande_DateDebutAbo": "20180430",
362
            "Demande_DateFinAbo": None,
363
            "Demande_DelaiAutorise": 30,
364
            "Demande_ImmatVehicule1": "AA555BB",
365
            "Demande_ImmatVehicule2": "XX333YY",
366
            "Demande_MarqueVehicule1": "FORD",
367
            "Demande_MarqueVehicule2": "MERCEDES",
368
            "Demande_ModeleVehicule1": "Fiesta",
369
            "Demande_ModeleVehicule2": "Serie A",
370
            "Demande_NumeroDossier": 22955,
371
            "Demandeur_Civilite": 1,
372
            "Demandeur_Email": "spameggs@example.net",
373
            "Demandeur_NomUsuel": "EGGS",
374
            "Demandeur_Prenom": "Monty",
375
            "Demandeur_TelephoneFixe": "0611111111",
376
            "Demandeur_TelephonePortable": None,
377
        }
378
        # there will be only one call as first pairing is now cached
379
        client.side_effect = [get_client(replydata=replydata2)]
380
        resp = app.get(url)
381
        data = resp.json['data']
382
        assert len(data) == 2
383
        assert data[1]['id'] == '22955'
384
        assert data[1]['text'] == '22955 - EGGS Monty - AA555BB/XX333YY'
385
        assert data[1]['adresse_codepostal'] == '94000'
386
        assert data[1]['adresse_codesti'] == '315553609651'
387
        assert data[1]['adresse_localite'] == 'Creteil'
388
        assert data[1]['demande_numerodossier'] == 22955
389
        assert data[1]['demandeur_email'] == 'spameggs@example.net'
390
        assert data[1]['demandeur_telephonefixe'] == '0611111111'
391
        assert data[1]['demande_datedebutabo'] == '2018-04-30'
392
        assert data[1]['demande_datefinabo'] is None
393

  
394
        # filtering by filenumber
395
        for pairing in Pairing.objects.all():
396
            pairing.clear_cache()
397
        # we modify numerodossier to verify cache is not used
398
        replydata['Demande_NumeroDossier'] = 22953
399
        client.side_effect = [
400
            get_client(replydata=replydata),
401
        ]
402
        resp = app.get(url, params={'filenumber': '1' * 9})
403
        data = resp.json['data']
404
        assert len(data) == 1
405
        assert data[0]['id'] == '22953'
406
        assert data[0]['text'] == '22953 - BAR Foo Spam - CX453AD'
407
        assert data[0]['adresse_codepostal'] == '44000'
408
        assert data[0]['adresse_codesti'] == '315553609651'
409
        assert data[0]['adresse_localite'] == 'Nantes'
410
        assert data[0]['demande_numerodossier'] == 22953
411
        assert data[0]['demandeur_email'] == 'spameggs@example.net'
412
        assert data[0]['demandeur_telephonefixe'] == '0611111111'
413
        assert data[0]['demande_datedebutabo'] == '2018-06-25'
414
        assert data[0]['demande_datefinabo'] == '2019-06-24'
415

  
416

  
417
def test_check_renewal_time(dpark, app):
418
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
419
        url = '/dpark/test/check-renewal-time/'
420
        params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
421
        client.return_value = get_client(
422
            replydata={'CodeRetour': '02', 'MessageRetour': 'Renouvellement hors délai'}
423
        )
424
        resp = app.get(url, params=params)
425
        assert resp.json['data'] is False
426
        assert resp.json['desc'] == 'Renouvellement hors délai'
427
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
428
        resp = app.get(url, params=params)
429
        assert resp.json['data'] is True
430

  
431

  
432
def test_check_renewal_duplicate(dpark, app):
433
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
434
        url = '/dpark/test/check-renewal-time/'
435
        params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
436
        client.return_value = get_client(
437
            replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
438
        )
439
        resp = app.get(url, params=params)
440
        assert resp.json['data'] is False
441
        assert resp.json['desc'] == 'Demande déjà en cours'
442
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
443
        resp = app.get(url, params=params)
444
        assert resp.json['data'] is True
445
        assert resp.json['err'] == 0
446

  
447

  
448
def test_check_creation_duplicate(dpark, app):
449
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
450
        url = '/dpark/test/check-creation-duplicate/'
451
        params = {
452
            'address_district': 'PERI',
453
            'address_locality': 'Toulouse',
454
            'address_sticode': '315553609651',
455
            'address_streetext': '1',
456
            'address_zipcode': '31000',
457
            'applicant_firstnames': 'Spam',
458
            'applicant_lastname': 'Ham',
459
        }
460
        client.return_value = get_client(
461
            replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
462
        )
463
        resp = app.get(url, params=params)
464
        assert resp.json['data'] is False
465
        assert resp.json['desc'] == 'Demande déjà en cours'
466
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''})
467
        resp = app.get(url, params=params)
468
        assert resp.json['data'] is True
469
        assert resp.json['err'] == 0
470

  
471

  
472
def test_check_creation_not_renewal(dpark, app):
473
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
474
        url = '/dpark/test/check-creation-not-renewal/'
475
        params = {
476
            'address_district': 'PERI',
477
            'address_locality': 'Toulouse',
478
            'address_sticode': '315553609651',
479
            'address_streetext': '1',
480
            'address_zipcode': '31000',
481
            'applicant_firstnames': 'Spam',
482
            'applicant_lastname': 'Ham',
483
        }
484
        client.return_value = get_client(
485
            replydata={'CodeRetour': '02', 'MessageRetour': 'Usager existe déjà dans D-Park'}
486
        )
487
        resp = app.get(url, params=params)
488
        assert resp.json['data'] is False
489
        assert resp.json['desc'] == 'Usager existe déjà dans D-Park'
490
        client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''})
491
        resp = app.get(url, params=params)
492
        assert resp.json['data'] is True
493

  
494

  
495
def test_get_payment_infos(dpark, app):
496
    with mock.patch('passerelle.contrib.dpark.models.get_client') as client:
497
        nameid = 'abcd' * 8
498
        url = '/dpark/test/payment-info/%s/' % nameid
499
        resp = app.get(url)
500
        assert resp.json['err'] == 1
501
        assert resp.json['err_desc'] == 'No pairing exists'
502
        params = {
503
            'nameid': nameid,
504
            'firstnames': 'spam eggs',
505
            'lastname': 'bar',
506
            'filenumber': '1' * 9,
507
            'badgenumber': '2' * 9,
508
        }
509
        Pairing.objects.create(resource=dpark, **params)
510
        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'})
511
        resp = app.get(url)
512
        assert resp.json['err'] == 0
513
        assert resp.json['data'] == []
514
        replydata = {
515
            'CodeRetour': '01',
516
            'MessageRetour': 'Demande acceptée',
517
            'NumeroDemande': '55555',
518
            'Montant': 12500,
519
            'TypePaiement': 10,
520
            'NumeroTeledossierPhase1': 'E-8-0AA666BB',
521
        }
522
        client.return_value = get_client(replydata=replydata)
523
        resp = app.get(url)
524
        data = resp.json['data'][0]
525
        assert data['montant'] == 125
526
        assert data['typepaiement'] == 10
527
        assert data['typepaiement_text'] == 'Carte Bancaire via Internet'
528
        assert data['numerodemande'] == '55555'
275
def test_subscriber_infos(dpark, app, get_service):
276
    nameid = 'abcd' * 8
277
    url = '/dpark/test/infos/%s/' % nameid
278
    params = {
279
        'nameid': nameid,
280
        'firstnames': 'spam eggs',
281
        'lastname': 'bar',
282
        'filenumber': '1' * 9,
283
        'badgenumber': '2' * 9,
284
    }
285
    Pairing.objects.create(resource=dpark, **params)
286
    # unknown subscriber
287
    resp = app.get('/dpark/test/infos/toto/')
288
    assert resp.json['data'] == []
289
    # unknown file
290
    get_service.return_value = MockedService(
291
        replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}
292
    )
293
    resp = app.get(url)
294
    assert resp.json['data'] == []
295
    # known file
296
    replydata = {
297
        'CodeRetour': '01',
298
        'MessageRetour': 'Dossier existant',
299
        "Adresse_BoitePostaleLieuDit": None,
300
        "Adresse_CodePostal": "44000",
301
        "Adresse_CodeSTI": "315553609651",
302
        "Adresse_EtageEscalierAppartement": None,
303
        "Adresse_Extension": 1,
304
        "Adresse_ImmeubleBatimentResidence": None,
305
        "Adresse_Localite": "Nantes",
306
        "Adresse_NomVoie": "All\u00e9es Jean Jaur\u00e8s",
307
        "Adresse_NumeroVoie": 80,
308
        "Adresse_Quartier": "PERI",
309
        "Demande_DateDebutAbo": "20180625",
310
        "Demande_DateFinAbo": "20190624",
311
        "Demande_DelaiAutorise": 30,
312
        "Demande_ImmatVehicule1": "CX453AD",
313
        "Demande_ImmatVehicule2": None,
314
        "Demande_MarqueVehicule1": "CITROEN",
315
        "Demande_MarqueVehicule2": None,
316
        "Demande_ModeleVehicule1": "GS",
317
        "Demande_ModeleVehicule2": None,
318
        "Demande_NumeroDossier": 22952,
319
        "Demandeur_Civilite": 1,
320
        "Demandeur_Email": "spameggs@example.net",
321
        "Demandeur_NomUsuel": "BAR",
322
        "Demandeur_Prenom": "Foo Spam",
323
        "Demandeur_TelephoneFixe": "0611111111",
324
        "Demandeur_TelephonePortable": None,
325
    }
326
    get_service.return_value = MockedService(replydata=replydata)
327
    resp = app.get(url)
328
    data = resp.json['data']
329
    assert data[0]['id'] == '22952'
330
    assert data[0]['text'] == '22952 - BAR Foo Spam - CX453AD'
331
    assert data[0]['adresse_codepostal'] == '44000'
332
    assert data[0]['adresse_codesti'] == '315553609651'
333
    assert data[0]['adresse_localite'] == 'Nantes'
334
    assert data[0]['demande_numerodossier'] == 22952
335
    assert data[0]['demandeur_email'] == 'spameggs@example.net'
336
    assert data[0]['demandeur_telephonefixe'] == '0611111111'
337
    assert data[0]['demande_datedebutabo'] == '2018-06-25'
338
    assert data[0]['demande_datefinabo'] == '2019-06-24'
339

  
340
    # mutiple pairing
341
    Pairing.objects.create(
342
        resource=dpark,
343
        nameid=nameid,
344
        firstnames='monty',
345
        lastname='eggs',
346
        filenumber='5' * 9,
347
        badgenumber='6' * 9,
348
        cardnumber='7' * 9,
349
    )
350
    replydata2 = {
351
        'CodeRetour': '01',
352
        'MessageRetour': 'Dossier existant',
353
        "Adresse_BoitePostaleLieuDit": None,
354
        "Adresse_CodePostal": "94000",
355
        "Adresse_CodeSTI": "315553609651",
356
        "Adresse_EtageEscalierAppartement": None,
357
        "Adresse_Extension": 1,
358
        "Adresse_ImmeubleBatimentResidence": None,
359
        "Adresse_Localite": "Creteil",
360
        "Adresse_NomVoie": "Allée les sablons",
361
        "Adresse_NumeroVoie": 5,
362
        "Adresse_Quartier": "HOOLI",
363
        "Demande_DateDebutAbo": "20180430",
364
        "Demande_DateFinAbo": None,
365
        "Demande_DelaiAutorise": 30,
366
        "Demande_ImmatVehicule1": "AA555BB",
367
        "Demande_ImmatVehicule2": "XX333YY",
368
        "Demande_MarqueVehicule1": "FORD",
369
        "Demande_MarqueVehicule2": "MERCEDES",
370
        "Demande_ModeleVehicule1": "Fiesta",
371
        "Demande_ModeleVehicule2": "Serie A",
372
        "Demande_NumeroDossier": 22955,
373
        "Demandeur_Civilite": 1,
374
        "Demandeur_Email": "spameggs@example.net",
375
        "Demandeur_NomUsuel": "EGGS",
376
        "Demandeur_Prenom": "Monty",
377
        "Demandeur_TelephoneFixe": "0611111111",
378
        "Demandeur_TelephonePortable": None,
379
    }
380
    # there will be only one call as first pairing is now cached
381
    get_service.side_effect = [MockedService(replydata=replydata2)]
382
    resp = app.get(url)
383
    data = resp.json['data']
384
    assert len(data) == 2
385
    assert data[1]['id'] == '22955'
386
    assert data[1]['text'] == '22955 - EGGS Monty - AA555BB/XX333YY'
387
    assert data[1]['adresse_codepostal'] == '94000'
388
    assert data[1]['adresse_codesti'] == '315553609651'
389
    assert data[1]['adresse_localite'] == 'Creteil'
390
    assert data[1]['demande_numerodossier'] == 22955
391
    assert data[1]['demandeur_email'] == 'spameggs@example.net'
392
    assert data[1]['demandeur_telephonefixe'] == '0611111111'
393
    assert data[1]['demande_datedebutabo'] == '2018-04-30'
394
    assert data[1]['demande_datefinabo'] is None
395

  
396
    # filtering by filenumber
397
    for pairing in Pairing.objects.all():
398
        pairing.clear_cache()
399
    # we modify numerodossier to verify cache is not used
400
    replydata['Demande_NumeroDossier'] = 22953
401
    get_service.side_effect = [
402
        MockedService(replydata=replydata),
403
    ]
404
    resp = app.get(url, params={'filenumber': '1' * 9})
405
    data = resp.json['data']
406
    assert len(data) == 1
407
    assert data[0]['id'] == '22953'
408
    assert data[0]['text'] == '22953 - BAR Foo Spam - CX453AD'
409
    assert data[0]['adresse_codepostal'] == '44000'
410
    assert data[0]['adresse_codesti'] == '315553609651'
411
    assert data[0]['adresse_localite'] == 'Nantes'
412
    assert data[0]['demande_numerodossier'] == 22953
413
    assert data[0]['demandeur_email'] == 'spameggs@example.net'
414
    assert data[0]['demandeur_telephonefixe'] == '0611111111'
415
    assert data[0]['demande_datedebutabo'] == '2018-06-25'
416
    assert data[0]['demande_datefinabo'] == '2019-06-24'
417

  
418

  
419
def test_check_renewal_time(dpark, app, get_service):
420
    url = '/dpark/test/check-renewal-time/'
421
    params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
422
    get_service.return_value = MockedService(
423
        replydata={'CodeRetour': '02', 'MessageRetour': 'Renouvellement hors délai'}
424
    )
425
    resp = app.get(url, params=params)
426
    assert resp.json['data'] is False
427
    assert resp.json['desc'] == 'Renouvellement hors délai'
428
    get_service.return_value = MockedService(
429
        replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}
430
    )
431
    resp = app.get(url, params=params)
432
    assert resp.json['data'] is True
433

  
434

  
435
def test_check_renewal_duplicate(dpark, app, get_service):
436
    url = '/dpark/test/check-renewal-time/'
437
    params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
438
    get_service.return_value = MockedService(
439
        replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
440
    )
441
    resp = app.get(url, params=params)
442
    assert resp.json['data'] is False
443
    assert resp.json['desc'] == 'Demande déjà en cours'
444
    get_service.return_value = MockedService(
445
        replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}
446
    )
447
    resp = app.get(url, params=params)
448
    assert resp.json['data'] is True
449
    assert resp.json['err'] == 0
450

  
451

  
452
def test_check_creation_duplicate(dpark, app, get_service):
453
    url = '/dpark/test/check-creation-duplicate/'
454
    params = {
455
        'address_district': 'PERI',
456
        'address_locality': 'Toulouse',
457
        'address_sticode': '315553609651',
458
        'address_streetext': '1',
459
        'address_zipcode': '31000',
460
        'applicant_firstnames': 'Spam',
461
        'applicant_lastname': 'Ham',
462
    }
463
    get_service.return_value = MockedService(
464
        replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
465
    )
466
    resp = app.get(url, params=params)
467
    assert resp.json['data'] is False
468
    assert resp.json['desc'] == 'Demande déjà en cours'
469
    get_service.return_value = MockedService(replydata={'CodeRetour': '01', 'MessageRetour': ''})
470
    resp = app.get(url, params=params)
471
    assert resp.json['data'] is True
472
    assert resp.json['err'] == 0
473

  
474

  
475
def test_check_creation_not_renewal(dpark, app, get_service):
476
    url = '/dpark/test/check-creation-not-renewal/'
477
    params = {
478
        'address_district': 'PERI',
479
        'address_locality': 'Toulouse',
480
        'address_sticode': '315553609651',
481
        'address_streetext': '1',
482
        'address_zipcode': '31000',
483
        'applicant_firstnames': 'Spam',
484
        'applicant_lastname': 'Ham',
485
    }
486
    get_service.return_value = MockedService(
487
        replydata={'CodeRetour': '02', 'MessageRetour': 'Usager existe déjà dans D-Park'}
488
    )
489
    resp = app.get(url, params=params)
490
    assert resp.json['data'] is False
491
    assert resp.json['desc'] == 'Usager existe déjà dans D-Park'
492
    get_service.return_value = MockedService(replydata={'CodeRetour': '01', 'MessageRetour': ''})
493
    resp = app.get(url, params=params)
494
    assert resp.json['data'] is True
495

  
496

  
497
def test_get_payment_infos(dpark, app, get_service):
498
    nameid = 'abcd' * 8
499
    url = '/dpark/test/payment-info/%s/' % nameid
500
    resp = app.get(url)
501
    assert resp.json['err'] == 1
502
    assert resp.json['err_desc'] == 'No pairing exists'
503
    params = {
504
        'nameid': nameid,
505
        'firstnames': 'spam eggs',
506
        'lastname': 'bar',
507
        'filenumber': '1' * 9,
508
        'badgenumber': '2' * 9,
509
    }
510
    Pairing.objects.create(resource=dpark, **params)
511
    get_service.return_value = MockedService(
512
        replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}
513
    )
514
    resp = app.get(url)
515
    assert resp.json['err'] == 0
516
    assert resp.json['data'] == []
517
    replydata = {
518
        'CodeRetour': '01',
519
        'MessageRetour': 'Demande acceptée',
520
        'NumeroDemande': '55555',
521
        'Montant': 12500,
522
        'TypePaiement': 10,
523
        'NumeroTeledossierPhase1': 'E-8-0AA666BB',
524
    }
525
    get_service.return_value = MockedService(replydata=replydata)
526
    resp = app.get(url)
527
    data = resp.json['data'][0]
528
    assert data['montant'] == 125
529
    assert data['typepaiement'] == 10
530
    assert data['typepaiement_text'] == 'Carte Bancaire via Internet'
531
    assert data['numerodemande'] == '55555'
529 532

  
530 533

  
531 534
@pytest.mark.parametrize(
......
536 539
        ('2018-06-11T23:59:00', '20180612'),
537 540
    ],
538 541
)
539
def test_payment_notification(dpark, app, transaction_datetime, expected_date):
542
def test_payment_notification(dpark, app, transaction_datetime, expected_date, get_service):
540 543
    operation = mock.Mock(name='PLS_NOTIFCB')
541 544
    service = mock.Mock(spec=['PLS_NOTIFCB'], PLS_NOTIFCB=operation)
542
    create_service = mock.Mock(spec=[], return_value=service)
543
    client = mock.NonCallableMock(spec=['create_service'], create_service=create_service)
544
    with mock.patch('passerelle.contrib.dpark.models.get_client', return_value=client):
545
        nameid = 'abcd' * 8
546
        filenumber = '1' * 9
547
        params = {
545
    get_service.return_value = service
546

  
547
    nameid = 'abcd' * 8
548
    filenumber = '1' * 9
549
    params = {
550
        'nameid': nameid,
551
        'filenumber': filenumber,
552
        'transaction_id': 'I123456789',
553
        'transaction_datetime': transaction_datetime,
554
        'total_amount': '125',
555
        'application_id': '61718',
556
        'application_external_id': 'E-8-N5UTAK6P',
557
    }
558
    url = '/dpark/test/notify-payment/'
559
    resp = app.post_json(url, params=params)
560
    assert resp.json['err'] == 1
561
    assert resp.json['err_desc'] == 'No pairing exists'
562
    Pairing.objects.create(
563
        resource=dpark,
564
        **{
548 565
            'nameid': nameid,
566
            'firstnames': 'spam eggs',
567
            'lastname': 'bar',
549 568
            'filenumber': filenumber,
550
            'transaction_id': 'I123456789',
551
            'transaction_datetime': transaction_datetime,
552
            'total_amount': '125',
553
            'application_id': '61718',
554
            'application_external_id': 'E-8-N5UTAK6P',
555
        }
556
        url = '/dpark/test/notify-payment/'
557
        resp = app.post_json(url, params=params)
558
        assert resp.json['err'] == 1
559
        assert resp.json['err_desc'] == 'No pairing exists'
560
        Pairing.objects.create(
561
            resource=dpark,
562
            **{
563
                'nameid': nameid,
564
                'firstnames': 'spam eggs',
565
                'lastname': 'bar',
566
                'filenumber': filenumber,
567
                'badgenumber': '2' * 9,
568
            },
569
        )
570
        operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu')
571
        resp = app.post_json(url, params=params)
572
        assert operation.call_args_list[-1].args[5] == expected_date
573
        assert resp.json['err'] == 1
574
        assert resp.json['err_desc'] == 'Dossier inconnu'
575
        operation.return_value = mock.Mock(CodeRetour='01')
576
        resp = app.post_json(url, params=params)
577
        assert resp.json['data'] is True
569
            'badgenumber': '2' * 9,
570
        },
571
    )
572
    operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu')
573
    resp = app.post_json(url, params=params)
574
    assert operation.call_args_list[-1].args[5] == expected_date
575
    assert resp.json['err'] == 1
576
    assert resp.json['err_desc'] == 'Dossier inconnu'
577
    operation.return_value = mock.Mock(CodeRetour='01')
578
    resp = app.post_json(url, params=params)
579
    assert resp.json['data'] is True
578 580

  
579 581

  
580 582
@pytest.mark.parametrize('application_thirdparty_subscription', [True, False])
......
867 869
        ('2018-06-11T23:59:00', '20180612'),
868 870
    ],
869 871
)
870
def test_payment_notification_double_plaque(dpark, app, transaction_datetime, expected_date):
872
def test_payment_notification_double_plaque(dpark, app, transaction_datetime, expected_date, get_service):
871 873
    operation = mock.Mock(name='PLS_NOTIFCB2')
872 874
    service = mock.Mock(spec=['PLS_NOTIFCB2'], PLS_NOTIFCB2=operation)
873
    create_service = mock.Mock(spec=[], return_value=service)
874
    client = mock.NonCallableMock(spec=['create_service'], create_service=create_service)
875
    with mock.patch('passerelle.contrib.dpark.models.get_client', return_value=client):
876
        nameid = 'abcd' * 8
877
        filenumber = '1' * 9
878
        params = {
875
    get_service.return_value = service
876

  
877
    nameid = 'abcd' * 8
878
    filenumber = '1' * 9
879
    params = {
880
        'nameid': nameid,
881
        'filenumber': filenumber,
882
        'transaction_id': 'I123456789',
883
        'transaction_datetime': transaction_datetime,
884
        'total_amount': '125',
885
        'application_id': '61718',
886
        'application_external_id': 'E-8-N5UTAK6P',
887
        'double_plaque': '1',
888
    }
889
    url = '/dpark/test/notify-payment/'
890
    resp = app.post_json(url, params=params)
891
    assert resp.json['err'] == 1
892
    assert resp.json['err_desc'] == 'No pairing exists'
893
    Pairing.objects.create(
894
        resource=dpark,
895
        **{
879 896
            'nameid': nameid,
897
            'firstnames': 'spam eggs',
898
            'lastname': 'bar',
880 899
            'filenumber': filenumber,
881
            'transaction_id': 'I123456789',
882
            'transaction_datetime': transaction_datetime,
883
            'total_amount': '125',
884
            'application_id': '61718',
885
            'application_external_id': 'E-8-N5UTAK6P',
886
            'double_plaque': '1',
887
        }
888
        url = '/dpark/test/notify-payment/'
889
        resp = app.post_json(url, params=params)
890
        assert resp.json['err'] == 1
891
        assert resp.json['err_desc'] == 'No pairing exists'
892
        Pairing.objects.create(
893
            resource=dpark,
894
            **{
895
                'nameid': nameid,
896
                'firstnames': 'spam eggs',
897
                'lastname': 'bar',
898
                'filenumber': filenumber,
899
                'badgenumber': '2' * 9,
900
            },
901
        )
902
        operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu')
903
        resp = app.post_json(url, params=params)
904
        assert operation.call_args_list[-1].args[5] == expected_date
905
        assert resp.json['err'] == 1
906
        assert resp.json['err_desc'] == 'Dossier inconnu'
907
        operation.return_value = mock.Mock(CodeRetour='01')
908
        resp = app.post_json(url, params=params)
909
        assert resp.json['data'] is True
900
            'badgenumber': '2' * 9,
901
        },
902
    )
903
    operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu')
904
    resp = app.post_json(url, params=params)
905
    assert operation.call_args_list[-1].args[5] == expected_date
906
    assert resp.json['err'] == 1
907
    assert resp.json['err_desc'] == 'Dossier inconnu'
908
    operation.return_value = mock.Mock(CodeRetour='01')
909
    resp = app.post_json(url, params=params)
910
    assert resp.json['data'] is True
910
-