753 lines
30 KiB
Python
753 lines
30 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# to run it use the following command in the 'tests' directory:
|
|
# ~> DJANGO_SETTINGS_MODULE=passerelle.settings pytest -W ignore::django.utils.deprecation.RemovedInDjango20Warning test_atreal_openads.py -vv
|
|
#
|
|
# and with 'coverage':
|
|
# ~> DJANGO_SETTINGS_MODULE=passerelle.settings pytest -W ignore::django.utils.deprecation.RemovedInDjango20Warning test_atreal_openads.py -vv --cov=~/src/passerelle/passerelle/apps/atreal_openads
|
|
|
|
import pytest
|
|
import mock
|
|
import json
|
|
import os
|
|
import base64
|
|
import re
|
|
from requests import Response
|
|
|
|
from django.http import Http404
|
|
from django.http.request import HttpRequest, QueryDict
|
|
from django.http.response import JsonResponse
|
|
from django.core.files import File
|
|
|
|
from passerelle.utils.jsonresponse import APIError
|
|
from passerelle.base.models import Job
|
|
|
|
from atreal_openads.models import (
|
|
strip_tags,
|
|
clean_spaces,
|
|
normalize,
|
|
get_file_data,
|
|
get_upload_path,
|
|
trunc_str_values,
|
|
DictDumper,
|
|
AtrealOpenads,
|
|
ForwardFile
|
|
)
|
|
|
|
|
|
CONNECTOR_NAME = 'atreal-openads'
|
|
CONNECTOR_SLUG = 'atreal'
|
|
COLLECTIVITE = 3
|
|
OPENADS_API_LOGIN = 'publik-passerelle'
|
|
OPENADS_API_PASSWORD = base64.urlsafe_b64encode(os.urandom(20))
|
|
OPENADS_API_URL = 'http://openads.api/'
|
|
|
|
FAKE_COOKIE_CRSF = base64.urlsafe_b64encode(os.urandom(20))
|
|
FAKE_NUMERO_DOSSIER = base64.urlsafe_b64encode(os.urandom(10))
|
|
|
|
TESTS_DIR = os.path.dirname(__file__)
|
|
RESOURCES_DIR = os.path.join(TESTS_DIR, 'resources')
|
|
TEST_FILE_CERFA_DIA = os.path.join(RESOURCES_DIR, 'cerfa_10072-02.pdf')
|
|
TEST_FILE_PLAN_CADASTRAL = os.path.join(RESOURCES_DIR, 'plancadastral.pdf')
|
|
|
|
|
|
@pytest.fixture
|
|
def atreal_openads(db):
|
|
return AtrealOpenads.objects.create(
|
|
slug = CONNECTOR_SLUG,
|
|
collectivite = COLLECTIVITE,
|
|
openADS_API_url = OPENADS_API_URL,
|
|
basic_auth_username = OPENADS_API_LOGIN,
|
|
basic_auth_password = OPENADS_API_PASSWORD
|
|
)
|
|
|
|
|
|
def test_strip_tags():
|
|
s = 'aaa b cc '
|
|
assert strip_tags(s) == s
|
|
|
|
ss = s + '<em>dd'
|
|
assert strip_tags(ss) == s + 'dd'
|
|
|
|
ss = s + '<em>dd</em>'
|
|
assert strip_tags(ss) == s + 'dd'
|
|
|
|
ss = s + '<em>dd</em>'
|
|
assert strip_tags(ss) == s + 'dd'
|
|
|
|
ss = s + ' 1 < 3'
|
|
assert strip_tags(ss) == s + ' 1 < 3'
|
|
|
|
|
|
def test_clean_spaces():
|
|
s = 'aaa b cc '
|
|
assert clean_spaces(s) == 'aaa b cc'
|
|
|
|
s = 'a\ta b\nb c\rc d\\n\\r\\td'
|
|
assert clean_spaces(s) == 'a a b b c c d d'
|
|
|
|
|
|
def test_normalize():
|
|
assert normalize(None) == ''
|
|
|
|
s = 'aaa b cc '
|
|
assert normalize(s) == 'aaa b cc'
|
|
|
|
s = 'a\ta b\nb c\rc d\\n\\r\\td'
|
|
assert normalize(s) == 'a a b b c c d d'
|
|
|
|
|
|
def test_get_file_data():
|
|
assert get_file_data(TEST_FILE_CERFA_DIA) == base64.b64encode(open(TEST_FILE_CERFA_DIA).read())
|
|
assert get_file_data(TEST_FILE_CERFA_DIA, b64=False) == open(TEST_FILE_CERFA_DIA).read()
|
|
|
|
|
|
def test_get_upload_path(app, atreal_openads):
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_CERFA_DIA, FAKE_NUMERO_DOSSIER, 'cerfa')
|
|
assert re.search(
|
|
r"^pass_openADS_up_%s_%s$" %
|
|
('[0-9]{4}-[A-Z][a-z]{2}-[0-9]{2}_[0-9]{2}h[0-9]{2}m[0-9]{2}s[0-9]+', 'cc90'),
|
|
get_upload_path(FF))
|
|
|
|
|
|
def test_trunc_str_values():
|
|
d = {}
|
|
assert trunc_str_values(d, 10) == d
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 0) == {'a': u'…'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 1) == {'a': u'1…'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 2) == {'a': u'12…'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 5) == {'a': u'12345…'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 8) == {'a': u'12345678…'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 9) == {'a': u'123456789'}
|
|
d = {'a': '123456789'}
|
|
assert trunc_str_values(d, 10) == d
|
|
|
|
d = {'a': '123456789', 'b123456789': '987654321'}
|
|
assert trunc_str_values(d, 5) == {'a': u'12345…', 'b123456789': u'98765…'}
|
|
|
|
d = {'a': '123456789', 'b123456789': '987654321', 'c': {'c1':'ABCDEFGHIJK'}}
|
|
assert trunc_str_values(d, 5) == {'a': u'12345…', 'b123456789': u'98765…', 'c': {'c1': u'ABCDE…'}}
|
|
|
|
d = {'a': '123456789', 'b123456789': '987654321', 'c': {'c1':'ABCDEFGHIJK'}, 'd': ['123456789']}
|
|
assert trunc_str_values(d, 5) == {'a': u'12345…', 'b123456789': u'98765…', 'c': {'c1': u'ABCDE…'}, 'd': [u'12345…']}
|
|
|
|
d = {'a': '123456789', 'b123456789': '987654321', 'c': {'c1':'ABCDEFGHIJK'}, 'd': ['123456789', {'eeeeeeeeee':'132456789'}]}
|
|
assert trunc_str_values(d, 5) == {'a': u'12345…', 'b123456789': u'98765…', 'c': {'c1': u'ABCDE…'}, 'd': [u'12345…', {'eeeeeeeeee': u'13245…'}]}
|
|
|
|
|
|
def test_dict_dumper():
|
|
d = {}
|
|
dd = DictDumper(d, use_json_dumps=False)
|
|
assert d == dd.dic
|
|
assert unicode(d) == unicode(dd)
|
|
dd = DictDumper(d, 0, use_json_dumps=False)
|
|
assert d == dd.dic
|
|
assert unicode(d) == unicode(dd)
|
|
|
|
d = {'a': '123456789'}
|
|
dd = DictDumper(d, 10, use_json_dumps=False)
|
|
assert d == dd.dic
|
|
assert unicode(d) == unicode(dd)
|
|
dd = DictDumper(d, 5, use_json_dumps=False)
|
|
assert d == dd.dic
|
|
assert unicode(dd) == unicode({'a': u'12345…'})
|
|
dd = DictDumper(d, 5, use_json_dumps=True)
|
|
assert d == dd.dic
|
|
assert unicode(dd) == u'{"a": "12345\\u2026"}'
|
|
|
|
|
|
def test_openads_log_json_payload(app, atreal_openads):
|
|
# TODO implement
|
|
assert True
|
|
# change the debug file path
|
|
# check that the function log to it
|
|
# check that what was is logged is correct
|
|
|
|
|
|
def test_openads_get_files_from_json_payload(app, atreal_openads):
|
|
title = 'payload'
|
|
|
|
assert atreal_openads.get_files_from_json_payload({'files':[{'a':'file'}]}) == [{'a':'file'}]
|
|
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.get_files_from_json_payload({})
|
|
assert unicode(e.value) == u"Expecting '%s' key in JSON %s" % ('files', title)
|
|
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.get_files_from_json_payload({'files': 'invalid'})
|
|
assert unicode(e.value) == u"Expecting '%s' value in JSON %s to be a %s (not a %s)" % (
|
|
'files', title, 'list', type(''))
|
|
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.get_files_from_json_payload({'files': {'i':'invalid'}})
|
|
assert unicode(e.value) == u"Expecting '%s' value in JSON %s to be a %s (not a %s)" % (
|
|
'files', title, 'list', type({}))
|
|
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.get_files_from_json_payload({'files': []})
|
|
assert unicode(e.value) == u"Expecting non-empty '%s' value in JSON %s" % ('files', title)
|
|
|
|
|
|
def test_check_file_dict(app, atreal_openads):
|
|
title = 'payload'
|
|
|
|
d = {
|
|
'content': get_file_data(TEST_FILE_CERFA_DIA, b64=False),
|
|
'filename': os.path.basename(TEST_FILE_CERFA_DIA),
|
|
'content_type': 'application/pdf'
|
|
}
|
|
|
|
d64 = {
|
|
'b64_content': get_file_data(TEST_FILE_CERFA_DIA, b64=True),
|
|
'filename': os.path.basename(TEST_FILE_CERFA_DIA),
|
|
'content_type': 'application/pdf'
|
|
}
|
|
|
|
assert atreal_openads.check_file_dict(d, b64=False) is None
|
|
assert atreal_openads.check_file_dict(d64) is None
|
|
|
|
d['filename'] = {'a','filename'}
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.check_file_dict(d, b64=False)
|
|
assert unicode(e.value) == u"Expecting '%s' value in JSON %s in file dict to be a %s (not a %s)" % (
|
|
'file.filename', title, 'string', type(d['filename']))
|
|
|
|
d['content'] = {'a','filename'}
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.check_file_dict(d, b64=False)
|
|
assert unicode(e.value) == u"Expecting '%s' value in JSON %s in file dict to be a %s (not a %s)" % (
|
|
'file.content', title, 'string', type(d['content']))
|
|
|
|
del(d['content'])
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.check_file_dict(d, b64=False)
|
|
assert unicode(e.value) == u"Expecting 'file.%s' key in JSON %s" % ('content', title)
|
|
|
|
del(d64['b64_content'])
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.check_file_dict(d, b64=True)
|
|
assert unicode(e.value) == u"Expecting 'file.%s' key in JSON %s" % ('b64_content', title)
|
|
|
|
|
|
def test_get_first_file_from_json_payload(app, atreal_openads):
|
|
title = 'payload'
|
|
|
|
d = {
|
|
'files': [{
|
|
'content': get_file_data(TEST_FILE_CERFA_DIA, b64=False),
|
|
'filename': os.path.basename(TEST_FILE_CERFA_DIA),
|
|
'content_type': 'application/pdf'
|
|
}]
|
|
}
|
|
|
|
assert atreal_openads.get_first_file_from_json_payload(
|
|
d, title, ensure_content=True, b64=False) == d['files'][0]
|
|
|
|
|
|
def test_openads_check_status(app, atreal_openads):
|
|
fake_resp_json = {
|
|
'message': 'Service online'
|
|
}
|
|
fake_resp = JsonResponse(fake_resp_json)
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = mock.Mock(content=fake_resp, status_code=200)
|
|
jresp = atreal_openads.check_status(None)
|
|
assert jresp['response'] == 200
|
|
|
|
|
|
def test_openads_create_dossier(app, atreal_openads):
|
|
fake_req_json = {
|
|
"fields": {
|
|
|
|
# proprietaire
|
|
"proprietaire" : "Non",
|
|
"proprietaire_raw": "Non",
|
|
|
|
# mandataire
|
|
"mandataire_prenom" : "John",
|
|
"mandataire_nom" : "Man",
|
|
|
|
"mandataire_qualite" : "Une personne morale",
|
|
"mandataire_qualite_raw" : "Une personne morale",
|
|
|
|
"mandataire_denomination" : "SELARL",
|
|
"mandataire_raison_sociale" : "Super Juriste",
|
|
|
|
"mandataire_numero_voie": "808",
|
|
"mandataire_nom_voie" : "Avenue de l'argent",
|
|
"mandataire_lieu_dit" : "geoisbour",
|
|
"mandataire_code_postal": "13004",
|
|
"mandataire_localite" : "Marseille",
|
|
|
|
# petitionnaire
|
|
"prenom": "Toto",
|
|
"nom" : "Loulou",
|
|
|
|
"qualite" : "Un particulier",
|
|
"qualite_raw": "Un particulier",
|
|
|
|
"numero_voie": "52",
|
|
"nom_voie" : "Avenue de la Blaque",
|
|
"lieu_dit" : "tierquar",
|
|
"code_postal": "13004",
|
|
"localite" : "Marseille",
|
|
|
|
# terrain
|
|
"terrain_numero_voie": "23",
|
|
"terrain_nom_voie" : "Boulevard de la République",
|
|
"terrain_lieu_dit" : "Leecorne",
|
|
"terrain_code_postal": "13002",
|
|
"terrain_localite" : "Marseille",
|
|
|
|
# références cadastrales
|
|
"reference_cadastrale" : [ ["999", "Z", "0010"] ],
|
|
"autres_parcelles" : True,
|
|
"references_cadastrales": [ ["123", "D", "9874"] ],
|
|
|
|
# user attached files
|
|
"cerfa": {
|
|
"content" : get_file_data(TEST_FILE_CERFA_DIA),
|
|
"content_type": "invalid/content type",
|
|
"field_id" : "50",
|
|
"filename" : os.path.basename(TEST_FILE_CERFA_DIA)
|
|
},
|
|
"plan_cadastral_1": {
|
|
"content" : get_file_data(TEST_FILE_PLAN_CADASTRAL),
|
|
"content_type": "application/pdf",
|
|
"filename" : os.path.basename(TEST_FILE_PLAN_CADASTRAL)
|
|
},
|
|
"plan_cadastral_2": {
|
|
"content" : get_file_data(TEST_FILE_PLAN_CADASTRAL),
|
|
"content_type": "application/pdf",
|
|
"filename" : os.path.basename(TEST_FILE_PLAN_CADASTRAL)
|
|
},
|
|
"pouvoir_mandat": {
|
|
"content" : get_file_data(TEST_FILE_CERFA_DIA),
|
|
"content_type": "application/pdf",
|
|
"filename" : 'mandat.pdf'
|
|
}
|
|
}
|
|
}
|
|
req = HttpRequest()
|
|
req._body = json.dumps(fake_req_json)
|
|
req.path = '/test'
|
|
req.method = 'POST'
|
|
req.encoding = 'utf-8'
|
|
req.GET = QueryDict(mutable=True) # required because of encoding setter
|
|
req.POST = QueryDict(mutable=True) # required because of encoding setter
|
|
req.content_type = 'application/json'
|
|
req.content_params = None
|
|
req.COOKIES = {}
|
|
req.META = {}
|
|
req._read_started = False
|
|
|
|
fake_resp_bad = Response()
|
|
fake_resp_bad.status_code = 502
|
|
fake_resp_bad.reason = 'Bad gateway'
|
|
|
|
with pytest.raises(ValueError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp_bad
|
|
atreal_openads.create_dossier(req, 'DIA',collectivite='not an integer')
|
|
assert unicode(e.value) == "invalid literal for int() with base 10: 'not an integer'"
|
|
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp_bad
|
|
atreal_openads.create_dossier(req, 'DIA')
|
|
assert unicode(e.value) == "HTTP error: 502"
|
|
|
|
fake_resp_json = {
|
|
'numero_dossier' : FAKE_NUMERO_DOSSIER,
|
|
'files': [{
|
|
'b64_content' : get_file_data(TEST_FILE_CERFA_DIA),
|
|
'content_type' : 'text/plain',
|
|
'filename' : 'recepisse_depot_%s.pdf' % FAKE_NUMERO_DOSSIER,
|
|
}]
|
|
}
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 200
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'OK'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
jresp = atreal_openads.create_dossier(req, 'DIA')
|
|
assert jresp['numero_dossier'] == fake_resp_json['numero_dossier']
|
|
assert jresp['recepisse']['b64_content'] == fake_resp_json['files'][0]['b64_content']
|
|
assert jresp['recepisse']['content_type'] == 'application/pdf'
|
|
assert jresp['recepisse']['filename'] == fake_resp_json['files'][0]['filename']
|
|
|
|
fake_resp_json['numero_dossier'] = {'a':'invalid type'}
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.create_dossier(req, 'DIA')
|
|
assert unicode(e.value) == u"Expecting '%s' value in JSON response to be a %s (not a %s)" % (
|
|
'numero_dossier', 'string', type({}))
|
|
|
|
del(fake_resp_json['numero_dossier'])
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.create_dossier(req, 'DIA')
|
|
assert unicode(e.value) == u"Expecting 'numero_dossier' key in JSON response"
|
|
|
|
fake_resp_json['files'][0]['b64_content'] = 'invalid_;{[content}'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.create_dossier(req, 'DIA')
|
|
assert unicode(e.value) == u'Failed to decode recepisse content from base 64'
|
|
|
|
fake_resp._content = 'df[{gfd;g#vfd'
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.create_dossier(req, 'DIA')
|
|
assert unicode(e.value) == u'No JSON content returned: %r' % fake_resp._content
|
|
|
|
job = Job.objects.filter(natural_id=FAKE_NUMERO_DOSSIER).last()
|
|
assert job
|
|
job_id = job.id
|
|
assert job.status == 'registered'
|
|
assert job.method_name == 'upload_user_files'
|
|
assert job.natural_id == FAKE_NUMERO_DOSSIER
|
|
assert job.parameters is not None
|
|
assert len(job.parameters) == 3
|
|
assert 'file_ids' in job.parameters
|
|
assert len(job.parameters['file_ids']) == 4
|
|
file_ids = job.parameters['file_ids']
|
|
|
|
FFs = ForwardFile.objects.filter(id__in=file_ids)
|
|
for FF in FFs:
|
|
assert len(FF.numero_demande) > 0
|
|
assert FF.numero_dossier == FAKE_NUMERO_DOSSIER
|
|
assert len(FF.file_hash) > 0
|
|
assert FF.upload_status == 'pending'
|
|
|
|
fake_resp_json = "You want add some files on %s " % FAKE_NUMERO_DOSSIER
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 200
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'OK'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.jobs()
|
|
|
|
job = Job.objects.get(id=job_id)
|
|
assert job.status == 'completed'
|
|
|
|
FFs = ForwardFile.objects.filter(id__in=file_ids)
|
|
for FF in FFs:
|
|
assert FF.upload_status == 'success'
|
|
|
|
|
|
def test_openads_get_dossier(app, atreal_openads):
|
|
fake_resp_bad = Response()
|
|
fake_resp_bad.status_code = 502
|
|
fake_resp_bad.reason = 'Bad gateway'
|
|
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp_bad
|
|
atreal_openads.get_dossier(None, 'DIA', FAKE_NUMERO_DOSSIER)
|
|
assert unicode(e.value) == "HTTP error: 502"
|
|
|
|
fake_resp_json = {
|
|
'etat' : u"Non préemption en cours",
|
|
'date_depot' : "24/04/2019",
|
|
'date_decision' : "",
|
|
'decision' : "",
|
|
'date_limite_instruction': "24/06/2019"
|
|
}
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 200
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'OK'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
jresp = atreal_openads.get_dossier(None, 'DIA', FAKE_NUMERO_DOSSIER)
|
|
assert jresp['etat'] == fake_resp_json['etat']
|
|
assert jresp['date_depot'] == fake_resp_json['date_depot']
|
|
assert jresp['date_decision'] == fake_resp_json['date_decision']
|
|
assert jresp['decision'] == fake_resp_json['decision']
|
|
assert jresp['date_limite_instruction'] == fake_resp_json['date_limite_instruction']
|
|
|
|
fake_resp._content = 'df[{gfd;g#vfd'
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
atreal_openads.get_dossier(None, 'DIA', FAKE_NUMERO_DOSSIER)
|
|
assert unicode(e.value) == u'No JSON content returned: %r' % fake_resp._content
|
|
|
|
fake_resp_json = {
|
|
'errors' : [{
|
|
'location' : 'path',
|
|
'name' : 'Invalid Type',
|
|
'description' : '"invalid_type" is not one of DIA, PC, DP, AT, PD'
|
|
}]
|
|
}
|
|
fake_resp.status_code = 404
|
|
fake_resp.reason = 'Resource not found'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
atreal_openads.get_dossier(None, 'invalid_type', FAKE_NUMERO_DOSSIER)
|
|
assert unicode(e.value) == u"HTTP error: 404, [path] (Invalid Type) \"invalid_type\" is not one of DIA, PC, DP, AT, PD"
|
|
|
|
|
|
def test_openads_upload2ForwardFile(app, atreal_openads):
|
|
FF = atreal_openads.upload2ForwardFile(None, None, None)
|
|
assert FF is None
|
|
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_CERFA_DIA, FAKE_NUMERO_DOSSIER, 'cerfa')
|
|
assert isinstance(FF, ForwardFile)
|
|
assert len(FF.numero_demande) > 0
|
|
assert FF.numero_dossier == FAKE_NUMERO_DOSSIER
|
|
assert FF.type_fichier == 'cerfa'
|
|
assert FF.orig_filename == os.path.basename(TEST_FILE_CERFA_DIA)
|
|
assert FF.content_type == 'application/pdf'
|
|
assert len(FF.file_hash) > 0
|
|
assert isinstance(FF.upload_file, File)
|
|
assert FF.upload_status == 'pending'
|
|
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_PLAN_CADASTRAL, FAKE_NUMERO_DOSSIER, 'plan')
|
|
assert isinstance(FF, ForwardFile)
|
|
assert len(FF.numero_demande) > 0
|
|
assert FF.numero_dossier == FAKE_NUMERO_DOSSIER
|
|
assert FF.type_fichier == 'plan'
|
|
assert FF.orig_filename == os.path.basename(TEST_FILE_PLAN_CADASTRAL)
|
|
assert FF.content_type == 'application/pdf'
|
|
assert len(FF.file_hash) > 0
|
|
assert isinstance(FF.upload_file, File)
|
|
assert FF.upload_status == 'pending'
|
|
|
|
|
|
def test_openads_get_fwd_files(app, atreal_openads):
|
|
with pytest.raises(APIError) as e:
|
|
atreal_openads.get_fwd_files(None, FAKE_NUMERO_DOSSIER, fichier_id='not an integer')
|
|
assert unicode(e.value) == u"fichier_id must be an integer"
|
|
|
|
with pytest.raises(Http404) as e:
|
|
atreal_openads.get_fwd_files(None, FAKE_NUMERO_DOSSIER, fichier_id=18)
|
|
assert unicode(e.value) == u"No file matches 'numero_dossier=%s' and 'id=%s'." % (FAKE_NUMERO_DOSSIER, 18)
|
|
|
|
resp_empty = atreal_openads.get_fwd_files(None, FAKE_NUMERO_DOSSIER, fichier_id=None)
|
|
assert resp_empty is not None
|
|
assert len(resp_empty) == 0
|
|
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_CERFA_DIA, FAKE_NUMERO_DOSSIER, 'cerfa')
|
|
FF.save()
|
|
assert isinstance(FF, ForwardFile)
|
|
|
|
jresp = atreal_openads.get_fwd_files(None, FAKE_NUMERO_DOSSIER, fichier_id=None)
|
|
assert jresp is not None
|
|
assert len(jresp) == 1
|
|
assert jresp[0]['id'] == FF.id
|
|
for k in ['numero_dossier', 'type_fichier', 'file_hash', 'orig_filename', 'content_type', 'upload_status', 'upload_msg']:
|
|
assert jresp[0][k] == getattr(FF, k)
|
|
assert jresp[0]['content_size'] == len(get_file_data(FF.upload_file.path, b64=False))
|
|
assert jresp[0]['last_update_datetime'] == FF.last_update_datetime
|
|
|
|
jresp = atreal_openads.get_fwd_files(None, FAKE_NUMERO_DOSSIER, fichier_id=FF.id)
|
|
assert jresp is not None
|
|
assert len(jresp) == 1
|
|
assert jresp[0]['id'] == FF.id
|
|
for k in ['numero_dossier', 'type_fichier', 'file_hash', 'orig_filename', 'content_type', 'upload_status', 'upload_msg']:
|
|
assert jresp[0][k] == getattr(FF, k)
|
|
assert jresp[0]['content_size'] == len(get_file_data(FF.upload_file.path, b64=False))
|
|
assert jresp[0]['last_update_datetime'] == FF.last_update_datetime
|
|
|
|
|
|
def test_openads_get_fwd_files_status(app, atreal_openads):
|
|
with pytest.raises(Http404) as e:
|
|
atreal_openads.get_fwd_files_status(None, FAKE_NUMERO_DOSSIER, fichier_id=18)
|
|
assert re.search(r"^No file matches 'numero_dossier=[^']+' and 'id=[^']+'.$", str(e.value))
|
|
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_CERFA_DIA, FAKE_NUMERO_DOSSIER, 'cerfa')
|
|
FF.save()
|
|
assert isinstance(FF, ForwardFile)
|
|
|
|
jresp = atreal_openads.get_fwd_files_status(None, FAKE_NUMERO_DOSSIER, fichier_id=None)
|
|
assert jresp is not None
|
|
assert jresp['all_forwarded'] == False
|
|
status_msg = '[%s] %s => %s' % (FF.id, FF.orig_filename, FF.upload_msg)
|
|
assert len(jresp['pending']) == 1
|
|
assert jresp['pending'][0] == status_msg
|
|
assert len(jresp['uploading']) == 0
|
|
assert len(jresp['success']) == 0
|
|
assert len(jresp['failed']) == 0
|
|
|
|
jresp = atreal_openads.get_fwd_files_status(None, FAKE_NUMERO_DOSSIER, fichier_id=FF.id)
|
|
assert jresp is not None
|
|
assert jresp['all_forwarded'] == False
|
|
status_msg = '[%s] %s => %s' % (FF.id, FF.orig_filename, FF.upload_msg)
|
|
assert len(jresp['pending']) == 1
|
|
assert jresp['pending'][0] == status_msg
|
|
assert len(jresp['uploading']) == 0
|
|
assert len(jresp['success']) == 0
|
|
assert len(jresp['failed']) == 0
|
|
|
|
|
|
def test_openads_get_courrier(app, atreal_openads):
|
|
lettre_type = 'dia_renonciation_preempter'
|
|
|
|
fake_resp_bad = Response()
|
|
fake_resp_bad.status_code = 502
|
|
fake_resp_bad.reason = 'Bad gateway'
|
|
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp_bad
|
|
atreal_openads.get_courrier(None, 'DIA', FAKE_NUMERO_DOSSIER, lettre_type)
|
|
assert unicode(e.value) == "HTTP error: 502"
|
|
|
|
fake_resp_json = {
|
|
'files': [{
|
|
'filename' : "instruction_4.pdf",
|
|
'content_type' : "text/plain",
|
|
'b64_content' : get_file_data(TEST_FILE_CERFA_DIA)
|
|
}]
|
|
}
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 200
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'OK'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
jresp = atreal_openads.get_courrier(None, 'DIA', FAKE_NUMERO_DOSSIER, lettre_type)
|
|
assert jresp['courrier']['filename'] == fake_resp_json['files'][0]['filename']
|
|
assert jresp['courrier']['content_type'] == fake_resp_json['files'][0]['content_type']
|
|
assert jresp['courrier']['b64_content'] == fake_resp_json['files'][0]['b64_content']
|
|
|
|
fake_resp_json['files'][0]['b64_content'] = 'invalid_;{[content}'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
atreal_openads.get_courrier(None, 'DIA', FAKE_NUMERO_DOSSIER, lettre_type)
|
|
assert unicode(e.value) == u'Failed to decode courrier content from base 64'
|
|
|
|
fake_resp._content = 'df[{gfd;g#vfd'
|
|
with pytest.raises(APIError) as e:
|
|
with mock.patch('passerelle.utils.Request.get') as requests_get:
|
|
requests_get.return_value = fake_resp
|
|
atreal_openads.get_courrier(None, 'DIA', FAKE_NUMERO_DOSSIER, lettre_type)
|
|
assert unicode(e.value) == u'No JSON content returned: %r' % fake_resp._content
|
|
|
|
|
|
def test_get_response_error(app, atreal_openads):
|
|
fake_resp_json = {
|
|
'errors': [
|
|
{
|
|
'location' : 'entity.name',
|
|
'name' : 'constraint',
|
|
'description': 'Must start with an uppercase letter'
|
|
}
|
|
]
|
|
}
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 404
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'Not Found'
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
|
|
error_msg = atreal_openads.get_response_error(fake_resp)
|
|
expected_msg = u'[%s] (%s) %s' % (
|
|
fake_resp_json['errors'][0]['location'],
|
|
fake_resp_json['errors'][0]['name'],
|
|
fake_resp_json['errors'][0]['description']
|
|
)
|
|
assert error_msg == u"HTTP error: %s, %s" % (fake_resp.status_code, ','.join([expected_msg]))
|
|
|
|
fake_resp._content = 'invalid_;{[content}'
|
|
error_msg = atreal_openads.get_response_error(fake_resp)
|
|
assert error_msg == u"HTTP error: %s, %s" % (fake_resp.status_code, fake_resp._content)
|
|
|
|
|
|
def test_openads_upload_user_files(app, atreal_openads):
|
|
|
|
# TODO check logs (because this doesn't do anything but log)
|
|
atreal_openads.upload_user_files('DIA', FAKE_NUMERO_DOSSIER, file_ids=[])
|
|
|
|
with pytest.raises(ForwardFile.DoesNotExist) as e:
|
|
atreal_openads.upload_user_files('DIA', FAKE_NUMERO_DOSSIER, file_ids=[999])
|
|
assert unicode(e.value) == u"ForwardFile matching query does not exist."
|
|
|
|
FF = atreal_openads.upload2ForwardFile(TEST_FILE_CERFA_DIA, FAKE_NUMERO_DOSSIER, 'cerfa')
|
|
FF.save()
|
|
assert isinstance(FF, ForwardFile)
|
|
assert FF.upload_status == 'pending'
|
|
file_id = FF.id
|
|
assert file_id
|
|
|
|
fake_resp_bad = Response()
|
|
fake_resp_bad.status_code = 502
|
|
fake_resp_bad.reason = 'Bad gateway'
|
|
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp_bad
|
|
atreal_openads.upload_user_files('DIA', FAKE_NUMERO_DOSSIER, file_ids=[file_id])
|
|
|
|
FFup = ForwardFile.objects.get(id=file_id)
|
|
assert isinstance(FFup, ForwardFile)
|
|
for k in ['numero_dossier', 'type_fichier', 'file_hash', 'orig_filename', 'content_type']:
|
|
assert getattr(FFup, k) == getattr(FF, k)
|
|
assert FFup.upload_attempt == 1
|
|
assert FFup.upload_status == 'failed'
|
|
assert FFup.upload_msg == "HTTP error: 502"
|
|
|
|
fake_resp = Response()
|
|
fake_resp.status_code = 200
|
|
fake_resp.headers = {'Content-Type': 'application/json'}
|
|
fake_resp.encoding = 'utf-8'
|
|
fake_resp.reason = 'OK'
|
|
|
|
fake_resp._content = 'invalid_;{[content}'
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.upload_user_files('DIA', FAKE_NUMERO_DOSSIER, file_ids=[file_id])
|
|
|
|
FFup = ForwardFile.objects.get(id=file_id)
|
|
assert isinstance(FFup, ForwardFile)
|
|
for k in ['numero_dossier', 'type_fichier', 'file_hash', 'orig_filename', 'content_type']:
|
|
assert getattr(FFup, k) == getattr(FF, k)
|
|
assert FFup.upload_attempt == 2
|
|
assert FFup.upload_status == 'failed'
|
|
assert FFup.upload_msg == u'No JSON content returned: %r' % fake_resp._content
|
|
|
|
fake_resp_json = "You want add some files on %s " % FAKE_NUMERO_DOSSIER
|
|
fake_resp._content = json.dumps(fake_resp_json)
|
|
with mock.patch('passerelle.utils.Request.post') as requests_post:
|
|
requests_post.return_value = fake_resp
|
|
atreal_openads.upload_user_files('DIA', FAKE_NUMERO_DOSSIER, file_ids=[file_id])
|
|
|
|
FFup = ForwardFile.objects.get(id=file_id)
|
|
assert isinstance(FFup, ForwardFile)
|
|
for k in ['numero_dossier', 'type_fichier', 'file_hash', 'orig_filename', 'content_type']:
|
|
assert getattr(FFup, k) == getattr(FF, k)
|
|
assert FFup.upload_attempt == 3
|
|
assert FFup.upload_status == 'success'
|
|
assert FFup.upload_msg == 'uploaded successfuly'
|
|
|