Skip to content

Commit

Permalink
Update test_alert_rules
Browse files Browse the repository at this point in the history
Rewrite our alert rule tests to use our fixtures. This means that we no
longer need to do as much setup in the individual test cases and can
focus more on the specific logic we're testing.

Because we're using a rule from a fixture, we also need to update our
test template a bit.
  • Loading branch information
kfdm committed Dec 15, 2022
1 parent 10900ca commit 26a6c13
Showing 1 changed file with 25 additions and 43 deletions.
68 changes: 25 additions & 43 deletions promgen/tests/test_alert_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
groups:
- name: promgen.example.com
rules:
- alert: RuleName
- alert: example-rule
annotations:
rule: https://promgen.example.com/rule/%d
summary: Test case
expr: up==0
rule: https://promgen.example.com/rule/1
summary: Example rule summary
expr: up==1
for: 1s
labels:
severity: severe
severity: high
""".lstrip().encode(
"utf-8"
)
Expand All @@ -30,39 +30,18 @@


class RuleTest(tests.PromgenTest):
@mock.patch("django.dispatch.dispatcher.Signal.send")
def setUp(self, mock_signal):
self.user = self.force_login(username="demo")
self.site = models.Site.objects.get_current()
self.shard = models.Shard.objects.create(name="Shard 1")
self.service = models.Service.objects.create(id=999, name="Service 1")
self.rule = models.Rule.objects.create(
name="RuleName",
clause="up==0",
duration="1s",
obj=self.site,
)
models.RuleLabel.objects.create(
name="severity",
value="severe",
rule=self.rule,
)
models.RuleAnnotation.objects.create(
name="summary",
value="Test case",
rule=self.rule,
)
fixtures = ["testcases.yaml", "extras.yaml"]

@override_settings(PROMGEN_SCHEME="https")
@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_write_new(self, mock_post):
result = prometheus.render_rules()
self.assertEqual(result, _RULE_V2 % self.rule.id)
self.assertEqual(result, _RULE_V2)

@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_copy(self, mock_post):
service = models.Service.objects.create(name="Service 2")
copy = self.rule.copy_to(content_type="service", object_id=service.id)
rule = models.Rule.objects.get(pk=1)
copy = rule.copy_to(content_type="service", object_id=2)
# Test that our copy has the same labels and annotations
self.assertIn("severity", copy.labels)
self.assertIn("summary", copy.annotations)
Expand All @@ -77,6 +56,7 @@ def test_copy(self, mock_post):
@override_settings(PROMGEN=TEST_SETTINGS)
@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_import_v2(self, mock_post):
self.user = self.force_login(username="demo")
self.add_user_permissions("promgen.change_rule", "promgen.change_site")
response = self.client.post(
reverse("rule-import"),
Expand All @@ -93,12 +73,11 @@ def test_import_v2(self, mock_post):
@override_settings(PROMGEN=TEST_SETTINGS)
@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_import_project_rule(self, mock_post):
self.user = self.force_login(username="demo")
self.add_user_permissions("promgen.add_rule", "promgen.change_project")
project = models.Project.objects.create(
name="Project 1", service=self.service, shard=self.shard
)

response = self.client.post(
reverse("rule-new", kwargs={"content_type": "project", "object_id": project.id}),
reverse("rule-new", kwargs={"content_type": "project", "object_id": 1}),
{"rules": tests.Data("examples", "import.rule.yml").raw()},
follow=True,
)
Expand All @@ -110,11 +89,12 @@ def test_import_project_rule(self, mock_post):
@override_settings(PROMGEN=TEST_SETTINGS)
@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_import_service_rule(self, mock_post):
self.user = self.force_login(username="demo")
self.add_user_permissions("promgen.add_rule", "promgen.change_service")
response = self.client.post(
reverse(
"rule-new",
kwargs={"content_type": "service", "object_id": self.service.id},
kwargs={"content_type": "service", "object_id": 1},
),
{"rules": tests.Data("examples", "import.rule.yml").raw()},
follow=True,
Expand All @@ -136,15 +116,16 @@ def test_missing_permission(self, mock_post):

@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_macro(self, mock_post):
self.project = models.Project.objects.create(
name="Project 1", service=self.service, shard=self.shard
)
self.site = models.Site.objects.get(pk=1)
self.service = models.Service.objects.get(pk=1)
self.project = models.Project.objects.get(pk=1)

clause = "up{%s}" % macro.EXCLUSION_MACRO

rules = {
"common": {"assert": 'up{service!~"Service 1"}'},
"service": {"assert": 'up{service="Service 1",project!~"Project 1"}'},
"project": {"assert": 'up{service="Service 1",project="Project 1",}'},
"common": {"assert": 'up{service!~"test-service"}'},
"service": {"assert": 'up{service="test-service",project!~"test-project"}'},
"project": {"assert": 'up{service="test-service",project="test-project",}'},
}

common_rule = models.Rule.objects.create(
Expand All @@ -162,7 +143,8 @@ def test_macro(self, mock_post):
@override_settings(PROMGEN=TEST_SETTINGS)
@mock.patch("django.dispatch.dispatcher.Signal.send")
def test_invalid_annotation(self, mock_post):
rule = models.Rule.objects.get(pk=1)
# $label.foo is invalid (should be $labels) so make sure we raise an exception
models.RuleAnnotation.objects.create(name="summary", value="{{$label.foo}}", rule=self.rule)
models.RuleAnnotation.objects.create(name="summary", value="{{$label.foo}}", rule=rule)
with self.assertRaises(ValidationError):
prometheus.check_rules([self.rule])
prometheus.check_rules([rule])

0 comments on commit 26a6c13

Please sign in to comment.