Skip to content
File

Blob: kv/sqlite3/migration_test.go

go125 lines
1package sqlite3
2 
3import (
4 "path/filepath"
5 "testing"
6 
7 "github.com/stretchr/testify/require"
8 "go.uber.org/zap"
9 "go.uber.org/zap/zaptest"
10)
11 
12func TestValidateMigrationSequence(t *testing.T) {
13 as := require.New(t)
14 
15 err := validateMigrationSequence([]migration{
16 {version: 1, name: "0001-initial-schema.sql"},
17 {version: 3, name: "0003-add-thing.sql"},
18 })
19 as.Error(err)
20 as.ErrorContains(err, "expected migration version 0002")
21}
22 
23func TestMigrateRejectsPartialLegacySchema(t *testing.T) {
24 as := require.New(t)
25 logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller()))
26 dir := t.TempDir()
27 dbPath := filepath.Join(dir, "db")
28 
29 db, err := openSQLite(logger, dbPath)
30 as.NoError(err)
31 t.Cleanup(func() {
32 _ = db.Close()
33 })
34 
35 _, err = db.Exec("CREATE TABLE `simple_entries` (`key` blob,`value` blob,PRIMARY KEY (`key`))")
36 as.NoError(err)
37 
38 err = migrate(db)
39 as.Error(err)
40 as.ErrorContains(err, "partial sqlite schema")
41}
42 
43func TestMigrateFreshDatabase(t *testing.T) {
44 as := require.New(t)
45 logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller()))
46 dir := t.TempDir()
47 dbPath := filepath.Join(dir, "db")
48 
49 db, err := openSQLite(logger, dbPath)
50 as.NoError(err)
51 t.Cleanup(func() {
52 _ = db.Close()
53 })
54 
55 migrations, err := loadMigrations()
56 as.NoError(err)
57 as.NotEmpty(migrations)
58 
59 err = migrate(db)
60 as.NoError(err)
61 
62 uv, err := getUserVersion(db)
63 as.NoError(err)
64 as.Equal(migrations[len(migrations)-1].version, uv)
65 
66 ok, err := schemaLooksLikeV1(db)
67 as.NoError(err)
68 as.True(ok)
69}
70 
71func TestMigrateAdoptsLegacySchema(t *testing.T) {
72 as := require.New(t)
73 logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller()))
74 dir := t.TempDir()
75 dbPath := filepath.Join(dir, "db")
76 
77 db, err := openSQLite(logger, dbPath)
78 as.NoError(err)
79 t.Cleanup(func() {
80 _ = db.Close()
81 })
82 
83 migrations, err := loadMigrations()
84 as.NoError(err)
85 as.NotEmpty(migrations)
86 
87 _, err = db.Exec(migrations[0].sql)
88 as.NoError(err)
89 
90 uv, err := getUserVersion(db)
91 as.NoError(err)
92 as.Zero(uv)
93 
94 err = migrate(db)
95 as.NoError(err)
96 
97 uv, err = getUserVersion(db)
98 as.NoError(err)
99 as.Equal(migrations[len(migrations)-1].version, uv)
100}
101 
102func TestMigrateRejectsNewerUserVersion(t *testing.T) {
103 as := require.New(t)
104 logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller()))
105 dir := t.TempDir()
106 dbPath := filepath.Join(dir, "db")
107 
108 db, err := openSQLite(logger, dbPath)
109 as.NoError(err)
110 t.Cleanup(func() {
111 _ = db.Close()
112 })
113 
114 migrations, err := loadMigrations()
115 as.NoError(err)
116 as.NotEmpty(migrations)
117 
118 err = setUserVersion(db, migrations[len(migrations)-1].version+1)
119 as.NoError(err)
120 
121 err = migrate(db)
122 as.Error(err)
123 as.ErrorContains(err, "newer than supported")
124}