From 048671af0a79a45e512c7f2ca135c793726f94a9 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 5 Dec 2018 11:54:22 +0100 Subject: [PATCH 2/2] tests: add test on trace_email (merge with previous patch before commit) --- tests/conftest.py | 31 ++++++++++++++++++++++++++++ tests/test_misc.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 20d5ec0..889edd3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,6 +3,11 @@ from httmock import urlmatch, HTTMock, response import django_webtest +from django.core.files import File +from io import BytesIO + +from .utils import make_resource + @pytest.fixture def app(request): @@ -109,3 +114,29 @@ def internal_server_error(url, request): 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 = '''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 diff --git a/tests/test_misc.py b/tests/test_misc.py index 588d8cd..4bc64a2 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,5 +1,6 @@ import datetime import pytest +from mock import patch from django.utils import timezone @@ -18,6 +19,7 @@ def test_get_description_url_fields(db): connector = OpenGIS(slug='plop', wms_service_url='http://username@example.net:secret@www.example.net') assert 'http://***:***@www.example.net' in [x[1] for x in connector.get_description_fields()] + def test_get_description_secret_fields(db): connector = ClicRdv(slug='plop', apikey='secret1', username='plop', password='secret2') assert not 'secret1' in [x[1] for x in connector.get_description_fields()] @@ -38,3 +40,51 @@ def test_log_cleaning(db): connector.daily() assert ResourceLog.objects.all().count() == 1 + +@pytest.fixture +def email_handler(): + import logging + from django.utils.log import AdminEmailHandler + + root = logging.getLogger() + handler = AdminEmailHandler(include_html=True) + handler.level = logging.ERROR + root.handlers.append(handler) + try: + yield + finally: + root.handlers.remove(handler) + + +def test_trace_emails(app, settings, dummy_csv_datasource, email_handler, mailoutbox): + from .utils import generic_endpoint_url + + settings.ADMINS = [('admin', 'admin@example.net')] + + logging_parameters = dummy_csv_datasource.logging_parameters + logging_parameters.save() + + assert not mailoutbox + + with patch.object(dummy_csv_datasource.__class__, + 'execute_query', + side_effect=ValueError('coin'), autospec=True): + + app.get(generic_endpoint_url(connector='csvdatasource', + endpoint='query/dummy-query/', + slug=dummy_csv_datasource.slug), + status=500) + + assert len(mailoutbox) == 1 + assert mailoutbox[0].to == ['admin@example.net'] + + logging_parameters.trace_emails = 'john.doe@example.net' + logging_parameters.save() + app.get(generic_endpoint_url(connector='csvdatasource', + endpoint='query/dummy-query/', + slug=dummy_csv_datasource.slug), + status=500) + + assert len(mailoutbox) == 2 + assert mailoutbox[0].to == ['admin@example.net'] + assert mailoutbox[1].to == ['john.doe@example.net'] -- 2.18.0