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...)