summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-28 10:37:12 +0300
committerPaul Buetow <paul@buetow.org>2026-05-28 10:37:12 +0300
commitcda151ec9654fd8b4d043668da21f909477f5e9c (patch)
tree0838bf873707636f244eac5d6d3b6aa3e7a8a00b
parent5ffe9658f0c752e899e99b91ef17d0f1baff7325 (diff)
test(cli): add codeberg constructor callsite regression (iq)
-rw-r--r--internal/cli/codeberg_newclient_callsites_test.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/internal/cli/codeberg_newclient_callsites_test.go b/internal/cli/codeberg_newclient_callsites_test.go
new file mode 100644
index 0000000..aca70c0
--- /dev/null
+++ b/internal/cli/codeberg_newclient_callsites_test.go
@@ -0,0 +1,99 @@
+package cli
+
+import (
+ "bytes"
+ "go/ast"
+ "go/parser"
+ "go/printer"
+ "go/token"
+ "path/filepath"
+ "runtime"
+ "testing"
+)
+
+func TestCodebergNewClientCallsitesUseTokenThenOrg(t *testing.T) {
+ t.Parallel()
+
+ _, thisFile, _, ok := runtime.Caller(0)
+ if !ok {
+ t.Fatal("failed to resolve test file path")
+ }
+ cliDir := filepath.Dir(thisFile)
+
+ // Keep this list explicit so regressions in known call-site files fail loudly.
+ targetFiles := []string{
+ "forge_client.go",
+ "description_sync.go",
+ "showcase_only_handler.go",
+ "sync_handlers.go",
+ }
+
+ fset := token.NewFileSet()
+ totalCalls := 0
+
+ for _, name := range targetFiles {
+ path := filepath.Join(cliDir, name)
+ file, err := parser.ParseFile(fset, path, nil, 0)
+ if err != nil {
+ t.Fatalf("parse %s: %v", name, err)
+ }
+
+ ast.Inspect(file, func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ pkg, ok := sel.X.(*ast.Ident)
+ if !ok || pkg.Name != "codeberg" || sel.Sel.Name != "NewClient" {
+ return true
+ }
+
+ totalCalls++
+ if len(call.Args) != 2 {
+ t.Errorf("%s: codeberg.NewClient arg count = %d, want 2", name, len(call.Args))
+ return true
+ }
+
+ firstField := selectorField(call.Args[0])
+ secondField := selectorField(call.Args[1])
+ if firstField != "CodebergToken" || secondField != "Name" {
+ t.Errorf(
+ "%s: codeberg.NewClient arg order mismatch: got (%s, %s), want (CodebergToken, Name)",
+ name,
+ exprString(fset, call.Args[0]),
+ exprString(fset, call.Args[1]),
+ )
+ }
+
+ return true
+ })
+ }
+
+ if totalCalls == 0 {
+ t.Fatal("expected at least one codeberg.NewClient call in CLI call-site files")
+ }
+}
+
+func selectorField(expr ast.Expr) string {
+ sel, ok := expr.(*ast.SelectorExpr)
+ if !ok {
+ return ""
+ }
+ if sel.Sel == nil {
+ return ""
+ }
+ return sel.Sel.Name
+}
+
+func exprString(fset *token.FileSet, expr ast.Expr) string {
+ var b bytes.Buffer
+ if err := printer.Fprint(&b, fset, expr); err != nil {
+ return "<print error>"
+ }
+ return b.String()
+}