diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_terraform_import.py b/tests/test_terraform_import.py new file mode 100644 index 00000000..a99935d2 --- /dev/null +++ b/tests/test_terraform_import.py @@ -0,0 +1,20 @@ +"""Tests for Terraform resource name validation""" +import sys, os, unittest +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "tools")) +from terraform_import import validate_resource_name + +class TestValidateResourceName(unittest.TestCase): + def test_valid_standard(self): + for n in ["my_resource", "MyResource", "resource_1", "test"]: + v, m = validate_resource_name(n) + self.assertTrue(v, f"{n}: {m}") + def test_hyphen_rejected(self): + v, m = validate_resource_name("my-resource") + self.assertFalse(v); self.assertIn("hyphen", m.lower()) + def test_empty_rejected(self): + v, m = validate_resource_name(""); self.assertFalse(v) + def test_invalid_chars(self): + for n in ["123abc", "my.resource", "my resource"]: + self.assertFalse(validate_resource_name(n)[0]) +if __name__ == "__main__": + unittest.main() diff --git a/tools/terraform_import.py b/tools/terraform_import.py index 9241ef31..1c1c88db 100644 --- a/tools/terraform_import.py +++ b/tools/terraform_import.py @@ -120,6 +120,23 @@ class ImportResult: # IMPORTER # --------------------------------------------------------------------------- + +import re + +def validate_resource_name(name): + """Validate a Terraform resource name. Returns (is_valid, error_message). + Resource names must match: [a-zA-Z_][a-zA-Z0-9_]*. + Hyphens are not allowed in Terraform resource names. + """ + if not name: + return False, "Resource name cannot be empty" + if "-" in name: + return False, f"Resource name '{name}' contains hyphens, which can corrupt Terraform state" + if not re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name): + return False, f"Resource name '{name}' is not a valid Terraform identifier" + return True, "" + + class TerraformImporter: def __init__(self, state_dir: str = ".", terraform_binary: str = "terraform"): self.state_dir = Path(state_dir)