package authz import ( "context" "net" "testing" auth "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" ) func TestRemoteCheckService(t *testing.T) { t.Run("Check", func(t *testing.T) { t.Run("when a client is not configured", func(t *testing.T) { svc := NewRemoteCheckService(nil) result, err := svc.Check(t.Context(), &auth.CheckRequest{}) require.Nil(t, result) require.Error(t, err) }) t.Run("when a client is configured", func(t *testing.T) { socket := bufconn.Listen(1024 * 1024) srv := grpc.NewServer() auth.RegisterAuthorizationServer(srv, NewLocalCheckService()) defer srv.GracefulStop() go func() { require.NoError(t, srv.Serve(socket)) }() connection, err := grpc.DialContext( t.Context(), "bufnet", grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return socket.Dial() }), grpc.WithTransportCredentials(insecure.NewCredentials()), ) require.NoError(t, err) defer connection.Close() t.Run("returns a response from the client", func(t *testing.T) { client := auth.NewAuthorizationClient(connection) svc := NewRemoteCheckService(client) response, err := svc.Check(t.Context(), &auth.CheckRequest{ Attributes: &auth.AttributeContext{ Request: &auth.AttributeContext_Request{ Http: &auth.AttributeContext_HttpRequest{ Method: "GET", Path: "/", }, }, }, }) require.NoError(t, err) assert.Equal(t, int32(codes.OK), response.Status.Code) }) }) }) }