3
3
ExUnit . start ( )
4
4
5
5
Mix . install ( [
6
- { :req , "~> 0.2.1" }
6
+ { :req , "~> 0.4.8" } ,
7
+ { :dns , "~> 2.4.0" }
7
8
] )
8
9
9
10
defmodule Transport.OpsTests do
10
- use ExUnit.Case
11
+ use ExUnit.Case , async: true
11
12
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
+ ]
27
21
28
22
test "correct DOMAIN_NAME for prod-worker" do
29
23
assert_redirect (
@@ -38,4 +32,74 @@ defmodule Transport.OpsTests do
38
32
to: "https://workers.prochainement.transport.data.gouv.fr/"
39
33
)
40
34
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
41
105
end
0 commit comments