Download
60 lines 1.5 KiBGoModified 2026-10-27 raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
package gitx

import (
	"os/exec"
	"strings"
	"testing"
)

// TestBatchCopy: Copy streams a blob whole and leaves the batch ready for
// the next request.
func TestBatchCopy(t *testing.T) {
	dir := t.TempDir()
	run := func(stdin string, args ...string) string {
		t.Helper()
		cmd := exec.Command("git", append([]string{"-C", dir}, args...)...)
		cmd.Stdin = strings.NewReader(stdin)
		out, err := cmd.Output()
		if err != nil {
			t.Fatalf("git %v: %v", args, err)
		}
		return strings.TrimSpace(string(out))
	}
	run("", "init", "-q", "--bare")
	big := strings.Repeat("0123456789abcdef\n", 1<<16) // past the reader's buffer
	a := run(big, "hash-object", "-w", "--stdin")
	b := run("next\n", "hash-object", "-w", "--stdin")
	batch, err := Repo{Dir: dir}.NewBatch()
	if err != nil {
		t.Fatal(err)
	}
	defer func() {
		if err := batch.Close(); err != nil {
			t.Error(err)
		}
	}()
	var buf strings.Builder
	if err := batch.Copy(a, &buf); err != nil {
		t.Fatal(err)
	}
	if buf.String() != big {
		t.Errorf("Copy gave %d bytes, want %d", buf.Len(), len(big))
	}
	if got, err := batch.Get(b); err != nil || string(got) != "next\n" {
		t.Errorf("Get after Copy = %q, %v", got, err)
	}
}

func TestIsZeroSHA(t *testing.T) {
	for s, want := range map[string]bool{
		strings.Repeat("0", 40):       true,
		strings.Repeat("0", 64):       true,
		strings.Repeat("0", 39):       false,
		"":                            false,
		strings.Repeat("0", 39) + "1": false,
	} {
		if got := IsZeroSHA(s); got != want {
			t.Errorf("IsZeroSHA(%q) = %v, want %v", s, got, want)
		}
	}
}