This commit is contained in:
Iliyan Angelov
2025-09-19 11:58:53 +03:00
parent 306b20e24a
commit 6b247e5b9f
11423 changed files with 1500615 additions and 778 deletions

View File

@@ -0,0 +1,11 @@
#!/usr/bin/env python
from django_prometheus.utils import PowersOf
class TestDjangoPrometheus:
def testPowersOf(self):
"""Tests utils.PowersOf."""
assert PowersOf(2, 4) == [0, 1, 2, 4, 8]
assert PowersOf(3, 5, lower=1) == [0, 3, 9, 27, 81, 243]
assert PowersOf(2, 4, include_zero=False) == [1, 2, 4, 8]
assert PowersOf(2, 6, lower=2, include_zero=False) == [4, 8, 16, 32, 64, 128]

View File

@@ -0,0 +1,29 @@
#!/usr/bin/env python
import socket
from unittest.mock import ANY, MagicMock, call, patch
from django_prometheus.exports import SetupPrometheusEndpointOnPortRange
@patch("django_prometheus.exports.HTTPServer")
def test_port_range_available(httpserver_mock):
"""Test port range setup with an available port."""
httpserver_mock.side_effect = [socket.error, MagicMock()]
port_range = [8000, 8001]
port_chosen = SetupPrometheusEndpointOnPortRange(port_range)
assert port_chosen in port_range
expected_calls = [call(("", 8000), ANY), call(("", 8001), ANY)]
assert httpserver_mock.mock_calls == expected_calls
@patch("django_prometheus.exports.HTTPServer")
def test_port_range_unavailable(httpserver_mock):
"""Test port range setup with no available ports."""
httpserver_mock.side_effect = [socket.error, socket.error]
port_range = [8000, 8001]
port_chosen = SetupPrometheusEndpointOnPortRange(port_range)
expected_calls = [call(("", 8000), ANY), call(("", 8001), ANY)]
assert httpserver_mock.mock_calls == expected_calls
assert port_chosen is None

View File

@@ -0,0 +1,146 @@
#!/usr/bin/env python
from operator import itemgetter
import prometheus_client
import pytest
from django_prometheus.testutils import (
assert_metric_diff,
assert_metric_equal,
assert_metric_no_diff,
assert_metric_not_equal,
get_metric,
get_metric_from_frozen_registry,
get_metrics_vector,
save_registry,
)
class TestPrometheusTestCaseMixin:
@pytest.fixture
def registry(self):
return prometheus_client.CollectorRegistry()
@pytest.fixture(autouse=True)
def some_gauge(self, registry):
some_gauge = prometheus_client.Gauge("some_gauge", "Some gauge.", registry=registry)
some_gauge.set(42)
return some_gauge
@pytest.fixture(autouse=True)
def some_labelled_gauge(self, registry):
some_labelled_gauge = prometheus_client.Gauge(
"some_labelled_gauge",
"Some labelled gauge.",
["labelred", "labelblue"],
registry=registry,
)
some_labelled_gauge.labels("pink", "indigo").set(1)
some_labelled_gauge.labels("pink", "royal").set(2)
some_labelled_gauge.labels("carmin", "indigo").set(3)
some_labelled_gauge.labels("carmin", "royal").set(4)
return some_labelled_gauge
def test_get_metric(self, registry):
"""Tests get_metric."""
assert get_metric("some_gauge", registry=registry) == 42
assert (
get_metric(
"some_labelled_gauge",
registry=registry,
labelred="pink",
labelblue="indigo",
)
== 1
)
def test_get_metrics_vector(self, registry):
"""Tests get_metrics_vector."""
vector = get_metrics_vector("some_nonexistent_gauge", registry=registry)
assert vector == []
vector = get_metrics_vector("some_gauge", registry=registry)
assert vector == [({}, 42)]
vector = get_metrics_vector("some_labelled_gauge", registry=registry)
assert sorted(
[
({"labelred": "pink", "labelblue": "indigo"}, 1),
({"labelred": "pink", "labelblue": "royal"}, 2),
({"labelred": "carmin", "labelblue": "indigo"}, 3),
({"labelred": "carmin", "labelblue": "royal"}, 4),
],
key=itemgetter(1),
) == sorted(vector, key=itemgetter(1))
def test_assert_metric_equal(self, registry):
"""Tests assert_metric_equal."""
# First we test that a scalar metric can be tested.
assert_metric_equal(42, "some_gauge", registry=registry)
assert_metric_not_equal(43, "some_gauge", registry=registry)
# Here we test that assert_metric_equal fails on nonexistent gauges.
assert_metric_not_equal(42, "some_nonexistent_gauge", registry=registry)
# Here we test that labelled metrics can be tested.
assert_metric_equal(
1,
"some_labelled_gauge",
registry=registry,
labelred="pink",
labelblue="indigo",
)
assert_metric_not_equal(
1,
"some_labelled_gauge",
registry=registry,
labelred="tomato",
labelblue="sky",
)
def test_registry_saving(self, registry, some_gauge, some_labelled_gauge):
"""Tests save_registry and frozen registries operations."""
frozen_registry = save_registry(registry=registry)
# Test that we can manipulate a frozen scalar metric.
assert get_metric_from_frozen_registry("some_gauge", frozen_registry) == 42
some_gauge.set(99)
assert get_metric_from_frozen_registry("some_gauge", frozen_registry) == 42
assert_metric_diff(frozen_registry, 99 - 42, "some_gauge", registry=registry)
assert_metric_no_diff(frozen_registry, 1, "some_gauge", registry=registry)
# Now test the same thing with a labelled metric.
assert (
get_metric_from_frozen_registry(
"some_labelled_gauge",
frozen_registry,
labelred="pink",
labelblue="indigo",
)
== 1
)
some_labelled_gauge.labels("pink", "indigo").set(5)
assert (
get_metric_from_frozen_registry(
"some_labelled_gauge",
frozen_registry,
labelred="pink",
labelblue="indigo",
)
== 1
)
assert_metric_diff(
frozen_registry,
5 - 1,
"some_labelled_gauge",
registry=registry,
labelred="pink",
labelblue="indigo",
)
assert_metric_no_diff(
frozen_registry,
1,
"some_labelled_gauge",
registry=registry,
labelred="pink",
labelblue="indigo",
)