From 563a4dfb78aaa97febd0763e9f81a740af0dd666 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 7 Mar 2026 19:37:20 +0800 Subject: refstore/files: Implement batching --- refstore/files/batch_test.go | 98 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 refstore/files/batch_test.go (limited to 'refstore/files/batch_test.go') diff --git a/refstore/files/batch_test.go b/refstore/files/batch_test.go new file mode 100644 index 00000000..17be3850 --- /dev/null +++ b/refstore/files/batch_test.go @@ -0,0 +1,98 @@ +package files_test + +import ( + "testing" + + "codeberg.org/lindenii/furgit/internal/testgit" + "codeberg.org/lindenii/furgit/objectid" +) + +func TestBatchApplyRejectsStaleDeleteAndAppliesIndependentDelete(t *testing.T) { + t.Parallel() + + //nolint:thelper + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { + t.Parallel() + + testRepo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo}) + _, _, commitID := testRepo.MakeCommit(t, "base") + _, _, staleID := testRepo.MakeCommit(t, "stale") + testRepo.UpdateRef(t, "refs/heads/main", commitID) + testRepo.UpdateRef(t, "refs/heads/topic", commitID) + + store := openFilesStore(t, testRepo, algo) + + batch, err := store.BeginBatch() + if err != nil { + t.Fatalf("BeginBatch: %v", err) + } + + batch.Delete("refs/heads/main", staleID) + batch.Delete("refs/heads/topic", commitID) + + results, err := batch.Apply() + if err != nil { + t.Fatalf("Apply: %v", err) + } + + if len(results) != 2 { + t.Fatalf("len(results) = %d, want 2", len(results)) + } + + if results[0].Error == nil { + t.Fatal("stale delete unexpectedly succeeded") + } + + if results[1].Error != nil { + t.Fatalf("valid delete failed: %v", results[1].Error) + } + + if _, err := store.Resolve("refs/heads/main"); err != nil { + t.Fatalf("Resolve(main): %v", err) + } + + if _, err := store.Resolve("refs/heads/topic"); err == nil { + t.Fatal("refs/heads/topic still exists") + } + }) +} + +func TestBatchApplyRejectsDuplicateQueuedRef(t *testing.T) { + t.Parallel() + + //nolint:thelper + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { + t.Parallel() + + testRepo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo}) + _, _, commitID := testRepo.MakeCommit(t, "base") + testRepo.UpdateRef(t, "refs/heads/main", commitID) + + store := openFilesStore(t, testRepo, algo) + + batch, err := store.BeginBatch() + if err != nil { + t.Fatalf("BeginBatch: %v", err) + } + + batch.Delete("refs/heads/main", commitID) + batch.Verify("refs/heads/main", commitID) + + results, err := batch.Apply() + if err == nil { + t.Fatal("Apply unexpectedly succeeded") + } + + if len(results) != 2 { + t.Fatalf("len(results) = %d, want 2", len(results)) + } + + if results[1].Error == nil { + t.Fatal("duplicate ref operation did not report an error") + } + + if _, err := store.Resolve("refs/heads/main"); err != nil { + t.Fatalf("Resolve(main): %v", err) + } + }) +} -- cgit v1.3.1-10-gc9f91