From d42a161b772d8f0e02654d6e899f2d8970a8711e Mon Sep 17 00:00:00 2001 From: RushikeshBhavsar3605 Date: Fri, 18 Sep 2026 02:36:16 +0530 Subject: [PATCH 1/4] test: share postgres container across suites --- cmd/migrate.go | 6 + internal/store/postgres/postgres_test.go | 180 +++++++++++++++++------ 2 files changed, 141 insertions(+), 45 deletions(-) diff --git a/cmd/migrate.go b/cmd/migrate.go index 522304bd9..37f6ecaab 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -23,6 +23,10 @@ func RunMigrations(logger *slog.Logger, config db.Config) error { if err != nil { return err } + defer func() { + _, _ = m.Close() + }() + if err = m.Up(); err != nil && err != migrate.ErrNoChange { return err } @@ -33,6 +37,8 @@ func RunMigrations(logger *slog.Logger, config db.Config) error { if err != nil { return errors.Wrap(err, "failed to connect to db") } + defer dbc.Close() + metaschemaRepository := postgres.NewMetaSchemaRepository(logger, dbc) metaschemaService := metaschema.NewService(metaschemaRepository, logger, 0) if err = metaschemaService.MigrateDefault(context.Background()); err != nil { diff --git a/internal/store/postgres/postgres_test.go b/internal/store/postgres/postgres_test.go index 18af52fb1..c3cc499ed 100644 --- a/internal/store/postgres/postgres_test.go +++ b/internal/store/postgres/postgres_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "os" + "sync/atomic" "testing" "time" @@ -45,7 +46,16 @@ const ( pg_dbname = "test_db" ) -func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockertest.Resource, error) { +var ( + testPool *dockertest.Pool + testResource *dockertest.Resource + testPort string + testDBCounter uint64 +) + +func TestMain(m *testing.M) { + logger := slog.New(slog.NewTextHandler(io.Discard, nil)) + opts := &dockertest.RunOptions{ Repository: "postgres", Tag: "13", // Upgraded from 12 to 13 for gen_random_uuid() support @@ -56,32 +66,35 @@ func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockerte }, } - // uses a sensible default on windows (tcp/http) and linux/osx (socket) - pool, err := dockertest.NewPool("") + var err error + + testPool, err = dockertest.NewPool("") if err != nil { - return nil, nil, nil, fmt.Errorf("could not create dockertest pool: %w", err) + fmt.Fprintf(os.Stderr, "could not create dockertest pool: %v\n", err) + os.Exit(1) } - // pulls an image, creates a container based on it and runs it - resource, err := pool.RunWithOptions(opts, func(config *docker.HostConfig) { - // set AutoRemove to true so that stopped container goes away by itself + testPool.MaxWait = 60 * time.Second + + testResource, err = testPool.RunWithOptions(opts, func(config *docker.HostConfig) { config.AutoRemove = true config.RestartPolicy = docker.RestartPolicy{Name: "no"} }) if err != nil { - return nil, nil, nil, fmt.Errorf("could not start resource: %w", err) + fmt.Fprintf(os.Stderr, "could not start postgres resource: %v\n", err) + os.Exit(1) } - pg_port := resource.GetPort("5432/tcp") - if err != nil { - return nil, nil, nil, fmt.Errorf("cannot parse external port of container to int: %w", err) + testPort = testResource.GetPort("5432/tcp") + + var logWaiter interface { + Close() error + Wait() error } - // attach terminal logger to container if exists - // for debugging purpose if logger.Enabled(context.Background(), slog.LevelDebug) { - logWaiter, err := pool.Client.AttachToContainerNonBlocking(docker.AttachToContainerOptions{ - Container: resource.Container.ID, + logWaiter, err = testPool.Client.AttachToContainerNonBlocking(docker.AttachToContainerOptions{ + Container: testResource.Container.ID, OutputStream: os.Stderr, ErrorStream: os.Stderr, Stderr: true, @@ -90,60 +103,137 @@ func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockerte }) if err != nil { logger.Error("could not connect to postgres container log output", "error", err) - return nil, nil, nil, err } - defer func() { - err = logWaiter.Close() - if err != nil { - logger.Error("could not close container log", "error", err) - } + } + + pgConfig := db.Config{ + Driver: "pgx", + URL: fmt.Sprintf("postgres://%s:%s@localhost:%s/%s?sslmode=disable", pg_uname, pg_passwd, testPort, pg_dbname), + MaxIdleConns: 10, + MaxOpenConns: 10, + ConnMaxLifeTime: time.Second * 60, + MaxQueryTimeout: time.Millisecond * 1000, + } + + var pgClient *db.Client + + if err := testPool.Retry(func() error { + var err error + pgClient, err = db.New(pgConfig) + return err + }); err != nil { + fmt.Fprintf(os.Stderr, "could not connect to postgres: %v\n", err) + _ = testPool.Purge(testResource) + os.Exit(1) + } + + if err := setup(context.Background(), logger, pgClient, pgConfig); err != nil { + fmt.Fprintf(os.Stderr, "failed to setup and migrate DB: %v\n", err) + _ = pgClient.Close() + _ = testPool.Purge(testResource) + os.Exit(1) + } + + if err := pgClient.Close(); err != nil { + fmt.Fprintf(os.Stderr, "failed to close template DB connection: %v\n", err) + _ = testPool.Purge(testResource) + os.Exit(1) + } + + code := m.Run() + + if logWaiter != nil { + if err := logWaiter.Close(); err != nil { + fmt.Fprintf(os.Stderr, "could not close container log: %v\n", err) + code = 1 + } + if err := logWaiter.Wait(); err != nil { + fmt.Fprintf(os.Stderr, "could not wait for container log to close: %v\n", err) + code = 1 + } + } + + if err := testPool.Purge(testResource); err != nil { + fmt.Fprintf(os.Stderr, "could not purge postgres resource: %v\n", err) + code = 1 + } - err = logWaiter.Wait() - if err != nil { - logger.Error("could not wait for container log to close", "error", err) - } - }() + os.Exit(code) +} + +func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockertest.Resource, error) { + if testPool == nil || testResource == nil || testPort == "" { + return nil, nil, nil, fmt.Errorf("shared postgres test container is not initialized") + } + + dbName := fmt.Sprintf( + "test_db_%d", + atomic.AddUint64(&testDBCounter, 1), + ) + + adminConfig := db.Config{ + Driver: "pgx", + URL: fmt.Sprintf( + "postgres://%s:%s@localhost:%s/postgres?sslmode=disable", + pg_uname, + pg_passwd, + testPort, + ), + MaxIdleConns: 1, + MaxOpenConns: 1, + ConnMaxLifeTime: time.Second * 60, + MaxQueryTimeout: time.Millisecond * 1000, } - // Tell docker to hard kill the container in 120 seconds - if err := resource.Expire(120); err != nil { - return nil, nil, nil, err + adminClient, err := db.New(adminConfig) + if err != nil { + return nil, nil, nil, fmt.Errorf("could not connect to postgres: %w", err) } + defer adminClient.Close() - // exponential backoff-retry, because the application in the container might not be ready to accept connections yet - pool.MaxWait = 60 * time.Second + query := fmt.Sprintf("CREATE DATABASE %s TEMPLATE %s", dbName, pg_dbname) + if _, err := adminClient.ExecContext(context.Background(), query); err != nil { + return nil, nil, nil, fmt.Errorf("could not create test database %s: %w", dbName, err) + } pgConfig := db.Config{ - Driver: "pgx", - URL: fmt.Sprintf("postgres://%s:%s@localhost:%s/%s?sslmode=disable", pg_uname, pg_passwd, pg_port, pg_dbname), + Driver: "pgx", + URL: fmt.Sprintf( + "postgres://%s:%s@localhost:%s/%s?sslmode=disable", + pg_uname, + pg_passwd, + testPort, + dbName, + ), MaxIdleConns: 10, MaxOpenConns: 10, ConnMaxLifeTime: time.Second * 60, MaxQueryTimeout: time.Millisecond * 1000, } + var pgClient *db.Client - if err = pool.Retry(func() error { + + if err := testPool.Retry(func() error { + var err error pgClient, err = db.New(pgConfig) - if err != nil { - return err - } - return nil + return err }); err != nil { - return nil, nil, nil, fmt.Errorf("could not connect to docker: %w", err) + return nil, nil, nil, fmt.Errorf("could not connect to test database %s: %w", dbName, err) } - err = setup(context.Background(), logger, pgClient, pgConfig) - if err != nil { - logger.Error("failed to setup and migrate DB", "error", err) - return nil, nil, nil, err - } - return pgClient, pool, resource, nil + return pgClient, testPool, testResource, nil } func purgeDocker(pool *dockertest.Pool, resource *dockertest.Resource) error { + // The shared container is owned by TestMain. + if resource == testResource { + return nil + } + if err := pool.Purge(resource); err != nil { return fmt.Errorf("could not purge resource: %w", err) } + return nil } From 894a2c8d27c47b4ed9c6f83f0c6aa25996bb568e Mon Sep 17 00:00:00 2001 From: RushikeshBhavsar3605 Date: Fri, 18 Sep 2026 03:24:50 +0530 Subject: [PATCH 2/4] fix: close postgres test clients --- .../store/postgres/audit_record_repository_test.go | 2 +- .../postgres/billing_customer_repository_test.go | 3 +-- .../store/postgres/billing_product_repository_test.go | 3 +-- .../billing_transactions_repository_pg_test.go | 2 +- internal/store/postgres/group_repository_test.go | 3 +-- internal/store/postgres/invitation_repository_test.go | 3 +-- internal/store/postgres/kyc_repository_test.go | 3 +-- internal/store/postgres/lock_test.go | 3 +-- internal/store/postgres/namespace_repository_test.go | 3 +-- .../store/postgres/organization_repository_test.go | 3 +-- internal/store/postgres/permission_repository_test.go | 3 +-- internal/store/postgres/policy_repository_test.go | 3 +-- internal/store/postgres/postgres_test.go | 11 +++-------- internal/store/postgres/preference_repository_test.go | 2 +- internal/store/postgres/project_repository_test.go | 3 +-- internal/store/postgres/prospect_repository_test.go | 3 +-- internal/store/postgres/relation_repository_test.go | 3 +-- internal/store/postgres/resource_repository_test.go | 3 +-- internal/store/postgres/role_repository_test.go | 3 +-- .../store/postgres/user_consent_repository_test.go | 2 +- internal/store/postgres/user_repository_test.go | 3 +-- internal/store/postgres/userpat_repository_test.go | 2 +- .../postgres/webhook_endpoint_repository_test.go | 3 +-- 23 files changed, 25 insertions(+), 47 deletions(-) diff --git a/internal/store/postgres/audit_record_repository_test.go b/internal/store/postgres/audit_record_repository_test.go index a54cc9511..4f0b18de7 100644 --- a/internal/store/postgres/audit_record_repository_test.go +++ b/internal/store/postgres/audit_record_repository_test.go @@ -100,7 +100,7 @@ func (s *AuditRecordRepositoryTestSuite) setupListTestData() { } func (s *AuditRecordRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/billing_customer_repository_test.go b/internal/store/postgres/billing_customer_repository_test.go index fd39cab34..ca93d8dc7 100644 --- a/internal/store/postgres/billing_customer_repository_test.go +++ b/internal/store/postgres/billing_customer_repository_test.go @@ -63,8 +63,7 @@ func (s *BillingCustomerRepositoryTestSuite) SetupTest() { } func (s *BillingCustomerRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/billing_product_repository_test.go b/internal/store/postgres/billing_product_repository_test.go index 9b8f92c93..0ff15af5a 100644 --- a/internal/store/postgres/billing_product_repository_test.go +++ b/internal/store/postgres/billing_product_repository_test.go @@ -47,8 +47,7 @@ func (s *BillingProductRepositoryTestSuite) SetupTest() { } func (s *BillingProductRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/billing_transactions_repository_pg_test.go b/internal/store/postgres/billing_transactions_repository_pg_test.go index ff6102d80..076e30ea3 100644 --- a/internal/store/postgres/billing_transactions_repository_pg_test.go +++ b/internal/store/postgres/billing_transactions_repository_pg_test.go @@ -38,7 +38,7 @@ func (s *BillingTransactionRepositoryTestSuite) SetupSuite() { } func (s *BillingTransactionRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/group_repository_test.go b/internal/store/postgres/group_repository_test.go index f4a520bfb..6493c3d43 100644 --- a/internal/store/postgres/group_repository_test.go +++ b/internal/store/postgres/group_repository_test.go @@ -125,8 +125,7 @@ func (s *GroupRepositoryTestSuite) SetupTest() { } func (s *GroupRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/invitation_repository_test.go b/internal/store/postgres/invitation_repository_test.go index 326ab3bbb..d8591ed7b 100644 --- a/internal/store/postgres/invitation_repository_test.go +++ b/internal/store/postgres/invitation_repository_test.go @@ -69,8 +69,7 @@ func (s *InvitationRespositoryTestSuite) SetupTest() { } func (s *InvitationRespositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/kyc_repository_test.go b/internal/store/postgres/kyc_repository_test.go index b97a5c914..d1791bc3d 100644 --- a/internal/store/postgres/kyc_repository_test.go +++ b/internal/store/postgres/kyc_repository_test.go @@ -59,8 +59,7 @@ func (s *OrgKycRepositoryTestSuite) SetupTest() { } func (s *OrgKycRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/lock_test.go b/internal/store/postgres/lock_test.go index e7d21a1ae..ac93e8fe9 100644 --- a/internal/store/postgres/lock_test.go +++ b/internal/store/postgres/lock_test.go @@ -40,8 +40,7 @@ func (s *LockTestSuite) SetupSuite() { func (s *LockTestSuite) SetupTest() {} func (s *LockTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/namespace_repository_test.go b/internal/store/postgres/namespace_repository_test.go index 33fda36c9..1ea3aa348 100644 --- a/internal/store/postgres/namespace_repository_test.go +++ b/internal/store/postgres/namespace_repository_test.go @@ -50,8 +50,7 @@ func (s *NamespaceRepositoryTestSuite) SetupTest() { } func (s *NamespaceRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/organization_repository_test.go b/internal/store/postgres/organization_repository_test.go index 40b1027b3..1fad3f342 100644 --- a/internal/store/postgres/organization_repository_test.go +++ b/internal/store/postgres/organization_repository_test.go @@ -101,8 +101,7 @@ func (s *OrganizationRepositoryTestSuite) SetupTest() { } func (s *OrganizationRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/permission_repository_test.go b/internal/store/postgres/permission_repository_test.go index 5d9d29ab7..21f6fe74f 100644 --- a/internal/store/postgres/permission_repository_test.go +++ b/internal/store/postgres/permission_repository_test.go @@ -58,8 +58,7 @@ func (s *PermissionRepositoryTestSuite) SetupTest() { } func (s *PermissionRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/policy_repository_test.go b/internal/store/postgres/policy_repository_test.go index 4e5d9fab9..1784b49a2 100644 --- a/internal/store/postgres/policy_repository_test.go +++ b/internal/store/postgres/policy_repository_test.go @@ -87,8 +87,7 @@ func (s *PolicyRepositoryTestSuite) SetupTest() { } func (s *PolicyRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/postgres_test.go b/internal/store/postgres/postgres_test.go index c3cc499ed..753ce5504 100644 --- a/internal/store/postgres/postgres_test.go +++ b/internal/store/postgres/postgres_test.go @@ -224,17 +224,12 @@ func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockerte return pgClient, testPool, testResource, nil } -func purgeDocker(pool *dockertest.Pool, resource *dockertest.Resource) error { - // The shared container is owned by TestMain. - if resource == testResource { +func closeTestClient(client *db.Client) error { + if client == nil { return nil } - if err := pool.Purge(resource); err != nil { - return fmt.Errorf("could not purge resource: %w", err) - } - - return nil + return client.Close() } func setup(ctx context.Context, logger *slog.Logger, client *db.Client, cfg db.Config) (err error) { diff --git a/internal/store/postgres/preference_repository_test.go b/internal/store/postgres/preference_repository_test.go index 9569adecb..85175dc49 100644 --- a/internal/store/postgres/preference_repository_test.go +++ b/internal/store/postgres/preference_repository_test.go @@ -53,7 +53,7 @@ func (s *PreferenceRepositoryTestSuite) SetupSuite() { } func (s *PreferenceRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/project_repository_test.go b/internal/store/postgres/project_repository_test.go index 31151722c..9f9c980ba 100644 --- a/internal/store/postgres/project_repository_test.go +++ b/internal/store/postgres/project_repository_test.go @@ -99,8 +99,7 @@ func (s *ProjectRepositoryTestSuite) SetupTest() { } func (s *ProjectRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/prospect_repository_test.go b/internal/store/postgres/prospect_repository_test.go index 36b3fef82..905a6fd34 100644 --- a/internal/store/postgres/prospect_repository_test.go +++ b/internal/store/postgres/prospect_repository_test.go @@ -92,8 +92,7 @@ func (s *ProspectRepositoryTestSuite) TearDownTest() { } func (s *ProspectRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/relation_repository_test.go b/internal/store/postgres/relation_repository_test.go index d824d4b44..394ceb643 100644 --- a/internal/store/postgres/relation_repository_test.go +++ b/internal/store/postgres/relation_repository_test.go @@ -69,8 +69,7 @@ func (s *RelationRepositoryTestSuite) SetupTest() { } func (s *RelationRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/resource_repository_test.go b/internal/store/postgres/resource_repository_test.go index b2d219a83..ed07d5b79 100644 --- a/internal/store/postgres/resource_repository_test.go +++ b/internal/store/postgres/resource_repository_test.go @@ -81,8 +81,7 @@ func (s *ResourceRepositoryTestSuite) SetupTest() { } func (s *ResourceRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/role_repository_test.go b/internal/store/postgres/role_repository_test.go index 26ca0a020..8ed9fb5dc 100644 --- a/internal/store/postgres/role_repository_test.go +++ b/internal/store/postgres/role_repository_test.go @@ -67,8 +67,7 @@ func (s *RoleRepositoryTestSuite) SetupTest() { } func (s *RoleRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/user_consent_repository_test.go b/internal/store/postgres/user_consent_repository_test.go index bfaab68f2..c29037428 100644 --- a/internal/store/postgres/user_consent_repository_test.go +++ b/internal/store/postgres/user_consent_repository_test.go @@ -44,7 +44,7 @@ func (s *UserConsentRepositoryTestSuite) SetupSuite() { } func (s *UserConsentRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/user_repository_test.go b/internal/store/postgres/user_repository_test.go index 56938c530..86f64cc14 100644 --- a/internal/store/postgres/user_repository_test.go +++ b/internal/store/postgres/user_repository_test.go @@ -55,8 +55,7 @@ func (s *UserRepositoryTestSuite) SetupTest() { } func (s *UserRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/userpat_repository_test.go b/internal/store/postgres/userpat_repository_test.go index 1915ee421..c8d88d92d 100644 --- a/internal/store/postgres/userpat_repository_test.go +++ b/internal/store/postgres/userpat_repository_test.go @@ -55,7 +55,7 @@ func (s *UserPATRepositoryTestSuite) SetupTest() { } func (s *UserPATRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/webhook_endpoint_repository_test.go b/internal/store/postgres/webhook_endpoint_repository_test.go index 7bc986146..ba238121e 100644 --- a/internal/store/postgres/webhook_endpoint_repository_test.go +++ b/internal/store/postgres/webhook_endpoint_repository_test.go @@ -47,8 +47,7 @@ func (s *WebhookEndpointRepositoryTestSuite) SetupTest() { } func (s *WebhookEndpointRepositoryTestSuite) TearDownSuite() { - // Clean tests - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } From f1d2a5d3849134152e928993573d513862e9f557 Mon Sep 17 00:00:00 2001 From: RushikeshBhavsar3605 Date: Thu, 24 Sep 2026 18:14:11 +0530 Subject: [PATCH 3/4] test: share postgres container across suites --- cmd/migrate.go | 3 ++ .../postgres/audit_record_repository_test.go | 9 +--- .../billing_customer_repository_test.go | 9 +--- .../billing_product_repository_test.go | 9 +--- ...billing_transactions_repository_pg_test.go | 8 +-- .../store/postgres/domain_repository_test.go | 4 +- .../store/postgres/group_repository_test.go | 9 +--- .../postgres/invitation_repository_test.go | 2 +- .../store/postgres/kyc_repository_test.go | 9 +--- internal/store/postgres/lock_test.go | 13 ++--- .../postgres/namespace_repository_test.go | 9 +--- .../org_serviceuser_repository_pg_test.go | 10 +--- .../postgres/org_users_repository_pg_test.go | 10 +--- .../postgres/organization_repository_test.go | 9 +--- .../postgres/permission_repository_test.go | 9 +--- .../store/postgres/policy_repository_test.go | 9 +--- internal/store/postgres/postgres_test.go | 49 ++++--------------- .../postgres/preference_repository_test.go | 9 +--- .../store/postgres/project_repository_test.go | 9 +--- .../postgres/prospect_repository_test.go | 9 +--- .../postgres/relation_repository_test.go | 9 +--- .../postgres/resource_repository_test.go | 9 +--- .../store/postgres/role_repository_test.go | 9 +--- .../postgres/serviceuser_repository_test.go | 10 +--- .../postgres/user_consent_repository_test.go | 8 +-- .../store/postgres/user_repository_test.go | 9 +--- .../store/postgres/userpat_repository_test.go | 9 +--- .../webhook_endpoint_repository_test.go | 9 +--- pkg/db/db.go | 1 + 29 files changed, 45 insertions(+), 235 deletions(-) diff --git a/cmd/migrate.go b/cmd/migrate.go index 37f6ecaab..dec2ce74e 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -55,6 +55,9 @@ func RunRollback(logger *slog.Logger, config db.Config) error { if err != nil { return err } + defer func() { + _, _ = m.Close() + }() err = m.Steps(-1) if err != nil && err != migrate.ErrNoChange { diff --git a/internal/store/postgres/audit_record_repository_test.go b/internal/store/postgres/audit_record_repository_test.go index 4f0b18de7..e5a15ef4c 100644 --- a/internal/store/postgres/audit_record_repository_test.go +++ b/internal/store/postgres/audit_record_repository_test.go @@ -10,11 +10,7 @@ import ( "testing" "time" - "io" - "log/slog" - "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/auditrecord" "github.com/raystack/frontier/internal/store/postgres" pkgAuditRecord "github.com/raystack/frontier/pkg/auditrecord" @@ -34,8 +30,6 @@ type AuditRecordRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.AuditRecordRepository auditRecords []auditrecord.AuditRecord } @@ -43,8 +37,7 @@ type AuditRecordRepositoryTestSuite struct { func (s *AuditRecordRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/billing_customer_repository_test.go b/internal/store/postgres/billing_customer_repository_test.go index ca93d8dc7..8909e8afb 100644 --- a/internal/store/postgres/billing_customer_repository_test.go +++ b/internal/store/postgres/billing_customer_repository_test.go @@ -15,13 +15,9 @@ import ( "github.com/raystack/frontier/billing/customer" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" "github.com/raystack/frontier/pkg/metadata" @@ -32,8 +28,6 @@ type BillingCustomerRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.BillingCustomerRepository orgIDs []string } @@ -41,8 +35,7 @@ type BillingCustomerRepositoryTestSuite struct { func (s *BillingCustomerRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/billing_product_repository_test.go b/internal/store/postgres/billing_product_repository_test.go index 0ff15af5a..043c0dedf 100644 --- a/internal/store/postgres/billing_product_repository_test.go +++ b/internal/store/postgres/billing_product_repository_test.go @@ -9,12 +9,8 @@ import ( "github.com/google/uuid" "github.com/raystack/frontier/billing/product" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" "github.com/raystack/frontier/pkg/metadata" @@ -25,16 +21,13 @@ type BillingProductRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.BillingProductRepository } func (s *BillingProductRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/billing_transactions_repository_pg_test.go b/internal/store/postgres/billing_transactions_repository_pg_test.go index 076e30ea3..42bf3ef38 100644 --- a/internal/store/postgres/billing_transactions_repository_pg_test.go +++ b/internal/store/postgres/billing_transactions_repository_pg_test.go @@ -2,12 +2,9 @@ package postgres_test import ( "context" - "io" - "log/slog" "testing" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/billing/credit" "github.com/raystack/frontier/internal/bootstrap/schema" "github.com/raystack/frontier/internal/store/postgres" @@ -19,16 +16,13 @@ type BillingTransactionRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.BillingTransactionRepository } func (s *BillingTransactionRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/domain_repository_test.go b/internal/store/postgres/domain_repository_test.go index 72c69da8b..d3e8c45b6 100644 --- a/internal/store/postgres/domain_repository_test.go +++ b/internal/store/postgres/domain_repository_test.go @@ -28,7 +28,7 @@ func (s *DomainRepositoryTestSuite) SetupSuite() { var err error logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } @@ -44,7 +44,7 @@ func (s *DomainRepositoryTestSuite) SetupSuite() { } func (s *DomainRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/group_repository_test.go b/internal/store/postgres/group_repository_test.go index 6493c3d43..0450a2e6b 100644 --- a/internal/store/postgres/group_repository_test.go +++ b/internal/store/postgres/group_repository_test.go @@ -8,13 +8,9 @@ import ( "github.com/raystack/frontier/internal/bootstrap/schema" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/group" "github.com/raystack/frontier/core/organization" "github.com/raystack/frontier/core/relation" @@ -29,8 +25,6 @@ type GroupRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.GroupRepository relationRepository *postgres.RelationRepository namespaceRepository *postgres.NamespaceRepository @@ -43,8 +37,7 @@ type GroupRepositoryTestSuite struct { func (s *GroupRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/invitation_repository_test.go b/internal/store/postgres/invitation_repository_test.go index d8591ed7b..a965bdecf 100644 --- a/internal/store/postgres/invitation_repository_test.go +++ b/internal/store/postgres/invitation_repository_test.go @@ -39,7 +39,7 @@ func (s *InvitationRespositoryTestSuite) SetupSuite() { var err error logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/kyc_repository_test.go b/internal/store/postgres/kyc_repository_test.go index d1791bc3d..f098295ae 100644 --- a/internal/store/postgres/kyc_repository_test.go +++ b/internal/store/postgres/kyc_repository_test.go @@ -6,13 +6,9 @@ import ( "sort" "testing" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/kyc" "github.com/raystack/frontier/core/organization" "github.com/raystack/frontier/internal/store/postgres" @@ -24,8 +20,6 @@ type OrgKycRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.OrgKycRepository orgRepository *postgres.OrganizationRepository kycs []kyc.KYC @@ -35,8 +29,7 @@ type OrgKycRepositoryTestSuite struct { func (s *OrgKycRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/lock_test.go b/internal/store/postgres/lock_test.go index ac93e8fe9..044f9fbe2 100644 --- a/internal/store/postgres/lock_test.go +++ b/internal/store/postgres/lock_test.go @@ -4,10 +4,6 @@ import ( "context" "testing" - "io" - "log/slog" - - "github.com/ory/dockertest" "github.com/stretchr/testify/suite" "github.com/raystack/frontier/pkg/db" @@ -15,10 +11,8 @@ import ( type LockTestSuite struct { suite.Suite - ctx context.Context - client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource + ctx context.Context + client *db.Client } func TestLocks(t *testing.T) { @@ -28,8 +22,7 @@ func TestLocks(t *testing.T) { func (s *LockTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/namespace_repository_test.go b/internal/store/postgres/namespace_repository_test.go index 1ea3aa348..86e60029f 100644 --- a/internal/store/postgres/namespace_repository_test.go +++ b/internal/store/postgres/namespace_repository_test.go @@ -7,12 +7,8 @@ import ( "github.com/google/uuid" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/namespace" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -23,16 +19,13 @@ type NamespaceRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.NamespaceRepository } func (s *NamespaceRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/org_serviceuser_repository_pg_test.go b/internal/store/postgres/org_serviceuser_repository_pg_test.go index 510c573e0..2398c3079 100644 --- a/internal/store/postgres/org_serviceuser_repository_pg_test.go +++ b/internal/store/postgres/org_serviceuser_repository_pg_test.go @@ -3,11 +3,8 @@ package postgres_test import ( "context" "fmt" - "io" - "log/slog" "testing" - "github.com/ory/dockertest" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" "github.com/raystack/salt/rql" @@ -29,16 +26,13 @@ type OrgServiceUserRepositoryPGTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.OrgServiceUserRepository orgID string } func (s *OrgServiceUserRepositoryPGTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } @@ -47,7 +41,7 @@ func (s *OrgServiceUserRepositoryPGTestSuite) SetupSuite() { } func (s *OrgServiceUserRepositoryPGTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/org_users_repository_pg_test.go b/internal/store/postgres/org_users_repository_pg_test.go index cc2f1e449..6debb12f5 100644 --- a/internal/store/postgres/org_users_repository_pg_test.go +++ b/internal/store/postgres/org_users_repository_pg_test.go @@ -3,11 +3,8 @@ package postgres_test import ( "context" "fmt" - "io" - "log/slog" "testing" - "github.com/ory/dockertest" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" "github.com/raystack/salt/rql" @@ -20,16 +17,13 @@ type OrgUsersRepositoryPGTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.OrgUsersRepository orgID string } func (s *OrgUsersRepositoryPGTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } @@ -38,7 +32,7 @@ func (s *OrgUsersRepositoryPGTestSuite) SetupSuite() { } func (s *OrgUsersRepositoryPGTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/organization_repository_test.go b/internal/store/postgres/organization_repository_test.go index 1fad3f342..12f3a21bb 100644 --- a/internal/store/postgres/organization_repository_test.go +++ b/internal/store/postgres/organization_repository_test.go @@ -9,13 +9,9 @@ import ( "github.com/raystack/frontier/internal/bootstrap/schema" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/organization" "github.com/raystack/frontier/core/relation" "github.com/raystack/frontier/core/user" @@ -29,8 +25,6 @@ type OrganizationRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.OrganizationRepository relationRepository *postgres.RelationRepository namespaceRepository *postgres.NamespaceRepository @@ -42,8 +36,7 @@ type OrganizationRepositoryTestSuite struct { func (s *OrganizationRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/permission_repository_test.go b/internal/store/postgres/permission_repository_test.go index 21f6fe74f..e8b78bb78 100644 --- a/internal/store/postgres/permission_repository_test.go +++ b/internal/store/postgres/permission_repository_test.go @@ -9,12 +9,8 @@ import ( "github.com/raystack/frontier/core/permission" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/namespace" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -25,8 +21,6 @@ type PermissionRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.PermissionRepository permsInDB []permission.Permission } @@ -34,8 +28,7 @@ type PermissionRepositoryTestSuite struct { func (s *PermissionRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/policy_repository_test.go b/internal/store/postgres/policy_repository_test.go index 1784b49a2..cd07fed37 100644 --- a/internal/store/postgres/policy_repository_test.go +++ b/internal/store/postgres/policy_repository_test.go @@ -10,13 +10,9 @@ import ( "github.com/raystack/frontier/internal/bootstrap/schema" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/stretchr/testify/suite" "github.com/raystack/frontier/core/policy" @@ -28,8 +24,6 @@ type PolicyRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.PolicyRepository policies []policy.Policy userID string @@ -40,8 +34,7 @@ type PolicyRepositoryTestSuite struct { func (s *PolicyRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/postgres_test.go b/internal/store/postgres/postgres_test.go index 753ce5504..1e670d659 100644 --- a/internal/store/postgres/postgres_test.go +++ b/internal/store/postgres/postgres_test.go @@ -40,10 +40,9 @@ import ( ) const ( - logLevelDebug = "debug" - pg_uname = "test_user" - pg_passwd = "test_pass" - pg_dbname = "test_db" + pg_uname = "test_user" + pg_passwd = "test_pass" + pg_dbname = "test_db" ) var ( @@ -87,25 +86,6 @@ func TestMain(m *testing.M) { testPort = testResource.GetPort("5432/tcp") - var logWaiter interface { - Close() error - Wait() error - } - - if logger.Enabled(context.Background(), slog.LevelDebug) { - logWaiter, err = testPool.Client.AttachToContainerNonBlocking(docker.AttachToContainerOptions{ - Container: testResource.Container.ID, - OutputStream: os.Stderr, - ErrorStream: os.Stderr, - Stderr: true, - Stdout: true, - Stream: true, - }) - if err != nil { - logger.Error("could not connect to postgres container log output", "error", err) - } - } - pgConfig := db.Config{ Driver: "pgx", URL: fmt.Sprintf("postgres://%s:%s@localhost:%s/%s?sslmode=disable", pg_uname, pg_passwd, testPort, pg_dbname), @@ -142,17 +122,6 @@ func TestMain(m *testing.M) { code := m.Run() - if logWaiter != nil { - if err := logWaiter.Close(); err != nil { - fmt.Fprintf(os.Stderr, "could not close container log: %v\n", err) - code = 1 - } - if err := logWaiter.Wait(); err != nil { - fmt.Fprintf(os.Stderr, "could not wait for container log to close: %v\n", err) - code = 1 - } - } - if err := testPool.Purge(testResource); err != nil { fmt.Fprintf(os.Stderr, "could not purge postgres resource: %v\n", err) code = 1 @@ -161,9 +130,9 @@ func TestMain(m *testing.M) { os.Exit(code) } -func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockertest.Resource, error) { +func newTestClient() (*db.Client, error) { if testPool == nil || testResource == nil || testPort == "" { - return nil, nil, nil, fmt.Errorf("shared postgres test container is not initialized") + return nil, fmt.Errorf("shared postgres test container is not initialized") } dbName := fmt.Sprintf( @@ -187,13 +156,13 @@ func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockerte adminClient, err := db.New(adminConfig) if err != nil { - return nil, nil, nil, fmt.Errorf("could not connect to postgres: %w", err) + return nil, fmt.Errorf("could not connect to postgres: %w", err) } defer adminClient.Close() query := fmt.Sprintf("CREATE DATABASE %s TEMPLATE %s", dbName, pg_dbname) if _, err := adminClient.ExecContext(context.Background(), query); err != nil { - return nil, nil, nil, fmt.Errorf("could not create test database %s: %w", dbName, err) + return nil, fmt.Errorf("could not create test database %s: %w", dbName, err) } pgConfig := db.Config{ @@ -218,10 +187,10 @@ func newTestClient(logger *slog.Logger) (*db.Client, *dockertest.Pool, *dockerte pgClient, err = db.New(pgConfig) return err }); err != nil { - return nil, nil, nil, fmt.Errorf("could not connect to test database %s: %w", dbName, err) + return nil, fmt.Errorf("could not connect to test database %s: %w", dbName, err) } - return pgClient, testPool, testResource, nil + return pgClient, nil } func closeTestClient(client *db.Client) error { diff --git a/internal/store/postgres/preference_repository_test.go b/internal/store/postgres/preference_repository_test.go index 85175dc49..6e07c9b33 100644 --- a/internal/store/postgres/preference_repository_test.go +++ b/internal/store/postgres/preference_repository_test.go @@ -5,12 +5,8 @@ import ( "fmt" "testing" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/preference" "github.com/raystack/frontier/internal/bootstrap/schema" "github.com/raystack/frontier/internal/store/postgres" @@ -22,16 +18,13 @@ type PreferenceRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.PreferenceRepository } func (s *PreferenceRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/project_repository_test.go b/internal/store/postgres/project_repository_test.go index 9f9c980ba..87a4e2cc5 100644 --- a/internal/store/postgres/project_repository_test.go +++ b/internal/store/postgres/project_repository_test.go @@ -7,13 +7,9 @@ import ( "github.com/raystack/frontier/internal/bootstrap/schema" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/organization" "github.com/raystack/frontier/core/project" "github.com/raystack/frontier/core/relation" @@ -27,8 +23,6 @@ type ProjectRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.ProjectRepository relationRepository *postgres.RelationRepository namespaceRepository *postgres.NamespaceRepository @@ -41,8 +35,7 @@ type ProjectRepositoryTestSuite struct { func (s *ProjectRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/prospect_repository_test.go b/internal/store/postgres/prospect_repository_test.go index 905a6fd34..ce1cdc578 100644 --- a/internal/store/postgres/prospect_repository_test.go +++ b/internal/store/postgres/prospect_repository_test.go @@ -7,13 +7,9 @@ import ( "os" "testing" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/prospect" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -32,8 +28,6 @@ type ProspectRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.ProspectRepository prospects []prospect.Prospect } @@ -41,8 +35,7 @@ type ProspectRepositoryTestSuite struct { func (s *ProspectRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/relation_repository_test.go b/internal/store/postgres/relation_repository_test.go index 394ceb643..c80afa06b 100644 --- a/internal/store/postgres/relation_repository_test.go +++ b/internal/store/postgres/relation_repository_test.go @@ -6,13 +6,9 @@ import ( "sort" "testing" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/relation" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -24,8 +20,6 @@ type RelationRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.RelationRepository relations []relation.Relation orgID string @@ -34,8 +28,7 @@ type RelationRepositoryTestSuite struct { func (s *RelationRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/resource_repository_test.go b/internal/store/postgres/resource_repository_test.go index ed07d5b79..99c4a6285 100644 --- a/internal/store/postgres/resource_repository_test.go +++ b/internal/store/postgres/resource_repository_test.go @@ -10,12 +10,8 @@ import ( "github.com/raystack/frontier/pkg/utils" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/namespace" "github.com/raystack/frontier/core/project" "github.com/raystack/frontier/core/resource" @@ -29,8 +25,6 @@ type ResourceRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.ResourceRepository resources []resource.Resource projects []project.Project @@ -42,8 +36,7 @@ type ResourceRepositoryTestSuite struct { func (s *ResourceRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/role_repository_test.go b/internal/store/postgres/role_repository_test.go index 8ed9fb5dc..5597dc30f 100644 --- a/internal/store/postgres/role_repository_test.go +++ b/internal/store/postgres/role_repository_test.go @@ -10,12 +10,8 @@ import ( "github.com/google/uuid" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/role" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -27,8 +23,6 @@ type RoleRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.RoleRepository roles []role.Role orgID string @@ -37,8 +31,7 @@ type RoleRepositoryTestSuite struct { func (s *RoleRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/serviceuser_repository_test.go b/internal/store/postgres/serviceuser_repository_test.go index a9da91d70..f56675713 100644 --- a/internal/store/postgres/serviceuser_repository_test.go +++ b/internal/store/postgres/serviceuser_repository_test.go @@ -2,11 +2,8 @@ package postgres_test import ( "context" - "io" - "log/slog" "testing" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/serviceuser" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -17,8 +14,6 @@ type ServiceUserRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.ServiceUserRepository credentialRepository *postgres.ServiceUserCredentialRepository orgID string @@ -27,8 +22,7 @@ type ServiceUserRepositoryTestSuite struct { func (s *ServiceUserRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } @@ -45,7 +39,7 @@ func (s *ServiceUserRepositoryTestSuite) SetupSuite() { } func (s *ServiceUserRepositoryTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } } diff --git a/internal/store/postgres/user_consent_repository_test.go b/internal/store/postgres/user_consent_repository_test.go index c29037428..6b19c8274 100644 --- a/internal/store/postgres/user_consent_repository_test.go +++ b/internal/store/postgres/user_consent_repository_test.go @@ -4,13 +4,10 @@ import ( "context" "database/sql" "fmt" - "io" - "log/slog" "testing" "time" "github.com/jmoiron/sqlx" - "github.com/ory/dockertest" "github.com/stretchr/testify/suite" "github.com/raystack/frontier/core/consent" @@ -23,8 +20,6 @@ type UserConsentRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.UserConsentRepository userRepository *postgres.UserRepository } @@ -32,8 +27,7 @@ type UserConsentRepositoryTestSuite struct { func (s *UserConsentRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/user_repository_test.go b/internal/store/postgres/user_repository_test.go index 86f64cc14..f072668d2 100644 --- a/internal/store/postgres/user_repository_test.go +++ b/internal/store/postgres/user_repository_test.go @@ -6,13 +6,9 @@ import ( "fmt" "testing" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/user" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -26,8 +22,6 @@ type UserRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.UserRepository users []user.User } @@ -35,8 +29,7 @@ type UserRepositoryTestSuite struct { func (s *UserRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/userpat_repository_test.go b/internal/store/postgres/userpat_repository_test.go index c8d88d92d..32d039944 100644 --- a/internal/store/postgres/userpat_repository_test.go +++ b/internal/store/postgres/userpat_repository_test.go @@ -6,11 +6,7 @@ import ( "testing" "time" - "io" - "log/slog" - "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/organization" "github.com/raystack/frontier/core/user" paterrors "github.com/raystack/frontier/core/userpat/errors" @@ -24,8 +20,6 @@ type UserPATRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.UserPATRepository users []user.User orgs []organization.Organization @@ -33,8 +27,7 @@ type UserPATRepositoryTestSuite struct { func (s *UserPATRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/internal/store/postgres/webhook_endpoint_repository_test.go b/internal/store/postgres/webhook_endpoint_repository_test.go index ba238121e..fdf0a3586 100644 --- a/internal/store/postgres/webhook_endpoint_repository_test.go +++ b/internal/store/postgres/webhook_endpoint_repository_test.go @@ -10,12 +10,8 @@ import ( "github.com/google/uuid" - "io" - "log/slog" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/ory/dockertest" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" "github.com/stretchr/testify/suite" @@ -25,16 +21,13 @@ type WebhookEndpointRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.WebhookEndpointRepository } func (s *WebhookEndpointRepositoryTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } diff --git a/pkg/db/db.go b/pkg/db/db.go index eebd571cc..0bef199b6 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -34,6 +34,7 @@ func New(cfg Config) (*Client, error) { } if err = d.Ping(); err != nil { + _ = d.Close() return nil, err } From 4b0b269ae9ba51752286e81c0e3bfe537c371896 Mon Sep 17 00:00:00 2001 From: RushikeshBhavsar3605 Date: Thu, 24 Sep 2026 18:48:54 +0530 Subject: [PATCH 4/4] test: clean up remaining postgres test clients --- internal/store/postgres/domain_repository_test.go | 3 --- internal/store/postgres/invitation_repository_test.go | 3 --- .../store/postgres/org_projects_repository_pg_test.go | 10 ++-------- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/internal/store/postgres/domain_repository_test.go b/internal/store/postgres/domain_repository_test.go index d3e8c45b6..a50b8fae5 100644 --- a/internal/store/postgres/domain_repository_test.go +++ b/internal/store/postgres/domain_repository_test.go @@ -7,7 +7,6 @@ import ( "testing" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/domain" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -18,8 +17,6 @@ type DomainRepositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.DomainRepository orgID string } diff --git a/internal/store/postgres/invitation_repository_test.go b/internal/store/postgres/invitation_repository_test.go index a965bdecf..077e653cb 100644 --- a/internal/store/postgres/invitation_repository_test.go +++ b/internal/store/postgres/invitation_repository_test.go @@ -12,7 +12,6 @@ import ( "log/slog" "github.com/google/uuid" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/group" "github.com/raystack/frontier/core/invitation" "github.com/raystack/frontier/core/user" @@ -26,8 +25,6 @@ type InvitationRespositoryTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.InvitationRepository users []user.User groups []group.Group diff --git a/internal/store/postgres/org_projects_repository_pg_test.go b/internal/store/postgres/org_projects_repository_pg_test.go index 57e117a0d..69032c511 100644 --- a/internal/store/postgres/org_projects_repository_pg_test.go +++ b/internal/store/postgres/org_projects_repository_pg_test.go @@ -3,11 +3,8 @@ package postgres_test import ( "context" "fmt" - "io" - "log/slog" "testing" - "github.com/ory/dockertest" "github.com/raystack/frontier/core/aggregates/orgprojects" "github.com/raystack/frontier/internal/store/postgres" "github.com/raystack/frontier/pkg/db" @@ -21,16 +18,13 @@ type OrgProjectsRepositoryPGTestSuite struct { suite.Suite ctx context.Context client *db.Client - pool *dockertest.Pool - resource *dockertest.Resource repository *postgres.OrgProjectsRepository orgID string } func (s *OrgProjectsRepositoryPGTestSuite) SetupSuite() { var err error - logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - s.client, s.pool, s.resource, err = newTestClient(logger) + s.client, err = newTestClient() if err != nil { s.T().Fatal(err) } @@ -39,7 +33,7 @@ func (s *OrgProjectsRepositoryPGTestSuite) SetupSuite() { } func (s *OrgProjectsRepositoryPGTestSuite) TearDownSuite() { - if err := purgeDocker(s.pool, s.resource); err != nil { + if err := closeTestClient(s.client); err != nil { s.T().Fatal(err) } }