diff --git a/cmd/ninja/cmd/plugin_test.go b/cmd/ninja/cmd/plugin_test.go index 8dd3164..e86c3f5 100644 --- a/cmd/ninja/cmd/plugin_test.go +++ b/cmd/ninja/cmd/plugin_test.go @@ -299,6 +299,108 @@ func TestSubmoduleWarning_NoopWithoutGitmodules(t *testing.T) { } } +func TestEmitPublishWarnings_WarnsAboutGitignoreTracked(t *testing.T) { + dir := t.TempDir() + runGit(t, dir, "init", "-q") + if err := os.WriteFile(filepath.Join(dir, "secret.env"), []byte("token=abc"), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", "secret.env") + runGit(t, dir, "commit", "-qm", "init") + if err := os.WriteFile(filepath.Join(dir, ".gitignore"), []byte("*.env\n"), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", ".gitignore") + runGit(t, dir, "commit", "-qm", "ignore") + + var buf bytes.Buffer + if err := emitPublishWarnings(dir, false, &buf); err != nil { + t.Fatalf("emitPublishWarnings: %v", err) + } + + out := buf.String() + if !strings.Contains(out, "secret.env") { + t.Errorf("expected gitignored-tracked warning to mention secret.env, got: %q", out) + } + if !strings.Contains(out, "match .gitignore") { + t.Errorf("expected gitignored-tracked warning fragment, got: %q", out) + } +} + +func TestEmitPublishWarnings_WarnsAboutSubmodules(t *testing.T) { + dir := t.TempDir() + runGit(t, dir, "init", "-q") + if err := os.WriteFile(filepath.Join(dir, "README.md"), []byte("hi"), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", "README.md") + runGit(t, dir, "commit", "-qm", "init") + + gitmodules := `[submodule "vendor/foo"] + path = vendor/foo + url = https://example.com/foo.git +` + if err := os.WriteFile(filepath.Join(dir, ".gitmodules"), []byte(gitmodules), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", ".gitmodules") + runGit(t, dir, "commit", "-qm", "add submodule decl") + + var buf bytes.Buffer + if err := emitPublishWarnings(dir, false, &buf); err != nil { + t.Fatalf("emitPublishWarnings: %v", err) + } + + out := buf.String() + if !strings.Contains(out, "vendor/foo") { + t.Errorf("expected submodule warning to mention vendor/foo, got: %q", out) + } + if !strings.Contains(out, "submodules") { + t.Errorf("expected submodule warning fragment, got: %q", out) + } +} + +func TestEmitPublishWarnings_WarnsAboutUntrackedWithAllowDirty(t *testing.T) { + dir := t.TempDir() + runGit(t, dir, "init", "-q") + if err := os.WriteFile(filepath.Join(dir, "README.md"), []byte("hi"), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", "README.md") + runGit(t, dir, "commit", "-qm", "init") + if err := os.WriteFile(filepath.Join(dir, "scratch.txt"), []byte("notes"), 0o644); err != nil { + t.Fatal(err) + } + + t.Run("allowDirty=true surfaces untracked warning", func(t *testing.T) { + var buf bytes.Buffer + if err := emitPublishWarnings(dir, true, &buf); err != nil { + t.Fatalf("emitPublishWarnings: %v", err) + } + out := buf.String() + if !strings.Contains(out, "scratch.txt") { + t.Errorf("expected untracked-files warning to mention scratch.txt, got: %q", out) + } + if !strings.Contains(out, "--allow-dirty") { + t.Errorf("expected untracked-files warning fragment, got: %q", out) + } + }) + + t.Run("allowDirty=false aborts before untracked warning", func(t *testing.T) { + var buf bytes.Buffer + err := emitPublishWarnings(dir, false, &buf) + if err == nil { + t.Fatal("expected dirty-tree error, got nil") + } + if !strings.Contains(err.Error(), "working tree dirty") { + t.Errorf("expected dirty-tree error, got: %v", err) + } + if strings.Contains(buf.String(), "--allow-dirty: these untracked files") { + t.Errorf("untracked-files warning should not fire on dirty-abort path, got: %q", buf.String()) + } + }) +} + func runGit(t *testing.T, dir string, args ...string) { t.Helper() cmd := exec.Command("git", args...)