Skip to content

Commit 7b644bc

Browse files
Éxecution de quelques tests ops (#3698)
* Work on ops tests * Add tests for email records * CI job: add name * Add more DKIM records
1 parent 5e5b00a commit 7b644bc

File tree

2 files changed

+95
-17
lines changed

2 files changed

+95
-17
lines changed

.github/workflows/ops_tests.yml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
name: CI ops tests
2+
on: push
3+
4+
jobs:
5+
test:
6+
runs-on: ubuntu-latest
7+
name: Run ops tests
8+
steps:
9+
- uses: actions/checkout@v4
10+
- uses: erlef/setup-beam@v1
11+
with:
12+
version-file: .tool-versions
13+
version-type: strict
14+
- run: elixir ops_tests/ops_tests.exs

ops_tests/ops_tests.exs

+81-17
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,21 @@
33
ExUnit.start()
44

55
Mix.install([
6-
{:req, "~> 0.2.1"}
6+
{:req, "~> 0.4.8"},
7+
{:dns, "~> 2.4.0"}
78
])
89

910
defmodule Transport.OpsTests do
10-
use ExUnit.Case
11+
use ExUnit.Case, async: true
1112

12-
def get_header!(headers, header) do
13-
{_header, value} =
14-
headers
15-
|> Enum.find(fn {k, _} -> k == header end)
16-
17-
value
18-
end
19-
20-
def assert_redirect(from: url, to: target_url) do
21-
%{status: 301, headers: headers} =
22-
Req.build(:get, url)
23-
|> Req.run!()
24-
25-
assert get_header!(headers, "location") == target_url
26-
end
13+
# See https://developers.clever-cloud.com/doc/administrate/domain-names/#your-application-runs-in-the-europeparis-par-zone
14+
@domain_name "transport.data.gouv.fr"
15+
@clever_cloud_ip_addresses [
16+
{46, 252, 181, 103},
17+
{46, 252, 181, 104},
18+
{185, 42, 117, 108},
19+
{185, 42, 117, 109}
20+
]
2721

2822
test "correct DOMAIN_NAME for prod-worker" do
2923
assert_redirect(
@@ -38,4 +32,74 @@ defmodule Transport.OpsTests do
3832
to: "https://workers.prochainement.transport.data.gouv.fr/"
3933
)
4034
end
35+
36+
test "redirects from www to non-www" do
37+
assert_redirect(from: "https://www.#{@domain_name}", to: "https://#{@domain_name}/")
38+
end
39+
40+
describe "Check DNS records" do
41+
test "main A/CNAME records" do
42+
{:ok, ips} = DNS.resolve(@domain_name, :a)
43+
assert MapSet.new(ips) == MapSet.new(@clever_cloud_ip_addresses)
44+
45+
# CNAMEs to Clever Cloud
46+
[
47+
"prochainement",
48+
"proxy",
49+
"proxy.prochainement",
50+
"validation",
51+
"workers",
52+
"workers.prochainement",
53+
"www"
54+
]
55+
|> Enum.each(fn subdomain ->
56+
record = "#{subdomain}.#{@domain_name}"
57+
assert {:ok, [~c"domain.par.clever-cloud.com"]} == DNS.resolve(record, :cname), "Wrong DNS record for #{record}"
58+
end)
59+
60+
# Satellite websites
61+
assert {:ok, [~c"transport-blog.netlify.app"]} == DNS.resolve("blog.#{@domain_name}", :cname)
62+
assert {:ok, [~c"transport-contribuer.netlify.app"]} == DNS.resolve("contribuer.#{@domain_name}", :cname)
63+
assert {:ok, [~c"hosting.gitbook.com"]} == DNS.resolve("doc.#{@domain_name}", :cname)
64+
assert {:ok, [~c"stats.uptimerobot.com"]} == DNS.resolve("status.#{@domain_name}", :cname)
65+
end
66+
67+
test "MX records" do
68+
{:ok, records} = DNS.resolve(@domain_name, :mx)
69+
assert MapSet.new([{10, ~c"mx1.alwaysdata.com"}, {20, ~c"mx2.alwaysdata.com"}]) == MapSet.new(records)
70+
assert {:ok, [{100, ~c"mx.sendgrid.net"}]} = DNS.resolve("front-mail.#{@domain_name}", :mx)
71+
end
72+
73+
test "SPF, DKIM and DMARC" do
74+
# SPF
75+
{:ok, records} = DNS.resolve(@domain_name, :txt)
76+
77+
assert Enum.member?(records, [
78+
~c"v=spf1 include:spf.mailjet.com include:_spf.alwaysdata.com include:_spf.scw-tem.cloud include:servers.mcsv.net -all"
79+
])
80+
81+
assert {:ok, [[~c"v=spf1 include:sendgrid.net ~all"]]} = DNS.resolve("front-mail.#{@domain_name}", :txt)
82+
83+
# DKIM
84+
assert {:ok, _} = DNS.resolve("37d278a7-e548-4029-a58d-111bdcf23d46._domainkey.#{@domain_name}", :txt)
85+
assert {:ok, _} = DNS.resolve("default._domainkey.#{@domain_name}", :txt)
86+
assert {:ok, _} = DNS.resolve("fnt._domainkey.#{@domain_name}", :txt)
87+
assert {:ok, _} = DNS.resolve("mailjet._domainkey.#{@domain_name}", :txt)
88+
assert {:ok, [~c"dkim2.mcsv.net"]} == DNS.resolve("k2._domainkey.#{@domain_name}", :cname)
89+
assert {:ok, [~c"dkim3.mcsv.net"]} == DNS.resolve("k3._domainkey.#{@domain_name}", :cname)
90+
91+
# DMARC
92+
assert {:ok, [[~c"v=DMARC1;p=quarantine;"]]} == DNS.resolve("_dmarc.#{@domain_name}", :txt)
93+
end
94+
end
95+
96+
def get_header!(headers, header) do
97+
{_header, [value]} = Enum.find(headers, fn {k, _} -> k == header end)
98+
value
99+
end
100+
101+
def assert_redirect(from: url, to: target_url) do
102+
%Req.Response{status: 301, headers: headers} = Req.get!(url, redirect: false)
103+
assert get_header!(headers, "location") == target_url
104+
end
41105
end

0 commit comments

Comments
 (0)