package authz import ( "context" "net" "strings" "testing" auth "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3" "github.com/oauth2-proxy/mockoidc" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/pls" "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/web" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" ) func TestServer(t *testing.T) { idp := web.NewOIDCServer(t) defer idp.Close() socket := bufconn.Listen(1024 * 1024) srv := New(t.Context()) 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() client := auth.NewAuthorizationClient(connection) user := mockoidc.DefaultUser() _, rawIDToken := idp.CreateTokensFor(user) cookies := []string{ "bearer_token=" + pls.GenerateRandomHex(32) + ";", "id_token=" + rawIDToken + ";", "refresh_token=" + pls.GenerateRandomHex(32), } loggedInHeaders := map[string]string{"cookie": strings.Join(cookies, "; ")} t.Run("CheckRequest", func(t *testing.T) { tt := []struct { http *auth.AttributeContext_HttpRequest status codes.Code }{ {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/application.js"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/callback"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/dashboard", Headers: loggedInHeaders}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/dashboard/nav"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/favicon.ico"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/favicon.png"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/health"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/index.html"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/logo.png"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/signout"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/sparkles"}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "POST", Path: "/sparkles", Headers: loggedInHeaders}}, {status: codes.OK, http: &auth.AttributeContext_HttpRequest{Method: "POST", Path: "/sparkles/restore"}}, {status: codes.PermissionDenied, http: &auth.AttributeContext_HttpRequest{Method: "GET", Path: "/dashboard"}}, {status: codes.PermissionDenied, http: &auth.AttributeContext_HttpRequest{Method: "POST", Path: "/sparkles"}}, } for _, example := range tt { t.Run(example.http.Path, func(t *testing.T) { response, err := client.Check(t.Context(), &auth.CheckRequest{ Attributes: &auth.AttributeContext{ Request: &auth.AttributeContext_Request{ Http: example.http, }, }, }) require.NoError(t, err) assert.Equal(t, int32(example.status), response.Status.Code) }) } }) }