From d41e1da4196e48d0c3bfb612515863fcc2facce3 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Thu, 3 Feb 2022 21:23:30 +0100 Subject: [PATCH] Add tests --- bitbucket-pipelines.yml | 1 + server/config/settings/base.py | 11 ++++++--- server/config/settings/test.py | 24 ++++++++++++++++++++ server/log/.keep | 0 server/pytest.ini | 2 +- server/run_tests.sh | 4 ++++ server/vbv_lernwelt/core/tests.py | 1 - server/vbv_lernwelt/core/tests/__init__.py | 0 server/vbv_lernwelt/core/tests/factories.py | 13 +++++++++++ server/vbv_lernwelt/core/tests/test_utils.py | 12 ++++++++++ 10 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 server/log/.keep create mode 100755 server/run_tests.sh delete mode 100644 server/vbv_lernwelt/core/tests.py create mode 100644 server/vbv_lernwelt/core/tests/__init__.py create mode 100644 server/vbv_lernwelt/core/tests/factories.py create mode 100644 server/vbv_lernwelt/core/tests/test_utils.py diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index ded99e9e..fc2707d8 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -16,6 +16,7 @@ pipelines: - pip3 install -r server/requirements/requirements-dev.txt - git-crypt status -e | sort > git-crypt-encrypted-files-check.txt && diff git-crypt-encrypted-files.txt git-crypt-encrypted-files-check.txt - trufflehog --exclude_paths trufflehog-exclude-patterns.txt --allow trufflehog-allow.json --entropy=True --max_depth=100 . + - ./server/run_tests.sh # - ./src/run_pylint.sh # - ./src/run_unittests_coverage.sh - step: diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 699c2d70..f40280b2 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -7,7 +7,7 @@ from pathlib import Path import structlog from environs import Env -from core.utils import add_app_info +from vbv_lernwelt.core.utils import add_app_info SERVER_ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent # vbv_lernwelt/ @@ -46,7 +46,12 @@ LOCALE_PATHS = [str(SERVER_ROOT_DIR / "locale")] # DATABASES # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#databases -DATABASES = {"default": env.dj_db_url("VBV_DATABASE_URL", default="postgres://vbv_lernwelt@localhost:5432/vbv_lernwelt")} +DATABASES = { + "default": env.dj_db_url( + "VBV_DATABASE_URL", + default="postgres://vbv_lernwelt@localhost:5432/vbv_lernwelt", + ) +} DATABASES["default"]["ATOMIC_REQUESTS"] = True # noqa F405 DATABASES["default"]["CONN_MAX_AGE"] = env.int("CONN_MAX_AGE", default=60) # noqa F405 # https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-DEFAULT_AUTO_FIELD @@ -303,7 +308,7 @@ else: "handlers": { "file": { "class": "concurrent_log_handler.ConcurrentRotatingFileHandler", - "filename": f"{SERVER_ROOT_DIR}/myservice.log", + "filename": f"{SERVER_ROOT_DIR}/log/myservice.log", "maxBytes": 1024 * 1024 * 100, "backupCount": 50, "formatter": "json", diff --git a/server/config/settings/test.py b/server/config/settings/test.py index 8e6e83cb..ed59a58d 100644 --- a/server/config/settings/test.py +++ b/server/config/settings/test.py @@ -1,4 +1,6 @@ # pylint: disable=unused-wildcard-import,wildcard-import,wrong-import-position +import getpass +import os from .base import * # noqa from .base import env @@ -23,5 +25,27 @@ PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"] # https://docs.djangoproject.com/en/dev/ref/settings/#email-backend EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend" + +class DisableMigrations(dict): + def __contains__(self, item): + return True + + def __getitem__(self, item): + return None + + +MIGRATION_MODULES = DisableMigrations() + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql_psycopg2", + "NAME": "vbv_lernwelt", + "USER": os.environ.get("PG_USER", getpass.getuser()), + "PASSWORD": os.environ.get("PG_PASSWORD"), + "HOST": "localhost", + "PORT": os.environ.get("PG_PORT", ""), + } +} + # Your stuff... # ------------------------------------------------------------------------------ diff --git a/server/log/.keep b/server/log/.keep new file mode 100644 index 00000000..e69de29b diff --git a/server/pytest.ini b/server/pytest.ini index 0db8322e..2cd87fc8 100644 --- a/server/pytest.ini +++ b/server/pytest.ini @@ -1,4 +1,4 @@ [pytest] -addopts = --ds=config.settings.test --reuse-db +addopts = --ds=config.settings.test --no-migrations python_files = tests.py test_*.py norecursedirs = node_modules diff --git a/server/run_tests.sh b/server/run_tests.sh new file mode 100755 index 00000000..73c974e7 --- /dev/null +++ b/server/run_tests.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +pytest --junitxml=../test-reports/coverage.xml diff --git a/server/vbv_lernwelt/core/tests.py b/server/vbv_lernwelt/core/tests.py deleted file mode 100644 index a39b155a..00000000 --- a/server/vbv_lernwelt/core/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/server/vbv_lernwelt/core/tests/__init__.py b/server/vbv_lernwelt/core/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/core/tests/factories.py b/server/vbv_lernwelt/core/tests/factories.py new file mode 100644 index 00000000..dfe56660 --- /dev/null +++ b/server/vbv_lernwelt/core/tests/factories.py @@ -0,0 +1,13 @@ +import factory +from django.contrib.auth import get_user_model +from django.contrib.auth.hashers import make_password + + +class SimpleUserFactory(factory.django.DjangoModelFactory): + class Meta: + model = get_user_model() + django_get_or_create = ("username",) + + username = factory.Sequence(lambda n: "user%d" % n) + email = factory.LazyAttribute(lambda obj: "%s@example.com" % obj.username) + password = make_password("pw") diff --git a/server/vbv_lernwelt/core/tests/test_utils.py b/server/vbv_lernwelt/core/tests/test_utils.py new file mode 100644 index 00000000..ff47f2e9 --- /dev/null +++ b/server/vbv_lernwelt/core/tests/test_utils.py @@ -0,0 +1,12 @@ +from unittest import skip + +from django.test import TestCase + + +class SimpleTestCase(TestCase): + def test_simple(self): + self.assertEqual(1, 1) + + @skip("Do not fail in pipelines") + def test_fail(self): + self.assertEqual(1, 2)