diff options
| author | 2025-11-16 00:00:00 +0000 | |
|---|---|---|
| committer | 2025-11-16 00:00:00 +0000 | |
| commit | bad0f9715556a470d0de2a22c7040181e3a033ba (patch) | |
| tree | 21463072ce5bc85682a887ce0cae26d833941af3 /obj_blob_test.go | |
| parent | EntryRecursive should return ErrNotFound instead of nil, nil (diff) | |
| signature | ||
Use actual git for tests and enhance Head
Diffstat (limited to 'obj_blob_test.go')
| -rw-r--r-- | obj_blob_test.go | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/obj_blob_test.go b/obj_blob_test.go new file mode 100644 index 00000000..72ef0a23 --- /dev/null +++ b/obj_blob_test.go @@ -0,0 +1,120 @@ +package furgit + +import ( + "bytes" + "fmt" + "testing" +) + +func TestBlobRead(t *testing.T) { + repoPath, cleanup := setupTestRepo(t) + defer cleanup() + + testData := []byte("Hello, Furgit!\nThis is test blob data.") + gitHash := gitHashObject(t, repoPath, "blob", testData) + + repo, err := OpenRepository(repoPath) + if err != nil { + t.Fatalf("OpenRepository failed: %v", err) + } + defer func() { + _ = repo.Close() + }() + + hash, _ := repo.ParseHash(gitHash) + obj, err := repo.ReadObject(hash) + if err != nil { + t.Fatalf("ReadObject failed: %v", err) + } + + blob, ok := obj.(*StoredBlob) + if !ok { + t.Fatalf("expected *StoredBlob, got %T", obj) + } + + if !bytes.Equal(blob.Data, testData) { + t.Errorf("Data mismatch: got %q, want %q", blob.Data, testData) + } + if blob.Hash() != hash { + t.Errorf("Hash(): got %s, want %s", blob.Hash(), hash) + } + if blob.ObjectType() != ObjectTypeBlob { + t.Errorf("ObjectType(): got %d, want %d", blob.ObjectType(), ObjectTypeBlob) + } + + gitData := gitCatFile(t, repoPath, "blob", gitHash) + if !bytes.Equal(blob.Data, gitData) { + t.Error("furgit data doesn't match git data") + } +} + +func TestBlobWrite(t *testing.T) { + repoPath, cleanup := setupTestRepo(t) + defer cleanup() + + repo, err := OpenRepository(repoPath) + if err != nil { + t.Fatalf("OpenRepository failed: %v", err) + } + defer func() { + _ = repo.Close() + }() + + testData := []byte("Test data written by furgit") + blob := &Blob{Data: testData} + + hash, err := repo.WriteLooseObject(blob) + if err != nil { + t.Fatalf("WriteLooseObject failed: %v", err) + } + + gitType := string(gitCatFile(t, repoPath, "-t", hash.String())) + if gitType != "blob" { + t.Errorf("git type: got %q, want %q", gitType, "blob") + } + + gitData := gitCatFile(t, repoPath, "blob", hash.String()) + if !bytes.Equal(gitData, testData) { + t.Error("git data doesn't match written data") + } + + gitSize := string(gitCatFile(t, repoPath, "-s", hash.String())) + if gitSize != fmt.Sprintf("%d", len(testData)) { + t.Errorf("git size: got %s, want %d", gitSize, len(testData)) + } +} + +func TestBlobRoundtrip(t *testing.T) { + repoPath, cleanup := setupTestRepo(t) + defer cleanup() + + repo, err := OpenRepository(repoPath) + if err != nil { + t.Fatalf("OpenRepository failed: %v", err) + } + defer func() { + _ = repo.Close() + }() + + testData := []byte("Roundtrip test data") + blob := &Blob{Data: testData} + + hash, err := repo.WriteLooseObject(blob) + if err != nil { + t.Fatalf("WriteLooseObject failed: %v", err) + } + + obj, err := repo.ReadObject(hash) + if err != nil { + t.Fatalf("ReadObject failed: %v", err) + } + + readBlob, ok := obj.(*StoredBlob) + if !ok { + t.Fatalf("expected *StoredBlob, got %T", obj) + } + + if !bytes.Equal(readBlob.Data, testData) { + t.Error("roundtrip data mismatch") + } +} |
