Files
query-orchestration/test/apiContainer_test.go
T
Michael McGuinness 6e5c7aedc8 Merged in feature/devbox (pull request #11)
Add Devbox

* adddevbox

* cleanupdockerfile

* testscripts
2025-01-10 12:58:14 +00:00

104 lines
2.4 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 {
ServiceName string
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: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),
"DB_NOSSL": "1",
},
ExposedPorts: []string{port.Port()},
WaitingFor: wait.ForLog("Listening on port 8080"),
Networks: []string{config.Network.Name},
Entrypoint: []string{fmt.Sprintf("./%s", config.ServiceName)},
}
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() {
err := container.Terminate(ctx)
if err != nil {
t.Error(err)
}
}
}
func createAPIDependencies(t *testing.T, ctx context.Context, serviceName string) (*grpc.ClientConn, func()) {
network := createNetwork(t, ctx)
dbconfig, dbContainer := createDB(t, ctx, network)
conn, containerCleanup := createAPIContainer(t, ctx, &apiContainerConfig{
ServiceName: serviceName,
DB: *dbconfig,
Network: network,
})
return conn, func() {
testcontainers.CleanupNetwork(t, network)
err := dbContainer.Terminate(ctx)
if err != nil {
t.Error(err)
}
err = conn.Close()
if err != nil {
t.Error(err)
}
containerCleanup()
}
}