passerelle/tests/conftest.py

227 lines
6.0 KiB
Python

from io import BytesIO
from urllib.parse import parse_qsl, urlparse
import django_webtest
import pytest
from django.contrib.auth.models import User
from django.core.cache import cache
from django.core.files import File
from httmock import HTTMock, remember_called, response, urlmatch
from tests.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()
wtm._patch_settings()
request.addfinalizer(wtm._unpatch_settings)
cache.clear()
return django_webtest.DjangoTestApp()
@urlmatch(netloc='^api-adresse.data.gouv.fr$', path='^/search/$')
@remember_called
def api_adresse_data_gouv_fr_search(url, request):
return response(
200,
{
"limit": 1,
"attribution": "BAN",
"version": "draft",
"licence": "ODbL 1.0",
"query": "plop",
"type": "FeatureCollection",
"features": [
{
"geometry": {"type": "Point", "coordinates": [-0.593775, 47.474633]},
"properties": {
"citycode": "49007",
"name": "Rue Roger Halope",
"id": "49007_6950_be54bd",
"city": "Angers",
"context": "49, Maine-et-Loire, Pays de la Loire",
"score": 0.14097272727272728,
"label": "Rue Roger Halope 49000 Angers",
"postcode": "49000",
"type": "street",
},
"type": "Feature",
}
],
},
request=request,
)
@urlmatch(netloc='^api-adresse.data.gouv.fr$', path='^/reverse/$')
@remember_called
def api_adresse_data_gouv_fr_reverse(url, request):
return response(
200,
{
"limit": 1,
"attribution": "BAN",
"version": "draft",
"licence": "ODbL 1.0",
"type": "FeatureCollection",
"features": [
{
"geometry": {"type": "Point", "coordinates": [-0.593775, 47.474633]},
"properties": {
"citycode": "49007",
"name": "Rue Roger Halope",
"id": "49007_6950_be54bd",
"city": "Angers",
"distance": 0,
"context": "49, Maine-et-Loire, Pays de la Loire",
"score": 1.0,
"label": "Rue Roger Halope 49000 Angers",
"postcode": "49000",
"type": "street",
},
"type": "Feature",
}
],
},
request=request,
)
@pytest.fixture
def mock_api_adresse_data_gouv_fr_search():
with HTTMock(api_adresse_data_gouv_fr_search):
yield api_adresse_data_gouv_fr_search
@pytest.fixture
def mock_api_adresse_data_gouv_fr_reverse():
with HTTMock(api_adresse_data_gouv_fr_reverse):
yield api_adresse_data_gouv_fr_reverse
@pytest.fixture
def endpoint_dummy_cache(monkeypatch):
from django.core.cache import caches
import passerelle.views
monkeypatch.setattr(passerelle.views, 'cache', caches['dummy'])
@urlmatch()
def internal_server_error(url, request):
return response(500, 'Internal server error')
@pytest.fixture
def mock_500():
with HTTMock(internal_server_error):
yield None
@pytest.fixture
def dummy_csv_datasource(db):
from passerelle.apps.csvdatasource.models import CsvDataSource, Query
data = b'''id,label
1,a
2,b
3,c'''
obj = make_resource(
CsvDataSource,
slug='dummy-slug',
title='Dummy Title',
description='dummy description',
csv_file=File(BytesIO(data), 'dummy.csv'),
)
Query.objects.create(
resource=obj,
slug='dummy-query',
structure='array',
label='Dummy Query',
description='dummy query description',
projections='id:int(id)\ntext:label',
)
return obj
@pytest.fixture
def relax_openssl(tmpdir):
"""OpenSSL default configuration has been really strict for some years,
this fixture set a temporary really permisive ciphers list."""
import os
openssl_cnf_path = tmpdir / 'openssl.cnf'
with openssl_cnf_path.open('w') as fd:
fd.write(
'''
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = ALL'''
)
old_value = os.environ.get('OPENSSL_CONF', None)
try:
os.environ['OPENSSL_CONF'] = str(openssl_cnf_path)
yield
finally:
if old_value is None:
del os.environ['OPENSSL_CONF']
else:
os.environ['OPENSSL_CONF'] = old_value
@pytest.fixture(autouse=True)
def clear_cache():
from zeep.cache import InMemoryCache
# prevent silent change in zeep private interface
assert InMemoryCache._cache == {}
InMemoryCache._cache = {}
try:
yield
finally:
InMemoryCache._cache = {}
cache.clear()
@pytest.fixture
def simple_user(db):
return User.objects.create_user('user', password='user')
@pytest.fixture
def admin_user(db):
return User.objects.create_superuser('admin', email=None, password='admin')
@pytest.fixture
def httpbin():
@urlmatch(netloc=r'^httpbin\.org$', path=r'^/cookies/set$')
def httpbin_cookies_set(url, request):
headers = []
cookies = {}
for key, value in parse_qsl(urlparse(request.url).query):
cookies[key] = value
headers.append(('Set-Cookie', f'{key}={value}; Path=/'))
headers.append(('Location', '/cookies'))
return response(200, b'', headers=headers, request=request)
with HTTMock(httpbin_cookies_set) as fixture:
fixture.url = 'http://httpbin.org'
yield fixture