@accounter/server 0.0.9-alpha-20251210155614-e6e65aaecafef9e8fedd0b933f613ffcf478cecf → 0.0.9-alpha-20251210171954-c9c0e7693ebe08d3643d9ee2c00c03606a53e334

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +43 -5
  2. package/dist/server/src/__tests__/factories/business.d.ts +2 -2
  3. package/dist/server/src/__tests__/factories/business.js +5 -4
  4. package/dist/server/src/__tests__/factories/business.js.map +1 -1
  5. package/dist/server/src/__tests__/factories/business.test.js +2 -2
  6. package/dist/server/src/__tests__/factories/business.test.js.map +1 -1
  7. package/dist/server/src/__tests__/factories/charge.d.ts +9 -9
  8. package/dist/server/src/__tests__/factories/charge.js +15 -15
  9. package/dist/server/src/__tests__/factories/charge.js.map +1 -1
  10. package/dist/server/src/__tests__/factories/charge.test.js +14 -14
  11. package/dist/server/src/__tests__/factories/charge.test.js.map +1 -1
  12. package/dist/server/src/__tests__/factories/document.d.ts +9 -9
  13. package/dist/server/src/__tests__/factories/document.js +11 -11
  14. package/dist/server/src/__tests__/factories/document.js.map +1 -1
  15. package/dist/server/src/__tests__/factories/document.test.js +38 -38
  16. package/dist/server/src/__tests__/factories/document.test.js.map +1 -1
  17. package/dist/server/src/__tests__/factories/financial-account.js +2 -2
  18. package/dist/server/src/__tests__/factories/financial-account.js.map +1 -1
  19. package/dist/server/src/__tests__/factories/financial-account.test.js +7 -7
  20. package/dist/server/src/__tests__/factories/financial-account.test.js.map +1 -1
  21. package/dist/server/src/__tests__/factories/index.d.ts +2 -2
  22. package/dist/server/src/__tests__/factories/index.js +2 -2
  23. package/dist/server/src/__tests__/factories/index.js.map +1 -1
  24. package/dist/server/src/__tests__/factories/index.test.js +12 -12
  25. package/dist/server/src/__tests__/factories/index.test.js.map +1 -1
  26. package/dist/server/src/__tests__/factories/tax-category.d.ts +3 -3
  27. package/dist/server/src/__tests__/factories/tax-category.js +6 -5
  28. package/dist/server/src/__tests__/factories/tax-category.js.map +1 -1
  29. package/dist/server/src/__tests__/factories/tax-category.test.js +4 -4
  30. package/dist/server/src/__tests__/factories/tax-category.test.js.map +1 -1
  31. package/dist/server/src/__tests__/factories/transaction.d.ts +7 -7
  32. package/dist/server/src/__tests__/factories/transaction.js +11 -11
  33. package/dist/server/src/__tests__/factories/transaction.js.map +1 -1
  34. package/dist/server/src/__tests__/factories/transaction.test.js +27 -27
  35. package/dist/server/src/__tests__/factories/transaction.test.js.map +1 -1
  36. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js +20 -20
  37. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js.map +1 -1
  38. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js +20 -20
  39. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js.map +1 -1
  40. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js +8 -8
  41. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js.map +1 -1
  42. package/dist/server/src/__tests__/helpers/db-setup.d.ts +0 -1
  43. package/dist/server/src/__tests__/helpers/db-setup.js +0 -2
  44. package/dist/server/src/__tests__/helpers/db-setup.js.map +1 -1
  45. package/dist/server/src/__tests__/helpers/fixture-loader.js +2 -2
  46. package/dist/server/src/__tests__/helpers/fixture-loader.js.map +1 -1
  47. package/dist/server/src/__tests__/helpers/fixture-loader.test.js +32 -29
  48. package/dist/server/src/__tests__/helpers/fixture-loader.test.js.map +1 -1
  49. package/dist/server/src/__tests__/helpers/fixture-validation.test.js +50 -50
  50. package/dist/server/src/__tests__/helpers/fixture-validation.test.js.map +1 -1
  51. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js +23 -31
  52. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js.map +1 -1
  53. package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js +8 -8
  54. package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js.map +1 -1
  55. package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js +41 -50
  56. package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js.map +1 -1
  57. package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js +23 -31
  58. package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js.map +1 -1
  59. package/dist/server/src/__tests__/helpers/test-db-config.js +1 -1
  60. package/dist/server/src/__tests__/helpers/test-db-config.js.map +1 -1
  61. package/dist/server/src/__tests__/seed-admin-context.integration.test.js +128 -131
  62. package/dist/server/src/__tests__/seed-admin-context.integration.test.js.map +1 -1
  63. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js +58 -0
  64. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js.map +1 -0
  65. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.d.ts +50 -0
  66. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js +66 -0
  67. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js.map +1 -0
  68. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.d.ts +1 -1
  69. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js +2 -2
  70. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js.map +1 -1
  71. package/dist/server/src/modules/admin-context/resolvers/admin-context.resolvers.js +1 -1
  72. package/dist/server/src/modules/business-trips/providers/business-trips.provider.d.ts +1 -1
  73. package/dist/server/src/modules/business-trips/providers/business-trips.provider.js +1 -1
  74. package/dist/server/src/modules/business-trips/providers/business-trips.provider.js.map +1 -1
  75. package/dist/server/src/modules/charges/helpers/common.helper.js +3 -3
  76. package/dist/server/src/modules/charges/helpers/common.helper.js.map +1 -1
  77. package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js → merge-charges.helper.js} +6 -6
  78. package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js.map → merge-charges.helper.js.map} +1 -1
  79. package/dist/server/src/modules/charges/resolvers/charges.resolver.js +1 -1
  80. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +2 -2
  81. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -1
  82. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +1 -1
  83. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -1
  84. package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js +1 -1
  85. package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js.map +1 -1
  86. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.d.ts +0 -2
  87. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js +0 -4
  88. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js.map +1 -1
  89. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js +20 -20
  90. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js.map +1 -1
  91. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js +21 -21
  92. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js.map +1 -1
  93. package/dist/server/src/modules/transactions/helpers/common.helper.js +11 -6
  94. package/dist/server/src/modules/transactions/helpers/common.helper.js.map +1 -1
  95. package/package.json +1 -1
  96. package/src/__tests__/factories/business.test.ts +3 -3
  97. package/src/__tests__/factories/business.ts +5 -4
  98. package/src/__tests__/factories/charge.test.ts +14 -14
  99. package/src/__tests__/factories/charge.ts +16 -16
  100. package/src/__tests__/factories/document.test.ts +38 -38
  101. package/src/__tests__/factories/document.ts +11 -11
  102. package/src/__tests__/factories/financial-account.test.ts +7 -7
  103. package/src/__tests__/factories/financial-account.ts +3 -3
  104. package/src/__tests__/factories/index.test.ts +12 -12
  105. package/src/__tests__/factories/index.ts +2 -2
  106. package/src/__tests__/factories/tax-category.test.ts +4 -4
  107. package/src/__tests__/factories/tax-category.ts +7 -6
  108. package/src/__tests__/factories/transaction.test.ts +27 -27
  109. package/src/__tests__/factories/transaction.ts +11 -11
  110. package/src/__tests__/fixtures/expenses/expense-scenario-a.ts +20 -20
  111. package/src/__tests__/fixtures/expenses/expense-scenario-b.test.ts +8 -8
  112. package/src/__tests__/fixtures/expenses/expense-scenario-b.ts +20 -20
  113. package/src/__tests__/helpers/db-setup.ts +0 -3
  114. package/src/__tests__/helpers/fixture-loader.test.ts +31 -29
  115. package/src/__tests__/helpers/fixture-loader.ts +2 -2
  116. package/src/__tests__/helpers/fixture-validation.test.ts +50 -50
  117. package/src/__tests__/helpers/seed-helpers.business.test.ts +145 -147
  118. package/src/__tests__/helpers/seed-helpers.concurrent.test.ts +10 -10
  119. package/src/__tests__/helpers/seed-helpers.financial-entity.test.ts +218 -231
  120. package/src/__tests__/helpers/seed-helpers.tax-category.test.ts +162 -164
  121. package/src/__tests__/helpers/test-db-config.ts +1 -1
  122. package/src/__tests__/seed-admin-context.integration.test.ts +199 -208
  123. package/src/demo-fixtures/__tests__/deterministic-uuid.test.ts +75 -0
  124. package/src/demo-fixtures/helpers/deterministic-uuid.ts +68 -0
  125. package/src/modules/admin-context/{heplers → helpers}/admin-context.helper.ts +3 -3
  126. package/src/modules/admin-context/resolvers/admin-context.resolvers.ts +1 -1
  127. package/src/modules/business-trips/providers/business-trips.provider.ts +1 -1
  128. package/src/modules/charges/helpers/common.helper.ts +3 -3
  129. package/src/modules/charges/helpers/{merge-charges.hepler.ts → merge-charges.helper.ts} +5 -5
  130. package/src/modules/charges/resolvers/charges.resolver.ts +1 -1
  131. package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +2 -2
  132. package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +1 -1
  133. package/src/modules/corn-jobs/resolvers/corn-jobs.resolver.ts +1 -1
  134. package/src/modules/ledger/__tests__/helpers/ledger-assertions.ts +0 -5
  135. package/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.ts +20 -20
  136. package/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.ts +21 -21
  137. package/src/modules/transactions/helpers/common.helper.ts +12 -6
  138. package/dist/server/src/__tests__/factories/ids.d.ts +0 -22
  139. package/dist/server/src/__tests__/factories/ids.js +0 -46
  140. package/dist/server/src/__tests__/factories/ids.js.map +0 -1
  141. package/dist/server/src/__tests__/factories/ids.test.js +0 -71
  142. package/dist/server/src/__tests__/factories/ids.test.js.map +0 -1
  143. package/src/__tests__/factories/ids.test.ts +0 -80
  144. package/src/__tests__/factories/ids.ts +0 -49
  145. /package/dist/server/src/{__tests__/factories/ids.test.d.ts → demo-fixtures/__tests__/deterministic-uuid.test.d.ts} +0 -0
  146. /package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.d.ts → merge-charges.helper.d.ts} +0 -0
