diff --git a/tests/settings.py b/tests/settings.py
index b573919089e3fcbf970ae9035317ad04b3d97bd0..c0fb94b21aef2ddca36046642498c41cbef23e91 100644
--- a/tests/settings.py
+++ b/tests/settings.py
@@ -3,8 +3,12 @@ import os
 SECRET_KEY = 'fake-key'
 
 INSTALLED_APPS = [
+    'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
     'live_settings',
     'tests',
 ]
@@ -20,3 +24,34 @@ DATABASES = {
 
 ROOT_URLCONF = 'tests.urls'
 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+MIDDLEWARE = [
+    'django.middleware.security.SecurityMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.locale.LocaleMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+                'basetheme_bootstrap.context_processors.processors',
+                'strass_app.context_processors.enrich_with_status',
+                'strass_app.context_processors.add_google_analytics_tracker',
+                "live_settings.context_processors.processors",
+            ],
+        },
+    },
+]
diff --git a/tests/tests.py b/tests/tests.py
deleted file mode 100644
index 5a014e2abe24a05c9ffd46760d6e984cdba7e0b6..0000000000000000000000000000000000000000
--- a/tests/tests.py
+++ /dev/null
@@ -1,141 +0,0 @@
-import json
-import logging
-from typing import Dict
-
-from django.core import mail
-from django.test import TestCase, override_settings
-from django.urls import reverse
-from django.urls import reverse_lazy
-
-import cspmailreports.apps
-import cspmailreports.conf
-
-logger = logging.getLogger(__name__)
-
-
-class CSPTooledTestCase(TestCase):
-    url = reverse_lazy('cspmailreports:csp-report')
-
-    def setUp(self):
-        super().setUp()
-        cspmailreports.conf.app_settings._reset_cache()
-
-    @staticmethod
-    def fake_report(referrer="http://127.0.0.1:8080") -> Dict:
-        return {
-            "csp-report": {
-                "blocked-uri": "inline",
-                "disposition": "enforce",
-                "document-uri": f"{referrer}/about/",
-                "effective-directive": "script-src-elem",
-                "line-number": 215,
-                "original-policy": "default-src 'self' *; script-src 'self' cdn.datatables.net",
-                "referrer": referrer,
-                "script-sample": "",
-                "source-file": f"{referrer}/about/",
-                "status-code": 200,
-                "violated-directive": "script-src-elem",
-            }
-        }
-
-    def report(self, report=None):
-        if report is None:
-            report = self.fake_report()
-        return self.client.post(self.url, data=json.dumps(report), content_type='application/csp-report')
-
-
-class TestMain(CSPTooledTestCase):
-    def test_works(self):
-        url = reverse('cspmailreports:csp-report')
-        # check get ko
-        self.assertNotIn(self.client.get(url).status_code, [200])
-        # check post works
-        self.assertIn(self.report().status_code, [200])
-
-    def test_invalid_mime_type_refused(self):
-        self.assertNotIn(self.client.post(self.url, data=self.fake_report()).status_code, [200])
-
-    def test_invalid_data_accepted(self):
-        self.assertIn(
-            self.client.generic(
-                "POST",
-                self.url,
-                'zerzerz!sdf{',
-                'application/csp-report',
-            ).status_code,
-            [200],
-        )
-
-
-@override_settings(
-    CSP_MAIL_REPORTS_MAX_BEFORE_COOLDOWN=10,
-    ADMINS=(('ada', 'ada@pasteur.fr'),),
-    DEBUG=False,
-)
-class TestDOS(CSPTooledTestCase):
-    def test_it(self):
-        mail_count = len(mail.outbox)
-        self.client.defaults['REMOTE_ADDR'] = '1.2.3.4'
-        # trigger dos
-        for i in range(cspmailreports.conf.app_settings.max_report_before_cooldown):
-            self.assertIn(self.report().status_code, [200])
-            mail_count += 1
-        self.assertEqual(mail_count, len(mail.outbox))
-        # check blocked
-        self.assertIn(self.report().status_code, [429])
-        self.assertEqual(mail_count, len(mail.outbox))
-        # check other is not blocked
-        self.client.defaults['REMOTE_ADDR'] = '1.2.3.5'
-        self.assertIn(self.report().status_code, [200])
-        mail_count += 1
-        self.assertEqual(mail_count, len(mail.outbox))
-
-
-@override_settings(
-    ADMINS=(('ada', 'ada@pasteur.fr'),),
-)
-class TestMailAdmin(CSPTooledTestCase):
-    def test_it(self):
-        mail_count = len(mail.outbox)
-        self.assertIn(self.report().status_code, [200])
-        mail_count += 1
-        self.assertEqual(mail_count, len(mail.outbox))
-
-
-@override_settings(
-    ADMINS=(),
-)
-class TestMailNoAdmin(CSPTooledTestCase):
-    def test_it(self):
-        mail_count = len(mail.outbox)
-        self.assertIn(self.report().status_code, [200])
-        mail_count += 0  # in debug not mail to admin is sent
-        self.assertEqual(mail_count, len(mail.outbox))
-
-
-@override_settings(
-    CSP_MAIL_REPORTS_MAX_BEFORE_COOLDOWN=-1,
-)
-class TestCheck1(CSPTooledTestCase):
-    def test_it(self):
-        cspmailreports.conf.app_settings._reset_cache()
-        self.assertEqual(len(cspmailreports.apps.check_settings(None)), 1)
-
-
-@override_settings(
-    CSP_MAIL_REPORTS_COOLDOWN_IN_SECONDS=-1,
-)
-class TestCheck2(CSPTooledTestCase):
-    def test_it(self):
-        cspmailreports.conf.app_settings._reset_cache()
-        self.assertEqual(len(cspmailreports.apps.check_settings(None)), 1)
-
-
-@override_settings(
-    CSP_MAIL_REPORTS_MAX_BEFORE_COOLDOWN=-1,
-    CSP_MAIL_REPORTS_COOLDOWN_IN_SECONDS=-1,
-)
-class TestCheckAll(CSPTooledTestCase):
-    def test_it(self):
-        cspmailreports.conf.app_settings._reset_cache()
-        self.assertEqual(len(cspmailreports.apps.check_settings(None)), 2)