package mapping import ( "os/exec" "strings" "testing" ) // The bridge translates values and nothing else: no network, no filesystem, no // clock, no configuration. Every one of those is a caller's to supply, which is // what lets this package be reasoned about and tested without a Gitea anywhere. // // Two imports and no more: internal/issue for what an issue is, and // internal/wire for the shapes on the other side. wire is allowed precisely // because it is inert — shapes and identifiers over the standard library, with // a layering test of its own — so naming a payload here costs nothing and // reaches nowhere. // // DIRECT imports, not the dependency walk internal/issue does. The domain // reaches os through internal/project and that is the domain's business; what // this test is about is what this package itself reaches for. A transport that // grew a helper here — or a lookup that quietly opened a config file — is what // it catches. func TestTheBridgeTranslatesAndNothingElse(t *testing.T) { forbidden := map[string]string{ "net/http": "an HTTP call belongs in the transport", "net": "an HTTP call belongs in the transport", "os": "a pure function reads no file and no environment", "os/exec": "nothing here shells out", "io/ioutil": "a pure function reads no file", "time": "the clock is the caller's; a timestamp arrives as a string", "git.noodles.cam/claude-skills/marketplace/cli/internal/gitea": "the transport imports this package, never the reverse", "git.noodles.cam/claude-skills/marketplace/cli/internal/config": "credentials and repositories are the transport's", "git.noodles.cam/claude-skills/marketplace/cli/internal/project": "nothing here resolves a path", } out, err := exec.Command("go", "list", "-f", `{{join .Imports "\n"}}`, ".").Output() if err != nil { t.Fatalf("go list: %v", err) } for _, dep := range strings.Fields(string(out)) { if why, bad := forbidden[dep]; bad { t.Errorf("mapping imports %s — %s", dep, why) } } }