Files
query-orchestration/test/integration/apiContainer_test.go
T
Michael McGuinness 56b447dfcf moveservicesInterfaces
2025-01-07 13:01:14 +00:00

88 lines
2.1 KiB
Go

package integration_test
import (
"context"
"fmt"
"strconv"
"testing"
"github.com/docker/go-connections/nat"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/wait"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
type apiContainerConfig struct {
DB dbConfig
Network *testcontainers.DockerNetwork
}
func createAPIContainer(t *testing.T, ctx context.Context, config *apiContainerConfig) (*grpc.ClientConn, func()) {
port, err := nat.NewPort("tcp", "8080")
if err != nil {
t.Fatalf("Failed to create port: %v", err)
}
req := testcontainers.ContainerRequest{
Image: "queryorchestration_grpc:latest",
Env: map[string]string{
"DB_USER": config.DB.User,
"DB_PASS": config.DB.Password,
"DB_HOST": config.DB.Host,
"DB_NAME": config.DB.Name,
"DB_PORT": strconv.Itoa(config.DB.Port),
},
ExposedPorts: []string{port.Port()},
WaitingFor: wait.ForListeningPort(port),
Networks: []string{config.Network.Name},
}
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)
}
conn, err := grpc.NewClient(
fmt.Sprintf("%s:%s", host, mappedPort.Port()),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
t.Fatalf("Failed to connect to gRPC server: %v", err)
}
return conn, func() {
container.Terminate(ctx)
}
}
func createAPIDependencies(t *testing.T, ctx context.Context) (*grpc.ClientConn, func()) {
network := createNetwork(t, ctx)
dbconfig, dbContainer := createDB(t, ctx, network)
conn, containerCleanup := createAPIContainer(t, ctx, &apiContainerConfig{
DB: *dbconfig,
Network: network,
})
return conn, func() {
testcontainers.CleanupNetwork(t, network)
dbContainer.Terminate(ctx)
containerCleanup()
conn.Close()
}
}