2025-02-03 17:30:50 +00:00
|
|
|
package test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2025-04-02 18:50:03 +00:00
|
|
|
"fmt"
|
2025-04-22 14:40:16 +00:00
|
|
|
"strings"
|
2025-05-03 14:59:21 +00:00
|
|
|
"sync"
|
2025-03-05 12:05:46 +00:00
|
|
|
"testing"
|
|
|
|
|
|
2025-02-03 17:30:50 +00:00
|
|
|
"queryorchestration/internal/serviceconfig"
|
2025-03-11 16:31:06 +00:00
|
|
|
"queryorchestration/internal/serviceconfig/objectstore"
|
2025-03-17 18:14:15 +00:00
|
|
|
queryapi "queryorchestration/pkg/queryAPI"
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-03-04 15:51:03 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2025-02-03 17:30:50 +00:00
|
|
|
"github.com/testcontainers/testcontainers-go"
|
|
|
|
|
)
|
|
|
|
|
|
2025-03-19 11:54:14 +00:00
|
|
|
type Network struct {
|
|
|
|
|
Dependencies Dependencies
|
2025-04-02 18:50:03 +00:00
|
|
|
APIs map[APIName]*Container
|
|
|
|
|
Runners map[RunnerName]*Container
|
2025-03-19 11:54:14 +00:00
|
|
|
Client *queryapi.ClientWithResponses
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-03-19 11:54:14 +00:00
|
|
|
func CreateFullNetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Network, func()) {
|
2025-05-06 01:59:52 +00:00
|
|
|
deps := CreateFullDependencies(t, ctx, cfg)
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
var wg sync.WaitGroup
|
|
|
|
|
|
2025-04-02 18:50:03 +00:00
|
|
|
apiContainers := make(map[APIName]*Container, len(apis))
|
2025-03-19 11:54:14 +00:00
|
|
|
apiClean := make([]func(), len(apis))
|
2025-05-06 01:59:52 +00:00
|
|
|
var apiMu sync.Mutex
|
2025-03-19 11:54:14 +00:00
|
|
|
for i, s := range apis {
|
2025-05-03 14:59:21 +00:00
|
|
|
wg.Add(1)
|
|
|
|
|
go func() {
|
|
|
|
|
c, ccleanup := CreateAPI(t, ctx, cfg, deps.Network, &APIConfig{
|
|
|
|
|
API: s,
|
|
|
|
|
MockHTTP: string(deps.MockServer.Internal),
|
|
|
|
|
})
|
2025-05-06 01:59:52 +00:00
|
|
|
|
|
|
|
|
apiMu.Lock()
|
2025-05-03 14:59:21 +00:00
|
|
|
apiContainers[s.Name] = c
|
2025-05-06 01:59:52 +00:00
|
|
|
apiMu.Unlock()
|
|
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
apiClean[i] = ccleanup
|
|
|
|
|
wg.Done()
|
|
|
|
|
}()
|
2025-02-12 19:00:25 +00:00
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-04-02 18:50:03 +00:00
|
|
|
runnerContainers := make(map[RunnerName]*Container, len(runners))
|
2025-03-19 11:54:14 +00:00
|
|
|
runnerClean := make([]func(), len(runners))
|
2025-05-06 01:59:52 +00:00
|
|
|
var runnerMu sync.Mutex
|
2025-03-19 11:54:14 +00:00
|
|
|
for i, r := range runners {
|
2025-05-03 14:59:21 +00:00
|
|
|
wg.Add(1)
|
|
|
|
|
go func() {
|
|
|
|
|
c, ccleanup := CreateRunner(t, ctx, cfg, deps.Network, &RunnerConfig{
|
|
|
|
|
Runner: r,
|
|
|
|
|
MockHTTP: string(deps.MockServer.Internal),
|
|
|
|
|
})
|
|
|
|
|
|
2025-05-06 01:59:52 +00:00
|
|
|
runnerMu.Lock()
|
2025-05-03 14:59:21 +00:00
|
|
|
runnerContainers[r.Name] = c
|
2025-05-06 01:59:52 +00:00
|
|
|
runnerMu.Unlock()
|
|
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
runnerClean[i] = ccleanup
|
|
|
|
|
wg.Done()
|
|
|
|
|
}()
|
2025-03-19 11:54:14 +00:00
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
wg.Wait()
|
|
|
|
|
|
|
|
|
|
qService, err := queryapi.NewClientWithResponses(apiContainers[QueryAPIName].URI)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2025-03-19 11:54:14 +00:00
|
|
|
return Network{
|
|
|
|
|
Dependencies: deps,
|
|
|
|
|
APIs: apiContainers,
|
|
|
|
|
Runners: runnerContainers,
|
|
|
|
|
Client: qService,
|
|
|
|
|
}, func() {
|
|
|
|
|
for _, c := range apiClean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
2025-05-03 14:59:21 +00:00
|
|
|
|
2025-03-19 11:54:14 +00:00
|
|
|
for _, c := range runnerClean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
2025-02-12 19:00:25 +00:00
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-03-11 16:31:06 +00:00
|
|
|
type FullDependenciesConfig interface {
|
|
|
|
|
serviceconfig.ConfigProvider
|
|
|
|
|
objectstore.ConfigProvider
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Dependencies struct {
|
2025-04-02 18:50:03 +00:00
|
|
|
QueueURLs map[RunnerName]string
|
2025-03-11 16:31:06 +00:00
|
|
|
AWSConfig *AWSContainerConfig
|
2025-03-19 11:54:14 +00:00
|
|
|
DBConfig testcontainers.Container
|
2025-04-02 18:50:03 +00:00
|
|
|
MockServer MockServer
|
2025-04-22 14:40:16 +00:00
|
|
|
Network string
|
2025-03-11 16:31:06 +00:00
|
|
|
}
|
|
|
|
|
|
2025-05-06 01:59:52 +00:00
|
|
|
func CreateFullDependencies(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) Dependencies {
|
2025-05-05 09:31:21 +00:00
|
|
|
network := GetNetwork(t)
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-04-22 14:40:16 +00:00
|
|
|
deps := Dependencies{
|
2025-04-25 17:02:50 +00:00
|
|
|
Network: network,
|
|
|
|
|
QueueURLs: map[RunnerName]string{},
|
2025-04-22 14:40:16 +00:00
|
|
|
}
|
2025-05-03 14:59:21 +00:00
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
2025-04-22 14:40:16 +00:00
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
wg.Add(1)
|
|
|
|
|
go func() {
|
2025-05-05 09:31:21 +00:00
|
|
|
deps.AWSConfig = CreateAWSContainer(t, cfg, network)
|
2025-05-03 14:59:21 +00:00
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
SetQueueClient(t, ctx, cfg, deps.AWSConfig.ExternalEndpoint)
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
for _, runner := range runners {
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
go func() {
|
|
|
|
|
deps.QueueURLs[runner.Name] = CreateQueue(t, ctx, cfg, runner.Name)
|
|
|
|
|
wg.Done()
|
|
|
|
|
}()
|
|
|
|
|
}
|
2025-04-02 18:50:03 +00:00
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
SetStoreClient(t, ctx, cfg, deps.AWSConfig.ExternalEndpoint)
|
|
|
|
|
CreateBucket(t, ctx, cfg)
|
|
|
|
|
SetBucketNotifs(t, ctx, cfg)
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
wg.Done()
|
|
|
|
|
}()
|
|
|
|
|
|
2025-05-06 01:59:52 +00:00
|
|
|
mockServer := CreateMockServer(t, network)
|
2025-05-05 09:31:21 +00:00
|
|
|
deps.MockServer = mockServer
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
CreateDB(t, cfg, network, &CreateDatabaseConfig{
|
|
|
|
|
NoMigrations: true,
|
|
|
|
|
})
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-05-03 14:59:21 +00:00
|
|
|
wg.Wait()
|
|
|
|
|
|
2025-05-06 01:59:52 +00:00
|
|
|
return deps
|
2025-03-11 16:31:06 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-22 14:40:16 +00:00
|
|
|
type APINetwork struct {
|
|
|
|
|
Dependencies Dependencies
|
|
|
|
|
API *Container
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateAPINetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig, api API) (*APINetwork, func()) {
|
2025-05-06 01:59:52 +00:00
|
|
|
deps := CreateFullDependencies(t, ctx, cfg)
|
2025-04-02 18:50:03 +00:00
|
|
|
|
2025-04-22 14:40:16 +00:00
|
|
|
c, ccleanup := CreateAPI(t, ctx, cfg, deps.Network, &APIConfig{
|
|
|
|
|
API: api,
|
2025-04-02 18:50:03 +00:00
|
|
|
MockHTTP: string(deps.MockServer.Internal),
|
|
|
|
|
})
|
|
|
|
|
|
2025-04-22 14:40:16 +00:00
|
|
|
return &APINetwork{
|
2025-05-06 01:59:52 +00:00
|
|
|
Dependencies: deps,
|
|
|
|
|
API: c,
|
|
|
|
|
}, ccleanup
|
2025-04-02 18:50:03 +00:00
|
|
|
}
|
|
|
|
|
|
2025-05-05 09:31:21 +00:00
|
|
|
func GetAlias(t testing.TB, baseName string) string {
|
|
|
|
|
name := fmt.Sprintf("%s_%s", baseName, t.Name())
|
|
|
|
|
name = strings.ToLower(name)
|
2025-04-25 17:02:50 +00:00
|
|
|
name = strings.ReplaceAll(name, "/", "")
|
|
|
|
|
name = strings.ReplaceAll(name, " ", "")
|
|
|
|
|
name = strings.ReplaceAll(name, "-", "")
|
2025-05-05 09:31:21 +00:00
|
|
|
name = strings.ReplaceAll(name, "_", "")
|
2025-04-22 14:40:16 +00:00
|
|
|
return name
|
|
|
|
|
}
|