josie / simplegit

package git

import (
	"os"
	"path/filepath"
	"strings"
	"testing"
)

func TestLogCommitAtShowPatch(t *testing.T) {
	path := filepath.Join(t.TempDir(), "demo.git")
	if err := InitBare(path, "main"); err != nil {
		t.Fatalf("InitBare: %v", err)
	}
	seedBare(t, path)

	work := filepath.Join(t.TempDir(), "work2")
	runGit(t, "", "clone", "-q", path, work)
	if err := os.WriteFile(filepath.Join(work, "new.txt"), []byte("new\n"), 0o644); err != nil {
		t.Fatalf("write: %v", err)
	}
	runGit(t, work, "add", ".")
	runGit(t, work, "-c", "user.email=t@t", "-c", "user.name=t", "commit", "-qm", "second")
	runGit(t, work, "push", "-q", "origin", "main")

	logs, err := Log(path, "main", 50)
	if err != nil {
		t.Fatalf("Log: %v", err)
	}
	if len(logs) != 2 {
		t.Fatalf("log length = %d, want 2: %+v", len(logs), logs)
	}
	if logs[0].Subject != "second" || logs[1].Subject != "seed" {
		t.Errorf("subjects = %q, %q, want second, seed", logs[0].Subject, logs[1].Subject)
	}
	if logs[0].Author != "t" || !strings.Contains(logs[0].Date, "T") {
		t.Errorf("first commit author/date = %q %q", logs[0].Author, logs[0].Date)
	}
	// Log lists rows only; parents come from CommitAt.
	head, err := CommitAt(path, logs[0].SHA)
	if err != nil {
		t.Fatalf("CommitAt head: %v", err)
	}
	if len(head.Parents) != 1 || head.Parents[0] != logs[1].SHA {
		t.Errorf("head parents = %v, want [%s]", head.Parents, logs[1].SHA)
	}

	root, err := CommitAt(path, logs[1].SHA[:8])
	if err != nil {
		t.Fatalf("CommitAt short sha: %v", err)
	}
	if root.Subject != "seed" || len(root.Parents) != 0 {
		t.Errorf("root commit = %+v, want seed with no parents", root)
	}

	patch, err := ShowPatch(path, logs[0].SHA, 1<<20)
	if err != nil {
		t.Fatalf("ShowPatch: %v", err)
	}
	if !strings.Contains(string(patch), "+++ b/new.txt") {
		t.Errorf("patch lacks new file diff: %q", patch)
	}

	if _, err := Log(path, "nosuchref", 10); err == nil {
		t.Error("Log on missing ref = nil error, want error")
	}
}