#!/usr/bin/env python3 """Focused tests for the Go package naming guardrail.""" from __future__ import annotations import importlib.util import tempfile import unittest from pathlib import Path SCRIPT = Path(__file__).with_name("check-go-package-names.py") SPEC = importlib.util.spec_from_file_location("check_go_package_names", SCRIPT) MODULE = importlib.util.module_from_spec(SPEC) assert SPEC.loader is not None SPEC.loader.exec_module(MODULE) class GoPackageNamesTest(unittest.TestCase): def scan(self, files: dict[str, str]) -> list[str]: with tempfile.TemporaryDirectory() as temporary: repo = Path(temporary) paths: list[Path] = [] for name, content in files.items(): path = repo / name path.parent.mkdir(parents=True, exist_ok=True) path.write_text(content) paths.append(path) return MODULE.scan(repo, paths) def test_accepts_matching_package_and_external_tests(self) -> None: self.assertEqual( [], self.scan( { "internal/service/message/service.go": "package message\n", "internal/service/message/service_test.go": "package message_test\n", } ), ) def test_accepts_descriptive_main_directory(self) -> None: self.assertEqual( [], self.scan({"cmd/agentteam-server/main.go": "package main\n"}), ) def test_rejects_underscore_and_directory_mismatch(self) -> None: failures = self.scan( {"internal/api/repository_tokens/routes.go": "package repository_tokens\n"} ) self.assertEqual(1, len(failures)) self.assertIn("no underscores", failures[0]) failures = self.scan( {"internal/service/message/service.go": "package messaging\n"} ) self.assertEqual(1, len(failures)) self.assertIn("must match directory basename", failures[0]) def test_rejects_mixed_production_packages(self) -> None: failures = self.scan( { "internal/service/message/a.go": "package message\n", "internal/service/message/b.go": "package messaging\n", } ) self.assertEqual(1, len(failures)) self.assertIn("multiple production packages", failures[0]) def test_excludes_external_and_fixture_trees(self) -> None: self.assertEqual( [], self.scan( { "x/vendor/bad_name/source.go": "package Bad_Name\n", "kits/agentteam-insight/testdata/smoke/fixture-repo/" "internal/bad_name/source.go": "package Bad_Name\n", } ), ) def test_rejects_stale_package_comment(self) -> None: failures = self.scan( { "internal/service/message/service.go": "// Package messaging owns messages.\npackage message\n" } ) self.assertEqual(1, len(failures)) self.assertIn("package comment names 'messaging'", failures[0]) def test_rejects_retired_import_string_outside_go_source(self) -> None: module_prefix = MODULE.MODULE_PREFIX + "/" with tempfile.TemporaryDirectory() as temporary: repo = Path(temporary) path = repo / "docs/example.md" path.parent.mkdir(parents=True) path.write_text(module_prefix + "internal/api/workflowrun") failures = MODULE.scan_retired_import_strings(repo, [path]) self.assertEqual(1, len(failures)) self.assertIn("retired Go import path", failures[0]) if __name__ == "__main__": unittest.main()