summaryrefslogtreecommitdiff
path: root/internal/cli/codeberg_newclient_callsites_test.go
blob: aca70c0b8c3403b2ef04da8b73414ab568b75ed2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()
}