tests: define a MEDIA_ROOT (#32516)

To prevent cluttering project root with tests files. Some connector's
test had to be changed:
* family connector tests had to be changed as it magically used a local
file path as a Django stored file path.
* mdel tests where completely bogus around storage
This commit is contained in:
Benjamin Dauvergne 2019-04-16 15:32:21 +02:00
parent 6c934db41c
commit 95446af6ce
6 changed files with 44 additions and 47 deletions

View File

@ -10,6 +10,11 @@ from io import BytesIO
from .utils import make_resource
@pytest.fixture(autouse=True)
def media(settings, tmpdir):
settings.MEDIA_ROOT = str(tmpdir.mkdir('media'))
@pytest.fixture
def app(request):
wtm = django_webtest.WebTestMixin()

View File

@ -45,14 +45,6 @@ def actesweb(db):
return utils.make_resource(ActesWeb, **{'slug': 'test'})
@pytest.fixture(autouse=True)
def media_dir(tmpdir, settings):
tmp_dir = tmpdir.mkdir('actesweb').dirname
settings.MEDIA_ROOT = tmp_dir
yield tmp_dir
shutil.rmtree(tmp_dir, ignore_errors=True)
PAYLOAD = [
{
'birth': json.loads(get_file_from_test_base_dir('payload_birth.json'))

View File

@ -32,6 +32,8 @@ from passerelle.apps.cityweb.models import CityWeb
from passerelle.apps.cityweb.cityweb import DateType
from passerelle.utils.jsonresponse import APIError
from django.core.files.storage import default_storage
def get_test_base_dir(name):
return os.path.join(os.path.dirname(__file__), 'data', name)
@ -81,13 +83,12 @@ def assert_xml_doc(filename, assertions):
assert path.find(root) == value
@mock.patch('passerelle.apps.cityweb.models.default_storage.path', get_test_base_dir)
def test_demand_creation(app, setup, payload):
url = '/cityweb/test/create/'
if 'birth' in payload:
response = app.post_json(url, params=payload['birth'])
assert response.json['data']['demand_id'] == 'N201610154'
filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'N201610154.xml')
filename = default_storage.path(os.path.join('cityweb', 'test', 'N201610154.xml'))
assertions = {
'identifiant': 'N201610154',
'demandeur.qualiteDemandeur': 'concerne',
@ -115,7 +116,7 @@ def test_demand_creation(app, setup, payload):
elif 'mariage' in payload:
response = app.post_json(url, params=payload['mariage'])
assert response.json['data']['demand_id'] == 'M201610161'
filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'M201610161.xml')
filename = default_storage.path(os.path.join('cityweb', 'test', 'M201610161.xml'))
assertions = {
'identifiant': 'M201610161',
'demandeur.qualiteDemandeur': 'concerne',
@ -147,7 +148,7 @@ def test_demand_creation(app, setup, payload):
else:
response = app.post_json(url, params=payload['death'])
assert response.json['data']['demand_id'] == 'D201610171'
filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'D201610171.xml')
filename = default_storage.path(os.path.join('cityweb', 'test', 'D201610171.xml'))
assertions = {
'identifiant': 'D201610171',
'demandeur.qualiteDemandeur': 'concerne',

View File

@ -20,6 +20,7 @@ from django.core.files.storage import default_storage
from passerelle.apps.family.models import GenericFamily, Family, FamilyLink
from passerelle.apps.family.models import Invoice, Adult, Child, DATETIME_FORMAT
from django.core.files import File
from django.contrib.contenttypes.models import ContentType
from passerelle.base.models import ApiUser, AccessRight
@ -33,7 +34,8 @@ API_KEY = 'family'
@pytest.fixture
def resource(db):
filepath = os.path.join(os.path.dirname(__file__), 'data', 'family_data.zip')
resource = GenericFamily.objects.create(title='test', slug='test', archive=filepath)
with open(filepath) as fd:
resource = GenericFamily.objects.create(title='test', slug='test', archive=File(fd, 'family_data.zip'))
api = ApiUser.objects.create(username='family', keytype='API', key=API_KEY)
obj_type = ContentType.objects.get_for_model(GenericFamily)
AccessRight.objects.create(codename='can_access', apiuser=api,
@ -200,8 +202,10 @@ def test_pay_invoice(app, resource):
def test_fondettes_concerto_loader():
Invoice.objects.all().delete()
filepath = os.path.join(os.path.dirname(__file__), 'data', 'family_data_fondettes.zip')
resource = GenericFamily.objects.create(title='test fondettes',
slug='test-fondettes', archive=filepath, file_format='concerto_fondettes')
with open(filepath) as fd:
resource = GenericFamily.objects.create(title='test fondettes',
slug='test-fondettes', archive=File(fd, 'family_data_fondettes.zip'),
file_format='concerto_fondettes')
assert Invoice.objects.filter(resource=resource).count() == 630
assert len([x for x in Invoice.objects.filter(resource=resource) if x.has_pdf]) == 4
assert Invoice.objects.filter(paid=True).count() == 314
@ -209,20 +213,20 @@ def test_fondettes_concerto_loader():
def test_archive_validation():
filepath = os.path.join(os.path.dirname(__file__), 'data', 'iparapheur.wsdl')
resource = GenericFamily.objects.create(title='test', slug='test', archive=filepath)
resource.archive = File(open(filepath))
with open(filepath) as fd:
resource = GenericFamily.objects.create(title='test', slug='test', archive=File(fd, 'iparapheur.wsdl'))
with pytest.raises(ValidationError):
resource.clean()
def test_fondettes_concerto_validation():
filepath = os.path.join(os.path.dirname(__file__), 'data', 'family_data_fondettes.zip')
resource = GenericFamily.objects.create(title='test fondettes',
slug='test fondettes', archive=filepath, file_format='concerto_fondettes')
resource.archive = File(open(filepath))
with open(filepath) as fd:
resource = GenericFamily.objects.create(title='test fondettes',
slug='test fondettes', archive=File(fd, 'family_data_fondettes.zip'), file_format='concerto_fondettes')
resource.clean()
filepath = os.path.join(os.path.dirname(__file__), 'data', 'family_data.zip')
resource.archive = File(open(filepath))
resource.archive = File(open(filepath), 'family_data.zip')
with pytest.raises(ValidationError):
resource.clean()
@ -232,7 +236,7 @@ def test_orleans_concerto_loader():
filepath = os.path.join(os.path.dirname(__file__), 'data', 'orleans',
'family_data_orleans.zip')
resource = GenericFamily(title='test orleans',
slug='test-orleans', archive=filepath, file_format='concerto_orleans')
slug='test-orleans', archive=File(open(filepath), 'family_data_orleans.zip'), file_format='concerto_orleans')
from passerelle.apps.family.loaders.concerto_orleans import Loader
loader = Loader(resource)
loader.archive = zipfile.ZipFile(filepath)
@ -294,9 +298,10 @@ def test_orleans_data_import_command():
cur_dir = os.path.dirname(__file__)
data_dir = os.path.join(cur_dir, 'data', 'orleans')
resource = GenericFamily.objects.create(title='test orleans',
archive=os.path.join(data_dir, 'family_data_orleans.zip'),
slug='test-orleans', file_format='concerto_orleans')
with open(os.path.join(data_dir, 'family_data_orleans.zip')) as fd:
resource = GenericFamily.objects.create(title='test orleans',
archive=File(fd, 'family_data_orleans.zip'),
slug='test-orleans', file_format='concerto_orleans')
# cleanup data before launching import
Family.objects.filter(resource=resource).delete()
@ -348,7 +353,7 @@ def test_incorrect_orleans_data(caplog):
filepath = os.path.join(os.path.dirname(__file__), 'data',
'family_incorrect_data_orleans.zip')
resource = GenericFamily.objects.create(title='test orleans',
slug='test-orleans', archive=filepath,
slug='test-orleans', archive=File(open(filepath), 'family_incorrect_data_orleans.zip'),
file_format='concerto_orleans')
for record in caplog.records:
assert 'Error occured while importing data:' in record.message

View File

@ -16,18 +16,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals
import shutil
import os
import json
import base64
import copy
import shutil
from xml.etree import ElementTree as etree
import pytest
import mock
from passerelle.contrib.mdel.models import MDEL, Demand
from passerelle.contrib.mdel.mdel import Message, Description, AttachedFile
from passerelle.contrib.mdel.mdel import Message, Description, AttachedFile, get_resource_base_dir
from passerelle.contrib.mdel.utils import parse_date
import utils
@ -117,14 +116,13 @@ def test_create_rco_demand_type(app, setup):
assert resp.json['err_desc'] == "RCO-LA processing not implemented"
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_create_aec_demand_type(app, setup, aec_payload):
resp = app.post_json('/mdel/test/create', params=aec_payload, status=200)
if aec_payload['display_id'] == '15-4':
assert resp.json['data']['demand_id'] == '15-4-AEC-LA'
doc = os.path.join(get_mdel_base_dir(), 'test', 'inputs', '15-4-AEC-LA--0', '15-4-AEC-LA-doc-.xml')
doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '15-4-AEC-LA--0', '15-4-AEC-LA-doc-.xml')
root = etree.parse(doc).getroot()
assert root.tag == 'EnveloppeMetierType'
@ -166,7 +164,7 @@ def test_create_aec_demand_type(app, setup, aec_payload):
assert resp.json['data']['demand_id'] == '16-1-AEC-LA'
doc = os.path.join(get_mdel_base_dir(), 'test', 'inputs', '16-1-AEC-LA--0', '16-1-AEC-LA-doc-.xml')
doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '16-1-AEC-LA--0', '16-1-AEC-LA-doc-.xml')
root = etree.parse(doc).getroot()
assert root.tag == 'EnveloppeMetierType'
@ -217,7 +215,7 @@ def test_create_aec_demand_type(app, setup, aec_payload):
else:
assert resp.json['data']['demand_id'] == '17-1-AEC-LA'
doc = os.path.join(get_mdel_base_dir(), 'test', 'inputs', '17-1-AEC-LA--0', '17-1-AEC-LA-doc-.xml')
doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '17-1-AEC-LA--0', '17-1-AEC-LA-doc-.xml')
root = etree.parse(doc).getroot()
assert root.tag == 'EnveloppeMetierType'
@ -255,7 +253,6 @@ def test_create_aec_demand_type(app, setup, aec_payload):
assert root.find('DemandeActe/Titulaire/Filiation/Pere/Prenoms').text == 'Ryu'
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_create_aec_demand_type_without_date_acte(app, setup):
payload = json.loads(get_file_from_test_base_dir('formdata_aec_deces.json'))
payload['fields'].pop('date_acte')
@ -263,12 +260,11 @@ def test_create_aec_demand_type_without_date_acte(app, setup):
assert resp.json['err_desc'] == '<date_acte> is required'
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_create_ile_demand_type(app, setup):
resp = app.post_json('/mdel/test/create', params=ILE_PAYLOAD, status=200)
assert resp.json['data']['demand_id'] == '1-14-ILE-LA'
base_doc = os.path.join(get_mdel_base_dir(), 'test', 'inputs', '1-14-ILE-LA--0')
base_doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '1-14-ILE-LA--0')
doc = os.path.join(base_doc, '1-14-ILE-LA-doc-.xml')
root = etree.parse(doc).getroot()
@ -338,7 +334,6 @@ def test_create_ile_demand_type(app, setup):
assert resp.json['err_desc'] == 'anterieur_situation_raw is required'
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_create_ile_demand_type_invalid_document_proof(app, setup):
# test with missing key
payload = json.loads(get_file_from_test_base_dir('formdata.json'))
@ -354,8 +349,10 @@ def test_create_ile_demand_type_invalid_document_proof(app, setup):
assert resp.json['err_desc'] == 'justificatif_identite and all its attributes are required'
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_get_status(app, setup):
shutil.copytree(
os.path.join(get_mdel_base_dir(), 'test', 'outputs'),
os.path.join(get_resource_base_dir(), 'test', 'outputs'))
resp = app.post_json('/mdel/test/create', params=ILE_PAYLOAD, status=200)
demand_id = resp.json['data']['demand_id']
assert demand_id == '1-14-ILE-LA'
@ -393,8 +390,10 @@ def test_get_status_unknown_demand(app, setup):
assert resp.json['err_desc'] == 'Demand matching query does not exist.'
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_get_status_no_response(app, setup):
shutil.copytree(
os.path.join(get_mdel_base_dir(), 'test', 'outputs'),
os.path.join(get_resource_base_dir(), 'test', 'outputs'))
Demand.objects.create(resource=setup, num='1-15', flow_type='ILE-LA', demand_id='1-15-ILE-LA')
resp = app.get('/mdel/test/status', params={'demand_id': '1-15-ILE-LA'}, status=200)
@ -406,8 +405,10 @@ def test_get_status_no_response(app, setup):
assert Demand.objects.get(demand_id='1-15-ILE-LA').status is None
@mock.patch('passerelle.contrib.mdel.mdel.get_resource_base_dir', get_mdel_base_dir)
def test_get_not_closed_status(app, setup):
shutil.copytree(
os.path.join(get_mdel_base_dir(), 'test', 'outputs'),
os.path.join(get_resource_base_dir(), 'test', 'outputs'))
Demand.objects.create(resource=setup, num='15-9', flow_type='AEC-LA', demand_id='15-9-AEC-LA')
resp = app.get('/mdel/test/status', params={'demand_id': '15-9-AEC-LA'}, status=200)
@ -474,9 +475,3 @@ def test_date_parsing():
with pytest.raises(APIError) as error:
date = parse_date('28-02-2018')
assert 'date u\'28-02-2018\' not iso-formated' in str(error)
def teardown_module(module):
# remove test/inputs from fs
shutil.rmtree(os.path.join(get_mdel_base_dir(), 'test', 'inputs'), ignore_errors=True)

View File

@ -21,7 +21,6 @@ from passerelle.utils.files import atomic_write
def test_atomic_write(settings, tmpdir):
settings.MEDIA_ROOT = str(tmpdir.mkdir('media'))
target_dir = tmpdir.mkdir('target')
filepath = str(target_dir.join('test'))