2025-02-03 17:30:50 +00:00
|
|
|
package test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2025-03-11 16:31:06 +00:00
|
|
|
"os"
|
|
|
|
|
"path"
|
2025-03-05 12:05:46 +00:00
|
|
|
"testing"
|
|
|
|
|
|
2025-02-03 17:30:50 +00:00
|
|
|
"queryorchestration/internal/serviceconfig"
|
2025-02-05 12:52:41 +00:00
|
|
|
"queryorchestration/internal/serviceconfig/aws"
|
|
|
|
|
"queryorchestration/internal/serviceconfig/database"
|
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-11 16:31:06 +00:00
|
|
|
func SetCfgProviderWithBasePath(t testing.TB, cfg serviceconfig.ConfigProvider, basePath string) {
|
|
|
|
|
SetCfgProvider(t, cfg)
|
|
|
|
|
|
|
|
|
|
cfg.SetBasePath(path.Join(os.Getenv("PWD"), basePath))
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-14 10:56:24 +00:00
|
|
|
func SetCfgProvider(t testing.TB, cfg serviceconfig.ConfigProvider) {
|
2025-02-05 12:52:41 +00:00
|
|
|
cfg.SetAWSConfig(&aws.AWSConfig{
|
|
|
|
|
AWSKeyID: "test",
|
|
|
|
|
AWSSecretKey: "test",
|
|
|
|
|
AWSRegion: "us-east-1",
|
|
|
|
|
})
|
|
|
|
|
t.Setenv("AWS_ACCESS_KEY_ID", cfg.GetAWSKeyID())
|
|
|
|
|
t.Setenv("AWS_SECRET_ACCESS_KEY", cfg.GetAWSSecretKey())
|
|
|
|
|
t.Setenv("AWS_SESSION_TOKEN", cfg.GetAWSSessionToken())
|
|
|
|
|
t.Setenv("AWS_REGION", cfg.GetAWSRegion())
|
|
|
|
|
t.Setenv("AWS_DEFAULT_REGION", cfg.GetAWSRegion())
|
|
|
|
|
|
|
|
|
|
cfg.SetDBConfig(&database.DBConfig{
|
|
|
|
|
DBUser: "invalid_user",
|
|
|
|
|
DBSecret: "invalid_pass",
|
|
|
|
|
DBHost: "invalid_host",
|
|
|
|
|
DBPort: 5432,
|
|
|
|
|
DBName: "invalid_name",
|
|
|
|
|
DBNoSSL: true,
|
|
|
|
|
})
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ServiceNetworkConfig struct {
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg serviceconfig.ConfigProvider
|
|
|
|
|
Network *testcontainers.DockerNetwork
|
2025-03-17 18:14:15 +00:00
|
|
|
API API
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
func CreateAPINetwork(t testing.TB, ctx context.Context, scfg *ServiceNetworkConfig) (*Container, func()) {
|
2025-02-12 19:00:25 +00:00
|
|
|
if scfg.Cfg == nil {
|
|
|
|
|
scfg.Cfg = &serviceconfig.BaseConfig{}
|
|
|
|
|
SetCfgProvider(t, scfg.Cfg)
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-02-12 19:00:25 +00:00
|
|
|
network := scfg.Network
|
|
|
|
|
var ncleanup func()
|
|
|
|
|
if network == nil {
|
|
|
|
|
network, ncleanup = CreateNetwork(t, ctx)
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
|
|
|
|
_, dbcleanup := CreateDB(t, ctx, &CreateDatabaseConfig{
|
|
|
|
|
Network: network,
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg: scfg.Cfg,
|
2025-02-03 17:30:50 +00:00
|
|
|
})
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
c, ccleanup := CreateAPI(t, ctx, &APIConfig{
|
|
|
|
|
API: scfg.API,
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg: scfg.Cfg,
|
2025-02-03 17:30:50 +00:00
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return c, func() {
|
|
|
|
|
dbcleanup()
|
|
|
|
|
ccleanup()
|
2025-02-12 19:00:25 +00:00
|
|
|
if ncleanup != nil {
|
|
|
|
|
ncleanup()
|
|
|
|
|
}
|
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 {
|
|
|
|
|
BucketName string
|
|
|
|
|
QueueURLs map[string]string
|
|
|
|
|
Network *testcontainers.DockerNetwork
|
|
|
|
|
AWSConfig *AWSContainerConfig
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateFullDependencies(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Dependencies, func()) {
|
|
|
|
|
network, ncleanup := CreateNetwork(t, ctx)
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
acfg, awsclean := CreateAWSContainer(t, ctx, &CreateAWSConfig{
|
2025-03-11 16:31:06 +00:00
|
|
|
Cfg: cfg,
|
|
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
_, dbcleanup := CreateDB(t, ctx, &CreateDatabaseConfig{
|
|
|
|
|
Network: network,
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
RunMigrations: true,
|
|
|
|
|
})
|
|
|
|
|
|
2025-03-11 16:31:06 +00:00
|
|
|
SetQueueClient(t, ctx, cfg)
|
|
|
|
|
SetStoreClient(t, ctx, cfg, acfg.ExternalEndpoint)
|
|
|
|
|
|
|
|
|
|
urls := map[string]string{}
|
2025-03-17 18:14:15 +00:00
|
|
|
for _, runner := range runners {
|
|
|
|
|
urls[runner.Name] = CreateQueue(t, ctx, cfg, runner.Name)
|
|
|
|
|
}
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
CreateBucket(t, ctx, cfg, BucketName)
|
|
|
|
|
SetBucketNotifs(t, ctx, cfg, BucketName)
|
2025-03-11 16:31:06 +00:00
|
|
|
|
|
|
|
|
return Dependencies{
|
2025-03-17 18:14:15 +00:00
|
|
|
BucketName: BucketName,
|
2025-03-11 16:31:06 +00:00
|
|
|
QueueURLs: urls,
|
|
|
|
|
Network: network,
|
|
|
|
|
AWSConfig: acfg,
|
|
|
|
|
}, func() {
|
2025-03-17 18:14:15 +00:00
|
|
|
awsclean()
|
|
|
|
|
dbcleanup()
|
2025-03-11 16:31:06 +00:00
|
|
|
ncleanup()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Network struct {
|
|
|
|
|
Dependencies Dependencies
|
2025-03-17 18:14:15 +00:00
|
|
|
APIs map[string]*Container
|
|
|
|
|
Runners map[string]*Container
|
|
|
|
|
Client *queryapi.ClientWithResponses
|
2025-03-11 16:31:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateFullNetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Network, func()) {
|
|
|
|
|
deps, clean := CreateFullDependencies(t, ctx, cfg)
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
apiContainers := make(map[string]*Container, len(apis))
|
|
|
|
|
apiClean := make([]func(), len(apis))
|
|
|
|
|
for i, s := range apis {
|
|
|
|
|
c, ccleanup := CreateAPI(t, ctx, &APIConfig{
|
|
|
|
|
API: s,
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
Network: deps.Network,
|
|
|
|
|
})
|
|
|
|
|
apiContainers[s.Name] = c
|
|
|
|
|
apiClean[i] = ccleanup
|
|
|
|
|
}
|
2025-03-11 16:31:06 +00:00
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
qService, err := queryapi.NewClientWithResponses(apiContainers[QueryAPIName].URI)
|
2025-03-11 16:31:06 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2025-03-17 18:14:15 +00:00
|
|
|
runnerContainers := make(map[string]*Container, len(runners))
|
|
|
|
|
runnerClean := make([]func(), len(runners))
|
|
|
|
|
for i, r := range runners {
|
|
|
|
|
c, ccleanup := CreateRunner(t, ctx, &RunnerConfig{
|
|
|
|
|
Runner: r,
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
Network: deps.Network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
runnerContainers[r.Name] = c
|
|
|
|
|
runnerClean[i] = ccleanup
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-11 16:31:06 +00:00
|
|
|
return Network{
|
|
|
|
|
Dependencies: deps,
|
2025-03-17 18:14:15 +00:00
|
|
|
APIs: apiContainers,
|
|
|
|
|
Runners: runnerContainers,
|
2025-03-11 16:31:06 +00:00
|
|
|
Client: qService,
|
|
|
|
|
}, func() {
|
2025-03-17 18:14:15 +00:00
|
|
|
for _, c := range apiClean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
|
|
|
|
for _, c := range runnerClean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
2025-03-11 16:31:06 +00:00
|
|
|
clean()
|
|
|
|
|
}
|
|
|
|
|
}
|