"""The exact calls mailadmin (https://git.neuf.no/edb/mailadmin, see mailadmin/api.py) makes, and what it reads.""" import pytest from dpdapi.models import Alias, Domain # mailadmin's PrefixQueryset.as_regex() for the prefixes "ops" and "yolo" PREFIX_REGEX = "^ops-|^ops@|^yolo-|^yolo@" @pytest.fixture def aliases(domain): other = Domain.objects.create(name="other.org") Alias.objects.create(source="ops-alert@example.com", destination="ninja@example.com", domain=domain) Alias.objects.create(source="yolo@example.com", destination="ninja@example.com", domain=domain) Alias.objects.create(source="nope-list@example.com", destination="ninja@example.com", domain=domain) Alias.objects.create(source="ops@other.org", destination="ninja@other.org", domain=other) def test_list_domains(api, domain): res = api.get("/api/domains/", {"name": "example.com"}) assert res.status_code == 200 assert [(d["id"], d["name"]) for d in res.json()] == [(domain.pk, "example.com")] def test_list_aliases_regex(api, aliases): res = api.get("/api/aliases/", {"domain__name": "example.com", "source__iregex": PREFIX_REGEX}) assert res.status_code == 200 assert sorted(a["source"] for a in res.json()) == ["ops-alert@example.com", "yolo@example.com"] assert all({"id", "source", "destination"} <= set(a) for a in res.json()) def test_create_aliases(api, domain): data = [ {"source": "ops-new@example.com", "destination": "a@example.com", "domain": domain.pk}, {"source": "ops-new@example.com", "destination": "B@Example.com", "domain": domain.pk}, ] res = api.post("/api/aliases/create_bulk/", data, content_type="application/json") assert res.status_code == 201 body = res.json() assert [(a["source"], a["destination"]) for a in body] == [ ("ops-new@example.com", "a@example.com"), ("ops-new@example.com", "b@example.com"), ] assert [a["id"] for a in body] == list(Alias.objects.order_by("pk").values_list("pk", flat=True)) def test_create_aliases_case_insensitive_duplicate(api, aliases, domain): data = [{"source": "OPS-alert@example.com", "destination": "Ninja@example.com", "domain": domain.pk}] res = api.post("/api/aliases/create_bulk/", data, content_type="application/json") assert res.status_code == 201 assert Alias.objects.count() == 4 def test_delete_aliases(api, aliases, domain): data = [{"source": "ops-alert@example.com", "destination": "ninja@example.com", "domain": domain.pk}] res = api.delete("/api/aliases/delete_bulk/", data, content_type="application/json") assert res.status_code == 204 assert res.content == b"" # mailadmin turns a non-JSON body into None def test_delete_aliases_partially_missing(api, aliases, domain): data = [ {"source": "ops-alert@example.com", "destination": "ninja@example.com", "domain": domain.pk}, {"source": "ops-alert@example.com", "destination": "ghost@example.com", "domain": domain.pk}, ] res = api.delete("/api/aliases/delete_bulk/", data, content_type="application/json") assert res.status_code == 200 assert "ops-alert@example.com=ghost@example.com" in res.json()["result"] def test_errors_are_json(api, domain): data = [{"source": "bad", "destination": "a@example.com", "domain": domain.pk}] res = api.post("/api/aliases/create_bulk/", data, content_type="application/json") assert res.status_code == 400 assert res.json() def test_bad_credentials_are_json(client, db): client.defaults["HTTP_AUTHORIZATION"] = "Basic YWRtaW46d3Jvbmc=" res = client.get("/api/domains/") assert res.status_code == 401 assert res.json()