cmd/gitbayd/main_test.go

e6cd75b5f28bacf51620bb531320c30fd4e66bfd
gitbay/cmd/gitbayd/main_test.go history · blame · raw

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}