Compare commits

1 Commits
Author SHA1 Message Date
clawbot 49c7aefc97 Keep test helpers out of the shipped binary (closes #506)
check / check (push) Successful in 10m29s
The four testing.go files in config, database, middleware and session
are gone. ClearEnvForTest moves to internal/config/configtest; the
webhook database manager helpers move to internal/database/databasetest
and the middleware's NewForTest to internal/middleware/middlewaretest,
both now built through the production constructors. Tests that wrapped
an open main database use database.Open. The session helpers move into
the session package's export_test.go; the middleware tests build their
session through session.New and age its timestamps instead of using a
fake clock.

The session, middleware and webhook database manager now take the
*slog.Logger they log through, so tests in other packages can give
them their own.

Model: opus-5-5
2026-10-06 07:16:09 +00:00
27 changed files with 77 additions and 85 deletions
+1 -1
View File
@@ -2984,7 +2984,7 @@ webhooker/
│ │ └── resetpw.go # `webhooker resetpw`: set an account's password, stopped deployments only
│ ├── config/
│ │ ├── config.go # Configuration loading from environment variables
│ │ └── configtest/ # Test support: ClearEnv, an empty environment for one test
│ │ └── configtest/ # Test support: ClearEnvForTest, an empty environment for one test
│ ├── database/
│ │ ├── base_model.go # BaseModel with UUID primary keys
│ │ ├── database.go # GORM connection, migrations, admin seed
+2 -2
View File
@@ -37,7 +37,7 @@ const dockerStopGrace = 10 * time.Second
// fx.New applies options before it executes invokes, so the timeout
// is set whether or not the graph itself can be constructed here.
func TestNewApp_StopTimeout(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("DATA_DIR", t.TempDir())
got := newApp().StopTimeout()
@@ -75,7 +75,7 @@ func freePort(t *testing.T) int {
// anything is built, and the run of logger.New, which happens before
// the configuration sets the level.
func TestNewApp_SendsFxEventsToTheLogger(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("DATA_DIR", t.TempDir())
t.Setenv("PORT", strconv.Itoa(freePort(t)))
t.Setenv("DEBUG", "true")
+10 -10
View File
@@ -71,7 +71,7 @@ func TestEnvironmentConfig(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.envValue != "" {
t.Setenv(
@@ -197,7 +197,7 @@ func TestRetentionSweepInterval(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
if tt.set {
@@ -336,7 +336,7 @@ func TestSessionIdleTimeout(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
if tt.set {
@@ -389,7 +389,7 @@ func TestDefaultDataDir(t *testing.T) {
t.Run("env="+name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if env != "" {
t.Setenv("WEBHOOKER_ENVIRONMENT", env)
@@ -434,7 +434,7 @@ func TestDataDirHelper(t *testing.T) {
t.Run(name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if set != "" {
t.Setenv("DATA_DIR", set)
@@ -499,7 +499,7 @@ func TestReceiverRateLimit(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
if tt.set {
@@ -615,7 +615,7 @@ func TestTrustedProxies(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
if tt.set {
@@ -726,7 +726,7 @@ func TestAllowedEgressCIDRs(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
if tt.set {
@@ -798,7 +798,7 @@ func TestEgressAllowlistWarning(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", config.EnvironmentDev)
if tt.allowed != "" {
@@ -934,7 +934,7 @@ func TestMetricsAuthConfig(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.username.set {
t.Setenv("METRICS_USERNAME", tt.username.value)
+2 -2
View File
@@ -8,12 +8,12 @@ import (
"testing"
)
// ClearEnv unsets every variable in the process environment
// ClearEnvForTest unsets every variable in the process environment
// for the rest of the test, so a test sees only the variables it sets
// itself, not whatever the developer's shell exports. When the test
// ends it leaves the environment exactly as it found it: each variable
// it unset is put back, and any variable added since is removed.
func ClearEnv(t *testing.T) {
func ClearEnvForTest(t *testing.T) {
t.Helper()
present := make(map[string]bool)
+7 -7
View File
@@ -40,9 +40,9 @@ func writeDotEnv(t *testing.T, contents string) string {
// normally rather than be refused for a file it was never meant to
// have.
//
//nolint:paralleltest // ClearEnv uses t.Setenv.
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
func TestLoadDotEnv_MissingFileIsFine(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
absent := filepath.Join(t.TempDir(), config.DotEnvPath)
require.NoError(t, config.LoadDotEnvFileForTest(absent))
@@ -55,9 +55,9 @@ func TestLoadDotEnv_MissingFileIsFine(t *testing.T) {
// reaches the environment, which is the whole reason the file is read
// at all.
//
//nolint:paralleltest // ClearEnv uses t.Setenv.
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
func TestLoadDotEnv_AppliesValues(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
path := writeDotEnv(t, "# a comment\n"+dotEnvKey+"=from-dot-env\n")
@@ -83,9 +83,9 @@ func TestLoadDotEnv_RealEnvironmentWins(t *testing.T) {
// reverts to its default; the process used to start that way with no
// log line naming the file at all.
//
//nolint:paralleltest // ClearEnv uses t.Setenv.
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
func TestLoadDotEnv_MalformedFileAborts(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
path := writeDotEnv(
t, malformedDotEnv+dotEnvKey+"=from-dot-env\n",
@@ -133,7 +133,7 @@ func TestLoadDotEnv_UnreadableFileAborts(t *testing.T) {
//
//nolint:paralleltest // t.Chdir moves the whole process.
func TestLoadDotEnv_ReadsTheWorkingDirectory(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
dir := t.TempDir()
require.NoError(t, os.WriteFile(
+5 -5
View File
@@ -121,7 +121,7 @@ func TestEnvBool(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.set {
t.Setenv(testEnvKey, tt.value)
@@ -170,7 +170,7 @@ func runEnvIntCases(
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.set {
t.Setenv(testEnvKey, tt.value)
@@ -311,7 +311,7 @@ func TestEnvBindAddress(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.set {
t.Setenv(testEnvKey, tt.value)
@@ -477,7 +477,7 @@ func TestNewRejectsBadEnvValues(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
t.Setenv(tt.key, tt.value)
@@ -639,7 +639,7 @@ func sentryEnvValueCases() []badEnvValueCase {
// break the legitimate unset case: absent variables still get their
// documented defaults.
func TestNewUsesDefaultsWhenUnset(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
cfg, err := buildConfig(t)
+1 -1
View File
@@ -101,7 +101,7 @@ func TestEnvSentryDSN(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
// Cannot use t.Parallel() here because t.Setenv
// is incompatible with parallel subtests.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
if tt.set {
t.Setenv(envKeySentryDSN, tt.value)
@@ -10,19 +10,19 @@ import (
"sneak.berlin/go/webhooker/internal/config/configtest"
)
// TestClearEnv_RemovesAddedVariables pins that a variable set
// TestClearEnvForTest_RemovesAddedVariables pins that a variable set
// after the clear other than through t.Setenv, as a test's .env file
// sets one, is gone once the test ends, so it cannot reach the tests
// that run after it.
//
//nolint:paralleltest // ClearEnv uses t.Setenv.
func TestClearEnv_RemovesAddedVariables(t *testing.T) {
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
func TestClearEnvForTest_RemovesAddedVariables(t *testing.T) {
// The outer clear keeps a value of the key exported in the shell
// from making it a variable the inner clear has to put back.
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Run("loads a .env file after the clear", func(t *testing.T) {
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
path := writeDotEnv(t, dotEnvKey+"=from-dot-env\n")
require.NoError(t, config.LoadDotEnvFileForTest(path))
@@ -13,14 +13,14 @@ import (
"sneak.berlin/go/webhooker/internal/database"
)
// NewWebhookDBManager creates a WebhookDBManager backed by the given
// NewTestWebhookDBManager creates a WebhookDBManager backed by the given
// data directory, logging at DEBUG to standard error.
func NewWebhookDBManager(
func NewTestWebhookDBManager(
t *testing.T, dataDir string,
) *database.WebhookDBManager {
t.Helper()
return NewWebhookDBManagerWithLogger(
return NewTestWebhookDBManagerWithLogger(
t,
dataDir,
slog.New(slog.NewTextHandler(
@@ -30,14 +30,14 @@ func NewWebhookDBManager(
)
}
// NewWebhookDBManagerWithLogger is NewWebhookDBManager with the
// NewTestWebhookDBManagerWithLogger is NewTestWebhookDBManager with the
// logger supplied by the caller. The per-webhook databases this manager
// opens hand that logger to gormlog, so a test that needs to see the SQL
// the service emits can capture it.
//
// It is built through database.NewWebhookDBManager on a lifecycle that
// is never started, so nothing closes its databases but the caller.
func NewWebhookDBManagerWithLogger(
func NewTestWebhookDBManagerWithLogger(
t *testing.T, dataDir string, log *slog.Logger,
) *database.WebhookDBManager {
t.Helper()
+11 -11
View File
@@ -134,7 +134,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
// Create the file the way the application does, so the targets
// table has exactly the shape AutoMigrate gives it, then write
// a leaked row into it the way the association upsert did.
initial := databasetest.NewWebhookDBManager(t, dataDir)
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err := initial.GetDB(webhookID)
require.NoError(t, err)
@@ -157,7 +157,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
clearEventDBSweptMarker(t, seed)
require.NoError(t, seed.Close())
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err = mgr.GetDB(webhookID)
require.NoError(t, err)
@@ -173,7 +173,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
// Idempotent: a second open leaves it at zero and does not
// error.
again := databasetest.NewWebhookDBManager(t, dataDir)
again := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err = again.GetDB(webhookID)
require.NoError(t, err)
@@ -196,7 +196,7 @@ func TestOpenPurgeRemovesCredentialBytes(t *testing.T) {
webhookID := uuid.New().String()
credential := "T00000000/B00000000/" + uuid.New().String()
initial := databasetest.NewWebhookDBManager(t, dataDir)
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err := initial.GetDB(webhookID)
require.NoError(t, err)
@@ -231,7 +231,7 @@ func TestOpenPurgeRemovesCredentialBytes(t *testing.T) {
"seeded credential is not in the file, so this test proves nothing",
)
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err = mgr.GetDB(webhookID)
require.NoError(t, err)
@@ -259,7 +259,7 @@ func TestOpenRevacuumsAfterIncompleteSweep(t *testing.T) {
webhookID := uuid.New().String()
credential := "T00000000/B00000000/" + uuid.New().String()
initial := databasetest.NewWebhookDBManager(t, dataDir)
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err := initial.GetDB(webhookID)
require.NoError(t, err)
@@ -299,7 +299,7 @@ func TestOpenRevacuumsAfterIncompleteSweep(t *testing.T) {
"test proves nothing",
)
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err = mgr.GetDB(webhookID)
require.NoError(t, err)
@@ -326,7 +326,7 @@ func TestOpenSkipsSweptDatabase(t *testing.T) {
dataDir := eventDBDataDir(t)
webhookID := uuid.New().String()
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err := mgr.GetDB(webhookID)
require.NoError(t, err)
@@ -348,7 +348,7 @@ func TestOpenSkipsSweptDatabase(t *testing.T) {
require.NoError(t, err)
require.NoError(t, marked.Close())
again := databasetest.NewWebhookDBManager(t, dataDir)
again := databasetest.NewTestWebhookDBManager(t, dataDir)
_, err = again.GetDB(webhookID)
require.NoError(t, err)
@@ -379,7 +379,7 @@ func TestOpenSucceedsWithoutTargetsTable(t *testing.T) {
require.NoError(t, err)
require.NoError(t, seed.Close())
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
db, err := mgr.GetDB(webhookID)
require.NoError(t, err)
@@ -397,7 +397,7 @@ func TestEventDBCreateOmitsAssociations(t *testing.T) {
dataDir := eventDBDataDir(t)
webhookID := uuid.New().String()
mgr := databasetest.NewWebhookDBManager(t, dataDir)
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
db, err := mgr.GetDB(webhookID)
require.NoError(t, err)
+2 -2
View File
@@ -118,7 +118,7 @@ func TestWebhookDBManager_ConcurrentFirstTouchOpensOnce(t *testing.T) {
var logs bytes.Buffer
mgr := databasetest.NewWebhookDBManagerWithLogger(
mgr := databasetest.NewTestWebhookDBManagerWithLogger(
t,
t.TempDir(),
slog.New(slog.NewTextHandler(&logs, nil)),
@@ -309,7 +309,7 @@ func TestWebhookDBManager_LostDatabaseIsLogged(t *testing.T) {
var logs bytes.Buffer
mgr := databasetest.NewWebhookDBManagerWithLogger(
mgr := databasetest.NewTestWebhookDBManagerWithLogger(
t,
t.TempDir(),
slog.New(slog.NewTextHandler(&logs, nil)),
+1 -1
View File
@@ -67,7 +67,7 @@ func setupArchiveTest(t *testing.T) *archiveEnv {
eng := delivery.NewTestEngineWithDB(
mainDB,
databasetest.NewWebhookDBManager(t, dataDir),
databasetest.NewTestWebhookDBManager(t, dataDir),
log,
&http.Client{Timeout: 5 * time.Second},
1,
+3 -3
View File
@@ -81,7 +81,7 @@ func iDBManager(
) *database.WebhookDBManager {
t.Helper()
return databasetest.NewWebhookDBManager(t, t.TempDir())
return databasetest.NewTestWebhookDBManager(t, t.TempDir())
}
func iSeedWebhookDB(
@@ -1137,7 +1137,7 @@ func TestRecoverInFlight_ReportsAMissingWebhookDatabase(t *testing.T) {
var logs bytes.Buffer
dbMgr := databasetest.NewWebhookDBManagerWithLogger(
dbMgr := databasetest.NewTestWebhookDBManagerWithLogger(
t, t.TempDir(), slog.New(slog.NewTextHandler(&logs, nil)),
)
t.Cleanup(func() { _ = dbMgr.CloseAll() })
@@ -1187,7 +1187,7 @@ func TestRecoverInFlight_SkipsAWebhookDeletedAfterTheListIsRead(
).Error)
}))
dbMgr := databasetest.NewWebhookDBManager(t, t.TempDir())
dbMgr := databasetest.NewTestWebhookDBManager(t, t.TempDir())
t.Cleanup(func() { _ = dbMgr.CloseAll() })
engine := delivery.NewTestEngineWithDB(
@@ -89,7 +89,7 @@ func TestQueueDepthSample_LogsNoBoundValue(t *testing.T) {
))
mainDB := qdMainDB(t, log)
dbMgr := databasetest.NewWebhookDBManagerWithLogger(
dbMgr := databasetest.NewTestWebhookDBManagerWithLogger(
t, t.TempDir(), log,
)
@@ -460,13 +460,8 @@ func TestArchiveExport_OneFileOpenAtATime(t *testing.T) {
}
// heapPeak is an io.Writer that discards what it is given and records
// the largest heap it saw at a write. It collects garbage twice before
// each reading, so the heap it reads is what is still held. Once is not
// enough: the libraries the export calls (regexp, under GORM's table
// names, and encoding/json among them) cache buffers in a sync.Pool,
// which keeps them through one collection, so after one the reading
// counts however many happen to be cached. That varies from run to run
// by about as much as the limit in TestArchiveExport_Streams.
// the largest heap it saw at a write. It collects garbage before each
// reading, so the heap it reads is what is still held.
type heapPeak struct {
max uint64
}
@@ -474,7 +469,6 @@ type heapPeak struct {
func (p *heapPeak) Write(b []byte) (int, error) {
var m runtime.MemStats
runtime.GC()
runtime.GC()
runtime.ReadMemStats(&m)
p.max = max(p.max, m.HeapAlloc)
@@ -504,8 +498,6 @@ func exportHeapGrowth(t *testing.T, rows, bodySize int) uint64 {
export := listExport(t, path)
// Twice, for the reason heapPeak gives.
runtime.GC()
runtime.GC()
var start runtime.MemStats
@@ -336,7 +336,7 @@ func TestArchivePathAt(t *testing.T) {
t.Parallel()
dataDir := t.TempDir()
dbMgr := databasetest.NewWebhookDBManager(t, dataDir)
dbMgr := databasetest.NewTestWebhookDBManager(t, dataDir)
webhook := &database.Webhook{
BaseModel: database.BaseModel{ID: "wh-id"}, Name: "Orders",
}
+1 -1
View File
@@ -130,7 +130,7 @@ func readFirstBootSecrets(
func bootAtDebug(t *testing.T, dataDir string) string {
t.Helper()
configtest.ClearEnv(t)
configtest.ClearEnvForTest(t)
t.Setenv("DEBUG", "true")
t.Setenv("DATA_DIR", dataDir)
+1 -1
View File
@@ -135,7 +135,7 @@ func TestUserRoute_Unauthenticated_RedirectedByMiddleware(t *testing.T) {
t.Cleanup(app.RequireStop)
mw := middlewaretest.New(t, log.Get(), cfg, sess)
mw := middlewaretest.NewForTest(t, log.Get(), cfg, sess)
var handlerReached bool
@@ -65,7 +65,7 @@ func postTargetCreate(
t.Helper()
logBuf := new(bytes.Buffer)
mw := middlewaretest.New(
mw := middlewaretest.NewForTest(
t,
slog.New(slog.NewJSONHandler(
logBuf, &slog.HandlerOptions{Level: slog.LevelInfo},
+1 -1
View File
@@ -310,7 +310,7 @@ func limitedServer(
const sendBuffer = 4 << 10
logBuf := new(bytes.Buffer)
mw := middlewaretest.New(
mw := middlewaretest.NewForTest(
t,
slog.New(slog.NewJSONHandler(logBuf, nil)),
&config.Config{Environment: config.EnvironmentDev},
+2 -2
View File
@@ -84,7 +84,7 @@ func capturingMiddleware(t *testing.T) (*middleware.Middleware, *bytes.Buffer) {
TrustedProxies: trustedProxies("192.0.2.1/32"),
}
return middlewaretest.New(t, log, cfg, nil), buf
return middlewaretest.NewForTest(t, log, cfg, nil), buf
}
// capturingTextMiddleware is capturingMiddleware for the other handler
@@ -108,7 +108,7 @@ func capturingTextMiddleware(
TrustedProxies: trustedProxies("192.0.2.1/32"),
}
return middlewaretest.New(t, log, cfg, nil), buf
return middlewaretest.NewForTest(t, log, cfg, nil), buf
}
// accessLogRouter mirrors the production route shapes that an
+1 -1
View File
@@ -134,7 +134,7 @@ func clientLogLines(
TrustedProxies: trustedProxies(trustedProxyCIDR),
}
m := middlewaretest.New(
m := middlewaretest.NewForTest(
t, log, cfg, newTestSessionManager(t, cfg),
)
handler := m.Logging()(site.build(m))
+1 -1
View File
@@ -158,7 +158,7 @@ func capturingBoundMiddleware(
sess := newTestSessionManager(t, cfg)
return middlewaretest.New(t, log, cfg, sess), buf
return middlewaretest.NewForTest(t, log, cfg, sess), buf
}
// unreachable is a next-handler that fails the test if the middleware
+5 -5
View File
@@ -71,7 +71,7 @@ func metricsTestRouter(
Environment: "prod",
ReceiverRateLimit: receiverLimit,
}
m := middlewaretest.New(
m := middlewaretest.NewForTest(
t, log, cfg, newTestSessionManager(t, cfg),
)
@@ -456,11 +456,11 @@ func TestMetrics_StatusAndSizeStillRecorded(t *testing.T) {
)
}
// TestMetrics_WorksOnMiddlewaretestNew pins that a Middleware built
// by middlewaretest.New has a recorder of its own: its Metrics()
// TestMetrics_WorksOnNewForTestMiddleware pins that a Middleware built
// by middlewaretest.NewForTest has a recorder of its own: its Metrics()
// serves a request instead of panicking, and a second one does not
// collide with the first.
func TestMetrics_WorksOnMiddlewaretestNew(t *testing.T) {
func TestMetrics_WorksOnNewForTestMiddleware(t *testing.T) {
t.Parallel()
log := slog.New(slog.DiscardHandler)
@@ -470,7 +470,7 @@ func TestMetrics_WorksOnMiddlewaretestNew(t *testing.T) {
})
for range 2 {
h := middlewaretest.New(t, log, cfg, nil).Metrics()(ok)
h := middlewaretest.NewForTest(t, log, cfg, nil).Metrics()(ok)
req := httptest.NewRequestWithContext(
t.Context(), http.MethodGet, okRoute, nil,
+2 -2
View File
@@ -56,7 +56,7 @@ func testMiddlewareWithIdleTimeout(
sessManager := newTestSessionManager(t, cfg)
m := middlewaretest.New(t, log, cfg, sessManager)
m := middlewaretest.NewForTest(t, log, cfg, sessManager)
return m, sessManager
}
@@ -943,7 +943,7 @@ func metricsAuthMiddleware(
MetricsPassword: "secret",
}
return middlewaretest.New(
return middlewaretest.NewForTest(
t, log, cfg, newTestSessionManager(t, cfg),
)
}
@@ -14,12 +14,12 @@ import (
"sneak.berlin/go/webhooker/internal/session"
)
// New builds a Middleware through middleware.New, on a
// NewForTest builds a Middleware through middleware.New, on a
// lifecycle that is never started.
//
// Its metrics recorder writes to a fresh registry of its own, so
// Metrics() works on it and two of them never collide.
func New(
func NewForTest(
t *testing.T,
log *slog.Logger,
cfg *config.Config,
+1 -1
View File
@@ -199,7 +199,7 @@ func rateLimitMiddleware(
&slog.HandlerOptions{Level: slog.LevelDebug},
))
return middlewaretest.New(t, log, cfg, nil)
return middlewaretest.NewForTest(t, log, cfg, nil)
}
// trustedProxies parses CIDR strings for a test Config.