@@ -42,6 +42,7 @@ import (
42
42
historypb "go.temporal.io/api/history/v1"
43
43
nexuspb "go.temporal.io/api/nexus/v1"
44
44
"go.temporal.io/api/operatorservice/v1"
45
+ "go.temporal.io/api/serviceerror"
45
46
46
47
"go.temporal.io/sdk/client"
47
48
"go.temporal.io/sdk/interceptor"
@@ -182,10 +183,20 @@ var syncOp = temporalnexus.NewSyncOperation("sync-op", func(ctx context.Context,
182
183
Message : "fail" ,
183
184
},
184
185
}
186
+ case "fmt-errorf" :
187
+ return "" , fmt .Errorf ("arbitrary error message" )
185
188
case "handlererror" :
186
189
return "" , nexus .HandlerErrorf (nexus .HandlerErrorTypeBadRequest , s )
190
+ case "already-started" :
191
+ return "" , serviceerror .NewWorkflowExecutionAlreadyStarted ("faking workflow already started" , "dont-care" , "dont-care" )
192
+ case "retryable-application-error" :
193
+ return "" , temporal .NewApplicationError ("fake app error for test" , "FakeTestError" )
194
+ case "non-retryable-application-error" :
195
+ return "" , temporal .NewApplicationErrorWithOptions ("fake app error for test" , "FakeTestError" , temporal.ApplicationErrorOptions {
196
+ NonRetryable : true ,
197
+ })
187
198
case "panic" :
188
- panic ("panic" )
199
+ panic ("panic requested " )
189
200
}
190
201
return "" , nil
191
202
})
@@ -213,9 +224,8 @@ func TestNexusSyncOperation(t *testing.T) {
213
224
214
225
w := worker .New (tc .client , tc .taskQueue , worker.Options {})
215
226
service := nexus .NewService ("test" )
216
- require .NoError (t , service .Register (syncOp , workflowOp ))
227
+ require .NoError (t , service .Register (syncOp ))
217
228
w .RegisterNexusService (service )
218
- w .RegisterWorkflow (waitForCancelWorkflow )
219
229
require .NoError (t , w .Start ())
220
230
t .Cleanup (w .Stop )
221
231
@@ -248,6 +258,14 @@ func TestNexusSyncOperation(t *testing.T) {
248
258
require .Equal (t , "fail" , unsuccessfulOperationErr .Failure .Message )
249
259
})
250
260
261
+ t .Run ("fmt-errorf" , func (t * testing.T ) {
262
+ tc .metricsHandler .Clear ()
263
+ _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "fmt-errorf" , nexus.ExecuteOperationOptions {})
264
+ var unexpectedResponseErr * nexus.UnexpectedResponseError
265
+ require .ErrorAs (t , err , & unexpectedResponseErr )
266
+ require .Contains (t , unexpectedResponseErr .Message , `"500 Internal Server Error": arbitrary error message` )
267
+ })
268
+
251
269
t .Run ("handlererror" , func (t * testing.T ) {
252
270
_ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "handlererror" , nexus.ExecuteOperationOptions {})
253
271
var unexpectedResponseErr * nexus.UnexpectedResponseError
@@ -263,12 +281,57 @@ func TestNexusSyncOperation(t *testing.T) {
263
281
}, time .Second * 3 , time .Millisecond * 100 )
264
282
})
265
283
284
+ t .Run ("already-started" , func (t * testing.T ) {
285
+ _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "already-started" , nexus.ExecuteOperationOptions {})
286
+ var unexpectedResponseErr * nexus.UnexpectedResponseError
287
+ require .ErrorAs (t , err , & unexpectedResponseErr )
288
+ require .Equal (t , http .StatusBadRequest , unexpectedResponseErr .Response .StatusCode )
289
+ require .Contains (t , unexpectedResponseErr .Message , `"400 Bad Request": faking workflow already started` )
290
+
291
+ require .EventuallyWithT (t , func (t * assert.CollectT ) {
292
+ tc .requireTimer (t , metrics .NexusTaskEndToEndLatency , service .Name , syncOp .Name ())
293
+ tc .requireTimer (t , metrics .NexusTaskScheduleToStartLatency , service .Name , syncOp .Name ())
294
+ tc .requireTimer (t , metrics .NexusTaskExecutionLatency , service .Name , syncOp .Name ())
295
+ tc .requireCounter (t , metrics .NexusTaskExecutionFailedCounter , service .Name , syncOp .Name ())
296
+ }, time .Second * 3 , time .Millisecond * 100 )
297
+ })
298
+
299
+ t .Run ("retryable-application-error" , func (t * testing.T ) {
300
+ _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "retryable-application-error" , nexus.ExecuteOperationOptions {})
301
+ var unexpectedResponseErr * nexus.UnexpectedResponseError
302
+ require .ErrorAs (t , err , & unexpectedResponseErr )
303
+ require .Equal (t , http .StatusInternalServerError , unexpectedResponseErr .Response .StatusCode )
304
+ require .Contains (t , unexpectedResponseErr .Message , `"500 Internal Server Error": fake app error for test` )
305
+
306
+ require .EventuallyWithT (t , func (t * assert.CollectT ) {
307
+ tc .requireTimer (t , metrics .NexusTaskEndToEndLatency , service .Name , syncOp .Name ())
308
+ tc .requireTimer (t , metrics .NexusTaskScheduleToStartLatency , service .Name , syncOp .Name ())
309
+ tc .requireTimer (t , metrics .NexusTaskExecutionLatency , service .Name , syncOp .Name ())
310
+ tc .requireCounter (t , metrics .NexusTaskExecutionFailedCounter , service .Name , syncOp .Name ())
311
+ }, time .Second * 3 , time .Millisecond * 100 )
312
+ })
313
+
314
+ t .Run ("non-retryable-application-error" , func (t * testing.T ) {
315
+ _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "non-retryable-application-error" , nexus.ExecuteOperationOptions {})
316
+ var unexpectedResponseErr * nexus.UnexpectedResponseError
317
+ require .ErrorAs (t , err , & unexpectedResponseErr )
318
+ require .Equal (t , http .StatusBadRequest , unexpectedResponseErr .Response .StatusCode )
319
+ require .Contains (t , unexpectedResponseErr .Message , `"400 Bad Request": fake app error for test` )
320
+
321
+ require .EventuallyWithT (t , func (t * assert.CollectT ) {
322
+ tc .requireTimer (t , metrics .NexusTaskEndToEndLatency , service .Name , syncOp .Name ())
323
+ tc .requireTimer (t , metrics .NexusTaskScheduleToStartLatency , service .Name , syncOp .Name ())
324
+ tc .requireTimer (t , metrics .NexusTaskExecutionLatency , service .Name , syncOp .Name ())
325
+ tc .requireCounter (t , metrics .NexusTaskExecutionFailedCounter , service .Name , syncOp .Name ())
326
+ }, time .Second * 3 , time .Millisecond * 100 )
327
+ })
328
+
266
329
t .Run ("panic" , func (t * testing.T ) {
267
330
_ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "panic" , nexus.ExecuteOperationOptions {})
268
331
var unexpectedResponseErr * nexus.UnexpectedResponseError
269
332
require .ErrorAs (t , err , & unexpectedResponseErr )
270
333
require .Equal (t , 500 , unexpectedResponseErr .Response .StatusCode )
271
- require .Contains (t , unexpectedResponseErr .Message , "internal error " )
334
+ require .Contains (t , unexpectedResponseErr .Message , "panic: panic requested " )
272
335
})
273
336
}
274
337
0 commit comments