(t *testing.T)
| 716 | } |
| 717 | |
| 718 | func TestHandlerErrorResponseNilInInterceptor(t *testing.T) { |
| 719 | t.Parallel() |
| 720 | handlerErr := connect.NewError(connect.CodeInternal, errors.New("handler error")) |
| 721 | var interceptorSawNilResponse bool |
| 722 | checkNilInterceptor := connect.UnaryInterceptorFunc( |
| 723 | func(next connect.UnaryFunc) connect.UnaryFunc { |
| 724 | return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { |
| 725 | res, err := next(ctx, req) |
| 726 | // res must be nil when err is non-nil; a typed nil stored in an |
| 727 | // interface would make this check incorrectly report non-nil. |
| 728 | interceptorSawNilResponse = res == nil |
| 729 | return res, err |
| 730 | } |
| 731 | }, |
| 732 | ) |
| 733 | mux := http.NewServeMux() |
| 734 | mux.Handle(pingv1connect.NewPingServiceHandler( |
| 735 | &pluggablePingServer{ |
| 736 | ping: func(_ context.Context, _ *connect.Request[pingv1.PingRequest]) (*connect.Response[pingv1.PingResponse], error) { |
| 737 | return nil, handlerErr |
| 738 | }, |
| 739 | }, |
| 740 | connect.WithInterceptors(checkNilInterceptor), |
| 741 | )) |
| 742 | server := memhttptest.NewServer(t, mux) |
| 743 | client := pingv1connect.NewPingServiceClient(server.Client(), server.URL()) |
| 744 | _, err := client.Ping(t.Context(), connect.NewRequest(&pingv1.PingRequest{})) |
| 745 | assert.NotNil(t, err) |
| 746 | assert.True(t, interceptorSawNilResponse) |
| 747 | } |
| 748 | |
| 749 | // headerInterceptor makes it easier to write interceptors that inspect or |
| 750 | // mutate HTTP headers. It applies the same logic to unary and streaming |
nothing calls this directly
no test coverage detected