diff options
| author | mo khan <mo@mokhan.ca> | 2025-05-09 16:19:15 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-05-11 21:21:38 -0600 |
| commit | 18c5623190105a5e99e238d7577e7c896220972c (patch) | |
| tree | c141f617df3c963c1cba25deef27ec16db0df8c5 /test/integration/container_test.go | |
| parent | 090d39e8adb08e49bd83e0432c7586086404a025 (diff) | |
test: test envoy and sparkle via testcontainers
Diffstat (limited to 'test/integration/container_test.go')
| -rw-r--r-- | test/integration/container_test.go | 106 |
1 files changed, 88 insertions, 18 deletions
diff --git a/test/integration/container_test.go b/test/integration/container_test.go index ff2c914..36cda37 100644 --- a/test/integration/container_test.go +++ b/test/integration/container_test.go @@ -6,56 +6,126 @@ package test import ( "context" "net/http" + "net/url" + "strconv" "testing" "time" + "github.com/oauth2-proxy/mockoidc" + "github.com/playwright-community/playwright-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/network" "github.com/testcontainers/testcontainers-go/wait" "github.com/xlgmokha/x/pkg/env" + "github.com/xlgmokha/x/pkg/x" + "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/oidc" ) +type StdoutLogConsumer struct { + t *testing.T +} + +func (lc *StdoutLogConsumer) Accept(l testcontainers.Log) { + lc.t.Logf("%s", l.Content) +} + func TestContainer(t *testing.T) { + srv := oidc.NewTestServer(t) + defer srv.Close() + image := env.Fetch("IMAGE_TAG", "sparkled:invalid") require.NotEmpty(t, image) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() - container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ - ContainerRequest: testcontainers.ContainerRequest{ - Image: image, - Env: map[string]string{"HMAC_SESSION_SECRET": "secret", "OAUTH_CLIENT_SECRET": "secret"}, - ExposedPorts: []string{"8080/tcp", "9901/tcp", "10000/tcp"}, - WaitingFor: wait.ForLog("Listening on"), - }, - Started: true, - }) + nw, err := network.New(ctx) require.NoError(t, err) - defer func() { - require.NoError(t, container.Terminate(context.Background())) + require.NoError(t, nw.Remove(ctx)) + }() + address, err := url.Parse(srv.MockOIDC.Addr()) + require.NoError(t, err) - testcontainers.CleanupContainer(t, container) + t.Logf("mockoidc: %v %v\n", address.String(), srv.Issuer()) + container, err := testcontainers.Run( + ctx, + image, + network.WithNetwork([]string{"host"}, nw), + testcontainers.WithEnv(map[string]string{ + "APP_ENV": "test", + "BIND_ADDR": ":8080", + "HMAC_SESSION_SECRET": "secret", + "OAUTH_CLIENT_ID": srv.MockOIDC.Config().ClientID, + "OAUTH_CLIENT_SECRET": srv.MockOIDC.Config().ClientSecret, + "OAUTH_REDIRECT_URL": "", + "OIDC_ISSUER": srv.Issuer(), + }), + testcontainers.WithHostPortAccess(x.Must(strconv.Atoi(address.Port()))), + testcontainers.WithExposedPorts("8080/tcp", "9901/tcp", "10000/tcp"), + testcontainers.WithLogConsumers(&StdoutLogConsumer{t: t}), + testcontainers.WithWaitStrategy(wait.ForLog("Listening on").WithStartupTimeout(time.Second*5)), + ) + require.NoError(t, err) + + defer func() { + require.NoError(t, testcontainers.TerminateContainer(container)) + testcontainers.CleanupNetwork(t, nw) }() - endpoint, err := container.Endpoint(ctx, "") + oidcProviderEndpoint := address.String() + sparkleEndpoint, err := container.PortEndpoint(ctx, "8080", "http") + require.NoError(t, err) + + envoyEndpoint, err := container.PortEndpoint(ctx, "10000", "http") require.NoError(t, err) paths := []string{ - "/health", - "/favicon.ico", + envoyEndpoint + "/", + envoyEndpoint + "/health", + oidcProviderEndpoint + mockoidc.DiscoveryEndpoint, + sparkleEndpoint + "/", + sparkleEndpoint + "/favicon.ico", + sparkleEndpoint + "/health", } + client := &http.Client{Timeout: 5 * time.Second} + for _, path := range paths { t.Run(path, func(t *testing.T) { - url := "http://" + endpoint + path - client := &http.Client{Timeout: 5 * time.Second} - request, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + 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) }) } + + t.Run("UI", func(t *testing.T) { + if env.Fetch("SKIP_E2E", "") != "" { + t.Skip() + } + + _ = playwright.Install() + + pw := x.Must(playwright.Run()) + browser := x.Must(pw.Firefox.Launch(playwright.BrowserTypeLaunchOptions{ + Headless: playwright.Bool(env.Fetch("HEADLESS", "true") == "true"), + SlowMo: playwright.Float(1000), + })) + page := x.Must(browser.NewPage()) + + defer func() { + x.Check(browser.Close()) + x.Check(pw.Stop()) + }() + + t.Run("initiates an OIDC login", func(t *testing.T) { + require.NoError(t, page.Context().ClearCookies()) + response, err := page.Goto(sparkleEndpoint + "/") + require.NoError(t, err) + assert.True(t, response.Ok()) + }) + }) } |
