@@ -42,6 +42,7 @@ import (
4242 historypb "go.temporal.io/api/history/v1"
4343 nexuspb "go.temporal.io/api/nexus/v1"
4444 "go.temporal.io/api/operatorservice/v1"
45+ "go.temporal.io/api/serviceerror"
4546
4647 "go.temporal.io/sdk/client"
4748 "go.temporal.io/sdk/interceptor"
@@ -182,10 +183,20 @@ var syncOp = temporalnexus.NewSyncOperation("sync-op", func(ctx context.Context,
182183 Message : "fail" ,
183184 },
184185 }
186+ case "fmt-errorf" :
187+ return "" , fmt .Errorf ("arbitrary error message" )
185188 case "handlererror" :
186189 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+ })
187198 case "panic" :
188- panic ("panic" )
199+ panic ("panic requested " )
189200 }
190201 return "" , nil
191202})
@@ -213,9 +224,8 @@ func TestNexusSyncOperation(t *testing.T) {
213224
214225 w := worker .New (tc .client , tc .taskQueue , worker.Options {})
215226 service := nexus .NewService ("test" )
216- require .NoError (t , service .Register (syncOp , workflowOp ))
227+ require .NoError (t , service .Register (syncOp ))
217228 w .RegisterNexusService (service )
218- w .RegisterWorkflow (waitForCancelWorkflow )
219229 require .NoError (t , w .Start ())
220230 t .Cleanup (w .Stop )
221231
@@ -248,6 +258,14 @@ func TestNexusSyncOperation(t *testing.T) {
248258 require .Equal (t , "fail" , unsuccessfulOperationErr .Failure .Message )
249259 })
250260
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+
251269 t .Run ("handlererror" , func (t * testing.T ) {
252270 _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "handlererror" , nexus.ExecuteOperationOptions {})
253271 var unexpectedResponseErr * nexus.UnexpectedResponseError
@@ -263,12 +281,57 @@ func TestNexusSyncOperation(t *testing.T) {
263281 }, time .Second * 3 , time .Millisecond * 100 )
264282 })
265283
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+
266329 t .Run ("panic" , func (t * testing.T ) {
267330 _ , err := nexus .ExecuteOperation (ctx , nc , syncOp , "panic" , nexus.ExecuteOperationOptions {})
268331 var unexpectedResponseErr * nexus.UnexpectedResponseError
269332 require .ErrorAs (t , err , & unexpectedResponseErr )
270333 require .Equal (t , 500 , unexpectedResponseErr .Response .StatusCode )
271- require .Contains (t , unexpectedResponseErr .Message , "internal error " )
334+ require .Contains (t , unexpectedResponseErr .Message , "panic: panic requested " )
272335 })
273336}
274337
0 commit comments