passerelle/tests/test_gdema.py

206 lines
11 KiB
Python

import json
from unittest import mock
import pytest
import responses
from django.contrib.contenttypes.models import ContentType
import tests.utils
from passerelle.base.models import AccessRight, ApiUser
from passerelle.contrib.gdema.models import Gdema
SERVICES = '''[{"AdminService":"ADMINISTRATEUR DIV - Transports et D\xc3\xa9placements","CommuneService":null,"Id":"16151",
"Label":"DMT - Mobilité et transports","Typology":[]},{"AdminService":"ADMINISTRATEUR DEP ADMINISTRATION","CommuneService":null,"Id":"10173",
"Label":"DESPU - Administration Direction environnement et services publics urbains","Typology":[{"Text":"Maintenance Cie","Value":"13067"},
{"Text":"Sensibilisation en milieu scolaire","Value":"14948"},{"Text":"Demandes diverses","Value":"11532"},
{"Text":"Demande de stage compostage","Value":"12992"},{"Text":"Pr\xc3\xa9sence de d\xc3\xa9chets verts","Value":"20432"}]},
{"AdminService":"ADMINISTRATEUR DED3","CommuneService":null,"Id":"10426","Label":"DEE - Périscolaire et éducatif",
"Typology":[{"Text":"Activités périscolaires","Value":"10804"},{"Text":"Garderie","Value":"10805"},{"Text":"Restauration scolaire","Value":"10806"},
{"Text":"Restauration scolaire \\/ Nutrition","Value":"11180"},{"Text":"Restauration scolaire \\/ Abonnements \\/cantine et r\xc3\xa9gie","Value":"10807"},
{"Text":"Projets éducatifs en temps scolaire","Value":"10808"},{"Text":"Autres","Value":"10809"}]}]'''
CIVILITY = (
'[{"Text":"Monsieur","Value":"1"},{"Text":"Madame","Value":"2"},{"Text":"Mademoiselle","Value":"3"}]'
)
REQUEST = r'''{"AnswerToProvide":true,"AssigmentServiceName":"DEPE - Projets et maintenance du patrimoine","AssigmentStructure":"Cellule Travaux",
"AssociationId":0,"ClosingDate":"/Date(1306314926000+0200)/","Confidential":false,"DataEntryService":"Education",
"Description":"contrôle de toutes les portes extérieures des classes - gonds faibles pour le poids de la porte(N° 11353 v1)","DesiredResponseDate":null,
"ExpectedDate":null,"ExpectedInterventionDate":null,"Files":[],"Handler":{"CUSStreetCode":null,"Cedex":null,"CellPhone":null,"Civility":null,"CivilityId":0,
"Fax":null,"Firstname":null,"Information":null,"Lastname":"ANONYME","Mail":null,"Organization":0,"Phone":null,"SectionCode":null,"SectionLetter":null,
"Street":null,"StreetLetter":null,"StreetNumber":null,"StructureLabel":null,"StructureShortLabel":null,"Title":null,"TitleId":0,"Town":null,"TownLabel":null,
"ZipCode":null},"Id":1,"InputChannel":"Courrier","Localization":{"AdditionnalInformation":null,"CUSStreetCode":"2075","ElectedDistrict":"006",
"JobSector":null,"Other":"(sous-localisation : Bâtiment)","SectionCode":"1","SectionLetter":"_","Site":"Conseil","SiteId":1790,"Street":"RUE DE LA PLACE",
"StreetLetter":null,"StreetNumber":"2","TerritorialSector":"105","Town":"482","TownLabel":"STRASBOURG","ZipCode":"67000"},"Origin":2,"OriginLabel":"Usager",
"Priority":2,"PriorityLabel":"Normal","ReceptDate":"/Date(1165964400000+0100)/","Refused":false,"ReleaseDate":null,"Response":false,"ResponseFinal":true,
"ResponseIntermediate":false,"Responses":[{"Date":"/Date(1306274400000+0200)/","OutputChannel":"Service X","Resume":"Intervention réalisée",
"SibeliusReference":null,"SignatureName":"UC","Type":2,"TypeLabel":"Finale"}],"SibeliusReference":null,"SiteCode":null,"SiteName":"Conseil","Sleeping":null,
"State":64,"StateLabel":"Cloturée","Structure":"Cellule Travaux","Syscreationdate":"/Date(1165186800000+0100)/",
"Sysmodificationdate":"/Date(1306314926000+0200)/","Typology":{"Id":11168,"Label":"Maintenance"}}'''
REQUEST_STATE = '{"Id":1,"State":64,"StateLabel":"Cloturée"}'
CREATE_INPUT = { # from Publik system
'Typology_Id': '21012',
'Description': 'this is a test',
'Localization_Town': '482',
'Localization_TownLabel': 'STRASBOURG',
'Origin': '2',
'Priority': '2',
'ReceptDate': '2006-12-13T00:00:00+01:00',
'Files_2': {
'filename': 'test2.txt',
'content_type': 'text/plain',
'content': 'ZGV1eA==',
},
'Files_1': {
'filename': 'test1.txt',
'content_type': 'text/plain',
'content': 'dW4=',
},
}
CONVERTED_INPUT = { # to GDEMA webservice
'Typology': {
'Id': '21012',
},
'Description': 'this is a test',
'Localization': {'Town': '482', 'TownLabel': 'STRASBOURG'},
'Origin': '2',
'Priority': '2',
'ReceptDate': '/Date(1165964400000+0100)/',
'Files': [
{'Base64Stream': 'dW4=', 'Name': 'test1.txt'},
{'Base64Stream': 'ZGV1eA==', 'Name': 'test2.txt'},
],
}
@pytest.fixture
def gdema(db):
gdema = Gdema.objects.create(slug='test', service_url='https://gdema.example.net/api/')
# open access
api = ApiUser.objects.create(username='all', keytype='', key='')
obj_type = ContentType.objects.get_for_model(gdema)
AccessRight.objects.create(
codename='can_access', apiuser=api, resource_type=obj_type, resource_pk=gdema.pk
)
return gdema
def test_gdema_services_and_typologies(app, gdema):
endpoint = tests.utils.generic_endpoint_url('gdema', 'referentiel', slug=gdema.slug)
assert endpoint == '/gdema/test/referentiel'
with mock.patch('passerelle.utils.Request.get') as requests_get:
requests_get.return_value = tests.utils.FakedResponse(content=SERVICES, status_code=200)
resp = app.get(endpoint + '/service/', status=200)
assert requests_get.call_count == 1
assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/referentiel/service'
assert 'data' in resp.json
assert resp.json['err'] == 0
assert len(resp.json['data']) == 3
assert resp.json['data'][0]['id'] == '16151'
assert resp.json['data'][0]['text'] == 'DMT - Mobilité et transports'
resp = app.get(endpoint + '/typology/', status=200)
assert requests_get.call_count == 2
assert 'data' in resp.json
assert resp.json['err'] == 0
assert len(resp.json['data']) == 12
assert resp.json['data'][0]['id'] == '13067'
assert resp.json['data'][0]['text'] == 'Maintenance Cie'
assert resp.json['data'][0]['service_id'] == '10173'
assert (
resp.json['data'][0]['service_text']
== 'DESPU - Administration Direction environnement et services publics urbains'
)
resp = app.get(endpoint + '/typology/?service_id=10426', status=200)
assert requests_get.call_count == 3
assert 'data' in resp.json
assert resp.json['err'] == 0
assert len(resp.json['data']) == 7
assert resp.json['data'][0]['id'] == '10804'
assert resp.json['data'][0]['text'] == 'Activités périscolaires'
assert resp.json['data'][0]['service_id'] == '10426'
assert resp.json['data'][0]['service_text'] == 'DEE - Périscolaire et éducatif'
def test_gdema_referentiel(app, gdema):
endpoint = tests.utils.generic_endpoint_url('gdema', 'referentiel', slug=gdema.slug)
assert endpoint == '/gdema/test/referentiel'
with mock.patch('passerelle.utils.Request.get') as requests_get:
requests_get.return_value = tests.utils.FakedResponse(content=CIVILITY, status_code=200)
resp = app.get(endpoint + '/civility/', status=200)
assert requests_get.call_count == 1
assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/referentiel/civility'
assert 'data' in resp.json
assert resp.json['err'] == 0
assert len(resp.json['data']) == 3
assert resp.json['data'][0]['id'] == '1'
assert resp.json['data'][0]['text'] == 'Monsieur'
with mock.patch('passerelle.utils.Request.get') as requests_get:
requests_get.return_value = tests.utils.FakedResponse(content='404', status_code=404)
resp = app.get(endpoint + '/nothing/', status=200)
assert requests_get.call_count == 1
assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/referentiel/nothing'
assert 'data' in resp.json
assert resp.json['err'] == 1
assert resp.json['data'] is None
assert resp.json['err_class'].endswith('.APIError')
assert '404' in resp.json['err_desc']
def test_gdema_get_request(app, gdema):
endpoint = tests.utils.generic_endpoint_url('gdema', 'get-request', slug=gdema.slug)
assert endpoint == '/gdema/test/get-request'
with mock.patch('passerelle.utils.Request.get') as requests_get:
requests_get.return_value = tests.utils.FakedResponse(content=REQUEST, status_code=200)
resp = app.get(endpoint + '/1/', status=200)
assert requests_get.call_count == 1
assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/request/1'
assert 'data' in resp.json
assert resp.json['err'] == 0
assert resp.json['data']['Id'] == '1'
assert resp.json['data']['AnswerToProvide'] is True
assert resp.json['data']['Description'].startswith('contrôle')
assert resp.json['data']['ExpectedDate'] is None
assert resp.json['data']['Files'] == []
assert resp.json['data']['Handler']['CivilityId'] == '0'
assert resp.json['data']['ReceptDate'] == '2006-12-13T00:00:00+01:00'
endpoint = tests.utils.generic_endpoint_url('gdema', 'get-request-state', slug=gdema.slug)
assert endpoint == '/gdema/test/get-request-state'
with mock.patch('passerelle.utils.Request.get') as requests_get:
requests_get.return_value = tests.utils.FakedResponse(content=REQUEST_STATE, status_code=200)
resp = app.get(endpoint + '/1/', status=200)
assert requests_get.call_count == 1
assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/request/1/state'
assert 'data' in resp.json
assert resp.json['err'] == 0
assert resp.json['data'] == {'Id': '1', 'State': '64', 'StateLabel': 'Cloturée'}
@responses.activate
def test_gdema_get_request_error(app, gdema, caplog):
endpoint = tests.utils.generic_endpoint_url('gdema', 'get-request', slug=gdema.slug)
responses.add(responses.GET, 'https://gdema.example.net/api/request/1', body=b'xxx', status=404)
resp = app.get(endpoint + '/1/', status=200)
assert resp.json['err'] == 1
assert [x for x in caplog.records if '=> 404' in x.message][0].levelname == 'INFO'
def test_gdema_create_request(app, gdema):
endpoint = tests.utils.generic_endpoint_url('gdema', 'create-request', slug=gdema.slug)
assert endpoint == '/gdema/test/create-request'
with mock.patch('passerelle.utils.Request.post') as requests_post:
requests_post.return_value = tests.utils.FakedResponse(content=REQUEST, status_code=200)
resp = app.post_json(endpoint + '?raise=1', params=CREATE_INPUT, status=200)
assert requests_post.call_count == 1
assert requests_post.call_args[0][0] == 'https://gdema.example.net/api/request/create'
assert json.loads(requests_post.call_args[1]['data']) == CONVERTED_INPUT
assert 'data' in resp.json
assert resp.json['err'] == 0
assert resp.json['data']['Id'] == '1'