from pathlib import Path from scripts.module_graph import build_module_graph def _write(p: Path, body: str) -> None: p.parent.mkdir(parents=True, exist_ok=True) p.write_text(body) def test_resolves_relative_source(tmp_path): _write(tmp_path / "modules/app-role/main.tf", 'resource "aws_iam_role" "this" {}\n') _write(tmp_path / "live/prod/app/main.tf", ''' module "app_role" { source = "../../../modules/app-role" } ''') g = build_module_graph(tmp_path) assert g["modules/app-role"].callsites == ["live/prod/app"] def test_multiple_callsites_sorted(tmp_path): _write(tmp_path / "modules/app-role/main.tf", "resource \"x\" \"y\" {}\n") _write(tmp_path / "live/staging/app/main.tf", 'module "r" { source = "../../../modules/app-role" }\n') _write(tmp_path / "live/prod/app/main.tf", 'module "r" { source = "../../../modules/app-role" }\n') g = build_module_graph(tmp_path) assert g["modules/app-role"].callsites == [ "live/prod/app", "live/staging/app", ] def test_ignores_registry_and_git_sources(tmp_path): _write(tmp_path / "live/prod/app/main.tf", ''' module "vpc" { source = "terraform-aws-modules/vpc/aws" } module "other" { source = "git::https://example.com/x.git" } ''') g = build_module_graph(tmp_path) assert g == {} def test_siblings_at_callsites_collected(tmp_path): _write(tmp_path / "modules/app-role/main.tf", "resource \"x\" \"y\" {}\n") _write(tmp_path / "modules/iam-policy-doc/main.tf", "resource \"x\" \"y\" {}\n") _write(tmp_path / "live/prod/app/main.tf", ''' module "role" { source = "../../../modules/app-role" } module "policy" { source = "../../../modules/iam-policy-doc" } ''') g = build_module_graph(tmp_path) assert g["modules/app-role"].callsites == ["live/prod/app"] assert "modules/iam-policy-doc" in g["modules/app-role"].sibling_modules_at_callsites def test_callsite_local_names_track_sibling_modules(tmp_path): _write(tmp_path / "modules/app-role/main.tf", 'resource "aws_iam_role" "this" {}\n') _write(tmp_path / "modules/app-policy/main.tf", 'resource "aws_iam_policy" "this" {}\n') _write(tmp_path / "live/prod/app/main.tf", ''' module "role" { source = "../../../modules/app-role" } module "policy" { source = "../../../modules/app-policy" } ''') g = build_module_graph(tmp_path) assert g["modules/app-role"].callsite_local_names == { "live/prod/app": { "policy": "modules/app-policy", "role": "modules/app-role", } } assert g["modules/app-policy"].callsite_local_names == { "live/prod/app": { "policy": "modules/app-policy", "role": "modules/app-role", } }