summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-05-12 17:33:14 -0600
committermo khan <mo@mokhan.ca>2025-05-12 17:33:14 -0600
commitb83870b98562a1eb9d4377dffc2283706ad574f3 (patch)
tree15c5285c39f3880e2e68f3621a6ba9bfb22694df
parent32e212fb891d522efa4990bc525a51326bd7e4ba (diff)
test: split integration test into separate files
-rw-r--r--test/integration/container.go37
-rw-r--r--test/integration/container_test.go72
-rw-r--r--test/integration/http.go24
-rw-r--r--test/integration/log_consumer.go16
-rw-r--r--test/integration/oidc.go23
5 files changed, 125 insertions, 47 deletions
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
+}