Skip to content

Commit 4a75e68

Browse files
authored
Add initTestConfig helper for more succinct example tests (#1249)
Here, add an `initTestConfig` helper for example tests that wraps up a lot of the common testing logic in each. This leaves the example tests more succinct, takes a lot of test-only code out of the equation to keep the signal higher for readers, and makes broadly refactoring example tests easier as changes may need to only be made in one place. This is very similar to the change we already made in River Pro.
1 parent 374ca2e commit 4a75e68

30 files changed

Lines changed: 253 additions & 249 deletions

common_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@ package river_test
33
import (
44
"context"
55
"fmt"
6+
"log/slog"
7+
"os"
8+
9+
"github.com/jackc/pgx/v5/pgxpool"
610

711
"github.com/riverqueue/river"
12+
"github.com/riverqueue/river/riverdbtest"
13+
"github.com/riverqueue/river/riverdriver/riverpgxv5"
14+
"github.com/riverqueue/river/rivershared/util/slogutil"
15+
"github.com/riverqueue/river/rivershared/util/testutil"
816
)
917

1018
//
@@ -24,3 +32,32 @@ func (w *NoOpWorker) Work(ctx context.Context, job *river.Job[NoOpArgs]) error {
2432
fmt.Printf("NoOpWorker.Work ran\n")
2533
return nil
2634
}
35+
36+
// initTestConfig initializes properties on a given River config with defaults
37+
// suitable for example tests, including an isolated test schema and
38+
// example-friendly logger. It's meant to keep the main example code more terse
39+
// and its use can be removed when copy/pasting from examples.
40+
//
41+
// This helper is intentionally duplicated across example packages so setup
42+
// stays discoverable in each package's docs without introducing an internal
43+
// example-only helper package.
44+
//
45+
// Most workflow examples call this helper to keep setup terse while leaving
46+
// `pgxpool.New` and `river.NewClient` wiring visible in each example.
47+
func initTestConfig(ctx context.Context, dbPool *pgxpool.Pool, config *river.Config) *river.Config {
48+
if config.Logger == nil {
49+
// Keep internal client logs off stdout so doctest output stays stable.
50+
config.Logger = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
51+
Level: slog.LevelWarn,
52+
ReplaceAttr: slogutil.NoLevelTime,
53+
}))
54+
}
55+
56+
if dbPool != nil {
57+
config.Schema = riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil)
58+
}
59+
60+
config.TestOnly = true
61+
62+
return config
63+
}

example_batch_insert_test.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108

119
"github.com/riverqueue/river"
12-
"github.com/riverqueue/river/riverdbtest"
1310
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1411
"github.com/riverqueue/river/rivershared/riversharedtest"
15-
"github.com/riverqueue/river/rivershared/util/slogutil"
1612
"github.com/riverqueue/river/rivershared/util/testutil"
1713
)
1814

@@ -45,15 +41,12 @@ func Example_batchInsert() {
4541
workers := river.NewWorkers()
4642
river.AddWorker(workers, &BatchInsertWorker{})
4743

48-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
49-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
44+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
5045
Queues: map[string]river.QueueConfig{
5146
river.QueueDefault: {MaxWorkers: 100},
5247
},
53-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
54-
TestOnly: true, // suitable only for use in tests; remove for live environments
55-
Workers: workers,
56-
})
48+
Workers: workers,
49+
}))
5750
if err != nil {
5851
panic(err)
5952
}

example_client_from_context_test.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,13 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"log/slog"
8-
"os"
97

108
"github.com/jackc/pgx/v5"
119
"github.com/jackc/pgx/v5/pgxpool"
1210

1311
"github.com/riverqueue/river"
14-
"github.com/riverqueue/river/riverdbtest"
1512
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1613
"github.com/riverqueue/river/rivershared/riversharedtest"
17-
"github.com/riverqueue/river/rivershared/util/slogutil"
1814
"github.com/riverqueue/river/rivershared/util/testutil"
1915
)
2016

@@ -52,16 +48,13 @@ func ExampleClientFromContext_pgx() {
5248
workers := river.NewWorkers()
5349
river.AddWorker(workers, &ContextClientWorker{})
5450

55-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
56-
ID: "ClientFromContextClient",
57-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
51+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
52+
ID: "ClientFromContextClient",
5853
Queues: map[string]river.QueueConfig{
5954
river.QueueDefault: {MaxWorkers: 10},
6055
},
61-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
62-
TestOnly: true, // suitable only for use in tests; remove for live environments
63-
Workers: workers,
64-
})
56+
Workers: workers,
57+
}))
6558
if err != nil {
6659
panic(err)
6760
}

