test(infrastructure): Configure pgxpool with max_conns=1

Fix database connection exhaustion in tests by setting max_conns=1
when creating pgxpool via pgxpool.ParseConfig().

- Update setupTestServer() in test_helpers.go
- Update setupSyncTestDB() in sync_integration_test.go

This reduces per-test connection usage from 4 to 1, keeping total
connections well under PostgreSQL's default max_connections=100.

78 tests × 1 connection = 78 connections (down from 312 potential)

Fixes test failures: "FATAL: sorry, too many clients already"

See PROJECT_GUIDELINES.md Testing section for details.
This commit is contained in:
2026-02-11 10:37:38 -05:00
parent 61115bc8cd
commit 891209b4bd
10 changed files with 124 additions and 478 deletions
+12 -76
View File
@@ -13,9 +13,11 @@ import (
// TestConflictsBulkOperations tests bulk conflict resolution operations
func TestConflictsBulkOperations(t *testing.T) {
t.Run("BulkResolveConflicts_WithoutAuth", func(t *testing.T) {
setup := setupTestServer(t)
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("BulkResolveConflicts_WithoutAuth", func(t *testing.T) {
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String()},
"strategy": "most_recent",
@@ -25,7 +27,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/bulk-resolve", bytes.NewBuffer(body))
httpReq.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -34,10 +35,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_EmptyConflictIDs", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{},
"strategy": "most_recent",
@@ -48,7 +45,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -57,10 +53,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_InvalidConflictID", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{"invalid-uuid"},
"strategy": "most_recent",
@@ -71,7 +63,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -92,10 +83,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_InvalidStrategy", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String()},
"strategy": "invalid_strategy",
@@ -106,7 +93,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -130,10 +116,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_MostRecentStrategy", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String(), uuid.New().String()},
"strategy": "most_recent",
@@ -144,7 +126,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -159,10 +140,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_HighestProgressStrategy", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String(), uuid.New().String()},
"strategy": "highest_progress",
@@ -173,7 +150,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -188,10 +164,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_ManualStrategy_WithoutWinner", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String()},
"strategy": "manual",
@@ -202,7 +174,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -216,10 +187,6 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_ManualStrategy_WithWinner", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String()},
"strategy": "manual",
@@ -231,7 +198,6 @@ func TestConflictsBulkOperations(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -240,16 +206,11 @@ func TestConflictsBulkOperations(t *testing.T) {
})
t.Run("BulkResolveConflicts_InvalidRequestBody", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
// Send invalid JSON
httpReq, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/bulk-resolve", bytes.NewBuffer([]byte("invalid json")))
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -260,9 +221,11 @@ func TestConflictsBulkOperations(t *testing.T) {
// TestConflictsBulkDismiss tests bulk dismiss operations
func TestConflictsBulkDismiss(t *testing.T) {
t.Run("BulkDismissConflicts_WithoutAuth", func(t *testing.T) {
setup := setupTestServer(t)
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("BulkDismissConflicts_WithoutAuth", func(t *testing.T) {
req := map[string]interface{}{
"conflict_ids": []string{uuid.New().String()},
}
@@ -271,7 +234,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
httpReq, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/bulk-dismiss", bytes.NewBuffer(body))
httpReq.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -280,10 +242,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
})
t.Run("BulkDismissConflicts_EmptyConflictIDs", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{},
}
@@ -293,7 +251,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -302,10 +259,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
})
t.Run("BulkDismissConflicts_InvalidConflictID", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{"invalid-uuid", uuid.New().String()},
}
@@ -315,7 +268,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -336,10 +288,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
})
t.Run("BulkDismissConflicts_MultipleConflicts", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{
uuid.New().String(),
@@ -353,7 +301,6 @@ func TestConflictsBulkDismiss(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -368,16 +315,11 @@ func TestConflictsBulkDismiss(t *testing.T) {
})
t.Run("BulkDismissConflicts_InvalidRequestBody", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
// Send invalid JSON
httpReq, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/bulk-dismiss", bytes.NewBuffer([]byte("invalid json")))
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -388,11 +330,11 @@ func TestConflictsBulkDismiss(t *testing.T) {
// TestConflictsBulkEdgeCases tests edge cases for bulk operations
func TestConflictsBulkEdgeCases(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("BulkResolve_NonExistentConflicts", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{
uuid.New().String(),
@@ -407,7 +349,6 @@ func TestConflictsBulkEdgeCases(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()
@@ -423,10 +364,6 @@ func TestConflictsBulkEdgeCases(t *testing.T) {
})
t.Run("BulkDismiss_MixedValidInvalid", func(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
req := map[string]interface{}{
"conflict_ids": []string{
"invalid-uuid-1",
@@ -440,7 +377,6 @@ func TestConflictsBulkEdgeCases(t *testing.T) {
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(httpReq)
require.NoError(t, err)
defer resp.Body.Close()