package e2eutil import ( "context" "fmt" "path/filepath" "testing" "time" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" ) // StartTestWebServer starts an nginx container with test content for E2E testing. // The container is attached to the shared network with the testServerAlias hostname, // and the returned URL uses that alias so the Hako container can fetch from it. func StartTestWebServer(ctx context.Context, t *testing.T) (testcontainers.Container, string, error) { t.Helper() // Get the project root (one level up from e2e) projectRoot, err := filepath.Abs(filepath.Join("..", "..")) if err != nil { return nil, "", fmt.Errorf("failed to get project root: %w", err) } // Ensure shared network exists so Hako can reach this server by alias. nw, err := getSharedNetwork(ctx) if err != nil { return nil, "", err } // Create container request attached to the shared network. req := testcontainers.ContainerRequest{ FromDockerfile: testcontainers.FromDockerfile{ Context: filepath.Join(projectRoot, "e2e", "testserver"), Dockerfile: "Dockerfile", PrintBuildLog: false, }, ExposedPorts: []string{"80/tcp"}, WaitingFor: wait.ForHTTP("/").WithStartupTimeout(10 * time.Second), Networks: []string{nw.Name}, NetworkAliases: map[string][]string{ nw.Name: {testServerAlias}, }, } // Start container t.Log("Starting test web server container...") container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ ContainerRequest: req, Started: true, }) if err != nil { return nil, "", fmt.Errorf("failed to start test web server container: %w", err) } // Register cleanup t.Cleanup(func() { if err := container.Terminate(ctx); err != nil { t.Logf("Failed to terminate test web server container: %v", err) } }) // Use the network alias as the base URL so Hako can reach this server // from inside its container via Docker DNS. baseURL := fmt.Sprintf("http://%s", testServerAlias) t.Logf("Test web server started at %s (network alias)", baseURL) return container, baseURL, nil }