settings_test.go
2958 bytes
1package backend
2
3import (
4 "context"
5 "testing"
6
7 "github.com/charmbracelet/soft-serve/pkg/access"
8 "github.com/charmbracelet/soft-serve/pkg/config"
9 "github.com/charmbracelet/soft-serve/pkg/db"
10 "github.com/charmbracelet/soft-serve/pkg/db/migrate"
11 "github.com/charmbracelet/soft-serve/pkg/store"
12 "github.com/charmbracelet/soft-serve/pkg/store/database"
13 "github.com/matryer/is"
14 _ "modernc.org/sqlite"
15)
16
17// newTestBackend returns a Backend backed by a real, freshly migrated SQLite
18// database, along with the *config.Config it was constructed with (so tests
19// can mutate AnonAccess/AllowKeyless directly to simulate config overrides).
20func newTestBackend(t *testing.T) (*Backend, *config.Config) {
21 t.Helper()
22 is := is.New(t)
23 ctx := context.Background()
24
25 dp := t.TempDir()
26 cfg := config.DefaultConfig()
27 cfg.DataPath = dp
28 cfg.DB.Driver = "sqlite"
29 cfg.DB.DataSource = dp + "/test.db"
30
31 ctx = config.WithContext(ctx, cfg)
32 dbx, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
33 is.NoErr(err)
34 t.Cleanup(func() { dbx.Close() }) //nolint:errcheck
35
36 is.NoErr(migrate.Migrate(ctx, dbx))
37 dbstore := database.New(ctx, dbx)
38 ctx = store.WithContext(ctx, dbstore)
39 be := New(ctx, cfg, dbx, dbstore)
40
41 return be, cfg
42}
43
44func TestAnonAccessConfigOverride(t *testing.T) {
45 is := is.New(t)
46 be, cfg := newTestBackend(t)
47 ctx := context.Background()
48
49 // Seeded default from migration, no override set.
50 is.Equal(be.AnonAccess(ctx), access.ReadOnlyAccess)
51
52 // With no override, DB writes via SetAnonAccess are reflected.
53 is.NoErr(be.SetAnonAccess(ctx, access.ReadWriteAccess))
54 is.Equal(be.AnonAccess(ctx), access.ReadWriteAccess)
55
56 // A config override takes precedence over whatever is in the DB.
57 admin := access.AdminAccess
58 cfg.AnonAccess = &admin
59 is.Equal(be.AnonAccess(ctx), access.AdminAccess)
60
61 // The DB value is unchanged underneath the override: once the override
62 // is cleared, the last DB write is what's returned again.
63 cfg.AnonAccess = nil
64 is.Equal(be.AnonAccess(ctx), access.ReadWriteAccess)
65}
66
67func TestAllowKeylessConfigOverride(t *testing.T) {
68 is := is.New(t)
69 be, cfg := newTestBackend(t)
70 ctx := context.Background()
71
72 // Seeded default from migration, no override set.
73 is.Equal(be.AllowKeyless(ctx), true)
74
75 // With no override, DB writes via SetAllowKeyless are reflected.
76 is.NoErr(be.SetAllowKeyless(ctx, false))
77 is.Equal(be.AllowKeyless(ctx), false)
78
79 // A config override of true takes precedence over a DB value of false.
80 allow := true
81 cfg.AllowKeyless = &allow
82 is.Equal(be.AllowKeyless(ctx), true)
83
84 // A config override of false takes precedence over a DB value of true
85 // too — this is a real tri-state override, not just a way to force
86 // things open.
87 is.NoErr(be.SetAllowKeyless(ctx, true))
88 disallow := false
89 cfg.AllowKeyless = &disallow
90 is.Equal(be.AllowKeyless(ctx), false)
91
92 // Clearing the override falls back to the DB value again.
93 cfg.AllowKeyless = nil
94 is.Equal(be.AllowKeyless(ctx), true)
95}