76 lines
3.1 KiB
HCL
76 lines
3.1 KiB
HCL
# =============================================================================
|
|
# TESTS TERRAFORM NATIFS (terraform test)
|
|
# =============================================================================
|
|
# Exécutés par la CI (validate.yml) avec des providers MOCKÉS : aucun appel
|
|
# réel à Cloudflare, Vault, ou autre. On vérifie la logique de construction
|
|
# (locals, for_each) — notamment le bug historique "hostname construit avec
|
|
# le zone ID au lieu du nom de domaine", qui ne peut plus revenir.
|
|
# =============================================================================
|
|
|
|
mock_provider "cloudflare" {}
|
|
mock_provider "tls" {}
|
|
mock_provider "http" {}
|
|
|
|
mock_provider "vault" {
|
|
# Les data sources vault_generic_secret renvoient ces valeurs factices
|
|
# (les clés couvrent secret/cloudflare ET secret/authentik)
|
|
mock_data "vault_generic_secret" {
|
|
defaults = {
|
|
data = {
|
|
api_token = "mock-api-token"
|
|
account_id = "mock-account-id"
|
|
zone_id_org = "0123456789abcdef0123456789abcdef"
|
|
email = "[email protected]"
|
|
client_id_cloudflare = "mock-client-id"
|
|
secret_cloudflare = "mock-secret"
|
|
directory_id = "mock-directory-id"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
variables {
|
|
vault_token = "mock-token"
|
|
}
|
|
|
|
run "hostnames_utilisent_le_nom_de_zone" {
|
|
command = plan
|
|
|
|
# Les URLs publiques sont construites avec le NOM de la zone…
|
|
assert {
|
|
condition = output.applications_urls["homeassistant"] == "https://home.tips-of-mine.org"
|
|
error_message = "L'URL publique de homeassistant doit être https://home.tips-of-mine.org (nom de zone, pas zone ID)"
|
|
}
|
|
|
|
# …et les règles d'ingress du tunnel aussi (le bug historique utilisait
|
|
# le zone ID hexadécimal ici)
|
|
assert {
|
|
condition = contains(
|
|
[for r in cloudflare_zero_trust_tunnel_cloudflared_config.home_tunnel_config.config.ingress : try(r.hostname, "")],
|
|
"home.tips-of-mine.org"
|
|
)
|
|
error_message = "L'ingress du tunnel doit contenir le hostname home.tips-of-mine.org"
|
|
}
|
|
|
|
# Aucun hostname d'ingress ne doit contenir le zone ID mocké
|
|
assert {
|
|
condition = length([
|
|
for r in cloudflare_zero_trust_tunnel_cloudflared_config.home_tunnel_config.config.ingress :
|
|
r if can(regex("0123456789abcdef", try(r.hostname, "")))
|
|
]) == 0
|
|
error_message = "Un hostname d'ingress contient le zone ID : régression du bug zone ID vs nom de domaine"
|
|
}
|
|
|
|
# La règle catch-all 404 doit rester la dernière règle d'ingress
|
|
assert {
|
|
condition = element(cloudflare_zero_trust_tunnel_cloudflared_config.home_tunnel_config.config.ingress, length(cloudflare_zero_trust_tunnel_cloudflared_config.home_tunnel_config.config.ingress) - 1).service == "http_status:404"
|
|
error_message = "La dernière règle d'ingress doit être le catch-all http_status:404"
|
|
}
|
|
|
|
# Chaque application du tfvars a bien son enregistrement DNS
|
|
assert {
|
|
condition = length(cloudflare_dns_record.applications) == length(var.applications)
|
|
error_message = "Chaque application doit avoir exactement un enregistrement DNS"
|
|
}
|
|
}
|