# passerelle - uniform access to multiple data sources and services # Copyright (C) 2018 Entr'ouvert # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import csv import functools import io import json from urllib.parse import parse_qs import httmock import pytest import responses import tests.utils from passerelle.contrib.rsa13.models import DEFAULTS, RSA13Resource, dump_csv_columns from passerelle.utils.json import validate_schema from .test_manager import login @pytest.fixture def rsa13(db): return tests.utils.make_resource( RSA13Resource, title='Test', slug='test', description='Test', webservice_base_url='https://rsa-cd13.com', basic_auth_username='username', basic_auth_password='password', ) @pytest.fixture def url(rsa13): return '/rsa13/%s/' % rsa13.slug def mock_response(*path_contents): def decorator(func): @httmock.urlmatch() def error(url, request): assert False, 'request to %s' % (url,) @functools.wraps(func) def wrapper(*args, **kwargs): handlers = [] for row in path_contents: try: path, query, content = row except ValueError: path, content = row query = None def make_handler(path, query, content): @httmock.urlmatch(path=path) def handler(url, request): if query: assert parse_qs(url.query) == parse_qs(query), 'query does not match' return json.dumps(content) return handler handlers.append(make_handler(path, query, content)) handlers.append(error) with httmock.HTTMock(*handlers): return func(*args, **kwargs) return wrapper return decorator @mock_response(['/api/check', {'ping': 'pong'}]) def test_check_status(rsa13): rsa13.check_status() EMAIL = 'john.doe@example.com' IP = '127.0.0.1' @pytest.fixture def app(app): '''Add authentication params email/ip to all requests''' orig_do_request = app.do_request def do_request(req, *args, **kwargs): qs = 'email=%s&ip=%s' % (EMAIL, IP) if req.environ['QUERY_STRING']: req.environ['QUERY_STRING'] += '&' + qs else: req.environ['QUERY_STRING'] = qs return orig_do_request(req, *args, **kwargs) app.do_request = do_request return app MOTICLODAC_CODES = [ {'id': 'ABSSUIVI', 'text': 'Aucune info. sur le suivi'}, {'id': 'CADUQUE', 'text': 'Caduque'}, {'id': 'REALISEE', 'text': 'Réalisée'}, {'id': 'RUPTINJUST', 'text': 'Rupture injustifiée'}, {'id': 'RUPTJUSTIF', 'text': 'Rupture justifiée'}, ] @mock_response(['/api/cg_ref_code/domain/MOTICLODAC', {'err': 0, 'data': MOTICLODAC_CODES}]) def test_nomenclature(app, rsa13, url): response = app.get(url + 'nomenclature/MOTICLODAC/') assert response.json == { 'err': 0, 'data': MOTICLODAC_CODES, } PLATFORM_LIST = [{'dsp': 'LA', 'id': 11, 'name': 'ADPEI', 'role': 'Coordonnateur'}] @mock_response(['/api/platform/', {'err': 0, 'data': PLATFORM_LIST}]) def test_platform(app, rsa13, url): response = app.get(url + 'platform/') assert response.json['data'] == PLATFORM_LIST PLATFORM_DETAIL = { 'id': 11, 'name': 'ADPEI', 'dsp': 'LA', 'adr1': 'ADPEI', 'adr2': None, 'adr3': None, 'adr4': '18 BOULEVARD CAMILLE FLAMMARION', 'adr5': None, 'adr6': '13001 MARSEILLE', 'tel': '0491110140', 'queries': [ {'id': 1, 'name': 'NON CONSULTÉ', 'count': 727}, {'id': 2, 'name': 'SANS RU', 'count': 727}, {'id': 3, 'name': 'SANS CONTRAT SUR LA PLATEFORME', 'count': 231}, {'id': 4, 'name': 'CONTRAT BIENTOT TERMINE', 'count': 0}, {'id': 5, 'name': 'SANS AUCUNE ACTION', 'count': 44}, {'id': 6, 'name': 'ACTION VALIDEE NON DEBUTEE NON CLOSE', 'count': 111}, ], } @mock_response(['/api/platform/11/', {'err': 0, 'data': PLATFORM_DETAIL}]) def test_platform_details(app, rsa13, url): response = app.get(url + 'platform/11/') assert response.json == { 'err': 0, 'data': PLATFORM_DETAIL, } PLATFORM_REFERENT = [ { 'id': 324, 'nom': 'EHRMANN ', 'prenom': 'Jean Paul', 'tel': None, 'email': 'john.doe@example.com', 'role': 'Coordonnateur', 'statut': 'Actif', }, { 'id': 239, 'nom': 'CHAUMONT ', 'prenom': 'Nadine', 'tel': '090909090909', 'email': 'jane.doe@example.com', 'role': 'Accompagnateur', 'statut': 'Clos', }, ] @mock_response(['/api/platform/11/referent/', {'err': 0, 'data': PLATFORM_REFERENT}]) def test_platform_referent(app, rsa13, url): response = app.get(url + 'platform/11/referent/') assert response.json == { 'err': 0, 'data': PLATFORM_REFERENT, } @mock_response(['/api/platform/11/referent/', {'err': 0, 'data': PLATFORM_REFERENT}]) def test_platform_referent_with_status(app, rsa13, url): response = app.get(url + 'platform/11/referent/?statut=Actif') assert response.json == { 'err': 0, 'data': [ref for ref in PLATFORM_REFERENT if ref['statut'] == 'Actif'], } @mock_response(['/api/platform/11/referent/', {'err': 0}]) def test_platform_referent_post(app, rsa13, url): response = app.post_json( url + 'platform/11/referent/', params={ 'email': 'john.doe@example.com', 'prenom': 'John', 'nom': 'Doe', 'tel': '0909090909', }, ) assert response.json == {'err': 0} @mock_response(['/api/platform/11/referent/', {'err': 0}]) def test_platform_referent_post_empty_mail_and_tel(app, rsa13, url): response = app.post_json( url + 'platform/11/referent/', params={ 'email': '', 'prenom': 'John', 'nom': 'Doe', 'tel': '', }, ) assert response.json == {'err': 0} @mock_response(['/api/platform/11/referent/1/', {'err': 0}]) def test_platform_referent_update(app, rsa13, url): response = app.post_json( url + 'platform/11/referent/1/', params={ 'email': 'john.doe@example.com', 'prenom': 'John', 'nom': 'Doe', 'tel': '0909090909', 'statut': 'A', }, ) assert response.json == {'err': 0} BENEFICIAIRE = { 'id': 386981, 'civilite': 'MR', 'nom': 'AAABEFBAADF', 'prenom': 'ACCDCBE', 'date_naissance': '1958-01-01', 'actif': 'Oui', 'matricule': '193740', 'code_postal': '13001', 'commune': 'MARSEILLE', 'code_pi': '51', 'referent': ' ', 'date_deb_affectation': '2019-03-11', 'consulte': 'Oui', 'toppersdrodevorsa': 'Oui', } @mock_response(['/api/platform/11/beneficiaire/', 'nom=AAABEFBAADF', {'err': 0, 'data': [BENEFICIAIRE]}]) def test_platform_beneficiaire_nom(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/', params={'nom': 'AAABEFBAADF'}) assert response.json == { 'err': 0, 'data': [BENEFICIAIRE], } @mock_response(['/api/platform/11/beneficiaire/', 'matricule=193740', {'err': 0, 'data': [BENEFICIAIRE]}]) def test_platform_beneficiaire_matricule(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/', params={'matricule': '193740'}) assert response.json == { 'err': 0, 'data': [BENEFICIAIRE], } @mock_response(['/api/platform/11/beneficiaire/', 'page=0', {'err': 0, 'data': [BENEFICIAIRE]}]) def test_platform_beneficiaire_page(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/', params={'page': '0'}) assert response.json == { 'err': 0, 'data': [BENEFICIAIRE], } @mock_response( [ '/api/platform/11/beneficiaire/', 'page=0&nom=NOM&prenom=PRENOM&matricule=MATRICULE&referent=REFERENT', {'err': 0, 'data': [BENEFICIAIRE]}, ] ) def test_platform_beneficiaire_full(app, rsa13, url): response = app.get( url + 'platform/11/beneficiaire/', params={ 'page': '0', 'nom': 'NOM', 'prenom': 'PRENOM', 'matricule': 'MATRICULE', 'referent': 'REFERENT', }, ) assert response.json == { 'err': 0, 'data': [BENEFICIAIRE], } BENEFICIAIRE_CSV = { 'NUM_CAF': '1234', 'CODE_PER': '1234', 'PRENOM_PER': 'prenom', 'DTNAI_PER': '1234', 'ACTIF_PER': '1234', 'NOM_PER': 'nom', 'INSEE_ADR': '99999', } @mock_response( [ '/api/platform/12/beneficiaire/csv/', 'query=0&nom=bar&prenom=foo&matricule=xxx', {'err': 0, 'data': [BENEFICIAIRE_CSV]}, ], [ '/api/platform/11/beneficiaire/csv/', 'query=1', {'err': 0, 'data': [BENEFICIAIRE_CSV]}, ], ) def test_platform_beneficiaire_csv(app, rsa13, url): response = app.get( url + 'platform/11/beneficiaire/csv/', params={ 'query': '1', }, ) assert ( response.content == b'\xef\xbb\xbfNUM_CAF;CODE_PER;NOM_PER;PRENOM_PER;DTNAI_PER;ACTIF_PER;CODE_' b'PI;LIB_CODE_PI;TOPPERSDRODEVORSA;LIB_ETATDOSRSA;LIB_MOTIF_ETATDOSRSA;NB_JOUR' b'_DEPUIS_ARR;DATE_DEB;DATE_1IERE_CONS;DATE_DERNIERE_CONSULT;DATE_REELLE_RDV;N' b'UM_CINS;DATE_SIGN;DATE_DEB_CI;DATE_FIN_CI;REFERENT_CI;ACTION_EN_COURS;DELAI_' b'REGUL;PROC_EN_COURS;REFERENT_AFFECTATION;COMPL1_ADR;COMPL2_ADR;VO' b'IE_ADR;LIEU_DISTRIB_ADR;CP_ADR;VILLE_ADR;INSEE_ADR\r\n1234;1234;nom;prenom' b';1234;1234;;;;;;;;;;;;;;;;;;;;;;;;;;99999\r\n' ) # customized on model rsa13.beneficiaire_csv_columns = '''\ NUM_CAF Numéro CAF VILLE_ADR Ville''' rsa13.save() response = app.get( url + 'platform/11/beneficiaire/csv/', params={ 'query': '1', }, ) assert response.content == b'\xef\xbb\xbfNum\xc3\xa9ro CAF;Ville\r\n1234;\r\n' response = app.get( url + 'platform/12/beneficiaire/csv/', params={'query': '0', 'prenom': 'foo', 'nom': 'bar', 'matricule': 'xxx', 'referent': ''}, ) BENEFICIAIRE_DETAIL = { 'actif': 'Oui', 'adresse': { 'adr2': '8 RUE MISSION DE FRANCE', 'adr3': '13001 MARSEILLE', 'adr4': None, 'adr5': None, 'adr6': None, }, 'age': '62 ans', 'civilite': 'MR', 'code_pi': '51', 'commentaire_ref': None, 'conjoint': { 'age': '52 ans', 'id': 854379, 'nom': 'AAABEFBAADF', 'plateforme': 'PI51', 'prenom': 'EEFBEFEC', }, 'date_de_naissance': '1958-01-01', 'droit': { 'date_demande': '2008-10-16', 'etat': 'Droit ouvert et versable', 'motif': None, 'toppersdrodevorsa': 'Oui', }, 'enfants': [ {'age': '16 ans', 'nom': 'DBFFFCDDDDCBAEAC', 'prenom': 'DCACBEAFFD'}, {'age': '14 ans', 'nom': 'DBFFFCDDDDCBAEAC', 'prenom': 'BEDAEDEEBBCD'}, ], 'id': 386981, 'lib_code_pi': "Pôle d'Insertion Marseille I", 'matricule': '193740', 'nom': 'AAABEFBAADF', 'nomnaiss': 'EAEFEFDDDBEFDF', 'numdemrsa': '13378013', 'prenom': 'ACCDCBE', 'referent': {'id': None, 'nom': None, 'prenom': None}, 'situation_familiale': {'date_debut': '2007-10-01', 'libelle': 'VIE MARITALE'}, } @mock_response(['/api/platform/11/beneficiaire/386981/', {'err': 0, 'data': BENEFICIAIRE_DETAIL}]) def test_platform_beneficiaire_detail(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_DETAIL, } BENEFICIAIRE_TRANSPORT = {'cumuls': [{'duree': 54, 'type': 'GTU'}]} @mock_response(['/api/platform/11/beneficiaire/386981/telephone/', {'err': 0}]) def test_platform_beneficiaire_telephone(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/telephone/', params={'tel': '0909090909', 'commentaire': 'coin'}, ) assert response.json == { 'err': 0, } @mock_response(['/api/platform/11/beneficiaire/386981/telephone/0909090909/', {'err': 0}]) def test_platform_beneficiaire_telephone_update(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/telephone/0909090909/', params={'commentaire': 'coin'}, ) assert response.json == { 'err': 0, } @mock_response(['/api/platform/11/beneficiaire/386981/telephone/0909090909/', {'err': 0}]) def test_platform_beneficiaire_telephone_delete(app, rsa13, url): response = app.delete( url + 'platform/11/beneficiaire/386981/telephone/0909090909/', ) assert response.json == { 'err': 0, } @mock_response(['/api/platform/11/beneficiaire/386981/email/', {'err': 0}]) def test_platform_beneficiaire_email(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/email/', params={'courriel': 'john.doe@example.com', 'commentaire': 'coin'}, ) assert response.json == { 'err': 0, } @mock_response(['/api/platform/11/beneficiaire/386981/email/john.doe@example.com/', {'err': 0}]) def test_platform_beneficiaire_email_update(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/email/john.doe@example.com/', params={'commentaire': 'coin'}, ) assert response.json == { 'err': 0, } @mock_response(['/api/platform/11/beneficiaire/386981/email/john.doe@example.com/', {'err': 0}]) def test_platform_beneficiaire_email_delete(app, rsa13, url): response = app.delete( url + 'platform/11/beneficiaire/386981/email/john.doe@example.com/', ) assert response.json == { 'err': 0, } @mock_response( ['/api/platform/11/beneficiaire/386981/transport/', {'err': 0, 'data': BENEFICIAIRE_TRANSPORT}] ) def test_platform_beneficiaire_transport(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/transport/') assert response.json == {'err': 0, 'data': BENEFICIAIRE_TRANSPORT} BENEFICIAIRE_CONTRAT = [ { 'clos': 'Non', 'date_deb': '2019-09-18', 'date_fin': '2020-03-18', 'decision': 'Validé', 'duree': 6, 'id': 15, 'operateur': 'ADPEI', 'plateforme': 'ADPEI', 'referent': 'EHRMANN J', 'retab': 'Non', }, { 'clos': 'Oui', 'date_deb': '2019-03-21', 'date_fin': '2019-09-21', 'decision': 'Validé', 'duree': 6, 'id': 14, 'operateur': 'ADPEI', 'plateforme': 'ADPEI', 'referent': 'EHRMANN J', 'retab': 'Non', }, { 'clos': 'Oui', 'date_deb': '2009-04-03', 'date_fin': '2009-10-02', 'decision': 'Validé', 'duree': 6, 'id': 0, 'operateur': 'REPRISE HISTORIQUE LOGIFORM', 'plateforme': 'REPRISE HISTORIQUE LOGIFORM', 'referent': ' ', 'retab': 'Non', }, ] @mock_response(['/api/platform/11/beneficiaire/386981/contrat/', {'err': 0, 'data': BENEFICIAIRE_CONTRAT}]) def test_platform_beneficiaire_contrat(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/contrat/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_CONTRAT, } BENEFICIAIRE_CONTRAT_DETAIL = { 'commentaire': 'Gratuité RTM refusée. En tant que bénéficiaire de la ' 'CMUC vous pouvez obtenir un tarif préférentiel sur ' 'le réseau RTM.', 'date_clos': None, 'date_cvs': None, 'date_deb': '2019-09-18', 'date_fin': '2020-03-18', 'date_retab': None, 'date_sign': '2019-09-03', 'decision': 'Validé', 'duree': 6, 'id': 15, 'motif_cvs': None, 'operateur': 'ADPEI', 'plateforme': 'ADPEI', 'referent': {'commentaire': None, 'nom': 'EHRMANN ', 'prenom': 'Jean Paul'}, 'type_contrat': "Contrat d'Engagement Réciproque-Social", } @mock_response( ['/api/platform/11/beneficiaire/386981/contrat/15/', {'err': 0, 'data': BENEFICIAIRE_CONTRAT_DETAIL}] ) def test_platform_beneficiaire_contrat_detail(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/contrat/15/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_CONTRAT_DETAIL, } BENEFICIAIRE_ACTION = [ { 'clos': 'Oui', 'contrat_id': 4, 'date_deb': None, 'date_fin': None, 'date_preconisation': '2011-11-18', 'id': 663774, 'libelle': "Recherche autonome d'emploi", 'validation': 'Non', }, { 'clos': 'Oui', 'contrat_id': 0, 'date_deb': '2009-04-03', 'date_fin': '2009-10-02', 'date_preconisation': '2009-09-05', 'id': 7435, 'libelle': 'Ne plus utilisé-Reprise historique Logiform', 'validation': 'Oui', }, ] @mock_response(['/api/platform/11/beneficiaire/386981/action/', {'err': 0, 'data': BENEFICIAIRE_ACTION}]) def test_platform_beneficiaire_action(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/action/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_ACTION, } @mock_response( ['/api/platform/11/beneficiaire/386981/action/', 'clos=oui', {'err': 0, 'data': BENEFICIAIRE_ACTION}] ) def test_platform_beneficiaire_action_clos(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/action/', params={'clos': 'oui'}) assert response.json == { 'err': 0, 'data': BENEFICIAIRE_ACTION, } BENEFICIAIRE_ACTION_DETAIL = { 'id': 663774, 'contrat_id': 4, 'sac': 'E3', 'libelle': "Recherche autonome d'emploi", 'date_deb': None, 'date_fin': None, 'date_preconisation': '2011-11-18', 'date_cloture': '2012-01-12', 'moticlodac': None, 'lib_moticlodac': None, 'validation': 'Non', 'financement': {'montant_accorde': None, 'montant_demande': None}, 'commentaire_ref': None, } @mock_response( ['/api/platform/11/beneficiaire/386981/action/663774/', {'err': 0, 'data': BENEFICIAIRE_ACTION_DETAIL}] ) def test_platform_beneficiaire_action_detail(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/action/663774/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_ACTION_DETAIL, } @mock_response(['/api/platform/11/beneficiaire/386981/action/663774/', {'err': 0}]) def test_platform_beneficiaire_action_detail_update(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/action/663774/', params={'date_debug': '2021-01-01'} ) assert response.json == { 'err': 0, } BENEFICIAIRE_FONDSAIDE = [ { 'avis_pi': {'avis': 'Refusée', 'date': '2019-07-08', 'montant': 0}, 'avis_sai': {'avis': None, 'date': None, 'montant': 0}, 'clos': 'Non', 'code_tfi': 'FAI8', 'demande': {'date': '2019-07-01', 'montant': 970}, 'id': 39605, 'lib_tfi': 'FAI Permis B', } ] @mock_response( ['/api/platform/11/beneficiaire/386981/fondsaide/', {'err': 0, 'data': BENEFICIAIRE_FONDSAIDE}] ) def test_platform_beneficiaire_fondsaide(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/fondsaide/') # 365385/fonds-d-aide/fond-d-aide/39605/ assert response.json == { 'err': 0, 'data': BENEFICIAIRE_FONDSAIDE, } BENEFICIAIRE_FONDSAIDE_DETAIL = { 'avis_pi': {'avis': 'Refusée', 'date': '2019-07-08', 'montant': 0}, 'budget': { 'date_reception': None, 'justificatifs': [ { 'conforme': None, 'date_reception': None, 'date_relance': None, 'num_versement': 1, 'reception': 'Non', 'type': 'Document officiel de ' 'présentation au code de la ' 'route (ETG)', }, { 'conforme': None, 'date_reception': None, 'date_relance': None, 'num_versement': 1, 'reception': 'Non', 'type': "Relevé d'identité bancaire", }, { 'conforme': None, 'date_reception': None, 'date_relance': None, 'num_versement': 2, 'reception': 'Non', 'type': 'Document officiel de ' 'présentation à l’examen ' 'pratique du permis de ' 'conduire', }, ], 'nombre_versements': 2, }, 'cloture': {'date_cloture': None, 'date_relance': None}, 'code_tfi': 'FAI8', 'decision_sai': {'date': None, 'decision': None, 'montant': 0}, 'demande': {'date': '2019-07-01', 'montant': 970}, 'id': 39605, 'lib_tfi': 'FAI Permis B', 'recours': { 'date_decision': None, 'date_demande': None, 'decision': None, 'montant': None, }, } @mock_response( ['/api/platform/11/beneficiaire/386981/fondsaide/1/', {'err': 0, 'data': BENEFICIAIRE_FONDSAIDE_DETAIL}] ) def test_platform_beneficiaire_fondsaide_detail(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/fondsaide/1/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_FONDSAIDE_DETAIL, } BENEFICIAIRE_AFFECTATION = [ { 'id': 1599703, 'dispoitif': 'LA', 'plateforme': 'ADPEI', 'code_pi': 51, 'referent': ' ', 'date_deb': '2019-03-11', 'origine': 'CER', }, { 'id': 28726, 'dispoitif': 'MDS', 'plateforme': 'MDS PRESSENSE', 'code_pi': 51, 'referent': ' ', 'date_deb': '2012-03-22', 'origine': 'CER', }, ] @mock_response( ['/api/platform/11/beneficiaire/386981/affectation/', {'err': 0, 'data': BENEFICIAIRE_AFFECTATION}] ) def test_platform_beneficiaire_affectation(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/affectation/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_AFFECTATION, } BENEFICIAIRE_AFFECTATION_DETAIL = { 'id': 1599703, 'dispositif': 'LA', 'plateforme': 'ADPEI', 'code_pi': 51, 'referent': {'nom': None, 'prenom': None}, 'erreur': 'Non', 'date_deb': '2019-03-11', 'origine': 'CER', 'prescripteur': {'type': 'PI', 'dispositif': None, 'plateforme': None}, 'rendez-vous': { 'date_prise': None, 'relance': {'date': None, 'motif': None, 'lib_motif': None}, 'date_reelle': None, 'resultat': None, 'lib_resultat': None, }, 'fin': {'motif': None, 'lib_motif': None, 'date': None}, 'commentaire_ref': None, } @mock_response( [ '/api/platform/11/beneficiaire/386981/affectation/1/', {'err': 0, 'data': BENEFICIAIRE_AFFECTATION_DETAIL}, ] ) def test_platform_beneficiaire_affectation_detail(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/affectation/1/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_AFFECTATION_DETAIL, } @mock_response( [ '/api/platform/11/beneficiaire/386981/affectation/1/', {'err': 0}, ] ) def test_platform_beneficiaire_affectation_detail_update(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/affectation/1/', params={'rendezvous': {'date_prise': '2020-01-01'}}, ) assert response.json == { 'err': 0, } BENEFICIAIRE_CONVO = { 'convos_par_motif': [{'motif': "Absence de Contrat d'Engagement Réciproque", 'nombre': 2}], 'derniere_consequence': {'date': None, 'consequence': None}, } @mock_response(['/api/platform/11/beneficiaire/386981/convo/', {'err': 0, 'data': BENEFICIAIRE_CONVO}]) def test_platform_beneficiaire_convo(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/convo/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_CONVO, } BENEFICIAIRE_EMPLOI = { 'id': '6720658N', 'date_sortie': None, 'motif_sortie': None, 'date_inscription': '2018-05-14', 'date_dernier_ent': '2019-04-11', 'code_rome': 'F1606', 'lib_rome': 'Peintre tapissier / tapissière', 'lib_modalite': 'RENFORCE', 'lib_niveau': 'CERTIFICATION DE NIVEAU 5 (CAP, BEP)', 'lib_secteur': None, 'code_axe': '06', 'lib_axe': "LEVEE DES FREINS PERIPHERIQUES A L'EMPLOI", 'code_categorie': '1', 'lib_categorie': 'PERSONNE SANS EMPLOI DISPONIBLE DUREE INDETERMINEE PLEIN TPS', } @mock_response(['/api/platform/11/beneficiaire/386981/emploi/', {'err': 0, 'data': BENEFICIAIRE_EMPLOI}]) def test_platform_beneficiaire_emploi(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/386981/emploi/') assert response.json == { 'err': 0, 'data': BENEFICIAIRE_EMPLOI, } @mock_response(['/api/platform/11/beneficiaire/386981/reaffectation/', {'err': 0}]) def test_platform_beneficiaire_reaffectation(app, rsa13, url): response = app.post_json( url + 'platform/11/beneficiaire/386981/reaffectation/', params={'motif': 'OK', 'commentaire': 'NOK'} ) assert response.json == { 'err': 0, } @mock_response( [ '/api/platform/11/facturation/periods/', { 'err': 0, 'data': [ { 'id': '1234', 'text': 'Du 01/01/2022 au 31/03/2022', 'date_deb': '2022-01-01', 'date_fin': '2022-03-31', }, {'text': 'Du 01/10/2021 au 31/12/2021', 'date_deb': '2021-10-01', 'date_fin': '2021-12-31'}, {'text': 'Du 01/07/2021 au 30/09/2021', 'date_deb': '2021-07-01', 'date_fin': '2021-09-30'}, ], }, ] ) def test_platform_facturation_periodes(app, rsa13, url): response = app.get(url + 'platform/11/facturation/periodes/') assert response.json == { 'err': 0, 'data': [ { 'date_deb': '2022-01-01', 'date_fin': '2022-03-31', 'id': '1234', 'text': 'Du 01/01/2022 au 31/03/2022', 'csv_url': 'http://testserver/rsa13/test/platform/11/facturation/csv/?date_deb=2022-01-01&date_fin=2022-03-31', }, { 'date_deb': '2021-10-01', 'date_fin': '2021-12-31', 'id': 'Du 01/10/2021 au 31/12/2021', 'text': 'Du 01/10/2021 au 31/12/2021', 'csv_url': 'http://testserver/rsa13/test/platform/11/facturation/csv/?date_deb=2021-10-01&date_fin=2021-12-31', }, { 'date_deb': '2021-07-01', 'date_fin': '2021-09-30', 'id': 'Du 01/07/2021 au 30/09/2021', 'text': 'Du 01/07/2021 au 30/09/2021', 'csv_url': 'http://testserver/rsa13/test/platform/11/facturation/csv/?date_deb=2021-07-01&date_fin=2021-09-30', }, ], } @mock_response( [ '/api/platform/11/facturation/periods/', { 'err': 0, 'data': [ { 'id': '1234', 'text': 'Du 01/01/2022 au 31/03/2022', 'date_deb': '2022-01-01', 'date_fin': '2022-03-31', }, {'text': 'Du 01/10/2021 au 31/12/2021', 'date_deb': '2021-10-01', 'date_fin': '2021-12-31'}, {'text': 'Du 01/07/2021 au 30/09/2021', 'date_deb': '2021-07-01', 'date_fin': '2021-09-30'}, ], }, ], [ '/api/platform/11/facturation/csv', 'date_deb=2021-10-01&date_fin=2021-12-31', { 'err': 0, 'data': [ { 'PLATEFORME': 'APDL MARTIGUES', 'MATRICULE': '1000017', 'NOM': 'VKEOIFKQS', 'PRENOM': 'SABINE', 'DTNAI': '1950-01-01', 'GENRE': 'Femme', 'ROLE': 'Demandeur', 'CODE_POSTAL': '13320', 'COMMUNE': 'BOUC BEL AIR', 'DATE_SIGN': '2021-01-07', 'DATE_DEB': '2021-01-26', 'DUREE': 6, 'DATE_FIN': None, 'COEFFICIENT': 1.5, }, ], }, ], ) def test_platform_facturation_csv(app, rsa13, url): response = app.get(url + 'platform/11/facturation/periodes/') response = app.get(response.json['data'][1]['csv_url']) stream = io.StringIO(response.content.decode('utf-8-sig')) assert list(csv.reader(stream, delimiter=';')) == [ [ 'PLATEFORME', 'MATRICULE', 'NOM', 'PRENOM', 'DTNAI', 'GENRE', 'ROLE', 'CODE_POSTAL', 'COMMUNE', 'DATE_SIGN', 'DATE_DEB', 'DUREE', 'DATE_FIN', 'COEFFICIENT', ], [ 'APDL MARTIGUES', '1000017', 'VKEOIFKQS', 'SABINE', '1950-01-01', 'Femme', 'Demandeur', '13320', 'BOUC BEL AIR', '2021-01-07', '2021-01-26', '6', '', '1.5', ], ] # customized on model rsa13.facturation_csv_columns = '''\ PLATEFORME DUREE''' rsa13.save() response = app.get(url + 'platform/11/facturation/periodes/') response = app.get(response.json['data'][1]['csv_url']) stream = io.StringIO(response.content.decode('utf-8-sig')) assert list(csv.reader(stream, delimiter=';')) == [ [ 'PLATEFORME', 'DUREE', ], [ 'APDL MARTIGUES', '6', ], ] @mock_response( [ '/api/platform/11/beneficiaire/sorti/csv', { 'err': 0, 'data': [ { 'NUM_CAF': '372927', 'CODE_PER': 415443, 'NOM_PER': 'DCFFEBABBDDCDEC', 'PRENOM_PER': 'CBDACDCFEBBAA', 'DTNAI_PER': '1972-01-01', 'CP_PER': '13004', 'COMMUNE_PER': 'MARSEILLE', 'ACTIF_PER': 'Oui', 'CODE_PI': 53, 'LIB_CODE_PI': "Pôle d'insertion Marseille III", 'TOPPERSDRODEVORSA': 'N', 'LIB_ETATDOSRSA': 'Droit clos', 'LIB_MOTIF_ETATDOSRSA': 'Clôture suite à échéance (4 mois sans droits)', 'PLT_DT_DEB_AFF': '2021-10-05', 'PLT_DT_FIN_AFF': '2022-06-13', 'PLT_MOTIF_FIN_ACC': None, 'PLT_COMMENTAIRE_REF': ( '29/11/2021 Mme présente au RDV, mais pas de CER car plus ' 'de RSA. Titulaire d\'une pension d\'invalidité elle a un complément d\'ASI.\nE.CASTORI' ), 'PLT_NUM_CI': None, 'PLT_PLATEFORME_CI': None, 'PLT_OPERATEUR_CI': None, 'PLT_REFERENT_CI': ' ', 'PLT_DECISION_CI': None, 'PLT_DUREE_CI': None, 'PLT_DATE_DEB_CI': None, 'PLT_DATE_FIN_CI': None, 'NOUVEAU_DT_DEB_AFF': '2022-06-13', 'NOUVEAU_AFF': 'SORTIE', 'NOUVEAU_COMMENTAIRE_PI': None, 'NOUVEAU_NUM_CI': None, 'NOUVEAU_PLATEFORME_CI': None, 'NOUVEAU_OPERATEUR_CI': None, 'NOUVEAU_REFERENT_CI': None, 'NOUVEAU_DECISION_CI': None, 'NOUVEAU_DUREE_CI': None, 'NOUVEAU_DATE_DEB_CI': None, 'NOUVEAU_DATE_FIN_CI': None, }, { 'NUM_CAF': '1677380', 'CODE_PER': 816754, 'NOM_PER': 'EBBCAAFBDCCF', 'PRENOM_PER': 'CCCADFBCBCEBCDCEBC', 'DTNAI_PER': '1956-01-01', 'CP_PER': '13012', 'COMMUNE_PER': 'MARSEILLE 12', 'ACTIF_PER': 'Oui', 'CODE_PI': 53, 'LIB_CODE_PI': "Pôle d'insertion Marseille III", 'TOPPERSDRODEVORSA': 'N', 'LIB_ETATDOSRSA': 'Droit clos', 'LIB_MOTIF_ETATDOSRSA': 'Clôture suite à échéance (4 mois sans droits)', 'PLT_DT_DEB_AFF': '2021-10-15', 'PLT_DT_FIN_AFF': '2022-06-13', 'PLT_MOTIF_FIN_ACC': None, 'PLT_COMMENTAIRE_REF': None, 'PLT_NUM_CI': None, 'PLT_PLATEFORME_CI': None, 'PLT_OPERATEUR_CI': None, 'PLT_REFERENT_CI': ' ', 'PLT_DECISION_CI': None, 'PLT_DUREE_CI': None, 'PLT_DATE_DEB_CI': None, 'PLT_DATE_FIN_CI': None, 'NOUVEAU_DT_DEB_AFF': '2022-06-13', 'NOUVEAU_AFF': 'SORTIE', 'NOUVEAU_COMMENTAIRE_PI': None, 'NOUVEAU_NUM_CI': '16', 'NOUVEAU_PLATEFORME_CI': 'CCO CANTINI', 'NOUVEAU_OPERATEUR_CI': 'CCO', 'NOUVEAU_REFERENT_CI': 'O BOBEUF', 'NOUVEAU_DECISION_CI': 'Validé', 'NOUVEAU_DUREE_CI': '4', 'NOUVEAU_DATE_DEB_CI': '2021-10-18', 'NOUVEAU_DATE_FIN_CI': '2022-02-18', }, ], }, ], ) def test_platform_beneficiaire_sorti_csv(app, rsa13, url): response = app.get(url + 'platform/11/beneficiaire/sorti/csv/') stream = io.StringIO(response.content.decode('utf-8-sig')) assert list(csv.reader(stream, delimiter=';')) == [ [ 'NUM_CAF', 'CODE_PER', 'NOM_PER', 'PRENOM_PER', 'DTNAI_PER', 'CP_PER', 'COMMUNE_PER', 'ACTIF_PER', 'CODE_PI', 'LIB_CODE_PI', 'TOPPERSDRODEVORSA', 'LIB_ETATDOSRSA', 'LIB_MOTIF_ETATDOSRSA', 'PLT_DT_DEB_AFF', 'PLT_DT_FIN_AFF', 'PLT_MOTIF_FIN_ACC', 'PLT_COMMENTAIRE_REF', 'PLT_NUM_CI', 'PLT_PLATEFORME_CI', 'PLT_OPERATEUR_CI', 'PLT_REFERENT_CI', 'PLT_DECISION_CI', 'PLT_DUREE_CI', 'PLT_DATE_DEB_CI', 'PLT_DATE_FIN_CI', 'NOUVEAU_DT_DEB_AFF', 'NOUVEAU_AFF', 'NOUVEAU_COMMENTAIRE_PI', 'NOUVEAU_NUM_CI', 'NOUVEAU_PLATEFORME_CI', 'NOUVEAU_OPERATEUR_CI', 'NOUVEAU_REFERENT_CI', 'NOUVEAU_DECISION_CI', 'NOUVEAU_DUREE_CI', 'NOUVEAU_DATE_DEB_CI', 'NOUVEAU_DATE_FIN_CI', ], [ '372927', '415443', 'DCFFEBABBDDCDEC', 'CBDACDCFEBBAA', '1972-01-01', '13004', 'MARSEILLE', 'Oui', '53', "Pôle d'insertion Marseille III", 'N', 'Droit clos', 'Clôture suite à échéance (4 mois sans droits)', '2021-10-05', '2022-06-13', '', '29/11/2021 Mme présente au RDV, mais pas de CER car plus de RSA. Titulaire ' "d'une pension d'invalidité elle a un complément d'ASI.\n" 'E.CASTORI', '', '', '', ' ', '', '', '', '', '2022-06-13', 'SORTIE', '', '', '', '', '', '', '', '', '', ], [ '1677380', '816754', 'EBBCAAFBDCCF', 'CCCADFBCBCEBCDCEBC', '1956-01-01', '13012', 'MARSEILLE 12', 'Oui', '53', "Pôle d'insertion Marseille III", 'N', 'Droit clos', 'Clôture suite à échéance (4 mois sans droits)', '2021-10-15', '2022-06-13', '', '', '', '', '', ' ', '', '', '', '', '2022-06-13', 'SORTIE', '', '16', 'CCO CANTINI', 'CCO', 'O BOBEUF', 'Validé', '4', '2021-10-18', '2022-02-18', ], ] # customized on model rsa13.sorti_csv_columns = ''' NUM_CAF CODE_PER ''' rsa13.save() response = app.get(url + 'platform/11/beneficiaire/sorti/csv/') stream = io.StringIO(response.content.decode('utf-8-sig')) assert list(csv.reader(stream, delimiter=';')) == [ ['NUM_CAF', 'CODE_PER'], ['372927', '415443'], ['1677380', '816754'], ] @mock_response( [ '/api/sousaction/', { 'err': 0, 'data': [ { 'id': 'A1', 'text': 'A1 - DAIE 13', 'description': "DISPOSITIF d'Accompagnement et d'Insertion par l'Emploi.\n", }, { 'id': 'A10', 'text': 'A10 - Accompagnement Global', 'description': ( 'Accompagnement de Pôle Emploi qui permet la prise en charge simultanée de ' 'problématiques sociales et professionnelles, par l’intervention conjointe ' 'd’un travailleur social et d’un conseiller dédié de Pôle Emploi.' ), }, { 'id': 'A11', 'text': 'A11 - MODALH', 'description': ( 'C’est un diagnostic qui évalue l’employabilité ou la nécessité ' 'd’un accès à une prestation plus adaptée (AAH) pour les bénéficiaires ' 'du RSA ayant un CER santé. La prescription est uniquement assuré par ' 'le médecin du Pôle d’insertion.' ), }, { 'id': 'A12', 'text': 'A12 - PHARE', 'description': ( 'C’est un accompagnement pour le retour à l’emploi des bénéficiaires ' 'du RSA reconnus travailleur handicapé. Il se formalise par la réalisation d’un CER.' ), }, {'id': 'A13', 'text': 'A13 - CAP Emploi', 'description': None}, { 'id': 'A14', 'text': 'A14 - Accompagnement Global spécialisé', 'description': ( 'A utiliser dans le cadre de la convention signée avec trois lieux d\'accueil ' 'sur l’expérimentation de l’accompagnement global spécialisé' ), }, {'id': 'A15', 'text': 'A15 - Boost Emploi', 'description': None}, { 'id': 'A16', 'text': 'A16 - Lieu accueil spécialisé travailleur indépendant', 'description': None, }, ], }, ] ) def test_sous_action(app, rsa13, url): response = app.get(url + 'sous-action/') assert response.json == { 'data': [ { 'description': "DISPOSITIF d'Accompagnement et d'Insertion par " "l'Emploi.\n", 'id': 'A1', 'text': 'A1 - DAIE 13', }, { 'description': 'Accompagnement de Pôle Emploi qui permet la prise ' 'en charge simultanée de problématiques sociales et ' 'professionnelles, par l’intervention conjointe d’un ' 'travailleur social et d’un conseiller dédié de Pôle ' 'Emploi.', 'id': 'A10', 'text': 'A10 - Accompagnement Global', }, { 'description': 'C’est un diagnostic qui évalue l’employabilité ou ' 'la nécessité d’un accès à une prestation plus ' 'adaptée (AAH) pour les bénéficiaires du RSA ayant ' 'un CER santé. La prescription est uniquement assuré ' 'par le médecin du Pôle d’insertion.', 'id': 'A11', 'text': 'A11 - MODALH', }, { 'description': 'C’est un accompagnement pour le retour à l’emploi ' 'des bénéficiaires du RSA reconnus travailleur ' 'handicapé. Il se formalise par la réalisation d’un ' 'CER.', 'id': 'A12', 'text': 'A12 - PHARE', }, {'description': None, 'id': 'A13', 'text': 'A13 - CAP Emploi'}, { 'description': 'A utiliser dans le cadre de la convention signée ' "avec trois lieux d'accueil sur l’expérimentation de " 'l’accompagnement global spécialisé', 'id': 'A14', 'text': 'A14 - Accompagnement Global spécialisé', }, {'description': None, 'id': 'A15', 'text': 'A15 - Boost Emploi'}, { 'description': None, 'id': 'A16', 'text': 'A16 - Lieu accueil spécialisé travailleur indépendant', }, ], 'err': 0, } TYPE_EVENEMENT = { 'err': 0, 'data': [ {'id': 2, 'text': 'Entretien Accueil'}, {'id': 3, 'text': 'Entretien Diagnostic'}, {'id': 4, 'text': 'Entretien Parcours'}, {'id': 5, 'text': 'Atelier'}, {'id': 6, 'text': 'Information collective'}, ], } @mock_response(['/api/typeevenement/', TYPE_EVENEMENT]) def test_type_evenement(app, rsa13, url): response = app.get(url + 'type-evenement/') assert response.json == TYPE_EVENEMENT ENDPOINT_CASES = [ { 'endpoint': 'platform_beneficiaire_evenement', 'path': 'platform/11/beneficiaire/386981/evenement/', 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/', 'mock_data': [ { 'id': 2, 'text': 'Atelier CV - 26/08/2023', 'datetime': '2023-08-26T14:30:00.000+02:00', 'duree': 120, 'type': 'Atelier', 'intervenant': { 'id': 1234, 'text': 'TARTEMPION Roger', 'type': {'id': 'TS', 'text': 'Travailleur social'}, }, 'resultat': None, }, { 'id': 1, 'text': 'Renouvellement de CER - 23/08/2023', 'datetime': '2023-08-23T08:30:10.000+02:00', 'duree': 95, 'type': 'Entretien Diagnostic', 'intervenant': { 'id': 22662, 'text': 'GELLF Bonnie', 'type': {'id': 'TS', 'text': 'Travailleur social'}, }, 'resultat': 'Présent', }, ], }, { 'endpoint': 'platform_beneficiaire_evenement', 'method': 'post_json', 'params': { 'code_tev': '1', 'nom_evt': 'TEST 20231109', 'lieu_evt': 'Aix', 'dt_evt': '2023-11-09T11:00:00', 'duree_evt': 60, 'code_upl': 37261, 'type_inter': 'TS', 'com_evt': 'Blabla', }, 'path': 'platform/11/beneficiaire/386981/evenement/', 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/', 'mock_method': 'post', 'mock_data': {'err': 0}, }, { 'endpoint': 'platform_beneficiaire_evenement', 'id': 'id-as-string', 'method': 'post_json', 'params': { 'code_tev': '1', 'nom_evt': 'TEST 20231109', 'lieu_evt': 'Aix', 'dt_evt': '2023-11-09T11:00:00', 'duree_evt': '60', 'code_upl': '37261', 'type_inter': 'TS', 'com_evt': 'Blabla', }, 'path': 'platform/11/beneficiaire/386981/evenement/', 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/', 'mock_method': 'post', 'mock_data': {'err': 0}, }, { 'endpoint': 'platform_beneficiaire_evenement_detail', 'path': 'platform/11/beneficiaire/386981/evenement/1/', 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/1/', 'mock_data': { 'id': 1, 'text': 'Diagnostic 01/01/2023', 'datetime': '2023-01-01T14:30:00.000+02:00', 'duree': 60, 'lieu': '14 Rue de la République, 13001 Marseille', 'type': {'id': '3', 'text': 'Entretien Diagnostic'}, 'nom': 'Diagnostic', 'intervenant': {'id': 1, 'text': 'NOM Prénom', 'type': {'id': 'PSY', 'text': 'Psychologue'}}, 'resultat': {'id': 'PRS', 'text': 'Présent'}, 'commentaire': 'Blabla', }, }, { 'endpoint': 'platform_beneficiaire_evenement_detail', 'path': 'platform/11/beneficiaire/386981/evenement/1/', 'method': 'post_json', 'params': { 'code_tev': '1', 'nom_evt': 'TEST 20231109', 'lieu_evt': 'Aix', 'dt_evt': '2023-11-09T11:00:00', 'duree_evt': 60, 'code_upl': 37261, 'type_inter': 'TS', 'com_evt': 'Blabla', }, 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/1/', 'mock_method': 'put', 'mock_data': { 'id': 1, 'text': 'Diagnostic 01/01/2023', 'datetime': '2023-01-01T14:30:00.000+02:00', 'duree': 60, 'lieu': '14 Rue de la République, 13001 Marseille', 'type': {'id': '3', 'text': 'Entretien Diagnostic'}, 'nom': 'Diagnostic', 'intervenant': {'id': 1, 'text': 'NOM Prénom', 'type': {'id': 'PSY', 'text': 'Psychologue'}}, 'resultat': {'id': 'PRS', 'text': 'Présent'}, 'commentaire': 'Blabla', }, }, { 'endpoint': 'platform_beneficiaire_evenement_detail', 'path': 'platform/11/beneficiaire/386981/evenement/1/', 'method': 'delete', 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/1/', 'mock_method': 'delete', 'mock_data': {'err': 0}, }, { 'id': 'gone', 'endpoint': 'platform_beneficiaire_evenement_detail', 'path': 'platform/11/beneficiaire/386981/evenement/1/', 'method': 'delete', 'response_data': { 'err': 1, 'err_class': 'passerelle.utils.jsonresponse.APIError', 'err_desc': 'gone', 'data': { 'err': 410, 'err_code': 'gone', 'metier': "L'évènement n'existe pas", }, }, 'mock_path': '/api/platform/11/beneficiaire/386981/evenement/1/', 'mock_method': 'delete', 'mock_data': {'err': 410, 'err_code': 'gone', 'metier': "L'évènement n'existe pas"}, }, ] def endpoint_case_ids(): for case in ENDPOINT_CASES: case_id = case['endpoint'] if method := case.get('method'): case_id += '-' + method if extra_id := case.get('id'): case_id += '-' + extra_id yield case_id @pytest.mark.parametrize( 'case', ENDPOINT_CASES, ids=list(endpoint_case_ids()), ) def test_endpoints(app, rsa13, url, case): endpoint = getattr(rsa13, case['endpoint']) method = case.get('method', 'get') api_response_method = case.get('mock_method', method) api_response_data = case['mock_data'] if 'err' not in api_response_data: api_response_data = { 'err': 0, 'data': api_response_data, } params = case.get('params', ()) with responses.RequestsMock() as rsp: rsp.add( getattr(responses, api_response_method.upper()), 'https://rsa-cd13.com' + case['mock_path'], json=api_response_data, ) response = getattr(app, method)(url + case['path'], params=params) response_data = case.get('response_data', api_response_data) if 'err' not in response_data: response_data = { 'err': 0, 'data': response_data, } assert response.json == response_data validate_schema(response.json, endpoint.endpoint_info.response_schemas['application/json']) def test_csv_columns_migration(migration, settings): old_apps = migration.before([('rsa13', '0001_initial')]) RSA13Resource = old_apps.get_model('rsa13', 'RSA13Resource') resource = RSA13Resource.objects.create() settings.RSA13_CSV_COLUMNS = [('A', '2'), 'B'] settings.RSA13_FACTURATION_CSV_COLUMNS = ['C', 'D'] settings.RSA13_BENEFICIAIRE_SORTI_CSV_COLUMNS = ['E', 'F'] apps = migration.apply([('rsa13', '0002_add_csv_columns_fields')]) RSA13Resource = apps.get_model('rsa13', 'RSA13Resource') resource = RSA13Resource.objects.get() assert resource.beneficiaire_csv_columns == 'A 2\nB' assert resource.facturation_csv_columns == 'C\nD' assert resource.sorti_csv_columns == 'E\nF' def test_manager(app, admin_user): app = login(app) resp = app.get('/manage/') resp = resp.click('Add Connector') resp = resp.click('RSA CD13') resp.forms[0]['title'] = 'Test Connector' resp.forms[0]['slug'] = 'test-connector' resp.forms[0]['description'] = 'Connector for a simple test' resp.forms[0]['webservice_base_url'] = 'https://example.com/' resp = resp.forms[0].submit().follow() assert 'Test Connector' in resp.text instance = RSA13Resource.objects.get() for key, value in DEFAULTS.items(): assert getattr(instance, key) == dump_csv_columns(value) resp = resp.click('Edit') resp.form.set('beneficiaire_csv_columns', 'NUM_CAF') resp.form.set('facturation_csv_columns', 'MATRICULE') resp.form.set('sorti_csv_columns', 'NUM_CAF') resp = resp.form.submit().follow() instance = RSA13Resource.objects.get() for key in DEFAULTS: assert getattr(instance, key) in ['NUM_CAF', 'MATRICULE'] resp = resp.click('Edit') for key in DEFAULTS: assert resp.form[key].value in ['NUM_CAF', 'MATRICULE']