411 lines
14 KiB
Python
411 lines
14 KiB
Python
import json
|
|
from unittest import mock
|
|
|
|
import pytest
|
|
from httmock import HTTMock
|
|
|
|
import tests.utils
|
|
from passerelle.contrib.lille_urban_card.models import LilleUrbanCard
|
|
from passerelle.utils.jsonresponse import APIError
|
|
|
|
|
|
@pytest.fixture
|
|
def connector(db):
|
|
return tests.utils.setup_access_rights(
|
|
LilleUrbanCard.objects.create(
|
|
slug='test', base_url='http://localhost/api/', username='test', password='secret'
|
|
)
|
|
)
|
|
|
|
|
|
TOKEN_ERROR_RESPONSE = '{"erreur":"Authentification échouée"}'
|
|
TOKEN_RESPONSE = '{"token": "eyJhbGciO..."}'
|
|
|
|
|
|
def mocked_http(url, request):
|
|
if url.path == '/api/clu/ws/auth/connexion':
|
|
return {'content': TOKEN_RESPONSE, 'status_code': 200}
|
|
if url.path == '/api/clu/ws/demanderCarte':
|
|
request_json = json.loads(request.body)
|
|
if request_json.get('simulate_error') == 'doublon':
|
|
error = {'erreur': 'Demande 113-9166 : 1 demande(s) ...'}
|
|
return {'content': json.dumps(error), 'status_code': 409}
|
|
elif request_json.get('simulate_error') == 'num_serie':
|
|
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': '... pas valide'}
|
|
return {'content': json.dumps(error), 'status_code': 404}
|
|
content = {
|
|
'n_demande_clu': 10000005,
|
|
'request': request_json, # for tests
|
|
}
|
|
return {'content': json.dumps(content), 'status_code': 200}
|
|
if url.path.startswith('/api/clu/ws/consulterDemande/'):
|
|
content = {
|
|
'n_demande_clu': '...',
|
|
'statut': '200',
|
|
'statut_desc': 'CARTE_PRODUITE_EXPEDIEE',
|
|
'date': '2019-01-01 00:00:00',
|
|
}
|
|
return {'content': json.dumps(content), 'status_code': 200}
|
|
if url.path == '/api/clu/ws/ajouterAbonnements':
|
|
request_json = json.loads(request.body)
|
|
if request_json.get('simulate_error') == 'data':
|
|
error = {'statut': 'ERREUR_DONNEES', 'erreur': 'Demande vide...'}
|
|
return {'content': json.dumps(error), 'status_code': 400}
|
|
content = {
|
|
'n_demande_clu': 10000005,
|
|
'request': request_json, # for tests
|
|
}
|
|
return {'content': json.dumps(content), 'status_code': 200}
|
|
if url.path == '/api/clu/ws/modifierCodeSecret':
|
|
request_json = json.loads(request.body)
|
|
if request_json.get('simulate_error') == 'wrong num serie':
|
|
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
|
|
return {'content': json.dumps(error), 'status_code': 404}
|
|
return {'content': json.dumps({}), 'status_code': 200}
|
|
if url.path == '/api/clu/ws/verifierMdp':
|
|
assert 'numero_serie=XXX' in request.body and 'code_secret=1234' in request.body
|
|
if 'simulate_error=wrong+num+serie' in request.body:
|
|
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
|
|
return {'content': json.dumps(error), 'status_code': 404}
|
|
return {'content': json.dumps({'message': 'Le mot de passe est valide'}), 'status_code': 200}
|
|
if url.path in ('/api/clu/ws/revoquerCarte', '/api/clu/ws/revoquerAbonnement'):
|
|
request_json = json.loads(request.body)
|
|
if request_json.get('simulate_error') == 'doublon':
|
|
error = {'erreur': 'La demande xx existe...'}
|
|
return {'content': json.dumps(error), 'status_code': 409}
|
|
return {'content': json.dumps({'message': 'ok'}), 'status_code': 200}
|
|
if url.path == '/api/clu/ws/renouvelerAbonnements':
|
|
request_json = json.loads(request.body)
|
|
if request_json.get('simulate_error') == 'wrong num serie':
|
|
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
|
|
return {'content': json.dumps(error), 'status_code': 409}
|
|
return {'content': json.dumps({'n_demande_clu': 10000507}), 'status_code': 200}
|
|
if url.path == '/api/clu/ws/consulterCarte':
|
|
if url.query == 'numero_serie=ERROR':
|
|
error = {'erreur': 'Pas de carte attribuee correspondante'}
|
|
return {'content': json.dumps(error), 'status_code': 404}
|
|
assert url.query == 'numero_serie=XXX'
|
|
return {
|
|
'content': json.dumps({'numero_serie': 'XXX', 'date_debut_abonnement': 'xx/xx/xxxx'}),
|
|
'status_code': 200,
|
|
}
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.post')
|
|
def test_get_token(mocked_post, app, connector):
|
|
with pytest.raises(APIError):
|
|
mocked_post.return_value = tests.utils.FakedResponse(content=TOKEN_ERROR_RESPONSE, status_code=400)
|
|
connector.get_token()
|
|
mocked_post.return_value = tests.utils.FakedResponse(content=TOKEN_RESPONSE, status_code=200)
|
|
connector.get_token()
|
|
|
|
|
|
def test_csp(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'csp', slug=connector.slug)
|
|
resp = app.get(endpoint)
|
|
assert resp.json.get('data')
|
|
|
|
resp = app.get(endpoint + '?q=com')
|
|
assert len(resp.json.get('data')) == 1
|
|
|
|
resp = app.get(endpoint + '?id=4')
|
|
assert len(resp.json.get('data')) == 1
|
|
|
|
resp = app.get(endpoint + '?id=24')
|
|
assert len(resp.json.get('data')) == 0
|
|
|
|
|
|
def test_card_request(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'card_request', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'civilite': 'Monsieur',
|
|
'code_postal': '59000',
|
|
'ville': 'Lille',
|
|
'photo': {'content': 'xxx'},
|
|
'telephone': '01.02.03.04.05',
|
|
'recevoir_journal_senior': 'Non',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
)
|
|
request = resp.json['data']['request']
|
|
assert request['civilite'] == 1
|
|
assert request['code_postal'] == 59000
|
|
assert request['ville'] == 'LILLE'
|
|
assert request['photo'] == 'xxx'
|
|
assert request['telephone'] == '0102030405'
|
|
assert request['services'] == [{'service': 'zoo', 'newsletter': 0}]
|
|
assert resp.json['data']['n_demande_clu'] == 10000005
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'doublon',
|
|
'civilite': 'Monsieur',
|
|
'code_postal': '59000',
|
|
'ville': 'Lille',
|
|
'photo': {'content': 'xxx'},
|
|
'telephone': '01.02.03.04.05',
|
|
'recevoir_journal_senior': 'Non',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['data']['status_code'] == 409
|
|
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'num_serie',
|
|
'civilite': 'Monsieur',
|
|
'code_postal': '59000',
|
|
'ville': 'Lille',
|
|
'photo': {'content': 'xxx'},
|
|
'telephone': '01.02.03.04.05',
|
|
'recevoir_journal_senior': 'Non',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['data']['status_code'] == 404
|
|
assert resp.json['data']['statut'] == 'ERREUR_NUM_SERIE'
|
|
|
|
|
|
def test_card_status(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'card_status', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.get(endpoint + '?n_demande_clu=1234')
|
|
assert resp.json['data']['statut_desc'] == 'CARTE_PRODUITE_EXPEDIEE'
|
|
|
|
|
|
def test_add_subscriptions(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'add_subscriptions', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'n_demande_gru': 'XXX',
|
|
'numero_serie': 'XXX',
|
|
'civilite': 'Monsieur',
|
|
'code_postal': '59000',
|
|
'ville': 'Lille',
|
|
'photo': {'content': 'xxx'},
|
|
'telephone': '01.02.03.04.05',
|
|
'recevoir_journal_senior': 'Non',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
)
|
|
request = resp.json['data']['request']
|
|
assert request['civilite'] == 1
|
|
assert request['code_postal'] == 59000
|
|
assert request['ville'] == 'LILLE'
|
|
assert request['photo'] == 'xxx'
|
|
assert request['telephone'] == '0102030405'
|
|
assert request['services'] == [{'service': 'zoo', 'newsletter': 0}]
|
|
assert resp.json['data']['n_demande_clu'] == 10000005
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'data',
|
|
'n_demande_gru': 'XXX',
|
|
'numero_serie': 'XXX',
|
|
'civilite': 'Monsieur',
|
|
'code_postal': '59000',
|
|
'ville': 'Lille',
|
|
'photo': {'content': 'xxx'},
|
|
'telephone': '01.02.03.04.05',
|
|
'recevoir_journal_senior': 'Non',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['data']['status_code'] == 400
|
|
|
|
|
|
def test_code_change(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'code_change', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'numero_serie': 'XXX',
|
|
'ancien': '1234',
|
|
'nouveau': '2345',
|
|
'confirmation_nouveau': '2345',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'wrong num serie',
|
|
'numero_serie': 'XXX',
|
|
'ancien': '1234',
|
|
'nouveau': '2345',
|
|
'confirmation_nouveau': '2345',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
assert resp.json['data']['status_code'] == 404
|
|
|
|
|
|
def test_code_check(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'code_check', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'numero_serie': 'XXX',
|
|
'password': '1234',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'wrong num serie',
|
|
'numero_serie': 'XXX',
|
|
'password': '1234',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
|
|
|
|
def test_card_info(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'card_info', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.get(
|
|
endpoint,
|
|
params={
|
|
'numero_serie': 'XXX',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.get(
|
|
endpoint,
|
|
params={
|
|
'numero_serie': 'ERROR',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
|
|
# empty numero_serie, do not even pass request
|
|
resp = app.get(
|
|
endpoint,
|
|
params={
|
|
'numero_serie': '',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 1
|
|
|
|
|
|
def test_card_revocation(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url('lille-urban-card', 'card_revocation', slug=connector.slug)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'doublon',
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
assert resp.json['data']['status_code'] == 409
|
|
|
|
|
|
def test_subscription_revocation(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url(
|
|
'lille-urban-card', 'subscription_revocation', slug=connector.slug
|
|
)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'doublon',
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
'service_zoo': 'Oui',
|
|
'service_zoo_newsletter': 'Non',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
assert resp.json['data']['status_code'] == 409
|
|
|
|
|
|
def test_subscription_renewal(app, connector):
|
|
endpoint = tests.utils.generic_endpoint_url(
|
|
'lille-urban-card', 'subscription_renewal', slug=connector.slug
|
|
)
|
|
with HTTMock(mocked_http):
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
},
|
|
)
|
|
assert resp.json['err'] == 0
|
|
|
|
# error handling
|
|
resp = app.post_json(
|
|
endpoint,
|
|
params={
|
|
'simulate_error': 'wrong num serie',
|
|
'n_demande_gru': '12-123',
|
|
'numero_serie': 'XXX',
|
|
'date_demande': '05/02/2020',
|
|
},
|
|
status=200,
|
|
)
|
|
assert resp.json['err'] == 1
|
|
assert resp.json['data']['status_code'] == 409
|