From b83870b98562a1eb9d4377dffc2283706ad574f3 Mon Sep 17 00:00:00 2001 From: mo khan Date: Mon, 12 May 2025 17:33:14 -0600 Subject: test: split integration test into separate files --- test/integration/container.go | 37 ++++++++++++++++++++ test/integration/container_test.go | 72 +++++++++++++------------------------- test/integration/http.go | 24 +++++++++++++ test/integration/log_consumer.go | 16 +++++++++ test/integration/oidc.go | 23 ++++++++++++ 5 files changed, 125 insertions(+), 47 deletions(-) create mode 100644 test/integration/container.go create mode 100644 test/integration/http.go create mode 100644 test/integration/log_consumer.go create mode 100644 test/integration/oidc.go (limited to 'test/integration') diff --git a/test/integration/container.go b/test/integration/container.go new file mode 100644 index 0000000..1b5b282 --- /dev/null +++ b/test/integration/container.go @@ -0,0 +1,37 @@ +package test + +import ( + "context" + "net/url" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" + "github.com/xlgmokha/x/pkg/env" +) + +func NewContainer(t *testing.T, ctx context.Context, envVars map[string]string) *testcontainers.DockerContainer { + t.Logf("mockoidc: %v %v\n", testcontainers.HostInternal, envVars) + issuer := envVars["OIDC_ISSUER"] + + u, err := url.Parse(issuer) + require.NoError(t, err) + + port, err := strconv.Atoi(u.Port()) + require.NoError(t, err) + + container, err := testcontainers.Run( + ctx, + env.Fetch("IMAGE_TAG", "sparkled:invalid"), + testcontainers.WithEnv(envVars), + testcontainers.WithExposedPorts("8080/tcp", "9901/tcp", "10000/tcp"), + testcontainers.WithHostPortAccess(port), + testcontainers.WithLogConsumers(&LogConsumer{t: t}), + testcontainers.WithWaitStrategy(wait.ForLog("Listening on").WithStartupTimeout(10*time.Second)), + ) + require.NoError(t, err) + return container +} diff --git a/test/integration/container_test.go b/test/integration/container_test.go index fcf2752..6739807 100644 --- a/test/integration/container_test.go +++ b/test/integration/container_test.go @@ -6,7 +6,6 @@ package test import ( "context" "net/http" - "net/url" "testing" "time" @@ -14,62 +13,46 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/testcontainers/testcontainers-go" - "github.com/testcontainers/testcontainers-go/wait" "github.com/xlgmokha/x/pkg/env" - "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/oidc" ) -type TestLogConsumer struct { - t *testing.T -} - -func (lc *TestLogConsumer) Accept(l testcontainers.Log) { - lc.t.Logf("%s", l.Content) +func environmentVariables(srv *mockoidc.MockOIDC) map[string]string { + config := srv.Config() + return map[string]string{ + "APP_ENV": "test", + "BIND_ADDR": ":8080", + "DEBUG": env.Fetch("DEBUG", ""), + "HMAC_SESSION_SECRET": "secret", + "OAUTH_CLIENT_ID": config.ClientID, + "OAUTH_CLIENT_SECRET": config.ClientSecret, + "OAUTH_REDIRECT_URL": "", + "OIDC_ISSUER": srv.Issuer(), + } } func TestContainer(t *testing.T) { - srv := oidc.NewTestServer(t) - defer srv.Close() - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() - address, err := url.Parse(srv.MockOIDC.Addr()) - require.NoError(t, err) - - issuer := srv.Issuer() - t.Logf("mockoidc: %v %v %v\n", address.String(), issuer, testcontainers.HostInternal) - container, err := testcontainers.Run( - ctx, - env.Fetch("IMAGE_TAG", "sparkled:invalid"), - testcontainers.WithEnv(map[string]string{ - "APP_ENV": "test", - "BIND_ADDR": ":8080", - "DEBUG": env.Fetch("DEBUG", ""), - "HMAC_SESSION_SECRET": "secret", - "OAUTH_CLIENT_ID": srv.MockOIDC.Config().ClientID, - "OAUTH_CLIENT_SECRET": srv.MockOIDC.Config().ClientSecret, - "OAUTH_REDIRECT_URL": "", - "OIDC_ISSUER": issuer, - }), - testcontainers.WithExposedPorts("8080/tcp", "9901/tcp", "10000/tcp"), - testcontainers.WithLogConsumers(&TestLogConsumer{t: t}), - testcontainers.WithWaitStrategy(wait.ForLog("Listening on").WithStartupTimeout(10*time.Second)), - ) - require.NoError(t, err) + srv := NewOIDCTestServer(t) + defer srv.Shutdown() + container := NewContainer(t, ctx, environmentVariables(srv)) defer testcontainers.TerminateContainer(container) - oidcProviderEndpoint := address.String() + require.True(t, container.IsRunning()) + sparkleEndpoint, err := container.PortEndpoint(ctx, "8080", "http") require.NoError(t, err) envoyEndpoint, err := container.PortEndpoint(ctx, "10000", "http") require.NoError(t, err) - client := &http.Client{Timeout: 5 * time.Second} + envoyAdminEndpoint, err := container.PortEndpoint(ctx, "9901", "http") + require.NoError(t, err) - publicPaths := []string{ + for _, publicPath := range []string{ + envoyAdminEndpoint + "/", envoyEndpoint + "/", envoyEndpoint + "/application.js", envoyEndpoint + "/favicon.ico", @@ -77,18 +60,13 @@ func TestContainer(t *testing.T) { envoyEndpoint + "/health", envoyEndpoint + "/index.html", envoyEndpoint + "/logo.png", - oidcProviderEndpoint + mockoidc.DiscoveryEndpoint, sparkleEndpoint + "/", sparkleEndpoint + "/favicon.ico", sparkleEndpoint + "/health", - } - - for _, path := range publicPaths { - t.Run(path, func(t *testing.T) { - request, err := http.NewRequestWithContext(ctx, http.MethodGet, path, nil) - response, err := client.Do(request) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, response.StatusCode) + srv.DiscoveryEndpoint(), + } { + t.Run(publicPath, func(t *testing.T) { + assert.Equal(t, http.StatusOK, HttpGet(t, ctx, publicPath).StatusCode) }) } } diff --git a/test/integration/http.go b/test/integration/http.go new file mode 100644 index 0000000..8aeeb77 --- /dev/null +++ b/test/integration/http.go @@ -0,0 +1,24 @@ +package test + +import ( + "context" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +var client *http.Client = &http.Client{ + Timeout: 5 * time.Second, +} + +func HttpGet(t *testing.T, ctx context.Context, path string) *http.Response { + request, err := http.NewRequestWithContext(ctx, http.MethodGet, path, nil) + require.NoError(t, err) + + response, err := client.Do(request) + require.NoError(t, err) + + return response +} diff --git a/test/integration/log_consumer.go b/test/integration/log_consumer.go new file mode 100644 index 0000000..4af438f --- /dev/null +++ b/test/integration/log_consumer.go @@ -0,0 +1,16 @@ +package test + +import ( + "testing" + + "github.com/testcontainers/testcontainers-go" +) + +type LogConsumer struct { + t *testing.T +} + +func (lc *LogConsumer) Accept(l testcontainers.Log) { + content := string(l.Content) + lc.t.Logf("%s", content) +} diff --git a/test/integration/oidc.go b/test/integration/oidc.go new file mode 100644 index 0000000..9fa465e --- /dev/null +++ b/test/integration/oidc.go @@ -0,0 +1,23 @@ +package test + +import ( + "net/http" + "testing" + + "github.com/oauth2-proxy/mockoidc" + "github.com/stretchr/testify/require" +) + +func NewOIDCTestServer(t *testing.T) *mockoidc.MockOIDC { + srv, err := mockoidc.Run() + require.NoError(t, err) + + srv.AddMiddleware(func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Logf("%v %v %v\n", r.Method, r.URL.Path, r.URL.Query()) + next.ServeHTTP(w, r) + }) + }) + + return srv +} -- cgit v1.2.3