Parent directory

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}