package main import ( "os" "path/filepath" "strings" "testing" ) func TestDiscoverCodegenTargetsIncludesCoreAndPluginConfigs(t *testing.T) { repoRoot := blockNinjaRepoRoot() backendDir := filepath.Join(repoRoot, "backend") pluginRoot := filepath.Join(t.TempDir(), "plugin") writeTestFile(t, filepath.Join(pluginRoot, "plugin.mod"), "[plugin]\nname = \"example\"\nversion = \"1.0.0\"\n", 0644) writeTestFile(t, filepath.Join(pluginRoot, "sqlc.yaml"), `version: "2"`, 0644) writeTestFile(t, filepath.Join(pluginRoot, "buf.yaml"), "version: v2\nmodules:\n - path: proto\n", 0644) targets := discoverCodegenTargets(repoRoot, backendDir, []backendScanTarget{{root: backendDir, display: "backend"}}, []pluginScanTarget{{root: pluginRoot, display: "plugin"}}, true) if len(targets) != 4 { t.Fatalf("discoverCodegenTargets() returned %d targets, want 4: %#v", len(targets), targets) } } func TestRunCodegenChecksWithBinariesRunsSQLCAndBuf(t *testing.T) { root := t.TempDir() sqlcBin := writeExecutableFile(t, filepath.Join(root, "sqlc"), "#!/bin/sh\nexit 0\n") bufArgsFile := filepath.Join(root, "buf-args.txt") bufBin := writeExecutableFile(t, filepath.Join(root, "buf"), "#!/bin/sh\nprintf '%s\\n' \"$@\" > "+shellQuote(bufArgsFile)+"\nexit 0\n") completed, failures, err := runCodegenChecksWithBinaries([]codegenTarget{ {label: "backend", workdir: root, stage: "sqlc compile", binary: "sqlc", args: []string{"compile"}}, {label: "repo", workdir: root, stage: "buf generate", binary: "buf", args: []string{"generate"}}, }, sqlcBin, bufBin) if err != nil { t.Fatalf("runCodegenChecksWithBinaries() error = %v", err) } if len(failures) != 0 { t.Fatalf("failures = %#v, want none", failures) } if len(completed) != 2 { t.Fatalf("completed = %#v, want 2", completed) } bufArgsBytes, err := os.ReadFile(bufArgsFile) if err != nil { t.Fatalf("ReadFile(%s): %v", bufArgsFile, err) } bufArgs := string(bufArgsBytes) if !strings.Contains(bufArgs, "-o") { t.Fatalf("buf args = %q, want -o temp output redirection", bufArgs) } } func TestRunCodegenChecksWithBinariesCapturesFailures(t *testing.T) { root := t.TempDir() sqlcBin := writeExecutableFile(t, filepath.Join(root, "sqlc"), "#!/bin/sh\necho \"sqlc failed\" >&2\nexit 1\n") bufBin := writeExecutableFile(t, filepath.Join(root, "buf"), "#!/bin/sh\nexit 0\n") completed, failures, err := runCodegenChecksWithBinaries([]codegenTarget{ {label: "backend", workdir: root, stage: "sqlc compile", binary: "sqlc", args: []string{"compile"}}, }, sqlcBin, bufBin) if err != nil { t.Fatalf("runCodegenChecksWithBinaries() error = %v", err) } if len(completed) != 0 { t.Fatalf("completed = %#v, want none", completed) } if len(failures) != 1 { t.Fatalf("failures = %#v, want 1", failures) } if !strings.Contains(failures[0].output, "sqlc failed") { t.Fatalf("failure output = %q, want stderr", failures[0].output) } }