1package server
2
3import (
4 "sort"
5 "testing"
6)
7
8func TestIsAutogeneratedPath(t *testing.T) {
9 tests := []struct {
10 path string
11 expected bool
12 }{
13 // Not autogenerated
14 {"main.go", false},
15 {"server/handler.go", false},
16 {"README.md", false},
17 {"src/app.ts", false},
18
19 // Autogenerated by extension
20 {"api.pb.go", true},
21 {"api.pb.gw.go", true},
22 {"stringer_string.go", true}, // stringer output for type "stringer"
23 {"day_string.go", true},
24 {"types.gen.go", true},
25 {"types.generated.go", true},
26 {"types_generated.go", true},
27 {"service.mock.go", true},
28 {"service_mock.go", true},
29 {"bundle.min.js", true},
30 {"styles.min.css", true},
31 {"types.d.ts", true},
32 {"queries.sql.go", true},
33
34 // Autogenerated by directory
35 {"vendor/github.com/pkg/errors/errors.go", true},
36 {"node_modules/lodash/index.js", true},
37 {"__pycache__/module.pyc", true},
38 {"generated/models.go", true},
39 {"gen/api.go", true},
40
41 // Autogenerated lock files
42 {"go.sum", true},
43 {"package-lock.json", true},
44 {"yarn.lock", true},
45 {"pnpm-lock.yaml", true},
46 {"Cargo.lock", true},
47 {"uv.lock", true},
48 }
49
50 for _, tt := range tests {
51 t.Run(tt.path, func(t *testing.T) {
52 if got := IsAutogeneratedPath(tt.path); got != tt.expected {
53 t.Errorf("IsAutogeneratedPath(%q) = %v, want %v", tt.path, got, tt.expected)
54 }
55 })
56 }
57}
58
59func TestIsAutogeneratedGoContent(t *testing.T) {
60 tests := []struct {
61 name string
62 content string
63 expected bool
64 }{
65 {
66 name: "regular go file",
67 content: "package main\n\nfunc main() {}\n",
68 expected: false,
69 },
70 {
71 name: "code generated comment",
72 content: "// Code generated by stringer; DO NOT EDIT.\n\npackage main\n",
73 expected: true,
74 },
75 {
76 name: "do not edit",
77 content: "// DO NOT EDIT\n\npackage main\n",
78 expected: true,
79 },
80 {
81 name: "generated in comment",
82 content: "// auto-generated file\n\npackage main\n",
83 expected: true,
84 },
85 {
86 name: "bindata",
87 content: "package main\n\nfunc bindataRead(name string) ([]byte, error) {\n",
88 expected: true,
89 },
90 }
91
92 for _, tt := range tests {
93 t.Run(tt.name, func(t *testing.T) {
94 if got := isAutogeneratedGoContent([]byte(tt.content)); got != tt.expected {
95 t.Errorf("isAutogeneratedGoContent() = %v, want %v", got, tt.expected)
96 }
97 })
98 }
99}
100
101func TestGitFileInfoSortOrder(t *testing.T) {
102 // Test that files are sorted with non-generated first, then generated
103 files := []GitFileInfo{
104 {Path: "api.pb.go", IsGenerated: true},
105 {Path: "main.go", IsGenerated: false},
106 {Path: "go.sum", IsGenerated: true},
107 {Path: "handler.go", IsGenerated: false},
108 {Path: "types_generated.go", IsGenerated: true},
109 }
110
111 // Sort using the same logic as handleGitDiffFiles
112 sort.Slice(files, func(i, j int) bool {
113 if files[i].IsGenerated != files[j].IsGenerated {
114 return !files[i].IsGenerated
115 }
116 return files[i].Path < files[j].Path
117 })
118
119 // Expected order: handler.go, main.go, api.pb.go, go.sum, types_generated.go
120 expected := []string{"handler.go", "main.go", "api.pb.go", "go.sum", "types_generated.go"}
121 for i, exp := range expected {
122 if files[i].Path != exp {
123 t.Errorf("position %d: expected %s, got %s", i, exp, files[i].Path)
124 }
125 }
126}