diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/test_django_project.py b/tests/test_django_project.py
new file mode 100644
index 0000000..98f7c66
--- /dev/null
+++ b/tests/test_django_project.py
@@ -0,0 +1,145 @@
+import for_runners
+from axes.models import AccessLog
+from bx_py_utils.test_utils.html_assertion import HtmlAssertionMixin
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.test import override_settings
+from django.test.testcases import TestCase
+from django.urls import NoReverseMatch
+from django.urls.base import reverse
+from django_ynh.test_utils import generate_basic_auth
+from django_ynh.views import request_media_debug_view
+
+
+@override_settings(DEBUG=False)
+class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
+ def setUp(self):
+ super().setUp()
+
+ # Always start a fresh session:
+ self.client = self.client_class()
+
+ def test_settings(self):
+ assert settings.PATH_URL == 'app_path'
+
+ assert str(settings.FINAL_HOME_PATH).endswith('/local_test/opt_yunohost')
+ assert str(settings.FINAL_WWW_PATH).endswith('/local_test/var_www')
+ assert str(settings.LOG_FILE).endswith('/local_test/var_log_django-for-runners_ynh.log')
+
+ assert settings.ROOT_URLCONF == 'urls'
+
+ def test_urls(self):
+ assert reverse('admin:index') == '/app_path/'
+
+ # The django_ynh debug view should not be avaiable:
+ with self.assertRaises(NoReverseMatch):
+ reverse(request_media_debug_view)
+
+ # TODO: https://github.com/jedie/django-for-runners/issues/25
+ # Serve user uploads via django_tools.serve_media_app:
+ # assert settings.MEDIA_URL == '/app_path/media/'
+ # assert reverse('serve_media_app:serve-media', kwargs={'user_token': 'token', 'path': 'foo/bar/'}) == (
+ # '/app_path/media/token/foo/bar/'
+ # )
+
+ def test_auth(self):
+ response = self.client.get('/app_path/')
+ self.assertRedirects(response, expected_url='/app_path/login/?next=/app_path/')
+
+ def test_create_unknown_user(self):
+ assert User.objects.count() == 0
+
+ self.client.cookies['SSOwAuthUser'] = 'test'
+
+ response = self.client.get(
+ path='/app_path/',
+ HTTP_REMOTE_USER='test',
+ HTTP_AUTH_USER='test',
+ HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
+ )
+
+ assert User.objects.count() == 1
+ user = User.objects.first()
+ assert user.username == 'test'
+ assert user.is_active is True
+ assert user.is_staff is True # Set by: conf.django_ynh_demo_urls.setup_user_handler
+ assert user.is_superuser is False
+
+ self.assert_html_parts(
+ response,
+ parts=(
+ f'
Site administration | Django-ForRunners v{for_runners.__version__}',
+ 'test',
+ ),
+ )
+
+ def test_wrong_auth_user(self):
+ assert User.objects.count() == 0
+ assert AccessLog.objects.count() == 0
+
+ self.client.cookies['SSOwAuthUser'] = 'test'
+
+ response = self.client.get(
+ path='/app_path/',
+ HTTP_REMOTE_USER='test',
+ HTTP_AUTH_USER='foobar', # <<< wrong user name
+ HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
+ )
+
+ assert User.objects.count() == 1
+ user = User.objects.first()
+ assert user.username == 'test'
+ assert user.is_active is True
+ assert user.is_staff is True # Set by: conf.django_ynh_demo_urls.setup_user_handler
+ assert user.is_superuser is False
+
+ assert AccessLog.objects.count() == 1
+
+ assert response.status_code == 403 # Forbidden
+
+ def test_wrong_cookie(self):
+ assert User.objects.count() == 0
+ assert AccessLog.objects.count() == 0
+
+ self.client.cookies['SSOwAuthUser'] = 'foobar' # <<< wrong user name
+
+ response = self.client.get(
+ path='/app_path/',
+ HTTP_REMOTE_USER='test',
+ HTTP_AUTH_USER='test',
+ HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
+ )
+
+ assert User.objects.count() == 1
+ user = User.objects.first()
+ assert user.username == 'test'
+ assert user.is_active is True
+ assert user.is_staff is True # Set by: conf.django_ynh_demo_urls.setup_user_handler
+ assert user.is_superuser is False
+
+ assert AccessLog.objects.count() == 1
+
+ assert response.status_code == 403 # Forbidden
+
+ def test_wrong_authorization_user(self):
+ assert User.objects.count() == 0
+
+ self.client.cookies['SSOwAuthUser'] = 'test'
+
+ response = self.client.get(
+ path='/app_path/',
+ HTTP_REMOTE_USER='test',
+ HTTP_AUTH_USER='test',
+ HTTP_AUTHORIZATION=generate_basic_auth(username='foobar', password='test123'), # <<< wrong user name
+ )
+
+ assert User.objects.count() == 1
+ user = User.objects.first()
+ assert user.username == 'test'
+ assert user.is_active is True
+ assert user.is_staff is True # Set by: conf.django_ynh_demo_urls.setup_user_handler
+ assert user.is_superuser is False
+
+ assert AccessLog.objects.count() == 1
+
+ assert response.status_code == 403 # Forbidden
diff --git a/tests/test_lint.py b/tests/test_lint.py
new file mode 100644
index 0000000..003dc76
--- /dev/null
+++ b/tests/test_lint.py
@@ -0,0 +1,13 @@
+import shutil
+import subprocess
+from pathlib import Path
+
+
+BASE_PATH = Path(__file__).parent.parent
+
+
+def test_lint():
+ assert Path(BASE_PATH, 'Makefile').is_file()
+ make_bin = shutil.which('make')
+ assert make_bin is not None
+ subprocess.check_call([make_bin, 'lint'], cwd=BASE_PATH)
diff --git a/tests/test_project_setup.py b/tests/test_project_setup.py
new file mode 100644
index 0000000..3e97905
--- /dev/null
+++ b/tests/test_project_setup.py
@@ -0,0 +1,41 @@
+import os
+import shutil
+import subprocess
+from pathlib import Path
+
+import for_runners
+
+
+PACKAGE_ROOT = Path(__file__).parent.parent
+
+
+def assert_file_contains_string(file_path, string):
+ with file_path.open('r') as f:
+ for line in f:
+ if string in line:
+ return
+ raise AssertionError(f'File {file_path} does not contain {string!r} !')
+
+
+def test_version():
+ version = for_runners.__version__
+
+ assert_file_contains_string(file_path=Path(PACKAGE_ROOT, 'pyproject.toml'), string=f'version = "{version}~ynh')
+ assert_file_contains_string(
+ file_path=Path(PACKAGE_ROOT, 'pyproject.toml'), string=f'django-for-runners = "=={version}"'
+ )
+ assert_file_contains_string(file_path=Path(PACKAGE_ROOT, 'manifest.json'), string=f'"version": "{version}~ynh')
+
+
+def test_poetry_check():
+ poerty_bin = shutil.which('poetry')
+
+ output = subprocess.check_output(
+ [poerty_bin, 'check'],
+ universal_newlines=True,
+ env=os.environ,
+ stderr=subprocess.STDOUT,
+ cwd=str(PACKAGE_ROOT),
+ )
+ print(output)
+ assert output == 'All set!\n'
diff --git a/tests/test_utils.py b/tests/test_utils.py
new file mode 100644
index 0000000..a9927a7
--- /dev/null
+++ b/tests/test_utils.py
@@ -0,0 +1,8 @@
+from unittest.case import TestCase
+
+from django_ynh.test_utils import generate_basic_auth
+
+
+class TestUtilsTestCase(TestCase):
+ def test_generate_basic_auth(self):
+ assert generate_basic_auth(username='test', password='test123') == 'basic dGVzdDp0ZXN0MTIz'