Make the placeholder migration an immutable 0000_bootstrap
CI / ci (push) Successful in 49s
CI / ci (pull_request) Successful in 48s
Independent review Approved — 0 high findings (#10)

The runner skips versions already recorded by filename, so replacing the
contents of the applied 0001_init.sql placeholder with the real schema
would leave upgraded databases without the new tables. Rename it to
0000_bootstrap.sql, document it as a permanent no-op, and leave
0001_init.sql free for the v1 schema as a brand-new version.

Add a test that migrates with the embedded set, then adds a fixture
0001_init.sql and proves it applies on the existing database.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 00:51:50 -04:00
co-authored by Claude Opus 5.5
parent c777668ef5
commit a36cae4517
3 changed files with 33 additions and 4 deletions
+29 -2
View File
@@ -2,6 +2,7 @@ package store
import (
"context"
"io/fs"
"strings"
"testing"
"testing/fstest"
@@ -173,7 +174,33 @@ func TestMigrateEmbeddedMigrations(t *testing.T) {
if err := Migrate(context.Background(), s.Writer, migrations.FS); err != nil {
t.Fatal(err)
}
if got := versions(migrationRows(t, s)); !strings.HasPrefix(got, "0001_init") {
t.Errorf("versions = %q, want 0001_init first", got)
if got := versions(migrationRows(t, s)); got != "0000_bootstrap" {
t.Errorf("versions = %q, want 0000_bootstrap", got)
}
}
func TestMigrateEmbeddedThenNewMigrationApplies(t *testing.T) {
ctx := context.Background()
s := openTestStore(t)
if err := Migrate(ctx, s.Writer, migrations.FS); err != nil {
t.Fatal(err)
}
bootstrap, err := fs.ReadFile(migrations.FS, "0000_bootstrap.sql")
if err != nil {
t.Fatal(err)
}
// A later build adds 0001_init.sql alongside the unchanged bootstrap.
upgraded := fstest.MapFS{
"0000_bootstrap.sql": {Data: bootstrap},
"0001_init.sql": {Data: []byte("CREATE TABLE later (id INTEGER PRIMARY KEY);")},
}
if err := Migrate(ctx, s.Writer, upgraded); err != nil {
t.Fatal(err)
}
if got := versions(migrationRows(t, s)); got != "0000_bootstrap,0001_init" {
t.Errorf("versions = %q, want 0000_bootstrap,0001_init", got)
}
if !tableExists(t, s, "later") {
t.Error("table from 0001_init was not created")
}
}
+4
View File
@@ -0,0 +1,4 @@
-- 0000_bootstrap: immutable no-op bootstrap migration. It lets the migrations
-- embed compile and proves the runner end to end. Never edit or remove it:
-- applied versions are recorded by filename and never re-run. The initial v1
-- schema arrives as a new migration, 0001_init.sql (Feature 02 task 3).
-2
View File
@@ -1,2 +0,0 @@
-- 0001_init: placeholder so the migrations embed compiles.
-- Replaced by the full v1 schema in Feature 02 task 3.