solis: change link logic, accept multiple user by name_id (#19393)
This commit is contained in:
parent
47f44a9fb8
commit
671af6cd0a
|
@ -1,4 +1,4 @@
|
|||
recursive-include passerelle *.html *.mako README
|
||||
recursive-include passerelle *.html *.mako *.txt README
|
||||
recursive-include passerelle/static *
|
||||
recursive-include passerelle/apps/*/static *
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('solis', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='solisapalink',
|
||||
name='text',
|
||||
field=models.CharField(default='inconnu', max_length=256),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
|
@ -17,6 +17,8 @@
|
|||
import json
|
||||
|
||||
from django.db import models
|
||||
from django.template import Context
|
||||
from django.template.loader import get_template
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from passerelle.base.models import BaseResource
|
||||
|
@ -30,6 +32,8 @@ class Solis(BaseResource):
|
|||
username = models.CharField(max_length=128, blank=False, verbose_name=_('Username'))
|
||||
password = models.CharField(max_length=128, blank=False, verbose_name=_('Password'))
|
||||
|
||||
text_template_name = 'solis/apa_user_text.txt'
|
||||
|
||||
category = _('Business Process Connectors')
|
||||
|
||||
class Meta:
|
||||
|
@ -53,7 +57,7 @@ class Solis(BaseResource):
|
|||
return self.requests.get(url, auth=auth, headers=headers)
|
||||
return self.requests.post(url, json=data, auth=auth, headers=headers)
|
||||
|
||||
def get_apa_token(self, user_id, code):
|
||||
def apa_token(self, user_id, code):
|
||||
response = self.request('asg/apa/generationJeton', data={
|
||||
'indexIndividu': user_id,
|
||||
'codeConfidentiel': code,
|
||||
|
@ -65,9 +69,19 @@ class Solis(BaseResource):
|
|||
(response.status_code, response.content))
|
||||
return response.json().get('token')
|
||||
|
||||
def apa_endpoint(self, endpoint, user_id=None, code=None, token=None):
|
||||
if token is None:
|
||||
token = self.apa_token(user_id, code)
|
||||
endpoint = 'asg/apa/' + endpoint + '/' + token
|
||||
response = self.request(endpoint)
|
||||
if response.status_code != 200:
|
||||
raise APIError('unknown error status:%s, content:%r' %
|
||||
(response.status_code, response.content))
|
||||
return response.json()
|
||||
|
||||
@endpoint(name='apa-link', methods=['post'], perm='can_access',
|
||||
description=_('Create link between name_id and '
|
||||
'Solis APA. payload: name_id, user_id, code'))
|
||||
'Solis APA. Payload: name_id, user_id, code'))
|
||||
def apa_link(self, request):
|
||||
try:
|
||||
data = json.loads(request.body)
|
||||
|
@ -80,81 +94,103 @@ class Solis(BaseResource):
|
|||
if 'user_id' not in data or 'code' not in data:
|
||||
raise APIError('missing user_id/code credentials')
|
||||
name_id, user_id, code = data['name_id'], data['user_id'], data['code']
|
||||
self.get_apa_token(user_id, code) # invalid credentials raise APIError
|
||||
token = self.apa_token(user_id, code) # invalid credentials raise APIError here
|
||||
information = self.apa_endpoint(endpoint='exportDonneesIndividu', token=token)
|
||||
text = get_template(self.text_template_name).render(Context(information)).strip()
|
||||
link, created = SolisAPALink.objects.update_or_create(resource=self, name_id=name_id,
|
||||
defaults={'user_id': user_id, 'code': code})
|
||||
user_id=user_id,
|
||||
defaults={'code': code,
|
||||
'text': text})
|
||||
return {'data': {'user_id': user_id,
|
||||
'created': created,
|
||||
'updated': not created}}
|
||||
|
||||
@endpoint(name='apa-unlink', perm='can_access',
|
||||
description=_('Delete Solis APA link with name_id'),
|
||||
@endpoint(name='apa-unlink', methods=['post'], perm='can_access',
|
||||
description=_('Delete a Solis APA link. Payload: name_id, user_id'))
|
||||
def apa_unlink(self, request):
|
||||
try:
|
||||
data = json.loads(request.body)
|
||||
except ValueError:
|
||||
raise APIError('payload is not a JSON dict')
|
||||
if not isinstance(data, dict):
|
||||
raise APIError('payload is not a JSON dict')
|
||||
if 'name_id' not in data:
|
||||
raise APIError('missing name_id')
|
||||
if 'user_id' not in data:
|
||||
raise APIError('missing user_id')
|
||||
name_id, user_id = data['name_id'], data['user_id']
|
||||
SolisAPALink.objects.filter(resource=self, name_id=name_id, user_id=user_id).delete()
|
||||
return {'data': {'user_id': user_id, 'deleted': True}}
|
||||
|
||||
@endpoint(name='apa-links', perm='can_access',
|
||||
description=_('List linked Solis APA users'),
|
||||
parameters={
|
||||
'name_id': {
|
||||
'description': _('user identifier'),
|
||||
'example_value': '3eb56fc'
|
||||
}
|
||||
})
|
||||
def apa_unlink(self, request, name_id):
|
||||
SolisAPALink.objects.filter(resource=self, name_id=name_id).delete()
|
||||
return {'data': {'deleted': True}}
|
||||
|
||||
def apa_infos(self, endpoint, name_id):
|
||||
try:
|
||||
apa_link = SolisAPALink.objects.get(resource=self, name_id=name_id)
|
||||
except SolisAPALink.DoesNotExist:
|
||||
raise APIError('unlinked name_id')
|
||||
token = self.get_apa_token(apa_link.user_id, apa_link.code)
|
||||
endpoint = 'asg/apa/' + endpoint + '/' + token
|
||||
response = self.request(endpoint)
|
||||
if response.status_code != 200:
|
||||
raise APIError('unknown error status:%s, content:%r' %
|
||||
(response.status_code, response.content))
|
||||
return {'data': response.json()}
|
||||
def apa_links(self, request, name_id):
|
||||
return {'data': [{'id': link.user_id, 'text': link.text}
|
||||
for link in SolisAPALink.objects.filter(resource=self, name_id=name_id)]}
|
||||
|
||||
@endpoint(name='apa-user-info', perm='can_access',
|
||||
description=_('Call exportDonneesIndividu on linked Solis APA user'),
|
||||
description=_('Get informations about a linked Solis APA user'),
|
||||
parameters={
|
||||
'name_id': {
|
||||
'description': _('user identifier'),
|
||||
'example_value': '3eb56fc'
|
||||
}
|
||||
},
|
||||
'user_id': {
|
||||
'description': _('Solis APA user identifier'),
|
||||
'example_value': '2345',
|
||||
},
|
||||
'information': {
|
||||
'description': _('exportDonneesIndividu, consultationDeMesDroits, '
|
||||
'suiviDemandeEnInstruction, suiviDemandeHistorique'),
|
||||
'example_value': 'consultationDeMesDroits',
|
||||
},
|
||||
})
|
||||
def apa_user_info(self, request, name_id):
|
||||
return self.apa_infos('exportDonneesIndividu', name_id)
|
||||
def apa_user_info(self, request, name_id, user_id, information='exportDonneesIndividu'):
|
||||
try:
|
||||
link = SolisAPALink.objects.get(resource=self, name_id=name_id, user_id=user_id)
|
||||
except SolisAPALink.DoesNotExist:
|
||||
raise APIError('unknown link')
|
||||
response = self.apa_endpoint(endpoint=information, user_id=user_id, code=link.code)
|
||||
if information == 'exportDonneesIndividu':
|
||||
text = get_template(self.text_template_name).render(Context(response)).strip()
|
||||
if text != link.text:
|
||||
link.text = text
|
||||
link.save()
|
||||
return {'data': response}
|
||||
|
||||
@endpoint(name='apa-user-rights', perm='can_access',
|
||||
description=_('Call consultationDeMesDroits on linked Solis APA user'),
|
||||
@endpoint(name='apa-users', perm='can_access',
|
||||
description=_('Get exportDonneesIndividu datas about all linked Solis APA users'),
|
||||
parameters={
|
||||
'name_id': {
|
||||
'description': _('user identifier'),
|
||||
'example_value': '3eb56fc'
|
||||
}
|
||||
})
|
||||
def apa_user_rights(self, request, name_id):
|
||||
return self.apa_infos('consultationDeMesDroits', name_id)
|
||||
|
||||
@endpoint(name='apa-user-request', perm='can_access',
|
||||
description=_('Call suiviDemandeEnInstruction on linked Solis APA user'),
|
||||
parameters={
|
||||
'name_id': {
|
||||
'description': _('user identifier'),
|
||||
'example_value': '3eb56fc'
|
||||
}
|
||||
})
|
||||
def apa_user_request(self, request, name_id):
|
||||
return self.apa_infos('suiviDemandeEnInstruction', name_id)
|
||||
|
||||
@endpoint(name='apa-user-history', perm='can_access',
|
||||
description=_('Call suiviDemandeHistorique on linked Solis APA user'),
|
||||
parameters={
|
||||
'name_id': {
|
||||
'description': _('user identifier'),
|
||||
'example_value': '3eb56fc'
|
||||
}
|
||||
})
|
||||
def apa_user_history(self, request, name_id):
|
||||
return self.apa_infos('suiviDemandeHistorique', name_id)
|
||||
def apa_users(self, request, name_id):
|
||||
users = []
|
||||
template = get_template(self.text_template_name)
|
||||
for link in SolisAPALink.objects.filter(resource=self, name_id=name_id):
|
||||
try:
|
||||
information = self.apa_endpoint(endpoint='exportDonneesIndividu',
|
||||
user_id=link.user_id, code=link.code)
|
||||
except APIError:
|
||||
# don't list unknown/unlinked users
|
||||
continue
|
||||
text = template.render(Context(information)).strip()
|
||||
if text != link.text:
|
||||
link.text = text
|
||||
link.save()
|
||||
users.append({
|
||||
'id': link.user_id,
|
||||
'text': text,
|
||||
'information': information})
|
||||
return {'data': users}
|
||||
|
||||
|
||||
class SolisAPALink(models.Model):
|
||||
|
@ -162,3 +198,4 @@ class SolisAPALink(models.Model):
|
|||
name_id = models.CharField(blank=False, max_length=256)
|
||||
user_id = models.CharField(blank=False, max_length=64)
|
||||
code = models.CharField(blank=False, max_length=64)
|
||||
text = models.CharField(blank=False, max_length=256)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{{ individu.civilite }} {{ individu.prenom }} {{ individu.nomUsuel }}{% if individu.nomNaissance != individu.nomUsuel %} ({{ individu.nomNaissance }}){% endif %}
|
|
@ -11,10 +11,10 @@ NAMEID = 'bebe'
|
|||
APATOKEN = '''{"token":"1c2562e6-b0a9-4bcf-b669-e33a42397147","endDate":"2017-10-11T10:22:40.342"}'''
|
||||
APATOKEN_403 = '''[{"logref":"db15cb8a-4d05-4e4f-b4e1-44ec39dc11e3","message":"Erreur d'authentification m\xc3\xa9tier ASG APA: Code confidentiel non valide pour l'individu 2823255","links":[]}]'''
|
||||
APAINFOS = {
|
||||
'apa-user-info': '{"individu":{"civilite":"Mme","nomUsuel":"PYPPENNE","nomNaissance":"NPYNEZ","prenom":"Pecile","dateNaissance":"1922-12-17","contact":{"telephone":"0344480774","mail":""},"adresse":{"complementDestinataire":"compl dest","numeroLieu":"38","natureLieu":null,"nomLieu":"RUE MARTIN","complementLieu":"MARPA LES NACRES - APPARTEMENT 9","finLieu":"fin adresse","codePostal":"80370","commune":"BERNAVILLE"},"tutelles":{"tutelle":[{"type":"Organisme","identite":"Association Tut\xc3\xa9laire de la Somme","mesure":null,"natureAccord":"Juridique","dateEffet":"2014-01-01","dateFin":null,"adresse":{"numeroLieu":"21","natureLieu":null,"nomLieu":"RUE SULLY","complementLieu":"BP 11660","finLieu":"","codePostal":"80016","commune":"AMIENS","cedex":"1"}},{"type":"Individu/Particulier","identite":"Ehmet TYEP","mesure":"Curatelle simple","natureAccord":"Juridique","dateEffet":"2017-01-01","dateFin":"2017-12-31","adresse":{"numeroLieu":"89","natureLieu":null,"nomLieu":"AVENUE LEON BLUM","complementLieu":"","finLieu":"","codePostal":"80100","commune":"ABBEVILLE","cedex":""}},{"type":"Individu/Particulier","identite":"Esg TYTEYP PE PEPPOXE OEX","mesure":null,"natureAccord":null,"dateEffet":null,"dateFin":null,"adresse":{"numeroLieu":"1","natureLieu":null,"nomLieu":"BOULEVARD DU PORT","complementLieu":"CAD","finLieu":"","codePostal":"80000","commune":"AMIENS","cedex":""}}]},"apa":{"classotheque":"05-2834","centreAutonomie":"Centre Autonomie nord ouest"}}}',
|
||||
'apa-user-rights': '{"demandeAsg":[{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2017-01-05","dateFin":"2019-01-31"},"complementDossier":{"dateDepot":"2016-11-15","dateArrivee":"2016-11-16","dateDossierComplet":"2016-11-17"},"gir":{"type":"Synth\xc3\xa8se","gir":3,"dateEvaluation":"2017-02-01"},"suivi":{"instructeur":{"civilite":"madame","nom":"ZEPEQPE","prenom":"EPOZOE","telephone":"0344974383","mail":"e.zepeqpe@xoppe.pp"},"dateDecision":"2017-01-05"},"bilan":{"pourcentageTM":2.1973443031311035},"prestationAccordeeAsg":[{"prestation":"Accueil de jour GIR 1-2","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":null,"quantitatif":null},"quantite":0,"montant":{"accorde":0,"participation":0,"verse":0},"attributaire":{"type":"Tuteur","identite":"Association Tut\xc3\xa9laire de la Somme"}},{"prestation":"Articles d\'hygi\xc3\xa8ne forfait 45\xc2\x80","periode":{"dateEffet":"2017-01-05","dateFin":null},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":45,"quantitatif":"Mois"},"quantite":1,"montant":{"accorde":45,"participation":1.68,"verse":43.32},"attributaire":{"type":"B\xc3\xa9n\xc3\xa9ficiaire","identite":"PYPPENNE Pecile"}},{"prestation":"Petite structure","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Etablissement","identite":"MARPA LES NACRES","tarif":null,"quantitatif":null},"quantite":0,"montant":{"accorde":440.42,"participation":7.68,"verse":432.74},"attributaire":{"type":"Etablissement","identite":"MARPA LES NACRES"}},{"prestation":"Aide humaine prestataire","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Prestataire","identite":"COMMUNAUTE DE COMMUNES DU TERRITOIRE NORD PICARDIE BERNAVILLE","tarif":19,"quantitatif":"Heure(s)"},"quantite":45.5,"montant":{"accorde":864.5,"participation":18.93,"verse":845.57},"attributaire":{"type":"Prestataire","identite":"COMMUNAUTE DE COMMUNES DU TERRITOIRE NORD PICARDIE BERNAVILLE"}},{"prestation":"Articles d\'hygi\xc3\xa8ne forfait 90\xc2\x80","periode":{"dateEffet":"2017-01-05","dateFin":null},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":90,"quantitatif":"Mois"},"quantite":1,"montant":{"accorde":90,"participation":3.35,"verse":86.65},"attributaire":{"type":"B\xc3\xa9n\xc3\xa9ficiaire","identite":"PYPPENNE Pecile"}}]}]}',
|
||||
'apa-user-request': '{"demandeAsg":[]}',
|
||||
'apa-user-history': '{"demandeAsg":[{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2013-03-01","dateFin":"2013-06-19"},"complementDossier":{"dateArrivee":null,"dateDossierComplet":"2012-10-25"},"suivi":{"decision":"Accord","dateDecision":"2013-02-12"}},{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2013-06-20","dateFin":"2016-03-31"},"complementDossier":{"dateArrivee":null,"dateDossierComplet":"2012-10-25"},"suivi":{"decision":"Accord","dateDecision":"2013-06-25"}},{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2016-04-01","dateFin":"2017-01-04"},"complementDossier":{"dateArrivee":"2016-06-06","dateDossierComplet":"2016-06-06"},"suivi":{"decision":"Accord","dateDecision":"2016-06-14"}}]}',
|
||||
'exportDonneesIndividu': '{"individu":{"civilite":"Mme","nomUsuel":"PYPPENNE","nomNaissance":"NPYNEZ","prenom":"Pecile","dateNaissance":"1922-12-17","contact":{"telephone":"0344480774","mail":""},"adresse":{"complementDestinataire":"compl dest","numeroLieu":"38","natureLieu":null,"nomLieu":"RUE MARTIN","complementLieu":"MARPA LES NACRES - APPARTEMENT 9","finLieu":"fin adresse","codePostal":"80370","commune":"BERNAVILLE"},"tutelles":{"tutelle":[{"type":"Organisme","identite":"Association Tut\xc3\xa9laire de la Somme","mesure":null,"natureAccord":"Juridique","dateEffet":"2014-01-01","dateFin":null,"adresse":{"numeroLieu":"21","natureLieu":null,"nomLieu":"RUE SULLY","complementLieu":"BP 11660","finLieu":"","codePostal":"80016","commune":"AMIENS","cedex":"1"}},{"type":"Individu/Particulier","identite":"Ehmet TYEP","mesure":"Curatelle simple","natureAccord":"Juridique","dateEffet":"2017-01-01","dateFin":"2017-12-31","adresse":{"numeroLieu":"89","natureLieu":null,"nomLieu":"AVENUE LEON BLUM","complementLieu":"","finLieu":"","codePostal":"80100","commune":"ABBEVILLE","cedex":""}},{"type":"Individu/Particulier","identite":"Esg TYTEYP PE PEPPOXE OEX","mesure":null,"natureAccord":null,"dateEffet":null,"dateFin":null,"adresse":{"numeroLieu":"1","natureLieu":null,"nomLieu":"BOULEVARD DU PORT","complementLieu":"CAD","finLieu":"","codePostal":"80000","commune":"AMIENS","cedex":""}}]},"apa":{"classotheque":"05-2834","centreAutonomie":"Centre Autonomie nord ouest"}}}',
|
||||
'consultationDeMesDroits': '{"demandeAsg":[{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2017-01-05","dateFin":"2019-01-31"},"complementDossier":{"dateDepot":"2016-11-15","dateArrivee":"2016-11-16","dateDossierComplet":"2016-11-17"},"gir":{"type":"Synth\xc3\xa8se","gir":3,"dateEvaluation":"2017-02-01"},"suivi":{"instructeur":{"civilite":"madame","nom":"ZEPEQPE","prenom":"EPOZOE","telephone":"0344974383","mail":"e.zepeqpe@xoppe.pp"},"dateDecision":"2017-01-05"},"bilan":{"pourcentageTM":2.1973443031311035},"prestationAccordeeAsg":[{"prestation":"Accueil de jour GIR 1-2","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":null,"quantitatif":null},"quantite":0,"montant":{"accorde":0,"participation":0,"verse":0},"attributaire":{"type":"Tuteur","identite":"Association Tut\xc3\xa9laire de la Somme"}},{"prestation":"Articles d\'hygi\xc3\xa8ne forfait 45\xc2\x80","periode":{"dateEffet":"2017-01-05","dateFin":null},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":45,"quantitatif":"Mois"},"quantite":1,"montant":{"accorde":45,"participation":1.68,"verse":43.32},"attributaire":{"type":"B\xc3\xa9n\xc3\xa9ficiaire","identite":"PYPPENNE Pecile"}},{"prestation":"Petite structure","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Etablissement","identite":"MARPA LES NACRES","tarif":null,"quantitatif":null},"quantite":0,"montant":{"accorde":440.42,"participation":7.68,"verse":432.74},"attributaire":{"type":"Etablissement","identite":"MARPA LES NACRES"}},{"prestation":"Aide humaine prestataire","periode":{"dateEffet":"2017-01-05","dateFin":"2019-01-31"},"tiers":{"type":"Prestataire","identite":"COMMUNAUTE DE COMMUNES DU TERRITOIRE NORD PICARDIE BERNAVILLE","tarif":19,"quantitatif":"Heure(s)"},"quantite":45.5,"montant":{"accorde":864.5,"participation":18.93,"verse":845.57},"attributaire":{"type":"Prestataire","identite":"COMMUNAUTE DE COMMUNES DU TERRITOIRE NORD PICARDIE BERNAVILLE"}},{"prestation":"Articles d\'hygi\xc3\xa8ne forfait 90\xc2\x80","periode":{"dateEffet":"2017-01-05","dateFin":null},"tiers":{"type":"Ind\xc3\xa9termin\xc3\xa9","identite":null,"tarif":90,"quantitatif":"Mois"},"quantite":1,"montant":{"accorde":90,"participation":3.35,"verse":86.65},"attributaire":{"type":"B\xc3\xa9n\xc3\xa9ficiaire","identite":"PYPPENNE Pecile"}}]}]}',
|
||||
'suiviDemandeEnInstruction': '{"demandeAsg":[]}',
|
||||
'suiviDemandeHistorique': '{"demandeAsg":[{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2013-03-01","dateFin":"2013-06-19"},"complementDossier":{"dateArrivee":null,"dateDossierComplet":"2012-10-25"},"suivi":{"decision":"Accord","dateDecision":"2013-02-12"}},{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2013-06-20","dateFin":"2016-03-31"},"complementDossier":{"dateArrivee":null,"dateDossierComplet":"2012-10-25"},"suivi":{"decision":"Accord","dateDecision":"2013-06-25"}},{"demande":{"type":"Allocation Personnalis\xc3\xa9e Autonomie","nature":"Domicile"},"droit":{"dateDebut":"2016-04-01","dateFin":"2017-01-04"},"complementDossier":{"dateArrivee":"2016-06-06","dateDossierComplet":"2016-06-06"},"suivi":{"decision":"Accord","dateDecision":"2016-06-14"}}]}',
|
||||
}
|
||||
|
||||
|
||||
|
@ -27,18 +27,18 @@ def solis(db):
|
|||
|
||||
|
||||
def test_solis_restricted_access(app, solis):
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-link', slug=solis.slug)
|
||||
assert endpoint == '/solis/test/apa-link'
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
resp = app.post(endpoint, status=403)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'PermissionDenied' in resp.json['err_class']
|
||||
resp = app.get(endpoint, status=405)
|
||||
assert requests_get.call_count == 0
|
||||
for service in ('apa-unlink', 'apa-user-info', 'apa-user-rights',
|
||||
'apa-user-request', 'apa-user-history'):
|
||||
for service in ('apa-link', 'apa-unlink'):
|
||||
endpoint = utils.generic_endpoint_url('solis', service, slug=solis.slug)
|
||||
assert endpoint == '/solis/test/%s' % service
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
resp = app.post(endpoint, status=403)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'PermissionDenied' in resp.json['err_class']
|
||||
resp = app.get(endpoint, status=405)
|
||||
assert requests_get.call_count == 0
|
||||
for service in ('apa-links', 'apa-user-info', 'apa-users'):
|
||||
endpoint = utils.generic_endpoint_url('solis', service, slug=solis.slug)
|
||||
assert endpoint == '/solis/test/%s' % service
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
|
@ -59,73 +59,122 @@ def test_solis_link_infos_unlink(app, solis):
|
|||
resource_pk=solis.pk)
|
||||
|
||||
# link
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-link', slug=solis.slug)
|
||||
for params in (None, '', []):
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post: # get solis token
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get: # get solis informations
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-link', slug=solis.slug)
|
||||
for params in (None, '', []):
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'payload is not a JSON dict' in resp.json['err_desc']
|
||||
|
||||
for params in ({}, {'user_id': 'x'}, {'code': 'x'}, {'foo': 'bar'}):
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'missing name_id' in resp.json['err_desc']
|
||||
params['name_id'] = 'xx'
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'missing user_id/code credentials' in resp.json['err_desc']
|
||||
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN_403, status_code=403)
|
||||
resp = app.post_json(endpoint,
|
||||
params={'user_id': 'x', 'code': 'x', 'name_id': NAMEID},
|
||||
status=200)
|
||||
assert requests_post.call_count == 1
|
||||
assert requests_get.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'payload is not a JSON dict' in resp.json['err_desc']
|
||||
assert 'invalid credentials' in resp.json['err_desc']
|
||||
|
||||
for params in ({}, {'user_id': 'x'}, {'code': 'x'}, {'foo': 'bar'}):
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'missing name_id' in resp.json['err_desc']
|
||||
params['name_id'] = 'xx'
|
||||
resp = app.post_json(endpoint, params=params, status=200)
|
||||
assert requests_post.call_count == 0
|
||||
assert resp.json['err'] == 1
|
||||
assert 'missing user_id/code credentials' in resp.json['err_desc']
|
||||
assert SolisAPALink.objects.count() == 0
|
||||
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN_403, status_code=403)
|
||||
resp = app.post_json(endpoint,
|
||||
params={'user_id': 'x', 'code': 'x', 'name_id': NAMEID},
|
||||
status=200)
|
||||
assert requests_post.call_count == 1
|
||||
assert resp.json['err'] == 1
|
||||
assert 'invalid credentials' in resp.json['err_desc']
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN, status_code=200)
|
||||
requests_get.return_value = utils.FakedResponse(content=APAINFOS['exportDonneesIndividu'],
|
||||
status_code=200)
|
||||
resp = app.post_json(endpoint,
|
||||
params={'name_id': NAMEID, 'user_id': '42', 'code': 'foo'},
|
||||
status=200)
|
||||
assert requests_post.call_count == 2
|
||||
assert requests_get.call_count == 1
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['user_id'] == '42'
|
||||
assert resp.json['data']['created']
|
||||
assert not resp.json['data']['updated']
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
assert SolisAPALink.objects.first().name_id == NAMEID
|
||||
assert SolisAPALink.objects.first().user_id == '42'
|
||||
assert SolisAPALink.objects.first().code == 'foo'
|
||||
assert SolisAPALink.objects.first().text == 'Mme Pecile PYPPENNE (NPYNEZ)'
|
||||
|
||||
assert SolisAPALink.objects.count() == 0
|
||||
# change code
|
||||
resp = app.post_json(endpoint,
|
||||
params={'name_id': NAMEID, 'user_id': '42', 'code': 'bar'},
|
||||
status=200)
|
||||
assert requests_post.call_count == 3
|
||||
assert requests_get.call_count == 2
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['user_id'] == '42'
|
||||
assert not resp.json['data']['created']
|
||||
assert resp.json['data']['updated']
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
assert SolisAPALink.objects.first().name_id == NAMEID
|
||||
assert SolisAPALink.objects.first().user_id == '42'
|
||||
assert SolisAPALink.objects.first().code == 'bar'
|
||||
assert SolisAPALink.objects.first().text == 'Mme Pecile PYPPENNE (NPYNEZ)'
|
||||
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN, status_code=200)
|
||||
resp = app.post_json(endpoint,
|
||||
params={'name_id': NAMEID, 'user_id': '42', 'code': 'foo'},
|
||||
status=200)
|
||||
assert requests_post.call_count == 2
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['user_id'] == '42'
|
||||
assert resp.json['data']['created']
|
||||
assert not resp.json['data']['updated']
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
assert SolisAPALink.objects.first().name_id == NAMEID
|
||||
assert SolisAPALink.objects.first().user_id == '42'
|
||||
assert SolisAPALink.objects.first().code == 'foo'
|
||||
# second link
|
||||
resp = app.post_json(endpoint,
|
||||
params={'name_id': NAMEID, 'user_id': '53', 'code': 'bar'},
|
||||
status=200)
|
||||
assert requests_post.call_count == 4
|
||||
assert requests_get.call_count == 3
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['user_id'] == '53'
|
||||
assert resp.json['data']['created']
|
||||
assert not resp.json['data']['updated']
|
||||
assert SolisAPALink.objects.count() == 2
|
||||
|
||||
resp = app.post_json(endpoint,
|
||||
params={'name_id': NAMEID, 'user_id': '53', 'code': 'bar'},
|
||||
status=200)
|
||||
assert requests_post.call_count == 3
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['user_id'] == '53'
|
||||
assert not resp.json['data']['created']
|
||||
assert resp.json['data']['updated']
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
assert SolisAPALink.objects.first().name_id == NAMEID
|
||||
assert SolisAPALink.objects.first().user_id == '53'
|
||||
assert SolisAPALink.objects.first().code == 'bar'
|
||||
# verify recorded names after link
|
||||
assert [x['text'] for x in SolisAPALink.objects.values('text')] == \
|
||||
['Mme Pecile PYPPENNE (NPYNEZ)', 'Mme Pecile PYPPENNE (NPYNEZ)']
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-links', slug=solis.slug)
|
||||
resp = app.get(endpoint, status=400) # missing name_id
|
||||
assert resp.json['err'] == 1
|
||||
endpoint += '?name_id=%s' % NAMEID
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert len(resp.json['data']) == 2
|
||||
assert resp.json['data'][0]['text'] == resp.json['data'][1]['text'] == \
|
||||
'Mme Pecile PYPPENNE (NPYNEZ)'
|
||||
|
||||
# get informations from linked user
|
||||
# get base informations from a linked user (exportDonneesIndividu)
|
||||
changed_name = APAINFOS['exportDonneesIndividu'].replace('PYPPENNE', 'PEPONE')
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN, status_code=200)
|
||||
requests_get.return_value = utils.FakedResponse(content=changed_name, status_code=200)
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-user-info', slug=solis.slug)
|
||||
endpoint += '?name_id=%s&user_id=42' % NAMEID
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['individu']['nomUsuel'] == 'PEPONE'
|
||||
# user "text" updated in link:
|
||||
assert SolisAPALink.objects.get(name_id=NAMEID, user_id='42').text == \
|
||||
'Mme Pecile PEPONE (NPYNEZ)'
|
||||
|
||||
# get all kind of informations
|
||||
for apa_endpoint in APAINFOS:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN, status_code=200)
|
||||
|
||||
endpoint = utils.generic_endpoint_url('solis', apa_endpoint, slug=solis.slug)
|
||||
resp = app.get(endpoint, status=400) # missing name_id
|
||||
endpoint_base = utils.generic_endpoint_url('solis', 'apa-user-info', slug=solis.slug)
|
||||
resp = app.get(endpoint_base, status=400) # missing name_id
|
||||
assert resp.json['err'] == 1
|
||||
|
||||
endpoint += '?name_id=%s' % NAMEID
|
||||
endpoint = endpoint_base + '?name_id=%s&user_id=53&information=%s' % (NAMEID, apa_endpoint)
|
||||
requests_get.return_value = utils.FakedResponse(content=APAINFOS[apa_endpoint],
|
||||
status_code=200)
|
||||
resp = app.get(endpoint, status=200)
|
||||
|
@ -144,35 +193,62 @@ def test_solis_link_infos_unlink(app, solis):
|
|||
assert not resp.json['data']
|
||||
assert resp.json['err_desc'].startswith('unknown error status:500')
|
||||
|
||||
# unlinked name_id
|
||||
endpoint = utils.generic_endpoint_url('solis', apa_endpoint, slug=solis.slug)
|
||||
endpoint += '?name_id=unlinked'
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
assert resp.json['err_desc'] == 'unlinked name_id'
|
||||
assert resp.json['data'] is None
|
||||
# unknown name_id or user_id
|
||||
for qs in ('name_id=%s&user_id=XXX' % NAMEID, 'name_id=unlinked&user_id=53'):
|
||||
endpoint = endpoint_base + ('?information=%s' % apa_endpoint) + '&' + qs
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
assert resp.json['err_desc'] == 'unknown link'
|
||||
assert resp.json['data'] is None
|
||||
|
||||
# get informations for all users (exportDonneesIndividu)
|
||||
change_info = APAINFOS['exportDonneesIndividu'].replace('PYPPENNE', 'PEPPYNE')
|
||||
with mock.patch('passerelle.utils.LoggedRequest.get') as requests_get:
|
||||
with mock.patch('passerelle.utils.LoggedRequest.post') as requests_post:
|
||||
requests_post.return_value = utils.FakedResponse(content=APATOKEN, status_code=200)
|
||||
requests_get.return_value = utils.FakedResponse(content=change_info, status_code=200)
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-users', slug=solis.slug)
|
||||
endpoint += '?name_id=%s' % NAMEID
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert len(resp.json['data']) == 2
|
||||
assert requests_post.call_count == 2
|
||||
assert requests_get.call_count == 2
|
||||
assert set([x['id'] for x in resp.json['data']]) == set(['42', '53'])
|
||||
assert resp.json['data'][0]['text'] == 'Mme Pecile PEPPYNE (NPYNEZ)'
|
||||
# user "text" updated in links:
|
||||
assert [x['text'] for x in SolisAPALink.objects.values('text')] == \
|
||||
['Mme Pecile PEPPYNE (NPYNEZ)', 'Mme Pecile PEPPYNE (NPYNEZ)']
|
||||
|
||||
# unlink
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-unlink', slug=solis.slug)
|
||||
resp = app.get(endpoint, status=400) # missing name_id
|
||||
assert resp.json['err'] == 1
|
||||
for bad_params in ({}, {'user_id': '42'}, {'name_id': NAMEID}):
|
||||
resp = app.post_json(endpoint, params=bad_params, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
|
||||
endpoint += '?name_id=%s' % NAMEID
|
||||
resp = app.get(endpoint, status=200)
|
||||
resp = app.post_json(endpoint, params={'user_id': 'xxx', 'name_id': 'xxx'}, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data'] == {'deleted': True}
|
||||
assert SolisAPALink.objects.count() == 0
|
||||
assert resp.json['data']['deleted']
|
||||
assert resp.json['data']['user_id'] == 'xxx'
|
||||
assert SolisAPALink.objects.count() == 2
|
||||
|
||||
resp = app.post_json(endpoint, params={'user_id': '42', 'name_id': NAMEID}, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']['deleted']
|
||||
assert resp.json['data']['user_id'] == '42'
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
|
||||
# unlink again, no trouble
|
||||
resp = app.get(endpoint, status=200)
|
||||
resp = app.post_json(endpoint, params={'user_id': '42', 'name_id': NAMEID}, status=200)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data'] == {'deleted': True}
|
||||
assert SolisAPALink.objects.count() == 0
|
||||
assert resp.json['data']['deleted']
|
||||
assert resp.json['data']['user_id'] == '42'
|
||||
assert SolisAPALink.objects.count() == 1
|
||||
|
||||
# can not get informations from unlinked user
|
||||
endpoint = utils.generic_endpoint_url('solis', 'apa-user-info', slug=solis.slug)
|
||||
endpoint += '?name_id=%s' % NAMEID
|
||||
endpoint += '?name_id=%s&user_id=42' % NAMEID
|
||||
resp = app.get(endpoint, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
assert resp.json['err_desc'] == 'unlinked name_id'
|
||||
assert resp.json['err_desc'] == 'unknown link'
|
||||
assert resp.json['data'] is None
|
||||
|
|
Loading…
Reference in New Issue