Skip to content

Commit 656b90d

Browse files
committed
refactor(app): accept client dependency for better testability
- Refactor App.New() to accept PostgreSQLClient interface parameter - Add NewDefault() convenience constructor for production use - Update all tests to inject mock clients via New() constructor - Remove tight coupling between App and PostgreSQLClientImpl - Enable dependency injection pattern for improved testability This follows constructor dependency injection pattern and makes it easier to test App without database dependencies. Implements #28
1 parent bc1a18a commit 656b90d

File tree

6 files changed

+87
-89
lines changed

6 files changed

+87
-89
lines changed

integration_test.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func TestIntegration_App_Connect(t *testing.T) {
141141
_, connectionString, cleanup := setupTestContainer(t)
142142
defer cleanup()
143143

144-
appInstance, err := app.New()
144+
appInstance, err := app.NewDefault()
145145
require.NoError(t, err)
146146
defer appInstance.Disconnect()
147147

@@ -165,7 +165,7 @@ func TestIntegration_App_ConnectWithEnvironmentVariable(t *testing.T) {
165165
os.Setenv("POSTGRES_URL", connectionString)
166166
defer os.Unsetenv("POSTGRES_URL")
167167

168-
appInstance, err := app.New()
168+
appInstance, err := app.NewDefault()
169169
require.NoError(t, err)
170170
defer appInstance.Disconnect()
171171

@@ -185,7 +185,7 @@ func TestIntegration_App_ListDatabases(t *testing.T) {
185185
_, connectionString, cleanup := setupTestDatabase(t)
186186
defer cleanup()
187187

188-
appInstance, err := app.New()
188+
appInstance, err := app.NewDefault()
189189
require.NoError(t, err)
190190
defer appInstance.Disconnect()
191191

@@ -214,7 +214,7 @@ func TestIntegration_App_ListSchemas(t *testing.T) {
214214
_, connectionString, cleanup := setupTestDatabase(t)
215215
defer cleanup()
216216

217-
appInstance, err := app.New()
217+
appInstance, err := app.NewDefault()
218218
require.NoError(t, err)
219219
defer appInstance.Disconnect()
220220

@@ -241,7 +241,7 @@ func TestIntegration_App_ListTables(t *testing.T) {
241241
_, connectionString, cleanup := setupTestDatabase(t)
242242
defer cleanup()
243243

244-
appInstance, err := app.New()
244+
appInstance, err := app.NewDefault()
245245
require.NoError(t, err)
246246
defer appInstance.Disconnect()
247247

@@ -276,7 +276,7 @@ func TestIntegration_App_ListTablesWithSize(t *testing.T) {
276276
_, connectionString, cleanup := setupTestDatabase(t)
277277
defer cleanup()
278278

279-
appInstance, err := app.New()
279+
appInstance, err := app.NewDefault()
280280
require.NoError(t, err)
281281
defer appInstance.Disconnect()
282282

@@ -308,7 +308,7 @@ func TestIntegration_App_DescribeTable(t *testing.T) {
308308
_, connectionString, cleanup := setupTestDatabase(t)
309309
defer cleanup()
310310

311-
appInstance, err := app.New()
311+
appInstance, err := app.NewDefault()
312312
require.NoError(t, err)
313313
defer appInstance.Disconnect()
314314

@@ -355,7 +355,7 @@ func TestIntegration_App_ExecuteQuery(t *testing.T) {
355355
_, connectionString, cleanup := setupTestDatabase(t)
356356
defer cleanup()
357357

358-
appInstance, err := app.New()
358+
appInstance, err := app.NewDefault()
359359
require.NoError(t, err)
360360
defer appInstance.Disconnect()
361361

@@ -390,7 +390,7 @@ func TestIntegration_App_ExecuteQueryWithLimit(t *testing.T) {
390390
_, connectionString, cleanup := setupTestDatabase(t)
391391
defer cleanup()
392392

393-
appInstance, err := app.New()
393+
appInstance, err := app.NewDefault()
394394
require.NoError(t, err)
395395
defer appInstance.Disconnect()
396396

@@ -418,7 +418,7 @@ func TestIntegration_App_ListIndexes(t *testing.T) {
418418
_, connectionString, cleanup := setupTestDatabase(t)
419419
defer cleanup()
420420

421-
appInstance, err := app.New()
421+
appInstance, err := app.NewDefault()
422422
require.NoError(t, err)
423423
defer appInstance.Disconnect()
424424

@@ -503,7 +503,7 @@ func TestIntegration_App_ListIndexes_SpecialCharacters(t *testing.T) {
503503
require.NoError(t, err)
504504

505505
// Test with app
506-
appInstance, err := app.New()
506+
appInstance, err := app.NewDefault()
507507
require.NoError(t, err)
508508
defer appInstance.Disconnect()
509509

@@ -554,7 +554,7 @@ func TestIntegration_App_ExplainQuery(t *testing.T) {
554554
_, connectionString, cleanup := setupTestDatabase(t)
555555
defer cleanup()
556556

557-
appInstance, err := app.New()
557+
appInstance, err := app.NewDefault()
558558
require.NoError(t, err)
559559
defer appInstance.Disconnect()
560560

@@ -577,7 +577,7 @@ func TestIntegration_App_GetTableStats(t *testing.T) {
577577
_, connectionString, cleanup := setupTestDatabase(t)
578578
defer cleanup()
579579

580-
appInstance, err := app.New()
580+
appInstance, err := app.NewDefault()
581581
require.NoError(t, err)
582582
defer appInstance.Disconnect()
583583

@@ -604,7 +604,7 @@ func TestIntegration_App_ErrorHandling(t *testing.T) {
604604
os.Setenv("POSTGRES_URL", connectionString)
605605
defer os.Unsetenv("POSTGRES_URL")
606606

607-
appInstance, err := app.New()
607+
appInstance, err := app.NewDefault()
608608
require.NoError(t, err)
609609
defer appInstance.Disconnect()
610610

@@ -635,7 +635,7 @@ func TestIntegration_App_ConnectionValidation(t *testing.T) {
635635
defer cleanup()
636636

637637
// Test validation without environment variable
638-
appInstance, err := app.New()
638+
appInstance, err := app.NewDefault()
639639
require.NoError(t, err)
640640

641641
ctx := context.Background()
@@ -648,7 +648,7 @@ func TestIntegration_App_ConnectionValidation(t *testing.T) {
648648
defer os.Unsetenv("POSTGRES_URL")
649649

650650
// Create new instance with environment variable set
651-
appInstance2, err := app.New()
651+
appInstance2, err := app.NewDefault()
652652
require.NoError(t, err)
653653
defer appInstance2.Disconnect()
654654

@@ -670,7 +670,7 @@ func BenchmarkIntegration_ListTables(b *testing.B) {
670670

671671
ctx := context.Background()
672672

673-
appInstance, err := app.New()
673+
appInstance, err := app.NewDefault()
674674
require.NoError(b, err)
675675
defer appInstance.Disconnect()
676676

@@ -702,7 +702,7 @@ func BenchmarkIntegration_ExecuteQuery(b *testing.B) {
702702

703703
ctx := context.Background()
704704

705-
appInstance, err := app.New()
705+
appInstance, err := app.NewDefault()
706706
require.NoError(b, err)
707707
defer appInstance.Disconnect()
708708

internal/app/app.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,23 @@ type App struct {
3333
logger *slog.Logger
3434
}
3535

36-
// New creates a new App instance without establishing a connection.
36+
// New creates a new App instance with the provided PostgreSQLClient.
37+
// This constructor accepts a client implementation for dependency injection,
38+
// making it easy to inject mocks or alternative implementations for testing.
39+
func New(client PostgreSQLClient) *App {
40+
return &App{
41+
client: client,
42+
logger: logger.NewLogger("info"),
43+
}
44+
}
45+
46+
// NewDefault creates a new App instance with a default PostgreSQLClient.
3747
// Use Connect() method or connect_database tool to establish connection.
38-
func New() (*App, error) {
48+
// This is a convenience constructor for production use.
49+
func NewDefault() (*App, error) {
50+
client := NewPostgreSQLClient()
3951
app := &App{
40-
client: NewPostgreSQLClient(),
52+
client: client,
4153
logger: logger.NewLogger("info"),
4254
}
4355

0 commit comments

Comments
 (0)