| package testutils |
|
|
| import ( |
| "crypto/rand" |
| "log/slog" |
| "sync" |
| "testing" |
| "time" |
|
|
| "github.com/oklog/ulid/v2" |
| "github.com/stretchr/testify/require" |
| "go.opentelemetry.io/otel/trace" |
| "go.opentelemetry.io/otel/trace/noop" |
|
|
| "github.com/openmeterio/openmeter/openmeter/customer" |
| customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" |
| customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" |
| entdb "github.com/openmeterio/openmeter/openmeter/ent/db" |
| "github.com/openmeterio/openmeter/openmeter/entitlement" |
| entitlementpgadapter "github.com/openmeterio/openmeter/openmeter/entitlement/adapter" |
| meteradapter "github.com/openmeterio/openmeter/openmeter/meter/mockadapter" |
| productcatalogadapter "github.com/openmeterio/openmeter/openmeter/productcatalog/adapter" |
| "github.com/openmeterio/openmeter/openmeter/productcatalog/feature" |
| "github.com/openmeterio/openmeter/openmeter/subject" |
| subjectadapter "github.com/openmeterio/openmeter/openmeter/subject/adapter" |
| subjectservice "github.com/openmeterio/openmeter/openmeter/subject/service" |
| "github.com/openmeterio/openmeter/openmeter/testutils" |
| "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" |
| ) |
|
|
| func NewTestULID(t *testing.T) string { |
| t.Helper() |
|
|
| return ulid.MustNew(ulid.Timestamp(time.Now().UTC()), rand.Reader).String() |
| } |
|
|
| var NewTestNamespace = NewTestULID |
|
|
| type TestEnv struct { |
| Logger *slog.Logger |
| Tracer trace.Tracer |
| SubjectService subject.Service |
| CustomerService customer.Service |
| EntitlementAdapter entitlement.EntitlementRepo |
| FeatureService feature.FeatureConnector |
|
|
| Client *entdb.Client |
| db *testutils.TestDB |
| close sync.Once |
| } |
|
|
| func (e *TestEnv) Close(t *testing.T) { |
| t.Helper() |
|
|
| e.close.Do(func() { |
| if e.db != nil { |
| if err := e.db.EntDriver.Close(); err != nil { |
| t.Errorf("failed to close ent driver: %v", err) |
| } |
|
|
| if err := e.db.PGDriver.Close(); err != nil { |
| t.Errorf("failed to postgres driver: %v", err) |
| } |
| } |
|
|
| if e.Client != nil { |
| if err := e.Client.Close(); err != nil { |
| t.Errorf("failed to close ent client: %v", err) |
| } |
| } |
| }) |
| } |
|
|
| func NewTestEnv(t *testing.T) *TestEnv { |
| t.Helper() |
|
|
| |
| logger := testutils.NewDiscardLogger(t) |
|
|
| tracer := noop.NewTracerProvider().Tracer("test_env") |
|
|
| |
| db := testutils.InitPostgresDB(t, testutils.PostgresDBStateEntMigrated) |
| client := db.EntDriver.Client() |
|
|
| |
| publisher := eventbus.NewMock(t) |
|
|
| |
| meterAdapter, err := meteradapter.New(nil) |
| require.NoErrorf(t, err, "initializing meter adapter must not fail") |
| require.NotNilf(t, meterAdapter, "meter adapter must not be nil") |
|
|
| |
| featureAdapter := productcatalogadapter.NewPostgresFeatureRepo(client, logger) |
| featureService := feature.NewFeatureConnector(featureAdapter, meterAdapter, publisher) |
|
|
| |
| entitlementDBAdapter := entitlementpgadapter.NewPostgresEntitlementRepo(client) |
| require.NotNilf(t, entitlementDBAdapter, "entitlement adapter must not be nil") |
|
|
| |
| subjectAdapter, err := subjectadapter.New(client) |
| require.NoErrorf(t, err, "initializing subject adapter must not fail") |
| require.NotNilf(t, subjectAdapter, "subject adapter must not be nil") |
|
|
| subjectService, err := subjectservice.New(subjectAdapter) |
| require.NoErrorf(t, err, "initializing subject service must not fail") |
| require.NotNilf(t, subjectService, "subject service must not be nil") |
|
|
| |
| customerAdapter, err := customeradapter.New(customeradapter.Config{ |
| Client: client, |
| Logger: logger, |
| }) |
| require.NoErrorf(t, err, "initializing customer adapter must not fail") |
| require.NotNilf(t, customerAdapter, "customer adapter must not be nil") |
|
|
| customerService, err := customerservice.New(customerservice.Config{ |
| Adapter: customerAdapter, |
| Publisher: publisher, |
| }) |
| require.NoErrorf(t, err, "initializing subject service must not fail") |
| require.NotNilf(t, customerService, "subject service must not be nil") |
|
|
| return &TestEnv{ |
| Logger: logger, |
| Tracer: tracer, |
| FeatureService: featureService, |
| SubjectService: subjectService, |
| CustomerService: customerService, |
| EntitlementAdapter: entitlementDBAdapter, |
| Client: client, |
| db: db, |
| close: sync.Once{}, |
| } |
| } |
|
|