aboutsummaryrefslogtreecommitdiff
path: root/repository/refs_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 15:18:32 +0800
committerGravatar Runxi Yu2026-02-21 15:18:32 +0800
commit53e166913d9e76b82aa53361b251390a2c0726bd (patch)
treec40fe0b4f359912138eb8202a4951541e941a502 /repository/refs_test.go
parentcmd/show-object: Add command (diff)
signatureNo signature
repository: Add passthrough ReadStored*; add ref convenience funcs
Diffstat (limited to 'repository/refs_test.go')
-rw-r--r--repository/refs_test.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/repository/refs_test.go b/repository/refs_test.go
new file mode 100644
index 00000000..4418c707
--- /dev/null
+++ b/repository/refs_test.go
@@ -0,0 +1,96 @@
+package repository_test
+
+import (
+ "strings"
+ "testing"
+
+ "codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/objectid"
+ "codeberg.org/lindenii/furgit/ref"
+ "codeberg.org/lindenii/furgit/repository"
+)
+
+func TestRefConvenienceMethods(t *testing.T) {
+ t.Parallel()
+
+ testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper
+ repoHarness := testgit.NewRepo(t, testgit.RepoOptions{
+ ObjectFormat: algo,
+ Bare: true,
+ RefFormat: "files",
+ })
+
+ _, _, commitID := repoHarness.MakeCommit(t, "refs wrappers")
+ repoHarness.UpdateRef(t, "refs/heads/main", commitID)
+ repoHarness.SymbolicRef(t, "HEAD", "refs/heads/main")
+ repoHarness.UpdateRef(t, "refs/tags/v1", commitID)
+
+ repo, err := repository.Open(repoHarness.Dir())
+ if err != nil {
+ t.Fatalf("repository.Open: %v", err)
+ }
+ defer func() { _ = repo.Close() }()
+
+ resolved, err := repo.ResolveRef("HEAD")
+ if err != nil {
+ t.Fatalf("ResolveRef(HEAD): %v", err)
+ }
+ sym, ok := resolved.(ref.Symbolic)
+ if !ok {
+ t.Fatalf("ResolveRef(HEAD) type = %T, want ref.Symbolic", resolved)
+ }
+ if sym.Target != "refs/heads/main" {
+ t.Fatalf("ResolveRef(HEAD) target = %q, want %q", sym.Target, "refs/heads/main")
+ }
+
+ fully, err := repo.ResolveRefFully("HEAD")
+ if err != nil {
+ t.Fatalf("ResolveRefFully(HEAD): %v", err)
+ }
+ if fully.ID != commitID {
+ t.Fatalf("ResolveRefFully(HEAD) id = %s, want %s", fully.ID, commitID)
+ }
+
+ refs, err := repo.ListRefs("refs/*/*")
+ if err != nil {
+ t.Fatalf("ListRefs: %v", err)
+ }
+ if len(refs) < 2 {
+ t.Fatalf("ListRefs returned %d refs, want >= 2", len(refs))
+ }
+
+ short, err := repo.ShortenRef("refs/heads/main")
+ if err != nil {
+ t.Fatalf("ShortenRef: %v", err)
+ }
+ if short != "heads/main" && short != "main" {
+ t.Fatalf("ShortenRef = %q, want %q or %q", short, "heads/main", "main")
+ }
+ })
+}
+
+func TestResolveRefErrorSurface(t *testing.T) {
+ t.Parallel()
+
+ testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper
+ repoHarness := testgit.NewRepo(t, testgit.RepoOptions{
+ ObjectFormat: algo,
+ Bare: true,
+ RefFormat: "files",
+ })
+
+ repo, err := repository.Open(repoHarness.Dir())
+ if err != nil {
+ t.Fatalf("repository.Open: %v", err)
+ }
+ defer func() { _ = repo.Close() }()
+
+ _, err = repo.ResolveRef("refs/heads/does-not-exist")
+ if err == nil {
+ t.Fatalf("ResolveRef missing: expected error")
+ }
+ if !strings.Contains(err.Error(), "not found") {
+ t.Fatalf("ResolveRef missing error = %v, want not found detail", err)
+ }
+ })
+}