From 421f5ee0cb01bd47a56895a1f3dfdfc8ea7e0035 Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Wed, 3 Jun 2026 09:11:37 +0800 Subject: [PATCH] test(cli): cover autoCommitPluginMod commit and no-op paths autoCommitPluginMod runs `git status --porcelain plugin.mod` then commits if dirty. Add two cases: dirty plugin.mod produces an "Add plugin.mod" commit, and a clean state leaves HEAD unchanged. Uses t.Chdir to scope CWD to the temp repo without polluting parent state. --- cmd/ninja/cmd/plugin_test.go | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/cmd/ninja/cmd/plugin_test.go b/cmd/ninja/cmd/plugin_test.go index 48c073b..0aa5c41 100644 --- a/cmd/ninja/cmd/plugin_test.go +++ b/cmd/ninja/cmd/plugin_test.go @@ -38,6 +38,76 @@ func TestCheckRepoHasHEAD_WithCommitReturnsNil(t *testing.T) { } } +func TestAutoCommitPluginMod_CommitsWhenDirty(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, "plugin.mod"), + []byte("[plugin]\nname = \"x\"\nscope = \"@s\"\nversion = \"0.1.0\"\n"), 0o644); err != nil { + t.Fatal(err) + } + + t.Chdir(dir) + if err := autoCommitPluginMod(); err != nil { + t.Fatalf("autoCommitPluginMod: %v", err) + } + + subject := gitLogSubject(t, dir) + if subject != "Add plugin.mod" { + t.Errorf("expected latest commit subject 'Add plugin.mod', got %q", subject) + } +} + +func TestAutoCommitPluginMod_NoopWhenClean(t *testing.T) { + dir := t.TempDir() + runGit(t, dir, "init", "-q") + if err := os.WriteFile(filepath.Join(dir, "plugin.mod"), + []byte("[plugin]\nname = \"x\"\nscope = \"@s\"\nversion = \"0.1.0\"\n"), 0o644); err != nil { + t.Fatal(err) + } + runGit(t, dir, "add", "plugin.mod") + runGit(t, dir, "commit", "-qm", "seed") + + beforeSHA := gitHeadSHA(t, dir) + + t.Chdir(dir) + if err := autoCommitPluginMod(); err != nil { + t.Fatalf("autoCommitPluginMod: %v", err) + } + + afterSHA := gitHeadSHA(t, dir) + if afterSHA != beforeSHA { + t.Errorf("expected no new commit, HEAD moved %s -> %s", beforeSHA, afterSHA) + } +} + +func gitLogSubject(t *testing.T, dir string) string { + t.Helper() + cmd := exec.Command("git", "log", "-1", "--pretty=%s") + cmd.Dir = dir + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("git log: %v\n%s", err, out) + } + return strings.TrimSpace(string(out)) +} + +func gitHeadSHA(t *testing.T, dir string) string { + t.Helper() + cmd := exec.Command("git", "rev-parse", "HEAD") + cmd.Dir = dir + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("git rev-parse: %v\n%s", err, out) + } + return strings.TrimSpace(string(out)) +} + func runGit(t *testing.T, dir string, args ...string) { t.Helper() cmd := exec.Command("git", args...)