cmd/gitbayd/main_test.go
89 lines · 2376 bytes
2 symbols in this file
1package main
2
3import (
4 "bytes"
5 "log/slog"
6 "path/filepath"
7 "strconv"
8 "strings"
9 "testing"
10
11 "gitbay.org/gitbay/internal/store"
12)
13
14// A restart that moves the schema says so. Migrations used to run in silence,
15// which left an unexpected user_version with nothing in the journal tying it to
16// the deploy that applied it.
17func TestOpenStoreLogsSchemaMigration(t *testing.T) {
18 cfg := testConfig(t)
19
20 var buf bytes.Buffer
21 prev := slog.Default()
22 slog.SetDefault(slog.New(slog.NewTextHandler(&buf, nil)))
23 defer slog.SetDefault(prev)
24
25 // First open creates the database and migrates it from nothing.
26 s, err := openStore(cfg)
27 if err != nil {
28 t.Fatalf("openStore: %v", err)
29 }
30 version, err := s.Version()
31 if err != nil {
32 t.Fatalf("version: %v", err)
33 }
34 s.Close()
35
36 logged := buf.String()
37 if !strings.Contains(logged, "schema migrated") {
38 t.Fatalf("no migration logged:\n%s", logged)
39 }
40 for _, want := range []string{"from=0", "to=" + strconv.Itoa(version)} {
41 if !strings.Contains(logged, want) {
42 t.Errorf("expected %q in the log line:\n%s", want, logged)
43 }
44 }
45
46 // Reopening an already-current database is silent: every restart would
47 // otherwise claim a migration that did not happen.
48 buf.Reset()
49 s, err = openStore(cfg)
50 if err != nil {
51 t.Fatalf("reopen: %v", err)
52 }
53 s.Close()
54 if strings.Contains(buf.String(), "schema migrated") {
55 t.Errorf("logged a migration on an up-to-date database:\n%s", buf.String())
56 }
57}
58
59// A note a migration leaves goes in the log line and is then dropped.
60func TestOpenStoreLogsMigrationNote(t *testing.T) {
61 cfg := testConfig(t)
62 st, err := store.Open(filepath.Join(cfg.Server.Root, "gitbay.db"))
63 if err != nil {
64 t.Fatal(err)
65 }
66 if err := st.MigrateTo(1); err != nil {
67 t.Fatal(err)
68 }
69 if _, err := st.DB.Exec("INSERT INTO settings (key, value) VALUES ('migration_note', 'removed 2 things')"); err != nil {
70 t.Fatal(err)
71 }
72 st.Close()
73
74 var buf bytes.Buffer
75 prev := slog.Default()
76 slog.SetDefault(slog.New(slog.NewTextHandler(&buf, nil)))
77 defer slog.SetDefault(prev)
78 s, err := openStore(cfg)
79 if err != nil {
80 t.Fatalf("openStore: %v", err)
81 }
82 defer s.Close()
83 if !strings.Contains(buf.String(), `note="removed 2 things"`) {
84 t.Fatalf("note not logged:\n%s", buf.String())
85 }
86 if note, err := s.TakeMigrationNote(); err != nil || note != "" {
87 t.Fatalf("note left behind: %q, %v", note, err)
88 }
89}