Files

99 lines
2.5 KiB
Go

package sqlitestore
import (
"context"
"fmt"
"testing"
v1 "github.com/garethgeorge/backrest/gen/go/v1"
"github.com/garethgeorge/backrest/internal/oplog"
"github.com/garethgeorge/backrest/internal/testutil"
"github.com/google/go-cmp/cmp"
"google.golang.org/protobuf/testing/protocmp"
)
func TestNewSqliteStore(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
store, err := NewSqliteStore(tempDir + "/test.sqlite")
if err != nil {
t.Fatalf("error creating sqlite store: %s", err)
}
t.Cleanup(func() { store.Close() })
}
func TestMigrateExisting(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
dbPath := tempDir + "/test.sqlite"
testOps := make([]*v1.Operation, 0, 10)
for i := 0; i < 10; i++ {
testOps = append(testOps, testutil.RandomOperation())
}
store, err := NewSqliteStore(dbPath)
if err != nil {
t.Fatalf("error creating sqlite store: %s", err)
}
if err := store.Add(testOps...); err != nil {
t.Fatalf("error adding test data: %s", err)
}
setSchemaVersion(t, store, 192393)
if err := store.Close(); err != nil {
t.Fatalf("error closing sqlite store: %s", err)
}
store2, err := NewSqliteStore(dbPath)
if err != nil {
t.Fatalf("error creating sqlite store: %s", err)
}
defer store2.Close()
gotOps := queryAllOperations(t, store2)
if len(gotOps) != len(testOps) {
t.Errorf("expected %d operations, got %d", len(testOps), len(gotOps))
}
if diff := cmp.Diff(
&v1.OperationList{Operations: gotOps},
&v1.OperationList{Operations: testOps},
protocmp.Transform()); diff != "" {
t.Errorf("unexpected diff in operations after migration: %v", diff)
}
verifySchemaVersion(t, store2)
}
func setSchemaVersion(t *testing.T, store *SqliteStore, version int) {
_, err := store.dbpool.ExecContext(context.Background(), fmt.Sprintf("PRAGMA user_version = %d", version))
if err != nil {
t.Fatalf("error setting user_version: %s", err)
}
}
func queryAllOperations(t *testing.T, store *SqliteStore) []*v1.Operation {
gotOps := make([]*v1.Operation, 0)
if err := store.Query(oplog.Query{}, func(op *v1.Operation) error {
gotOps = append(gotOps, op)
return nil
}); err != nil {
t.Fatalf("error querying sqlite store: %s", err)
}
return gotOps
}
func verifySchemaVersion(t *testing.T, store *SqliteStore) {
var version int
err := store.dbpool.QueryRowContext(context.Background(), "PRAGMA user_version").Scan(&version)
if err != nil {
t.Fatalf("error verifying user_version: %s", err)
}
if version != sqlSchemaVersion {
t.Fatalf("expected user_version %d, got %d", sqlSchemaVersion, version)
}
}