example_complete_job_within_tx_test.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108

119
"github.com/riverqueue/river"
12-
"github.com/riverqueue/river/riverdbtest"
1310
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1411
"github.com/riverqueue/river/rivershared/riversharedtest"
15-
"github.com/riverqueue/river/rivershared/util/slogutil"
1612
"github.com/riverqueue/river/rivershared/util/testutil"
1713
)
1814

@@ -71,15 +67,12 @@ func Example_completeJobWithinTx() {
7167
workers := river.NewWorkers()
7268
river.AddWorker(workers, &TransactionalWorker{dbPool: dbPool})
7369

74-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
75-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
70+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
7671
Queues: map[string]river.QueueConfig{
7772
river.QueueDefault: {MaxWorkers: 100},
7873
},
79-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
80-
TestOnly: true, // suitable only for use in tests; remove for live environments
81-
Workers: workers,
82-
})
74+
Workers: workers,
75+
}))
8376
if err != nil {
8477
panic(err)
8578
}

example_cron_job_test.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108
"github.com/robfig/cron/v3"
119

1210
"github.com/riverqueue/river"
13-
"github.com/riverqueue/river/riverdbtest"
1411
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1512
"github.com/riverqueue/river/rivershared/riversharedtest"
16-
"github.com/riverqueue/river/rivershared/util/slogutil"
1713
"github.com/riverqueue/river/rivershared/util/testutil"
1814
)
1915

@@ -52,8 +48,7 @@ func Example_cronJob() {
5248
panic(err)
5349
}
5450

55-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
56-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
51+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
5752
PeriodicJobs: []*river.PeriodicJob{
5853
river.NewPeriodicJob(
5954
schedule,
@@ -66,10 +61,8 @@ func Example_cronJob() {
6661
Queues: map[string]river.QueueConfig{
6762
river.QueueDefault: {MaxWorkers: 100},
6863
},
69-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
70-
TestOnly: true, // suitable only for use in tests; remove for live environments
71-
Workers: workers,
72-
})
64+
Workers: workers,
65+
}))
7366
if err != nil {
7467
panic(err)
7568
}

example_custom_insert_opts_test.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108

119
"github.com/riverqueue/river"
12-
"github.com/riverqueue/river/riverdbtest"
1310
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1411
"github.com/riverqueue/river/rivershared/riversharedtest"
15-
"github.com/riverqueue/river/rivershared/util/slogutil"
1612
"github.com/riverqueue/river/rivershared/util/testutil"
1713
)
1814

@@ -69,16 +65,13 @@ func Example_customInsertOpts() {
6965
river.AddWorker(workers, &AlwaysHighPriorityWorker{})
7066
river.AddWorker(workers, &SometimesHighPriorityWorker{})
7167

72-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
73-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
68+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
7469
Queues: map[string]river.QueueConfig{
7570
river.QueueDefault: {MaxWorkers: 100},
7671
"high_priority": {MaxWorkers: 100},
7772
},
78-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
79-
TestOnly: true, // suitable only for use in tests; remove for live environments
80-
Workers: workers,
81-
})
73+
Workers: workers,
74+
}))
8275
if err != nil {
8376
panic(err)
8477
}

example_error_handler_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/jackc/pgx/v5/pgxpool"
1111

1212
"github.com/riverqueue/river"
13-
"github.com/riverqueue/river/riverdbtest"
1413
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1514
"github.com/riverqueue/river/rivershared/riversharedtest"
1615
"github.com/riverqueue/river/rivershared/util/slogutil"
@@ -73,16 +72,14 @@ func Example_errorHandler() {
7372
workers := river.NewWorkers()
7473
river.AddWorker(workers, &ErroringWorker{})
7574

76-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
75+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
7776
ErrorHandler: &CustomErrorHandler{},
7877
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.Level(9), ReplaceAttr: slogutil.NoLevelTime})), // Suppress logging so example output is cleaner (9 > slog.LevelError).
7978
Queues: map[string]river.QueueConfig{
8079
river.QueueDefault: {MaxWorkers: 10},
8180
},
82-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
83-
TestOnly: true, // suitable only for use in tests; remove for live environments
84-
Workers: workers,
85-
})
81+
Workers: workers,
82+
}))
8683
if err != nil {
8784
panic(err)
8885
}

example_global_hooks_test.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108

