From 5f63e4b4693b49e747e4441e3703959c1429ec45 Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 5 Mar 2026 08:35:03 -0500 Subject: [PATCH] Wrote boltdb tests. --- boltdb_test.go | 194 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 boltdb_test.go diff --git a/boltdb_test.go b/boltdb_test.go new file mode 100644 index 0000000..f4df8d8 --- /dev/null +++ b/boltdb_test.go @@ -0,0 +1,194 @@ +package heartwood + +import ( + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "path/filepath" + "testing" +) + +func tempDB(t *testing.T) *bolt.DB { + path := filepath.Join(t.TempDir(), "test.db") + db, err := bolt.Open(path, 0600, nil) + require.NoError(t, err) + t.Cleanup(func() { db.Close() }) + return db +} + +func TestSetupBoltDB(t *testing.T) { + db := tempDB(t) + + err := SetupBoltDB(db) + assert.NoError(t, err) + + // Verify bucket exists + err = db.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(BucketName)) + assert.NotNil(t, bucket) + return nil + }) + assert.NoError(t, err) + + // Second call should not error + err = SetupBoltDB(db) + assert.NoError(t, err) +} + +func TestBatchCheckEventsExist(t *testing.T) { + cases := []struct { + name string + setupEvents []EventBlob + checkIDs []string + expectedMap map[string]bool + skipSetup bool + }{ + { + name: "empty ids", + setupEvents: []EventBlob{}, + checkIDs: []string{}, + expectedMap: map[string]bool{}, + }, + { + name: "no events exist", + setupEvents: []EventBlob{}, + checkIDs: []string{"id1", "id2"}, + expectedMap: map[string]bool{"id1": false, "id2": false}, + }, + { + name: "some exist", + setupEvents: []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + }, + checkIDs: []string{"id1", "id2"}, + expectedMap: map[string]bool{ + "id1": true, + "id2": false, + }, + }, + { + name: "all exist", + setupEvents: []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + {ID: "id2", JSON: `{"test":2}`}, + }, + checkIDs: []string{"id1", "id2"}, + expectedMap: map[string]bool{ + "id1": true, + "id2": true, + }, + }, + { + name: "bucket doesn't exist", + setupEvents: []EventBlob{}, + checkIDs: []string{"id1"}, + expectedMap: map[string]bool{}, // outputs empty map + skipSetup: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db := tempDB(t) + + if !tc.skipSetup { + err := SetupBoltDB(db) + require.NoError(t, err) + + if len(tc.setupEvents) > 0 { + err = BatchWriteEvents(db, tc.setupEvents) + require.NoError(t, err) + } + } + + result := BatchCheckEventsExist(db, tc.checkIDs) + assert.Equal(t, tc.expectedMap, result) + }) + } +} + +func TestBatchWriteEvents(t *testing.T) { + cases := []struct { + name string + events []EventBlob + verifyID string + expectedJSON string + }{ + { + name: "empty slice", + events: []EventBlob{}, + }, + { + name: "single event", + events: []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + }, + verifyID: "id1", + expectedJSON: `{"test":1}`, + }, + { + name: "multiple events", + events: []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + {ID: "id2", JSON: `{"test":2}`}, + {ID: "id3", JSON: `{"test":3}`}, + }, + verifyID: "id2", + expectedJSON: `{"test":2}`, + }, + { + name: "duplicate id overwrites", + events: []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + {ID: "id1", JSON: `{"test":2}`}, + }, + verifyID: "id1", + expectedJSON: `{"test":2}`, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db := tempDB(t) + + err := SetupBoltDB(db) + require.NoError(t, err) + + err = BatchWriteEvents(db, tc.events) + assert.NoError(t, err) + + if tc.verifyID != "" { + err = db.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(BucketName)) + val := bucket.Get([]byte(tc.verifyID)) + assert.Equal(t, tc.expectedJSON, string(val)) + return nil + }) + assert.NoError(t, err) + } + }) + } +} + +func TestWriteThenCheck(t *testing.T) { + db := tempDB(t) + + err := SetupBoltDB(db) + require.NoError(t, err) + + events := []EventBlob{ + {ID: "id1", JSON: `{"test":1}`}, + {ID: "id2", JSON: `{"test":2}`}, + {ID: "id3", JSON: `{"test":3}`}, + } + + err = BatchWriteEvents(db, events) + require.NoError(t, err) + + checkIDs := []string{"id1", "id2", "id3"} + result := BatchCheckEventsExist(db, checkIDs) + + for _, id := range checkIDs { + assert.True(t, result[id], "expected %s to exist", id) + } +}