package issue import ( "os/exec" "strings" "testing" ) // The domain must depend on nothing but the standard library and the one // package that answers "which directory is the project". // // In Python this rule was a grep in a document and a habit; here it is a build // graph, and the test fails the moment a tracker concept — an HTTP client, a // JSON payload, a login — is imported into the layer that must not know a // tracker exists. func TestDomainDependsOnNothing(t *testing.T) { const allowed = "git.noodles.cam/claude-skills/marketplace/cli/internal/project" out, err := exec.Command("go", "list", "-deps", ".").Output() if err != nil { t.Fatalf("go list: %v", err) } for _, dep := range strings.Fields(string(out)) { if dep == allowed || dep == "git.noodles.cam/claude-skills/marketplace/cli/internal/issue" { continue } // A standard-library import path has no dot in its first element, // because it has no domain name in front of it. first, _, _ := strings.Cut(dep, "/") if strings.Contains(first, ".") { t.Errorf("the domain imports %s — a tracker concept in the layer that must not know one exists", dep) } } } // The other half of the same rule: net/http and its friends are standard // library, so "no third-party imports" would not catch a transport written by // hand. Name them. func TestDomainDoesNotReachTheNetworkOrTheShell(t *testing.T) { forbidden := []string{"net/http", "net", "os/exec", "encoding/json"} out, err := exec.Command("go", "list", "-deps", ".").Output() if err != nil { t.Fatalf("go list: %v", err) } deps := map[string]bool{} for _, d := range strings.Fields(string(out)) { deps[d] = true } for _, f := range forbidden { if deps[f] { t.Errorf("the domain reaches %s — that belongs in the transport", f) } } }