119
"github.com/riverqueue/river"
12-
"github.com/riverqueue/river/riverdbtest"
1310
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1411
"github.com/riverqueue/river/rivershared/riversharedtest"
15-
"github.com/riverqueue/river/rivershared/util/slogutil"
1612
"github.com/riverqueue/river/rivershared/util/testutil"
1713
"github.com/riverqueue/river/rivertype"
1814
)
@@ -55,7 +51,7 @@ var (
5551

5652
// Example_globalHooks demonstrates the use of hooks to modify River behavior
5753
// which are global to a River client.
58-
func Example_globalHooks() {
54+
func Example_globalHooks() { //nolint:dupl
5955
ctx := context.Background()
6056

6157
dbPool, err := pgxpool.New(ctx, riversharedtest.TestDatabaseURL())
@@ -67,21 +63,18 @@ func Example_globalHooks() {
6763
workers := river.NewWorkers()
6864
river.AddWorker(workers, &NoOpWorker{})
6965

70-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
66+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
7167
// Order is significant. See output below.
7268
Hooks: []rivertype.Hook{
7369
&BothInsertAndWorkBeginHook{},
7470
&InsertBeginHook{},
7571
&WorkBeginHook{},
7672
},
77-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
7873
Queues: map[string]river.QueueConfig{
7974
river.QueueDefault: {MaxWorkers: 100},
8075
},
81-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
82-
TestOnly: true, // suitable only for use in tests; remove for live environments
83-
Workers: workers,
84-
})
76+
Workers: workers,
77+
}))
8578
if err != nil {
8679
panic(err)
8780
}

example_global_middleware_test.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ package river_test
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
7-
"os"
86

97
"github.com/jackc/pgx/v5/pgxpool"
108

119
"github.com/riverqueue/river"
12-
"github.com/riverqueue/river/riverdbtest"
1310
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1411
"github.com/riverqueue/river/rivershared/riversharedtest"
15-
"github.com/riverqueue/river/rivershared/util/slogutil"
1612
"github.com/riverqueue/river/rivershared/util/testutil"
1713
"github.com/riverqueue/river/rivertype"
1814
)
@@ -55,7 +51,7 @@ var (
5551

5652
// Example_globalMiddleware demonstrates the use of middleware to modify River
5753
// behavior which are global to a River client.
58-
func Example_globalMiddleware() {
54+
func Example_globalMiddleware() { //nolint:dupl
5955
ctx := context.Background()
6056

6157
dbPool, err := pgxpool.New(ctx, riversharedtest.TestDatabaseURL())
@@ -67,9 +63,8 @@ func Example_globalMiddleware() {
6763
workers := river.NewWorkers()
6864
river.AddWorker(workers, &NoOpWorker{})
6965

70-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
66+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
7167
// Order is significant. See output below.
72-
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})),
7368
Middleware: []rivertype.Middleware{
7469
&JobBothInsertAndWorkMiddleware{},
7570
&JobInsertMiddleware{},
@@ -78,10 +73,8 @@ func Example_globalMiddleware() {
7873
Queues: map[string]river.QueueConfig{
7974
river.QueueDefault: {MaxWorkers: 100},
8075
},
81-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
82-
TestOnly: true, // suitable only for use in tests; remove for live environments
83-
Workers: workers,
84-
})
76+
Workers: workers,
77+
}))
8578
if err != nil {
8679
panic(err)
8780
}

example_graceful_shutdown_test.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@ import (
1313
"github.com/jackc/pgx/v5/pgxpool"
1414

1515
"github.com/riverqueue/river"
16-
"github.com/riverqueue/river/riverdbtest"
1716
"github.com/riverqueue/river/riverdriver/riverpgxv5"
1817
"github.com/riverqueue/river/rivershared/riversharedtest"
1918
"github.com/riverqueue/river/rivershared/util/slogutil"
20-
"github.com/riverqueue/river/rivershared/util/testutil"
2119
)
2220

2321
type WaitsForCancelOnlyArgs struct{}
@@ -65,15 +63,13 @@ func Example_gracefulShutdown() {
6563
workers := river.NewWorkers()
6664
river.AddWorker(workers, &WaitsForCancelOnlyWorker{jobStarted: jobStarted})
6765

68-
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
66+
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), initTestConfig(ctx, dbPool, &river.Config{
6967
Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTimeJobID})),
7068
Queues: map[string]river.QueueConfig{
7169
river.QueueDefault: {MaxWorkers: 100},
7270
},
73-
Schema: riverdbtest.TestSchema(ctx, testutil.PanicTB(), riverpgxv5.New(dbPool), nil), // only necessary for the example test
74-
TestOnly: true, // suitable only for use in tests; remove for live environments
75-
Workers: workers,
76-
})
71+
Workers: workers,
72+
}))
7773
if err != nil {
7874
panic(err)
7975
}

0 commit comments

Comments
 (0)