diff --git a/serviceerror/convert_test.go b/serviceerror/convert_test.go index ad8aa180..89c53344 100644 --- a/serviceerror/convert_test.go +++ b/serviceerror/convert_test.go @@ -14,6 +14,7 @@ import ( "google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/durationpb" + enumspb "go.temporal.io/api/enums/v1" "go.temporal.io/api/errordetails/v1" "go.temporal.io/api/serviceerror" ) @@ -133,6 +134,48 @@ func TestMultiOperationExecution(t *testing.T) { }) } +func TestMultiOperationExecution_PreservesResourceExhaustedDetails(t *testing.T) { + resourceErr := &serviceerror.ResourceExhausted{ + Cause: enumspb.RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT, + Scope: enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE, + Message: "rate limit exceeded", + } + multiErr := serviceerror.NewMultiOperationExecution( + "multi-op failed", + []error{ + resourceErr, + serviceerror.NewInvalidArgument("other error"), + }, + ) + + // Check round-trip conversion + st := serviceerror.ToStatus(multiErr) + reconstructed := serviceerror.FromStatus(st) + + multiOp, ok := reconstructed.(*serviceerror.MultiOperationExecution) + require.True(t, ok) + + // Get the operation errors + opErrors := multiOp.OperationErrors() + require.Len(t, opErrors, 2) + + // Verify the first error is ResourceExhausted with preserved details + reErr, ok := opErrors[0].(*serviceerror.ResourceExhausted) + require.True(t, ok) + require.Equal(t, enumspb.RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT, reErr.Cause) + require.Equal(t, enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE, reErr.Scope) + require.Equal(t, "rate limit exceeded", reErr.Message) + + // Verify the second error is InvalidArgument with preserved details + invErr, ok := opErrors[1].(*serviceerror.InvalidArgument) + require.True(t, ok) + require.Equal(t, "other error", invErr.Message) + + // Verify proto round-trip equality + reconstructedStatus := serviceerror.ToStatus(reconstructed) + require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto())) +} + func TestMultiOperationAborted(t *testing.T) { err := serviceerror.NewMultiOperationAborted("Operation was aborted.")