@@ -1,161 +1,159 @@
1
- import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
2
- import pg from 'pg';
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
3
2
  import { ensureFinancialEntity, ensureBusinessForEntity } from './seed-helpers.js';
4
- import { testDbConfig, qualifyTable } from './test-db-config.js';
3
+ import { qualifyTable } from './test-db-config.js';
5
4
  import { EntityValidationError } from './seed-errors.js';
5
+ import { TestDatabase } from './db-setup.js';
6
6
 
7
7
  describe('ensureBusinessForEntity', () => {
8
- let pool: pg.Pool;
9
- let client: pg.PoolClient;
8
+ let db: TestDatabase;
10
9
 
11
10
  beforeAll(async () => {
12
- pool = new pg.Pool(testDbConfig);
13
- client = await pool.connect();
11
+ db = new TestDatabase();
12
+ await db.connect();
14
13
  });
15
14
 
16
15
  afterAll(async () => {
17
- client.release();
18
- await pool.end();
16
+ await db.close();
19
17
  });
20
18
 
21
- beforeEach(async () => {
22
- await client.query('BEGIN');
23
- });
24
-
25
- afterEach(async () => {
26
- await client.query('ROLLBACK');
27
- });
28
-
29
- it('should create a new business for a financial entity', async () => {
30
- // Create a financial entity first
31
- const { id: entityId } = await ensureFinancialEntity(client, {
32
- name: 'Test Business Entity',
33
- type: 'business',
34
- });
35
-
36
- // Ensure business for this entity
37
- await ensureBusinessForEntity(client, entityId);
38
-
39
- // Verify business exists
40
- const result = await client.query(
41
- `SELECT id, no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
42
- [entityId],
43
- );
44
-
45
- expect(result.rows).toHaveLength(1);
46
- expect(result.rows[0].id).toBe(entityId);
47
- expect(result.rows[0].no_invoices_required).toBe(false);
48
- });
49
-
50
- it('should be idempotent - repeated calls do not create duplicates', async () => {
51
- // Create a financial entity first
52
- const { id: entityId } = await ensureFinancialEntity(client, {
53
- name: 'Test Business Entity 2',
54
- type: 'business',
55
- });
56
-
57
- // Call ensureBusinessForEntity multiple times
58
- await ensureBusinessForEntity(client, entityId);
59
- await ensureBusinessForEntity(client, entityId);
60
- await ensureBusinessForEntity(client, entityId);
61
-
62
- // Verify only one business exists
63
- const result = await client.query(
64
- `SELECT id FROM ${qualifyTable('businesses')} WHERE id = $1`,
65
- [entityId],
66
- );
67
-
68
- expect(result.rows).toHaveLength(1);
69
- expect(result.rows[0].id).toBe(entityId);
70
- });
71
-
72
- it('should support noInvoicesRequired option', async () => {
73
- // Create a financial entity first
74
- const { id: entityId } = await ensureFinancialEntity(client, {
75
- name: 'Test Business Entity 3',
76
- type: 'business',
77
- });
78
-
79
- // Ensure business with noInvoicesRequired set to true
80
- await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: true });
81
-
82
- // Verify business has correct option set
83
- const result = await client.query(
84
- `SELECT id, no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
85
- [entityId],
86
- );
87
-
88
- expect(result.rows).toHaveLength(1);
89
- expect(result.rows[0].id).toBe(entityId);
90
- expect(result.rows[0].no_invoices_required).toBe(true);
91
- });
92
-
93
- it('should default noInvoicesRequired to false when not specified', async () => {
94
- // Create a financial entity first
95
- const { id: entityId } = await ensureFinancialEntity(client, {
96
- name: 'Test Business Entity 4',
97
- type: 'business',
98
- });
99
-
100
- // Ensure business without specifying options
101
- await ensureBusinessForEntity(client, entityId);
102
-
103
- // Verify business has default value
104
- const result = await client.query(
105
- `SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
106
- [entityId],
107
- );
108
-
109
- expect(result.rows).toHaveLength(1);
110
- expect(result.rows[0].no_invoices_required).toBe(false);
111
- });
112
-
113
- it('should not modify existing business when called again', async () => {
114
- // Create a financial entity first
115
- const { id: entityId } = await ensureFinancialEntity(client, {
116
- name: 'Test Business Entity 5',
117
- type: 'business',
118
- });
119
-
120
- // Create business with noInvoicesRequired = true
121
- await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: true });
122
-
123
- // Call again with different options (should be no-op)
124
- await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: false });
125
-
126
- // Verify original value is preserved
127
- const result = await client.query(
128
- `SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
129
- [entityId],
130
- );
131
-
132
- expect(result.rows).toHaveLength(1);
133
- expect(result.rows[0].no_invoices_required).toBe(true); // Original value preserved
134
- });
135
-
136
- it('should not leak data between tests', async () => {
137
- // This test verifies transactional isolation by checking that data
138
- // from previous tests is not visible
139
- const result = await client.query(
140
- `SELECT COUNT(*) as count FROM ${qualifyTable('businesses')} WHERE id IN (SELECT id FROM ${qualifyTable('financial_entities')} WHERE name LIKE 'Test Business Entity%')`,
141
- );
142
-
143
- // Due to ROLLBACK after each test, count should be 0
144
- expect(parseInt(result.rows[0].count)).toBe(0);
145
- });
19
+ it('should create a new business for a financial entity', async () =>
20
+ db.withTransaction(async client => {
21
+ // Create a financial entity first
22
+ const { id: entityId } = await ensureFinancialEntity(client, {
23
+ name: 'Test Business Entity',
24
+ type: 'business',
25
+ });
26
+
27
+ // Ensure business for this entity
28
+ await ensureBusinessForEntity(client, entityId);
29
+
30
+ // Verify business exists
31
+ const result = await client.query(
32
+ `SELECT id, no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
33
+ [entityId],
34
+ );
35
+
36
+ expect(result.rows).toHaveLength(1);
37
+ expect(result.rows[0].id).toBe(entityId);
38
+ expect(result.rows[0].no_invoices_required).toBe(false);
39
+ }));
40
+
41
+ it('should be idempotent - repeated calls do not create duplicates', async () =>
42
+ db.withTransaction(async client => {
43
+ // Create a financial entity first
44
+ const { id: entityId } = await ensureFinancialEntity(client, {
45
+ name: 'Test Business Entity 2',
46
+ type: 'business',
47
+ });
48
+
49
+ // Call ensureBusinessForEntity multiple times
50
+ await ensureBusinessForEntity(client, entityId);
51
+ await ensureBusinessForEntity(client, entityId);
52
+ await ensureBusinessForEntity(client, entityId);
53
+
54
+ // Verify only one business exists
55
+ const result = await client.query(
56
+ `SELECT id FROM ${qualifyTable('businesses')} WHERE id = $1`,
57
+ [entityId],
58
+ );
59
+
60
+ expect(result.rows).toHaveLength(1);
61
+ expect(result.rows[0].id).toBe(entityId);
62
+ }));
63
+
64
+ it('should support noInvoicesRequired option', async () =>
65
+ db.withTransaction(async client => {
66
+ // Create a financial entity first
67
+ const { id: entityId } = await ensureFinancialEntity(client, {
68
+ name: 'Test Business Entity 3',
69
+ type: 'business',
70
+ });
71
+
72
+ // Ensure business with noInvoicesRequired set to true
73
+ await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: true });
74
+
75
+ // Verify business has correct option set
76
+ const result = await client.query(
77
+ `SELECT id, no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
78
+ [entityId],
79
+ );
80
+
81
+ expect(result.rows).toHaveLength(1);
82
+ expect(result.rows[0].id).toBe(entityId);
83
+ expect(result.rows[0].no_invoices_required).toBe(true);
84
+ }));
85
+
86
+ it('should default noInvoicesRequired to false when not specified', async () =>
87
+ db.withTransaction(async client => {
88
+ // Create a financial entity first
89
+ const { id: entityId } = await ensureFinancialEntity(client, {
90
+ name: 'Test Business Entity 4',
91
+ type: 'business',
92
+ });
93
+
94
+ // Ensure business without specifying options
95
+ await ensureBusinessForEntity(client, entityId);
96
+
97
+ // Verify business has default value
98
+ const result = await client.query(
99
+ `SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
100
+ [entityId],
101
+ );
102
+
103
+ expect(result.rows).toHaveLength(1);
104
+ expect(result.rows[0].no_invoices_required).toBe(false);
105
+ }));
106
+
107
+ it('should not modify existing business when called again', async () =>
108
+ db.withTransaction(async client => {
109
+ // Create a financial entity first
110
+ const { id: entityId } = await ensureFinancialEntity(client, {
111
+ name: 'Test Business Entity 5',
112
+ type: 'business',
113
+ });
114
+
115
+ // Create business with noInvoicesRequired = true
116
+ await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: true });
117
+
118
+ // Call again with different options (should be no-op)
119
+ await ensureBusinessForEntity(client, entityId, { noInvoicesRequired: false });
120
+
121
+ // Verify original value is preserved
122
+ const result = await client.query(
123
+ `SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`,
124
+ [entityId],
125
+ );
126
+
127
+ expect(result.rows).toHaveLength(1);
128
+ expect(result.rows[0].no_invoices_required).toBe(true); // Original value preserved
129
+ }));
130
+
131
+ it('should not leak data between tests', async () =>
132
+ db.withTransaction(async client => {
133
+ // This test verifies transactional isolation by checking that data
134
+ // from previous tests is not visible
135
+ const result = await client.query(
136
+ `SELECT COUNT(*) as count FROM ${qualifyTable('businesses')} WHERE id IN (SELECT id FROM ${qualifyTable('financial_entities')} WHERE name LIKE 'Test Business Entity%')`,
137
+ );
138
+
139
+ // Due to ROLLBACK after each test, count should be 0
140
+ expect(parseInt(result.rows[0].count)).toBe(0);
141
+ }));
146
142
 
147
143
  // Validation tests
148
- it('should reject invalid UUID format', async () => {
149
- await expect(
150
- ensureBusinessForEntity(client, 'not-a-valid-uuid'),
151
- ).rejects.toThrow(EntityValidationError);
152
- });
153
-
154
- it('should reject non-existent financial entity', async () => {
155
- const fakeId = '00000000-0000-0000-0000-000000000000';
156
-
157
- await expect(
158
- ensureBusinessForEntity(client, fakeId),
159
- ).rejects.toThrow(EntityValidationError);
160
- });
144
+ it('should reject invalid UUID format', async () =>
145
+ db.withTransaction(async client => {
146
+ await expect(ensureBusinessForEntity(client, 'not-a-valid-uuid')).rejects.toThrow(
147
+ EntityValidationError,
148
+ );
149
+ }));
150
+
151
+ it('should reject non-existent financial entity', async () =>
152
+ db.withTransaction(async client => {
153
+ const fakeId = '00000000-0000-0000-0000-000000000000';
154
+
155
+ await expect(ensureBusinessForEntity(client, fakeId)).rejects.toThrow(
156
+ EntityValidationError,
157
+ );
158
+ }));
161
159
  });
@@ -1,18 +1,18 @@
1
1
  import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
- import pg from 'pg';
3
2
  import { ensureFinancialEntity } from './seed-helpers.js';
4
- import { testDbConfig } from './test-db-config.js';
5
3
  import { withConcurrentTransactions } from './test-transaction.js';
4
+ import { TestDatabase } from './db-setup.js';
6
5
 
7
6
  describe('ensureFinancialEntity - Concurrent Access', () => {
8
- let pool: pg.Pool;
7
+ let db: TestDatabase;
9
8
 
10
9
  beforeAll(async () => {
11
- pool = new pg.Pool(testDbConfig);
10
+ db = new TestDatabase();
11
+ await db.connect();
12
12
  });
13
13
 
14
14
  afterAll(async () => {
15
- await pool.end();
15
+ await db.close();
16
16
  });
17
17
 
18
18
  it('should handle concurrent inserts of same entity gracefully', async () => {
@@ -22,7 +22,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
22
22
  };
23
23
 
24
24
  // Two separate transactions attempting to create the same entity
25
- const [result1, result2] = await withConcurrentTransactions(pool, [
25
+ const [result1, result2] = await withConcurrentTransactions(db.getPool(), [
26
26
  async client => ensureFinancialEntity(client, params),
27
27
  async client => ensureFinancialEntity(client, params),
28
28
  ]);
@@ -37,7 +37,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
37
37
  });
38
38
 
39
39
  it('should handle concurrent inserts of different entities', async () => {
40
- const [result1, result2, result3] = await withConcurrentTransactions(pool, [
40
+ const [result1, result2, result3] = await withConcurrentTransactions(db.getPool(), [
41
41
  async client =>
42
42
  ensureFinancialEntity(client, {
43
43
  name: 'Concurrent Entity A',
@@ -64,8 +64,8 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
64
64
  it('should handle concurrent creation with separate namespaces', async () => {
65
65
  // Test that concurrent operations in separate transactions don't interfere
66
66
  const timestamp = Date.now();
67
-
68
- const [result1, result2, result3] = await withConcurrentTransactions(pool, [
67
+
68
+ const [result1, result2, result3] = await withConcurrentTransactions(db.getPool(), [
69
69
  async client =>
70
70
  ensureFinancialEntity(client, {
71
71
  name: `Namespace A - ${timestamp}`,
@@ -87,7 +87,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
87
87
  expect(result1.id).toBeDefined();
88
88
  expect(result2.id).toBeDefined();
89
89
  expect(result3.id).toBeDefined();
90
-
90
+
91
91
  // All should have unique IDs
92
92
  expect(result1.id).not.toBe(result2.id);
93
93
  expect(result2.id).not.toBe(result3.id);