@accounter/server 0.0.9-alpha-20251210155614-e6e65aaecafef9e8fedd0b933f613ffcf478cecf → 0.0.9-alpha-20251210170728-fe2c044a6279c36a9ba58b13bae56b181e8f85f5

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 (144) hide show
  1. package/CHANGELOG.md +27 -5
  2. package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
  3. package/dist/server/src/__tests__/factories/business.d.ts +2 -2
  4. package/dist/server/src/__tests__/factories/business.js +5 -4
  5. package/dist/server/src/__tests__/factories/business.js.map +1 -1
  6. package/dist/server/src/__tests__/factories/business.test.js +2 -2
  7. package/dist/server/src/__tests__/factories/business.test.js.map +1 -1
  8. package/dist/server/src/__tests__/factories/charge.d.ts +9 -9
  9. package/dist/server/src/__tests__/factories/charge.js +15 -15
  10. package/dist/server/src/__tests__/factories/charge.js.map +1 -1
  11. package/dist/server/src/__tests__/factories/charge.test.js +14 -14
  12. package/dist/server/src/__tests__/factories/charge.test.js.map +1 -1
  13. package/dist/server/src/__tests__/factories/document.d.ts +9 -9
  14. package/dist/server/src/__tests__/factories/document.js +11 -11
  15. package/dist/server/src/__tests__/factories/document.js.map +1 -1
  16. package/dist/server/src/__tests__/factories/document.test.js +38 -38
  17. package/dist/server/src/__tests__/factories/document.test.js.map +1 -1
  18. package/dist/server/src/__tests__/factories/financial-account.js +2 -2
  19. package/dist/server/src/__tests__/factories/financial-account.js.map +1 -1
  20. package/dist/server/src/__tests__/factories/financial-account.test.js +7 -7
  21. package/dist/server/src/__tests__/factories/financial-account.test.js.map +1 -1
  22. package/dist/server/src/__tests__/factories/index.d.ts +2 -2
  23. package/dist/server/src/__tests__/factories/index.js +2 -2
  24. package/dist/server/src/__tests__/factories/index.js.map +1 -1
  25. package/dist/server/src/__tests__/factories/index.test.js +12 -12
  26. package/dist/server/src/__tests__/factories/index.test.js.map +1 -1
  27. package/dist/server/src/__tests__/factories/tax-category.d.ts +3 -3
  28. package/dist/server/src/__tests__/factories/tax-category.js +6 -5
  29. package/dist/server/src/__tests__/factories/tax-category.js.map +1 -1
  30. package/dist/server/src/__tests__/factories/tax-category.test.js +4 -4
  31. package/dist/server/src/__tests__/factories/tax-category.test.js.map +1 -1
  32. package/dist/server/src/__tests__/factories/transaction.d.ts +7 -7
  33. package/dist/server/src/__tests__/factories/transaction.js +11 -11
  34. package/dist/server/src/__tests__/factories/transaction.js.map +1 -1
  35. package/dist/server/src/__tests__/factories/transaction.test.js +27 -27
  36. package/dist/server/src/__tests__/factories/transaction.test.js.map +1 -1
  37. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js +20 -20
  38. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js.map +1 -1
  39. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js +20 -20
  40. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js.map +1 -1
  41. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js +8 -8
  42. package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js.map +1 -1
  43. package/dist/server/src/__tests__/helpers/db-setup.d.ts +0 -1
  44. package/dist/server/src/__tests__/helpers/db-setup.js +0 -2
  45. package/dist/server/src/__tests__/helpers/db-setup.js.map +1 -1
  46. package/dist/server/src/__tests__/helpers/fixture-loader.js +2 -2
  47. package/dist/server/src/__tests__/helpers/fixture-loader.js.map +1 -1
  48. package/dist/server/src/__tests__/helpers/fixture-loader.test.js +32 -29
  49. package/dist/server/src/__tests__/helpers/fixture-loader.test.js.map +1 -1
  50. package/dist/server/src/__tests__/helpers/fixture-validation.test.js +50 -50
  51. package/dist/server/src/__tests__/helpers/fixture-validation.test.js.map +1 -1
  52. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js +23 -31
  53. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js.map +1 -1
  54. package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js +8 -8
  55. package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js.map +1 -1
  56. package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js +41 -50
  57. package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js.map +1 -1
  58. package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js +23 -31
  59. package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js.map +1 -1
  60. package/dist/server/src/__tests__/seed-admin-context.integration.test.js +128 -131
  61. package/dist/server/src/__tests__/seed-admin-context.integration.test.js.map +1 -1
  62. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js +58 -0
  63. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js.map +1 -0
  64. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.d.ts +50 -0
  65. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js +66 -0
  66. package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js.map +1 -0
  67. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.d.ts +1 -1
  68. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js +2 -2
  69. package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js.map +1 -1
  70. package/dist/server/src/modules/admin-context/resolvers/admin-context.resolvers.js +1 -1
  71. package/dist/server/src/modules/business-trips/providers/business-trips.provider.d.ts +1 -1
  72. package/dist/server/src/modules/business-trips/providers/business-trips.provider.js +1 -1
  73. package/dist/server/src/modules/business-trips/providers/business-trips.provider.js.map +1 -1
  74. package/dist/server/src/modules/charges/helpers/common.helper.js +3 -3
  75. package/dist/server/src/modules/charges/helpers/common.helper.js.map +1 -1
  76. package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js → merge-charges.helper.js} +6 -6
  77. package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js.map → merge-charges.helper.js.map} +1 -1
  78. package/dist/server/src/modules/charges/resolvers/charges.resolver.js +1 -1
  79. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +2 -2
  80. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -1
  81. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +1 -1
  82. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -1
  83. package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js +1 -1
  84. package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js.map +1 -1
  85. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.d.ts +0 -2
  86. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js +0 -4
  87. package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js.map +1 -1
  88. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js +20 -20
  89. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js.map +1 -1
  90. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js +21 -21
  91. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js.map +1 -1
  92. package/dist/server/src/modules/transactions/helpers/common.helper.js +11 -6
  93. package/dist/server/src/modules/transactions/helpers/common.helper.js.map +1 -1
  94. package/package.json +1 -1
  95. package/src/__tests__/factories/business.test.ts +3 -3
  96. package/src/__tests__/factories/business.ts +5 -4
  97. package/src/__tests__/factories/charge.test.ts +14 -14
  98. package/src/__tests__/factories/charge.ts +16 -16
  99. package/src/__tests__/factories/document.test.ts +38 -38
  100. package/src/__tests__/factories/document.ts +11 -11
  101. package/src/__tests__/factories/financial-account.test.ts +7 -7
  102. package/src/__tests__/factories/financial-account.ts +3 -3
  103. package/src/__tests__/factories/index.test.ts +12 -12
  104. package/src/__tests__/factories/index.ts +2 -2
  105. package/src/__tests__/factories/tax-category.test.ts +4 -4
  106. package/src/__tests__/factories/tax-category.ts +7 -6
  107. package/src/__tests__/factories/transaction.test.ts +27 -27
  108. package/src/__tests__/factories/transaction.ts +11 -11
  109. package/src/__tests__/fixtures/expenses/expense-scenario-a.ts +20 -20
  110. package/src/__tests__/fixtures/expenses/expense-scenario-b.test.ts +8 -8
  111. package/src/__tests__/fixtures/expenses/expense-scenario-b.ts +20 -20
  112. package/src/__tests__/helpers/db-setup.ts +0 -3
  113. package/src/__tests__/helpers/fixture-loader.test.ts +31 -29
  114. package/src/__tests__/helpers/fixture-loader.ts +2 -2
  115. package/src/__tests__/helpers/fixture-validation.test.ts +50 -50
  116. package/src/__tests__/helpers/seed-helpers.business.test.ts +145 -147
  117. package/src/__tests__/helpers/seed-helpers.concurrent.test.ts +10 -10
  118. package/src/__tests__/helpers/seed-helpers.financial-entity.test.ts +218 -231
  119. package/src/__tests__/helpers/seed-helpers.tax-category.test.ts +162 -164
  120. package/src/__tests__/seed-admin-context.integration.test.ts +199 -208
  121. package/src/demo-fixtures/__tests__/deterministic-uuid.test.ts +75 -0
  122. package/src/demo-fixtures/helpers/deterministic-uuid.ts +68 -0
  123. package/src/modules/admin-context/{heplers → helpers}/admin-context.helper.ts +3 -3
  124. package/src/modules/admin-context/resolvers/admin-context.resolvers.ts +1 -1
  125. package/src/modules/business-trips/providers/business-trips.provider.ts +1 -1
  126. package/src/modules/charges/helpers/common.helper.ts +3 -3
  127. package/src/modules/charges/helpers/{merge-charges.hepler.ts → merge-charges.helper.ts} +5 -5
  128. package/src/modules/charges/resolvers/charges.resolver.ts +1 -1
  129. package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +2 -2
  130. package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +1 -1
  131. package/src/modules/corn-jobs/resolvers/corn-jobs.resolver.ts +1 -1
  132. package/src/modules/ledger/__tests__/helpers/ledger-assertions.ts +0 -5
  133. package/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.ts +20 -20
  134. package/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.ts +21 -21
  135. package/src/modules/transactions/helpers/common.helper.ts +12 -6
  136. package/dist/server/src/__tests__/factories/ids.d.ts +0 -22
  137. package/dist/server/src/__tests__/factories/ids.js +0 -46
  138. package/dist/server/src/__tests__/factories/ids.js.map +0 -1
  139. package/dist/server/src/__tests__/factories/ids.test.js +0 -71
  140. package/dist/server/src/__tests__/factories/ids.test.js.map +0 -1
  141. package/src/__tests__/factories/ids.test.ts +0 -80
  142. package/src/__tests__/factories/ids.ts +0 -49
  143. /package/dist/server/src/{__tests__/factories/ids.test.d.ts → demo-fixtures/__tests__/deterministic-uuid.test.d.ts} +0 -0
  144. /package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.d.ts → merge-charges.helper.d.ts} +0 -0
