diff --git a/internal/server/evaluation/evaluation.go b/internal/server/evaluation/evaluation.go index b7ebb9306e..fc8acfadb0 100644 --- a/internal/server/evaluation/evaluation.go +++ b/internal/server/evaluation/evaluation.go @@ -2,7 +2,6 @@ package evaluation import ( "context" - "errors" "fmt" "hash/crc32" "sort" @@ -500,9 +499,28 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ f, err := store.GetFlag(ctx, storage.NewResource(req.NamespaceKey, req.FlagKey, storage.WithReference(b.Reference))) if err != nil { - var errnf errs.ErrNotFound - if errors.As(err, &errnf) { - eresp := &rpcevaluation.EvaluationResponse{ + eresp := &rpcevaluation.EvaluationResponse{ + Type: rpcevaluation.EvaluationResponseType_ERROR_EVALUATION_RESPONSE_TYPE, + Response: &rpcevaluation.EvaluationResponse_ErrorResponse{ + ErrorResponse: &rpcevaluation.ErrorEvaluationResponse{ + FlagKey: req.FlagKey, + NamespaceKey: req.NamespaceKey, + Reason: rpcevaluation.ErrorEvaluationReason_NOT_FOUND_ERROR_EVALUATION_REASON, + }, + }, + } + + resp.Responses = append(resp.Responses, eresp) + continue + } + + var eresp *rpcevaluation.EvaluationResponse + + switch f.Type { + case core.FlagType_BOOLEAN_FLAG_TYPE: + res, err := s.boolean(ctx, store, env, f, req) + if err != nil { + eresp = &rpcevaluation.EvaluationResponse{ Type: rpcevaluation.EvaluationResponseType_ERROR_EVALUATION_RESPONSE_TYPE, Response: &rpcevaluation.EvaluationResponse_ErrorResponse{ ErrorResponse: &rpcevaluation.ErrorEvaluationResponse{ @@ -512,21 +530,10 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ }, }, } - resp.Responses = append(resp.Responses, eresp) continue } - return nil, err - } - - switch f.Type { - case core.FlagType_BOOLEAN_FLAG_TYPE: - res, err := s.boolean(ctx, store, env, f, req) - if err != nil { - return nil, err - } - if s.tracingEnabled { s.addEvaluationEvent( ctx, env, req.NamespaceKey, req.FlagKey, req.EntityId, req.RequestId, @@ -537,7 +544,7 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ ) } - eresp := &rpcevaluation.EvaluationResponse{ + eresp = &rpcevaluation.EvaluationResponse{ Type: rpcevaluation.EvaluationResponseType_BOOLEAN_EVALUATION_RESPONSE_TYPE, Response: &rpcevaluation.EvaluationResponse_BooleanResponse{ BooleanResponse: res, @@ -548,7 +555,18 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ case core.FlagType_VARIANT_FLAG_TYPE: res, err := s.variant(ctx, store, env, f, req) if err != nil { - return nil, err + eresp = &rpcevaluation.EvaluationResponse{ + Type: rpcevaluation.EvaluationResponseType_ERROR_EVALUATION_RESPONSE_TYPE, + Response: &rpcevaluation.EvaluationResponse_ErrorResponse{ + ErrorResponse: &rpcevaluation.ErrorEvaluationResponse{ + FlagKey: req.FlagKey, + NamespaceKey: req.NamespaceKey, + Reason: rpcevaluation.ErrorEvaluationReason_NOT_FOUND_ERROR_EVALUATION_REASON, + }, + }, + } + resp.Responses = append(resp.Responses, eresp) + continue } if s.tracingEnabled { @@ -561,7 +579,7 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ tracing.AttributeFlagTypeVariant, ) } - eresp := &rpcevaluation.EvaluationResponse{ + eresp = &rpcevaluation.EvaluationResponse{ Type: rpcevaluation.EvaluationResponseType_VARIANT_EVALUATION_RESPONSE_TYPE, Response: &rpcevaluation.EvaluationResponse_VariantResponse{ VariantResponse: res, @@ -570,7 +588,18 @@ func (s *Server) Batch(ctx context.Context, b *rpcevaluation.BatchEvaluationRequ resp.Responses = append(resp.Responses, eresp) default: - return nil, errs.ErrInvalidf("unknown flag type: %s", f.Type) + eresp = &rpcevaluation.EvaluationResponse{ + Type: rpcevaluation.EvaluationResponseType_ERROR_EVALUATION_RESPONSE_TYPE, + Response: &rpcevaluation.EvaluationResponse_ErrorResponse{ + ErrorResponse: &rpcevaluation.ErrorEvaluationResponse{ + FlagKey: req.FlagKey, + NamespaceKey: req.NamespaceKey, + Reason: rpcevaluation.ErrorEvaluationReason_NOT_FOUND_ERROR_EVALUATION_REASON, + }, + }, + } + resp.Responses = append(resp.Responses, eresp) + continue } } diff --git a/internal/server/evaluation/evaluation_test.go b/internal/server/evaluation/evaluation_test.go index 301cf23e1d..7ce6c86e32 100644 --- a/internal/server/evaluation/evaluation_test.go +++ b/internal/server/evaluation/evaluation_test.go @@ -1071,7 +1071,7 @@ func TestBatch_UnknownFlagType(t *testing.T) { Type: 3, }, nil) - _, err := s.Batch(t.Context(), &rpcevaluation.BatchEvaluationRequest{ + resp, err := s.Batch(t.Context(), &rpcevaluation.BatchEvaluationRequest{ Requests: []*rpcevaluation.EvaluationRequest{ { FlagKey: flagKey, @@ -1084,8 +1084,11 @@ func TestBatch_UnknownFlagType(t *testing.T) { }, }) - require.Error(t, err) - assert.EqualError(t, err, "unknown flag type: 3") + require.NoError(t, err) + require.Len(t, resp.GetResponses(), 1) + er := resp.GetResponses()[0].GetErrorResponse() + assert.NotNil(t, er) + assert.Equal(t, rpcevaluation.ErrorEvaluationReason_NOT_FOUND_ERROR_EVALUATION_REASON, er.GetReason()) } func TestBatch_InternalError_GetFlag(t *testing.T) { @@ -1104,7 +1107,7 @@ func TestBatch_InternalError_GetFlag(t *testing.T) { store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{}, errors.New("internal error")) - _, err := s.Batch(t.Context(), &rpcevaluation.BatchEvaluationRequest{ + resp, err := s.Batch(t.Context(), &rpcevaluation.BatchEvaluationRequest{ Requests: []*rpcevaluation.EvaluationRequest{ { FlagKey: flagKey, @@ -1117,8 +1120,11 @@ func TestBatch_InternalError_GetFlag(t *testing.T) { }, }) - require.Error(t, err) - assert.EqualError(t, err, "internal error") + require.NoError(t, err) + require.Len(t, resp.GetResponses(), 1) + er := resp.GetResponses()[0].GetErrorResponse() + assert.NotNil(t, er) + assert.Equal(t, rpcevaluation.ErrorEvaluationReason_NOT_FOUND_ERROR_EVALUATION_REASON, er.GetReason()) } func TestBatch_Success(t *testing.T) {