package test import ( "context" "fmt" "queryorchestration/internal/serviceconfig" "testing" "github.com/docker/go-connections/nat" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" ) type AWSContainerConfig struct { Container testcontainers.Container ExternalEndpoint string NetworkEndpoint string } type CreateAWSConfig struct { Network *testcontainers.DockerNetwork Cfg serviceconfig.ConfigProvider } func CreateAWSContainer(t *testing.T, ctx context.Context, cfg *CreateAWSConfig) (*AWSContainerConfig, func()) { alias := "localstack" port, err := nat.NewPort("tcp", "4566") if err != nil { t.Fatalf("Failed to create port: %v", err) } req := testcontainers.ContainerRequest{ Image: "localstack/localstack:4.1.0", Env: map[string]string{ "AWS_ACCESS_KEY_ID": cfg.Cfg.GetAWSKeyID(), "AWS_SECRET_ACCESS_KEY": cfg.Cfg.GetAWSSecretKey(), "AWS_SESSION_TOKEN": cfg.Cfg.GetAWSSessionToken(), "AWS_REGION": cfg.Cfg.GetAWSRegion(), "SERVICES": "s3,sqs", "SKIP_SSL_CERT_DOWNLOAD": "1", "LOCALSTACK_HOST": alias, "SQS_ENDPOINT_STRATEGY": "path", "EAGER_SERVICE_LOADING": "1", }, ExposedPorts: []string{port.Port()}, WaitingFor: wait.ForAll( // wait.ForExposedPort(), wait.ForListeningPort(port), wait.ForLog("Ready."), ), } if cfg.Network != nil { req.Networks = []string{cfg.Network.Name} req.NetworkAliases = map[string][]string{ cfg.Network.Name: {alias}, } } container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ ContainerRequest: req, Started: true, }) if err != nil { t.Fatalf("Failed to start container: %v", err) } host, err := container.Host(ctx) if err != nil { t.Fatalf("Failed to extract host: %v", err) } mappedPort, err := container.MappedPort(ctx, port) if err != nil { t.Fatalf("Failed to extract port: %v", err) } extEndpoint := fmt.Sprintf("http://%s:%s", host, mappedPort.Port()) t.Setenv("AWS_ENDPOINT_URL", extEndpoint) t.Setenv("AWS_ENDPOINT_URL_SQS", extEndpoint) t.Setenv("AWS_ENDPOINT_URL_S3", extEndpoint) cfg.Cfg.SetAWSEndpoint(extEndpoint) var endpoint string if cfg.Network != nil { endpoint = fmt.Sprintf("http://%s:%s", alias, port.Port()) cfg.Cfg.SetAWSEndpoint(endpoint) } return &AWSContainerConfig{ Container: container, ExternalEndpoint: extEndpoint, NetworkEndpoint: endpoint, }, func() { err := container.Terminate(ctx) if err != nil { t.Error(err) } } }