autogenerated_test.go

  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}