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" meteradapter "github.com/openmeterio/openmeter/openmeter/meter/mockadapter" "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 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() // Init logger logger := testutils.NewDiscardLogger(t) tracer := noop.NewTracerProvider().Tracer("test_env") // Init database db := testutils.InitPostgresDB(t, testutils.PostgresDBStateEntMigrated) client := db.EntDriver.Client() // Init event publisher publisher := eventbus.NewMock(t) // Init meter service 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") // Init subject service 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") // Init Customer service 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, SubjectService: subjectService, CustomerService: customerService, Client: client, db: db, close: sync.Once{}, } }