diff --git a/settings/dev.py b/settings/dev.py index efde469..bd05b18 100644 --- a/settings/dev.py +++ b/settings/dev.py @@ -15,6 +15,7 @@ PROMETHEUS_ENABLED = True # Settings required for tests +SECRET_KEY = "test" DATABASES = { "default": dj_database_url.parse( env( @@ -30,6 +31,7 @@ "task_processor", ] MIDDLEWARE = [ + "django.middleware.common.CommonMiddleware", "common.gunicorn.middleware.RouteLoggerMiddleware", ] LOG_FORMAT = "json" diff --git a/src/common/core/urls.py b/src/common/core/urls.py index b0641b5..0dc2fa6 100644 --- a/src/common/core/urls.py +++ b/src/common/core/urls.py @@ -4,9 +4,9 @@ from common.core import views urlpatterns = [ - path("version", views.version_info), - path("health/liveness", views.liveness), - path("health/readiness", include("health_check.urls", namespace="health")), + path("version/", views.version_info), + path("health/liveness/", views.liveness), + path("health/readiness/", include("health_check.urls", namespace="health")), re_path(r"^health", include("health_check.urls", namespace="health-deprecated")), # Aptible health checks must be on /healthcheck and cannot redirect # see https://www.aptible.com/docs/core-concepts/apps/connecting-to-apps/app-endpoints/https-endpoints/health-checks @@ -14,4 +14,4 @@ ] if settings.PROMETHEUS_ENABLED: - urlpatterns += [path("metrics", views.metrics)] + urlpatterns += [path("metrics/", views.metrics)] diff --git a/tests/conftest.py b/tests/conftest.py index 30c5b08..0f0e692 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1 +1,26 @@ +import os +from importlib import reload + +import prometheus_client +import prometheus_client.values +import pytest + pytest_plugins = "flagsmith-test-tools" + + +@pytest.fixture(scope="session") +def prometheus_multiproc_dir(tmp_path_factory: pytest.TempPathFactory) -> str: + os.environ["PROMETHEUS_MULTIPROC_DIR"] = prometheus_multiproc_dir_path = str( + tmp_path_factory.mktemp("prometheus_multiproc") + ) + reload(prometheus_client.values) + return prometheus_multiproc_dir_path + + +@pytest.fixture(scope="session") +def test_metric(prometheus_multiproc_dir: str) -> prometheus_client.Counter: + return prometheus_client.Counter( + "pytest_tests_run_total", + "Total number of tests run by pytest", + ["test_name"], + ) diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/core/__init__.py b/tests/integration/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/core/test_views.py b/tests/integration/core/test_views.py new file mode 100644 index 0000000..eed1757 --- /dev/null +++ b/tests/integration/core/test_views.py @@ -0,0 +1,34 @@ +import prometheus_client +from rest_framework.test import APIClient + + +def test_liveness_probe__return_expected( + client: APIClient, +) -> None: + response = client.get("/health/liveness/") + assert response.status_code == 200 + assert response.json() == {"status": "ok"} + + +def test_metrics__return_expected( + test_metric: prometheus_client.Counter, + client: APIClient, +) -> None: + # Arrange + test_metric.labels(test_name="test_metrics__return_expected").inc() + + # Act + response = client.get("/metrics", follow=True) + + # Assert + assert response.status_code == 200 + assert response.content == ( + "\n".join( + [ + "# HELP pytest_tests_run_total Total number of tests run by pytest", + "# TYPE pytest_tests_run_total counter", + 'pytest_tests_run_total{test_name="test_metrics__return_expected"} 1.0', + "", + ] + ).encode() + ) diff --git a/tests/unit/common/test_tools/test_plugin.py b/tests/unit/common/test_tools/test_plugin.py index 1b9b138..c2b9ae7 100644 --- a/tests/unit/common/test_tools/test_plugin.py +++ b/tests/unit/common/test_tools/test_plugin.py @@ -4,15 +4,10 @@ from common.test_tools import AssertMetricFixture from common.test_tools.plugin import assert_metric_impl -test_metric = prometheus_client.Counter( - "pytest_tests_run_total", - "Total number of tests run by pytest", - ["test_name"], -) - def test_assert_metrics__asserts_expected( assert_metric: AssertMetricFixture, + test_metric: prometheus_client.Counter, ) -> None: # Given test_metric.labels(test_name="test_assert_metrics__asserts_expected").inc() @@ -25,7 +20,9 @@ def test_assert_metrics__asserts_expected( ) -def test_assert_metrics__registry_reset_expected() -> None: +def test_assert_metrics__registry_reset_expected( + test_metric: prometheus_client.Counter, +) -> None: # Given test_metric.labels(test_name="test_assert_metrics__registry_reset_expected").inc()