@@ -7,55 +7,120 @@ import { Logger } from "@trigger.dev/core/logger";
7
7
import { SimpleQueue } from "./queue.js" ;
8
8
9
9
describe ( "Worker" , ( ) => {
10
- // Tests will be added here
11
- } ) ;
12
-
13
- redisTest ( "concurrency settings" , { timeout : 30_000 } , async ( { redisContainer } ) => {
14
- const processedItems : number [ ] = [ ] ;
15
- const worker = new Worker ( {
16
- name : "test-worker" ,
17
- redisOptions : {
18
- host : redisContainer . getHost ( ) ,
19
- port : redisContainer . getPort ( ) ,
20
- password : redisContainer . getPassword ( ) ,
21
- } ,
22
- catalog : {
23
- testJob : {
24
- schema : z . object ( { value : z . number ( ) } ) ,
25
- visibilityTimeoutMs : 5000 ,
26
- retry : { maxAttempts : 3 } ,
10
+ redisTest ( "Process items that don't throw" , { timeout : 30_000 } , async ( { redisContainer } ) => {
11
+ const processedItems : number [ ] = [ ] ;
12
+ const worker = new Worker ( {
13
+ name : "test-worker" ,
14
+ redisOptions : {
15
+ host : redisContainer . getHost ( ) ,
16
+ port : redisContainer . getPort ( ) ,
17
+ password : redisContainer . getPassword ( ) ,
18
+ } ,
19
+ catalog : {
20
+ testJob : {
21
+ schema : z . object ( { value : z . number ( ) } ) ,
22
+ visibilityTimeoutMs : 5000 ,
23
+ retry : { maxAttempts : 3 } ,
24
+ } ,
25
+ } ,
26
+ jobs : {
27
+ testJob : async ( { payload } ) => {
28
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 30 ) ) ; // Simulate work
29
+ processedItems . push ( payload . value ) ;
30
+ } ,
27
31
} ,
28
- } ,
29
- jobs : {
30
- testJob : async ( { payload } ) => {
31
- await new Promise ( ( resolve ) => setTimeout ( resolve , 30 ) ) ; // Simulate work
32
- processedItems . push ( payload . value ) ;
32
+ concurrency : {
33
+ workers : 2 ,
34
+ tasksPerWorker : 3 ,
33
35
} ,
34
- } ,
35
- concurrency : {
36
- workers : 2 ,
37
- tasksPerWorker : 3 ,
38
- } ,
39
- logger : new Logger ( "test" , "log" ) ,
36
+ logger : new Logger ( "test" , "log" ) ,
37
+ } ) ;
38
+
39
+ // Enqueue 10 items
40
+ for ( let i = 0 ; i < 10 ; i ++ ) {
41
+ await worker . enqueue ( {
42
+ id : `item-${ i } ` ,
43
+ job : "testJob" ,
44
+ payload : { value : i } ,
45
+ visibilityTimeoutMs : 5000 ,
46
+ } ) ;
47
+ }
48
+
49
+ worker . start ( ) ;
50
+
51
+ // Wait for items to be processed
52
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 600 ) ) ;
53
+
54
+ worker . stop ( ) ;
55
+
56
+ expect ( processedItems . length ) . toBe ( 10 ) ;
57
+ expect ( new Set ( processedItems ) . size ) . toBe ( 10 ) ; // Ensure all items were processed uniquely
40
58
} ) ;
41
59
42
- // Enqueue 10 items
43
- for ( let i = 0 ; i < 10 ; i ++ ) {
44
- await worker . enqueue ( {
45
- id : `item-${ i } ` ,
46
- job : "testJob" ,
47
- payload : { value : i } ,
48
- visibilityTimeoutMs : 5000 ,
49
- } ) ;
50
- }
60
+ redisTest (
61
+ "Process items that throw an error" ,
62
+ { timeout : 30_000 } ,
63
+ async ( { redisContainer } ) => {
64
+ const processedItems : number [ ] = [ ] ;
65
+ const hadAttempt = new Set < string > ( ) ;
51
66
52
- worker . start ( ) ;
67
+ const worker = new Worker ( {
68
+ name : "test-worker" ,
69
+ redisOptions : {
70
+ host : redisContainer . getHost ( ) ,
71
+ port : redisContainer . getPort ( ) ,
72
+ password : redisContainer . getPassword ( ) ,
73
+ } ,
74
+ catalog : {
75
+ testJob : {
76
+ schema : z . object ( { value : z . number ( ) } ) ,
77
+ visibilityTimeoutMs : 5000 ,
78
+ retry : { maxAttempts : 3 , minDelayMs : 10 } ,
79
+ } ,
80
+ } ,
81
+ jobs : {
82
+ testJob : async ( { id, payload } ) => {
83
+ if ( ! hadAttempt . has ( id ) ) {
84
+ hadAttempt . add ( id ) ;
85
+ throw new Error ( "Test error" ) ;
86
+ }
53
87
54
- // Wait for items to be processed
55
- await new Promise ( ( resolve ) => setTimeout ( resolve , 600 ) ) ;
88
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 30 ) ) ; // Simulate work
89
+ processedItems . push ( payload . value ) ;
90
+ } ,
91
+ } ,
92
+ concurrency : {
93
+ workers : 2 ,
94
+ tasksPerWorker : 3 ,
95
+ } ,
96
+ pollIntervalMs : 50 ,
97
+ logger : new Logger ( "test" , "error" ) ,
98
+ } ) ;
56
99
57
- worker . stop ( ) ;
100
+ // Enqueue 10 items
101
+ for ( let i = 0 ; i < 10 ; i ++ ) {
102
+ await worker . enqueue ( {
103
+ id : `item-${ i } ` ,
104
+ job : "testJob" ,
105
+ payload : { value : i } ,
106
+ visibilityTimeoutMs : 5000 ,
107
+ } ) ;
108
+ }
58
109
59
- expect ( processedItems . length ) . toBe ( 10 ) ;
60
- expect ( new Set ( processedItems ) . size ) . toBe ( 10 ) ; // Ensure all items were processed uniquely
110
+ worker . start ( ) ;
111
+
112
+ // Wait for items to be processed
113
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 500 ) ) ;
114
+
115
+ worker . stop ( ) ;
116
+
117
+ expect ( processedItems . length ) . toBe ( 10 ) ;
118
+ expect ( new Set ( processedItems ) . size ) . toBe ( 10 ) ; // Ensure all items were processed uniquely
119
+ }
120
+ ) ;
61
121
} ) ;
122
+
123
+ //todo test throwing an error and that retrying works
124
+ //todo test that throwing an error doesn't screw up the other items
125
+ //todo change the processItems to be in parallel using Promise.allResolved
126
+ //process more items when finished
0 commit comments