package postgres import ( "context" "encoding/json" "os" "strings" "testing" "time" "github.com/jackc/pgx/v5/pgxpool" ) func TestListSourceConnectionsIntegrationOmitsSensitiveFields(t *testing.T) { databaseURL := isolatedIntegrationDatabaseURL(t, os.Getenv("TEST_DATABASE_URL")) if databaseURL == "" { t.Skip("TEST_DATABASE_URL is not set") } ctx := context.Background() pool, err := pgxpool.New(ctx, databaseURL) if err != nil { t.Fatal(err) } defer pool.Close() if err := ApplyMigrations(ctx, pool); err != nil { t.Fatalf("ApplyMigrations() error = %v", err) } now := time.Date(2026, 9, 6, 2, 0, 0, 0, time.UTC) if _, err := pool.Exec(ctx, ` INSERT INTO source_connections ( id, source_type, name, base_url, secret_ref, enabled, schedule, last_health, created_at, updated_at ) VALUES ( 'conn-integration', 'alist', 'AList只读集成源', 'https://sensitive-origin.example', 'sensitive-secret-ref', TRUE, '{"type":"daily"}'::jsonb, '{"status":"healthy","detail":"must-not-leak"}'::jsonb, $1, $1 )`, now); err != nil { t.Fatal(err) } if _, err := pool.Exec(ctx, ` INSERT INTO source_items ( id, source_connection_id, stable_external_id, canonical_uri_hash, title, item_type, visibility, visibility_origin, source_change, created_at, updated_at ) VALUES ( 'item-integration', 'conn-integration', 'external-1', $2, 'Safe item', 'file', 'internal', 'configured_scope', 'unchanged', $1, $1 )`, now, strings.Repeat("a", 64)); err != nil { t.Fatal(err) } page, err := NewStore(pool).ListSourceConnections(ctx) if err != nil { t.Fatalf("ListSourceConnections() error = %v", err) } if len(page.Items) != 1 || page.Items[0].ItemCount != 1 || !page.Items[0].ScheduleConfigured || page.Items[0].HealthStatus != "healthy" { t.Fatalf("page = %#v", page) } encoded, err := json.Marshal(page) if err != nil { t.Fatal(err) } for _, forbidden := range []string{"sensitive-origin", "sensitive-secret-ref", "must-not-leak", "base_url", "secret_ref"} { if strings.Contains(string(encoded), forbidden) { t.Fatalf("projection leaked %q: %s", forbidden, encoded) } } }