@@ -24,7 +24,6 @@ import (
2424 "github.com/tidwall/sjson"
2525
2626 "github.com/riverqueue/river/internal/dbunique"
27- "github.com/riverqueue/river/internal/jobexecutor"
2827 "github.com/riverqueue/river/internal/maintenance"
2928 "github.com/riverqueue/river/internal/middlewarelookup"
3029 "github.com/riverqueue/river/internal/notifier"
@@ -840,38 +839,47 @@ func Test_Client_Common(t *testing.T) {
840839
841840 _ , bundle := setup (t )
842841
843- type JobArgs struct {
844- testutil.JobArgsReflectKind [JobArgs ]
845- hookEmbed [metadataHookInsertBegin ]
846- }
842+ var hookInsertBeginCalled atomic.Bool
847843
848- AddWorker (bundle .config .Workers , WorkFunc (func (ctx context.Context , job * Job [JobArgs ]) error {
844+ jobArgs := JobArgsWithHooksFunc (func () []rivertype.Hook {
845+ return []rivertype.Hook {
846+ HookInsertBeginFunc (func (ctx context.Context , params * rivertype.JobInsertParams ) error {
847+ hookInsertBeginCalled .Store (true )
848+ return nil
849+ }),
850+ }
851+ })
852+
853+ AddWorkerArgs (bundle .config .Workers , jobArgs , WorkFunc (func (ctx context.Context , job * Job [JobArgsWithHooksFunc ]) error {
849854 return nil
850855 }))
851856
852857 client , err := NewClient (riverpgxv5 .New (bundle .dbPool ), bundle .config )
853858 require .NoError (t , err )
854859
855- insertRes , err : = client .Insert (ctx , JobArgs {} , nil )
860+ _ , err = client .Insert (ctx , jobArgs , nil )
856861 require .NoError (t , err )
857862
858- var metadataMap map [string ]any
859- err = json .Unmarshal (insertRes .Job .Metadata , & metadataMap )
860- require .NoError (t , err )
861- require .Equal (t , metadataHookCalled , metadataMap [metadataHookInsertBeginKey ])
863+ require .True (t , hookInsertBeginCalled .Load ())
862864 })
863865
864866 t .Run ("WithWorkBeginHookOnJobArgs" , func (t * testing.T ) { //nolint:dupl
865867 t .Parallel ()
866868
867869 _ , bundle := setup (t )
868870
869- type JobArgs struct {
870- testutil.JobArgsReflectKind [JobArgs ]
871- hookEmbed [metadataHookWorkBegin ]
872- }
871+ var hookWorkBeginCalled atomic.Bool
873872
874- AddWorker (bundle .config .Workers , WorkFunc (func (ctx context.Context , job * Job [JobArgs ]) error {
873+ jobArgs := JobArgsWithHooksFunc (func () []rivertype.Hook {
874+ return []rivertype.Hook {
875+ HookWorkBeginFunc (func (ctx context.Context , job * rivertype.JobRow ) error {
876+ hookWorkBeginCalled .Store (true )
877+ return nil
878+ }),
879+ }
880+ })
881+
882+ AddWorkerArgs (bundle .config .Workers , jobArgs , WorkFunc (func (ctx context.Context , job * Job [JobArgsWithHooksFunc ]) error {
875883 return nil
876884 }))
877885
@@ -881,30 +889,33 @@ func Test_Client_Common(t *testing.T) {
881889 subscribeChan := subscribe (t , client )
882890 startClient (ctx , t , client )
883891
884- insertRes , err := client .Insert (ctx , JobArgs {} , nil )
892+ insertRes , err := client .Insert (ctx , jobArgs , nil )
885893 require .NoError (t , err )
886894
887895 event := riversharedtest .WaitOrTimeout (t , subscribeChan )
888896 require .Equal (t , EventKindJobCompleted , event .Kind )
889897 require .Equal (t , insertRes .Job .ID , event .Job .ID )
890898
891- var metadataMap map [string ]any
892- err = json .Unmarshal (event .Job .Metadata , & metadataMap )
893- require .NoError (t , err )
894- require .Equal (t , metadataHookCalled , metadataMap [metadataHookWorkBeginKey ])
899+ require .True (t , hookWorkBeginCalled .Load ())
895900 })
896901
897902 t .Run ("WithWorkEndHookOnJobArgs" , func (t * testing.T ) { //nolint:dupl
898903 t .Parallel ()
899904
900905 _ , bundle := setup (t )
901906
902- type JobArgs struct {
903- testutil.JobArgsReflectKind [JobArgs ]
904- hookEmbed [metadataHookWorkEnd ]
905- }
907+ var hookWorkEndCalled atomic.Bool
906908
907- AddWorker (bundle .config .Workers , WorkFunc (func (ctx context.Context , job * Job [JobArgs ]) error {
909+ jobArgs := JobArgsWithHooksFunc (func () []rivertype.Hook {
910+ return []rivertype.Hook {
911+ HookWorkEndFunc (func (ctx context.Context , job * rivertype.JobRow , err error ) error {
912+ hookWorkEndCalled .Store (true )
913+ return nil
914+ }),
915+ }
916+ })
917+
918+ AddWorkerArgs (bundle .config .Workers , jobArgs , WorkFunc (func (ctx context.Context , job * Job [JobArgsWithHooksFunc ]) error {
908919 return nil
909920 }))
910921
@@ -914,17 +925,14 @@ func Test_Client_Common(t *testing.T) {
914925 subscribeChan := subscribe (t , client )
915926 startClient (ctx , t , client )
916927
917- insertRes , err := client .Insert (ctx , JobArgs {} , nil )
928+ insertRes , err := client .Insert (ctx , jobArgs , nil )
918929 require .NoError (t , err )
919930
920931 event := riversharedtest .WaitOrTimeout (t , subscribeChan )
921932 require .Equal (t , EventKindJobCompleted , event .Kind )
922933 require .Equal (t , insertRes .Job .ID , event .Job .ID )
923934
924- var metadataMap map [string ]any
925- err = json .Unmarshal (event .Job .Metadata , & metadataMap )
926- require .NoError (t , err )
927- require .Equal (t , metadataHookCalled , metadataMap [metadataHookWorkEndKey ])
935+ require .True (t , hookWorkEndCalled .Load ())
928936 })
929937
930938 t .Run ("WithGlobalWorkerMiddleware" , func (t * testing.T ) {
@@ -1384,73 +1392,6 @@ func Test_Client_Common(t *testing.T) {
13841392 })
13851393}
13861394
1387- // hookEmbed can be embedded on a JobArgs to add a hook to it in such a way that
1388- // it can be encapsulated within a test case.
1389- type hookEmbed [T rivertype.Hook ] struct {}
1390-
1391- func (f hookEmbed [T ]) Hooks () []rivertype.Hook {
1392- var hook T
1393- return []rivertype.Hook {hook }
1394- }
1395-
1396- const (
1397- metadataHookCalled = "called"
1398- metadataHookInsertBeginKey = "insert_begin"
1399- metadataHookWorkBeginKey = "work_begin"
1400- metadataHookWorkEndKey = "work_end"
1401- )
1402-
1403- type metadataHookInsertBegin struct { rivertype.Hook }
1404-
1405- func (metadataHookInsertBegin ) InsertBegin (ctx context.Context , params * rivertype.JobInsertParams ) error {
1406- var metadataMap map [string ]any
1407- if err := json .Unmarshal (params .Metadata , & metadataMap ); err != nil {
1408- return err
1409- }
1410-
1411- metadataMap [metadataHookInsertBeginKey ] = metadataHookCalled
1412-
1413- var err error
1414- params .Metadata , err = json .Marshal (metadataMap )
1415- if err != nil {
1416- return err
1417- }
1418-
1419- return nil
1420- }
1421-
1422- type metadataHookWorkBegin struct { rivertype.Hook }
1423-
1424- func (metadataHookWorkBegin ) WorkBegin (ctx context.Context , job * rivertype.JobRow ) error {
1425- metadataUpdates , hasMetadataUpdates := jobexecutor .MetadataUpdatesFromWorkContext (ctx )
1426- if ! hasMetadataUpdates {
1427- panic ("expected to be called from within job executor" )
1428- }
1429-
1430- metadataUpdates [metadataHookWorkBeginKey ] = metadataHookCalled
1431-
1432- return nil
1433- }
1434-
1435- type metadataHookWorkEnd struct { rivertype.Hook }
1436-
1437- func (metadataHookWorkEnd ) WorkEnd (ctx context.Context , job * rivertype.JobRow , err error ) error {
1438- metadataUpdates , hasMetadataUpdates := jobexecutor .MetadataUpdatesFromWorkContext (ctx )
1439- if ! hasMetadataUpdates {
1440- panic ("expected to be called from within job executor" )
1441- }
1442-
1443- metadataUpdates [metadataHookWorkEndKey ] = metadataHookCalled
1444-
1445- return err
1446- }
1447-
1448- var (
1449- _ rivertype.HookInsertBegin = metadataHookInsertBegin {}
1450- _ rivertype.HookWorkBegin = metadataHookWorkBegin {}
1451- _ rivertype.HookWorkEnd = metadataHookWorkEnd {}
1452- )
1453-
14541395type workerWithMiddleware [T JobArgs ] struct {
14551396 WorkerDefaults [T ]
14561397
@@ -8036,3 +7977,15 @@ func NewDriverWithoutListenNotify(dbPool *pgxpool.Pool) *DriverWithoutListenNoti
80367977
80377978func (d * DriverWithoutListenNotify ) SupportsListener () bool { return false }
80387979func (d * DriverWithoutListenNotify ) SupportsListenNotify () bool { return false }
7980+
7981+ type JobArgsWithHooksFunc func () []rivertype.Hook
7982+
7983+ func (JobArgsWithHooksFunc ) Kind () string { return "job_args_with_hooks" }
7984+
7985+ func (f JobArgsWithHooksFunc ) Hooks () []rivertype.Hook {
7986+ return f ()
7987+ }
7988+
7989+ func (JobArgsWithHooksFunc ) MarshalJSON () ([]byte , error ) { return []byte ("{}" ), nil }
7990+
7991+ func (JobArgsWithHooksFunc ) UnmarshalJSON ([]byte ) error { return nil }
0 commit comments