@@ -1,176 +1,174 @@
1
- import { describe, expect, it, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
2
- import pg from 'pg';
3
- import { testDbConfig, qualifyTable } from './test-db-config.js';
1
+ import { describe, expect, it, beforeAll, afterAll } from 'vitest';
2
+ import { qualifyTable } from './test-db-config.js';
4
3
  import { ensureFinancialEntity, ensureTaxCategoryForEntity } from './seed-helpers.js';
5
4
  import { EntityValidationError } from './seed-errors.js';
5
+ import { TestDatabase } from './db-setup.js';
6
6
 
7
7
  describe('ensureTaxCategoryForEntity', () => {
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 tax category on first call', async () => {
30
- // Create financial entity
31
- const { id: entityId } = await ensureFinancialEntity(client, {
32
- name: 'VAT Category',
33
- type: 'tax_category',
34
- });
35
-
36
- // Create tax category
37
- await ensureTaxCategoryForEntity(client, entityId);
38
-
39
- // Verify tax category exists
40
- const result = await client.query(
41
- `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
42
- [entityId],
43
- );
44
-
45
- expect(result.rows).toHaveLength(1);
46
- expect(result.rows[0].id).toBe(entityId);
47
- });
48
-
49
- it('should be idempotent (no-op on repeated calls)', async () => {
50
- // Create financial entity
51
- const { id: entityId } = await ensureFinancialEntity(client, {
52
- name: 'Income Tax',
53
- type: 'tax_category',
54
- });
55
-
56
- // Create tax category twice
57
- await ensureTaxCategoryForEntity(client, entityId);
58
- await ensureTaxCategoryForEntity(client, entityId);
59
-
60
- // Verify only one row exists
61
- const result = await client.query(
62
- `SELECT COUNT(*) as count FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
63
- [entityId],
64
- );
65
-
66
- expect(result.rows[0].count).toBe('1');
67
- });
68
-
69
- it('should preserve existing values on subsequent calls', async () => {
70
- // Create financial entity
71
- const { id: entityId } = await ensureFinancialEntity(client, {
72
- name: 'Expense Category',
73
- type: 'tax_category',
74
- });
75
-
76
- // Create tax category
77
- await ensureTaxCategoryForEntity(client, entityId);
78
-
79
- // Get initial state
80
- const initialResult = await client.query(
81
- `SELECT * FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
82
- [entityId],
83
- );
84
- const initialRow = initialResult.rows[0];
85
-
86
- // Call again (should not modify)
87
- await ensureTaxCategoryForEntity(client, entityId, { sortCode: 999 });
88
-
89
- // Verify unchanged
90
- const finalResult = await client.query(
91
- `SELECT * FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
92
- [entityId],
93
- );
94
- const finalRow = finalResult.rows[0];
95
-
96
- expect(finalRow).toEqual(initialRow);
97
- });
98
-
99
- it('should reject invalid UUID format', async () => {
100
- await expect(
101
- ensureTaxCategoryForEntity(client, 'not-a-uuid'),
102
- ).rejects.toThrow(EntityValidationError);
103
-
104
- await expect(
105
- ensureTaxCategoryForEntity(client, ''),
106
- ).rejects.toThrow(EntityValidationError);
107
-
108
- await expect(
109
- ensureTaxCategoryForEntity(client, '12345'),
110
- ).rejects.toThrow(EntityValidationError);
111
- });
112
-
113
- it('should reject non-existent financial entity', async () => {
114
- const fakeUuid = '00000000-0000-0000-0000-000000000001';
115
-
116
- await expect(
117
- ensureTaxCategoryForEntity(client, fakeUuid),
118
- ).rejects.toThrow(EntityValidationError);
119
- });
120
-
121
- it('should not leak data between tests', async () => {
122
- // This test verifies transactional isolation by checking that data
123
- // from previous tests is not visible
124
- const result = await client.query(
125
- `SELECT COUNT(*) as count FROM ${qualifyTable('tax_categories')} WHERE id IN (SELECT id FROM ${qualifyTable('financial_entities')} WHERE name LIKE 'VAT Category' OR name LIKE 'Income Tax' OR name LIKE 'Expense Category')`,
126
- );
127
-
128
- // Due to ROLLBACK after each test, count should be 0
129
- expect(parseInt(result.rows[0].count)).toBe(0);
130
- });
131
-
132
- it('should work with entities that have owner_id', async () => {
133
- // Create owner business entity (without owner_id requirement)
134
- const { id: _ownerId } = await ensureFinancialEntity(client, {
135
- name: 'Owner Business',
136
- type: 'business',
137
- });
138
-
139
- // Create owned tax category entity (tax categories can have owner_id)
140
- const { id: taxCatId } = await ensureFinancialEntity(client, {
141
- name: 'Owned Tax Category',
142
- type: 'tax_category',
143
- });
144
-
145
- // Create tax category
146
- await ensureTaxCategoryForEntity(client, taxCatId);
147
-
148
- // Verify tax category exists
149
- const result = await client.query(
150
- `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
151
- [taxCatId],
152
- );
153
-
154
- expect(result.rows).toHaveLength(1);
155
- expect(result.rows[0].id).toBe(taxCatId);
156
- });
157
-
158
- it('should handle options parameter gracefully (future-proofing)', async () => {
159
- // Create financial entity
160
- const { id: entityId } = await ensureFinancialEntity(client, {
161
- name: 'Category with Options',
162
- type: 'tax_category',
163
- });
164
-
165
- // Create tax category with options
166
- await ensureTaxCategoryForEntity(client, entityId, { sortCode: 1000 });
167
-
168
- // Verify tax category exists
169
- const result = await client.query(
170
- `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
171
- [entityId],
172
- );
173
-
174
- expect(result.rows).toHaveLength(1);
175
- });
19
+ it('should create tax category on first call', async () =>
20
+ db.withTransaction(async client => {
21
+ // Create financial entity
22
+ const { id: entityId } = await ensureFinancialEntity(client, {
23
+ name: 'VAT Category',
24
+ type: 'tax_category',
25
+ });
26
+
27
+ // Create tax category
28
+ await ensureTaxCategoryForEntity(client, entityId);
29
+
30
+ // Verify tax category exists
31
+ const result = await client.query(
32
+ `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
33
+ [entityId],
34
+ );
35
+
36
+ expect(result.rows).toHaveLength(1);
37
+ expect(result.rows[0].id).toBe(entityId);
38
+ }));
39
+
40
+ it('should be idempotent (no-op on repeated calls)', async () =>
41
+ db.withTransaction(async client => {
42
+ // Create financial entity
43
+ const { id: entityId } = await ensureFinancialEntity(client, {
44
+ name: 'Income Tax',
45
+ type: 'tax_category',
46
+ });
47
+
48
+ // Create tax category twice
49
+ await ensureTaxCategoryForEntity(client, entityId);
50
+ await ensureTaxCategoryForEntity(client, entityId);
51
+
52
+ // Verify only one row exists
53
+ const result = await client.query(
54
+ `SELECT COUNT(*) as count FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
55
+ [entityId],
56
+ );
57
+
58
+ expect(result.rows[0].count).toBe('1');
59
+ }));
60
+
61
+ it('should preserve existing values on subsequent calls', async () =>
62
+ db.withTransaction(async client => {
63
+ // Create financial entity
64
+ const { id: entityId } = await ensureFinancialEntity(client, {
65
+ name: 'Expense Category',
66
+ type: 'tax_category',
67
+ });
68
+
69
+ // Create tax category
70
+ await ensureTaxCategoryForEntity(client, entityId);
71
+
72
+ // Get initial state
73
+ const initialResult = await client.query(
74
+ `SELECT * FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
75
+ [entityId],
76
+ );
77
+ const initialRow = initialResult.rows[0];
78
+
79
+ // Call again (should not modify)
80
+ await ensureTaxCategoryForEntity(client, entityId, { sortCode: 999 });
81
+
82
+ // Verify unchanged
83
+ const finalResult = await client.query(
84
+ `SELECT * FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
85
+ [entityId],
86
+ );
87
+ const finalRow = finalResult.rows[0];
88
+
89
+ expect(finalRow).toEqual(initialRow);
90
+ }));
91
+
92
+ it('should reject invalid UUID format', async () =>
93
+ db.withTransaction(async client => {
94
+ await expect(ensureTaxCategoryForEntity(client, 'not-a-uuid')).rejects.toThrow(
95
+ EntityValidationError,
96
+ );
97
+
98
+ await expect(ensureTaxCategoryForEntity(client, '')).rejects.toThrow(
99
+ EntityValidationError,
100
+ );
101
+
102
+ await expect(ensureTaxCategoryForEntity(client, '12345')).rejects.toThrow(
103
+ EntityValidationError,
104
+ );
105
+ }));
106
+
107
+ it('should reject non-existent financial entity', async () =>
108
+ db.withTransaction(async client => {
109
+ const fakeUuid = '00000000-0000-0000-0000-000000000001';
110
+
111
+ await expect(ensureTaxCategoryForEntity(client, fakeUuid)).rejects.toThrow(
112
+ EntityValidationError,
113
+ );
114
+ }));
115
+
116
+ it('should not leak data between tests', async () =>
117
+ db.withTransaction(async client => {
118
+ // This test verifies transactional isolation by checking that data
119
+ // from previous tests is not visible
120
+ const result = await client.query(
121
+ `SELECT COUNT(*) as count FROM ${qualifyTable('tax_categories')} WHERE id IN (SELECT id FROM ${qualifyTable('financial_entities')} WHERE name LIKE 'VAT Category' OR name LIKE 'Income Tax' OR name LIKE 'Expense Category')`,
122
+ );
123
+
124
+ // Due to ROLLBACK after each test, count should be 0
125
+ expect(parseInt(result.rows[0].count)).toBe(0);
126
+ }));
127
+
128
+ it('should work with entities that have owner_id', async () =>
129
+ db.withTransaction(async client => {
130
+ // Create owner business entity (without owner_id requirement)
131
+ const { id: _ownerId } = await ensureFinancialEntity(client, {
132
+ name: 'Owner Business',
133
+ type: 'business',
134
+ });
135
+
136
+ // Create owned tax category entity (tax categories can have owner_id)
137
+ const { id: taxCatId } = await ensureFinancialEntity(client, {
138
+ name: 'Owned Tax Category',
139
+ type: 'tax_category',
140
+ });
141
+
142
+ // Create tax category
143
+ await ensureTaxCategoryForEntity(client, taxCatId);
144
+
145
+ // Verify tax category exists
146
+ const result = await client.query(
147
+ `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
148
+ [taxCatId],
149
+ );
150
+
151
+ expect(result.rows).toHaveLength(1);
152
+ expect(result.rows[0].id).toBe(taxCatId);
153
+ }));
154
+
155
+ it('should handle options parameter gracefully (future-proofing)', async () =>
156
+ db.withTransaction(async client => {
157
+ // Create financial entity
158
+ const { id: entityId } = await ensureFinancialEntity(client, {
159
+ name: 'Category with Options',
160
+ type: 'tax_category',
161
+ });
162
+
163
+ // Create tax category with options
164
+ await ensureTaxCategoryForEntity(client, entityId, { sortCode: 1000 });
165
+
166
+ // Verify tax category exists
167
+ const result = await client.query(
168
+ `SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`,
169
+ [entityId],
170
+ );
171
+
172
+ expect(result.rows).toHaveLength(1);
173
+ }));
176
174
  });