@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.
- package/CHANGELOG.md +27 -5
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
- package/dist/server/src/__tests__/factories/business.d.ts +2 -2
- package/dist/server/src/__tests__/factories/business.js +5 -4
- package/dist/server/src/__tests__/factories/business.js.map +1 -1
- package/dist/server/src/__tests__/factories/business.test.js +2 -2
- package/dist/server/src/__tests__/factories/business.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/charge.d.ts +9 -9
- package/dist/server/src/__tests__/factories/charge.js +15 -15
- package/dist/server/src/__tests__/factories/charge.js.map +1 -1
- package/dist/server/src/__tests__/factories/charge.test.js +14 -14
- package/dist/server/src/__tests__/factories/charge.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/document.d.ts +9 -9
- package/dist/server/src/__tests__/factories/document.js +11 -11
- package/dist/server/src/__tests__/factories/document.js.map +1 -1
- package/dist/server/src/__tests__/factories/document.test.js +38 -38
- package/dist/server/src/__tests__/factories/document.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/financial-account.js +2 -2
- package/dist/server/src/__tests__/factories/financial-account.js.map +1 -1
- package/dist/server/src/__tests__/factories/financial-account.test.js +7 -7
- package/dist/server/src/__tests__/factories/financial-account.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/index.d.ts +2 -2
- package/dist/server/src/__tests__/factories/index.js +2 -2
- package/dist/server/src/__tests__/factories/index.js.map +1 -1
- package/dist/server/src/__tests__/factories/index.test.js +12 -12
- package/dist/server/src/__tests__/factories/index.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/tax-category.d.ts +3 -3
- package/dist/server/src/__tests__/factories/tax-category.js +6 -5
- package/dist/server/src/__tests__/factories/tax-category.js.map +1 -1
- package/dist/server/src/__tests__/factories/tax-category.test.js +4 -4
- package/dist/server/src/__tests__/factories/tax-category.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/transaction.d.ts +7 -7
- package/dist/server/src/__tests__/factories/transaction.js +11 -11
- package/dist/server/src/__tests__/factories/transaction.js.map +1 -1
- package/dist/server/src/__tests__/factories/transaction.test.js +27 -27
- package/dist/server/src/__tests__/factories/transaction.test.js.map +1 -1
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js +20 -20
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-a.js.map +1 -1
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js +20 -20
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.js.map +1 -1
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js +8 -8
- package/dist/server/src/__tests__/fixtures/expenses/expense-scenario-b.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/db-setup.d.ts +0 -1
- package/dist/server/src/__tests__/helpers/db-setup.js +0 -2
- package/dist/server/src/__tests__/helpers/db-setup.js.map +1 -1
- package/dist/server/src/__tests__/helpers/fixture-loader.js +2 -2
- package/dist/server/src/__tests__/helpers/fixture-loader.js.map +1 -1
- package/dist/server/src/__tests__/helpers/fixture-loader.test.js +32 -29
- package/dist/server/src/__tests__/helpers/fixture-loader.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/fixture-validation.test.js +50 -50
- package/dist/server/src/__tests__/helpers/fixture-validation.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js +23 -31
- package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js +8 -8
- package/dist/server/src/__tests__/helpers/seed-helpers.concurrent.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js +41 -50
- package/dist/server/src/__tests__/helpers/seed-helpers.financial-entity.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js +23 -31
- package/dist/server/src/__tests__/helpers/seed-helpers.tax-category.test.js.map +1 -1
- package/dist/server/src/__tests__/seed-admin-context.integration.test.js +128 -131
- package/dist/server/src/__tests__/seed-admin-context.integration.test.js.map +1 -1
- package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js +58 -0
- package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js.map +1 -0
- package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.d.ts +50 -0
- package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js +66 -0
- package/dist/server/src/demo-fixtures/helpers/deterministic-uuid.js.map +1 -0
- package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.d.ts +1 -1
- package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js +2 -2
- package/dist/server/src/modules/admin-context/{heplers → helpers}/admin-context.helper.js.map +1 -1
- package/dist/server/src/modules/admin-context/resolvers/admin-context.resolvers.js +1 -1
- package/dist/server/src/modules/business-trips/providers/business-trips.provider.d.ts +1 -1
- package/dist/server/src/modules/business-trips/providers/business-trips.provider.js +1 -1
- package/dist/server/src/modules/business-trips/providers/business-trips.provider.js.map +1 -1
- package/dist/server/src/modules/charges/helpers/common.helper.js +3 -3
- package/dist/server/src/modules/charges/helpers/common.helper.js.map +1 -1
- package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js → merge-charges.helper.js} +6 -6
- package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.js.map → merge-charges.helper.js.map} +1 -1
- package/dist/server/src/modules/charges/resolvers/charges.resolver.js +1 -1
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +2 -2
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -1
- package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +1 -1
- package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -1
- package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js +1 -1
- package/dist/server/src/modules/corn-jobs/resolvers/corn-jobs.resolver.js.map +1 -1
- package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.d.ts +0 -2
- package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js +0 -4
- package/dist/server/src/modules/ledger/__tests__/helpers/ledger-assertions.js.map +1 -1
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js +20 -20
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js.map +1 -1
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js +21 -21
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js.map +1 -1
- package/dist/server/src/modules/transactions/helpers/common.helper.js +11 -6
- package/dist/server/src/modules/transactions/helpers/common.helper.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/factories/business.test.ts +3 -3
- package/src/__tests__/factories/business.ts +5 -4
- package/src/__tests__/factories/charge.test.ts +14 -14
- package/src/__tests__/factories/charge.ts +16 -16
- package/src/__tests__/factories/document.test.ts +38 -38
- package/src/__tests__/factories/document.ts +11 -11
- package/src/__tests__/factories/financial-account.test.ts +7 -7
- package/src/__tests__/factories/financial-account.ts +3 -3
- package/src/__tests__/factories/index.test.ts +12 -12
- package/src/__tests__/factories/index.ts +2 -2
- package/src/__tests__/factories/tax-category.test.ts +4 -4
- package/src/__tests__/factories/tax-category.ts +7 -6
- package/src/__tests__/factories/transaction.test.ts +27 -27
- package/src/__tests__/factories/transaction.ts +11 -11
- package/src/__tests__/fixtures/expenses/expense-scenario-a.ts +20 -20
- package/src/__tests__/fixtures/expenses/expense-scenario-b.test.ts +8 -8
- package/src/__tests__/fixtures/expenses/expense-scenario-b.ts +20 -20
- package/src/__tests__/helpers/db-setup.ts +0 -3
- package/src/__tests__/helpers/fixture-loader.test.ts +31 -29
- package/src/__tests__/helpers/fixture-loader.ts +2 -2
- package/src/__tests__/helpers/fixture-validation.test.ts +50 -50
- package/src/__tests__/helpers/seed-helpers.business.test.ts +145 -147
- package/src/__tests__/helpers/seed-helpers.concurrent.test.ts +10 -10
- package/src/__tests__/helpers/seed-helpers.financial-entity.test.ts +218 -231
- package/src/__tests__/helpers/seed-helpers.tax-category.test.ts +162 -164
- package/src/__tests__/seed-admin-context.integration.test.ts +199 -208
- package/src/demo-fixtures/__tests__/deterministic-uuid.test.ts +75 -0
- package/src/demo-fixtures/helpers/deterministic-uuid.ts +68 -0
- package/src/modules/admin-context/{heplers → helpers}/admin-context.helper.ts +3 -3
- package/src/modules/admin-context/resolvers/admin-context.resolvers.ts +1 -1
- package/src/modules/business-trips/providers/business-trips.provider.ts +1 -1
- package/src/modules/charges/helpers/common.helper.ts +3 -3
- package/src/modules/charges/helpers/{merge-charges.hepler.ts → merge-charges.helper.ts} +5 -5
- package/src/modules/charges/resolvers/charges.resolver.ts +1 -1
- package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +2 -2
- package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +1 -1
- package/src/modules/corn-jobs/resolvers/corn-jobs.resolver.ts +1 -1
- package/src/modules/ledger/__tests__/helpers/ledger-assertions.ts +0 -5
- package/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.ts +20 -20
- package/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.ts +21 -21
- package/src/modules/transactions/helpers/common.helper.ts +12 -6
- package/dist/server/src/__tests__/factories/ids.d.ts +0 -22
- package/dist/server/src/__tests__/factories/ids.js +0 -46
- package/dist/server/src/__tests__/factories/ids.js.map +0 -1
- package/dist/server/src/__tests__/factories/ids.test.js +0 -71
- package/dist/server/src/__tests__/factories/ids.test.js.map +0 -1
- package/src/__tests__/factories/ids.test.ts +0 -80
- package/src/__tests__/factories/ids.ts +0 -49
- /package/dist/server/src/{__tests__/factories/ids.test.d.ts → demo-fixtures/__tests__/deterministic-uuid.test.d.ts} +0 -0
- /package/dist/server/src/modules/charges/helpers/{merge-charges.hepler.d.ts → merge-charges.helper.d.ts} +0 -0
|
@@ -1,258 +1,245 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll
|
|
2
|
-
import pg from 'pg';
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
3
2
|
import { ensureFinancialEntity } from './seed-helpers.js';
|
|
4
|
-
import {
|
|
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('ensureFinancialEntity', () => {
|
|
8
|
-
let
|
|
9
|
-
let client: pg.PoolClient;
|
|
8
|
+
let db: TestDatabase;
|
|
10
9
|
|
|
11
10
|
beforeAll(async () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// Get a client for transactions
|
|
16
|
-
client = await pool.connect();
|
|
11
|
+
db = new TestDatabase();
|
|
12
|
+
await db.connect();
|
|
17
13
|
});
|
|
18
14
|
|
|
19
15
|
afterAll(async () => {
|
|
20
|
-
|
|
21
|
-
if (client) {
|
|
22
|
-
client.release();
|
|
23
|
-
}
|
|
24
|
-
if (pool) {
|
|
25
|
-
await pool.end();
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
beforeEach(async () => {
|
|
30
|
-
// Start transaction before each test
|
|
31
|
-
await client.query('BEGIN');
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
afterEach(async () => {
|
|
35
|
-
// Rollback transaction after each test to clean up
|
|
36
|
-
await client.query('ROLLBACK');
|
|
16
|
+
await db.close();
|
|
37
17
|
});
|
|
38
18
|
|
|
39
|
-
it('should create a new financial entity when it does not exist', async () =>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
19
|
+
it('should create a new financial entity when it does not exist', async () =>
|
|
20
|
+
db.withTransaction(async client => {
|
|
21
|
+
const result = await ensureFinancialEntity(client, {
|
|
22
|
+
name: 'Test Entity',
|
|
23
|
+
type: 'business',
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
expect(result).toHaveProperty('id');
|
|
27
|
+
expect(typeof result.id).toBe('string');
|
|
28
|
+
|
|
29
|
+
// Verify it was inserted
|
|
30
|
+
const checkResult = await client.query(
|
|
31
|
+
`SELECT id, name, type, owner_id FROM ${qualifyTable('financial_entities')} WHERE id = $1`,
|
|
32
|
+
[result.id],
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
expect(checkResult.rows.length).toBe(1);
|
|
36
|
+
expect(checkResult.rows[0].name).toBe('Test Entity');
|
|
37
|
+
expect(checkResult.rows[0].type).toBe('business');
|
|
38
|
+
expect(checkResult.rows[0].owner_id).toBeNull();
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
it('should return existing entity when called twice with same parameters', async () =>
|
|
42
|
+
db.withTransaction(async client => {
|
|
43
|
+
const firstResult = await ensureFinancialEntity(client, {
|
|
44
|
+
name: 'Duplicate Test',
|
|
45
|
+
type: 'tax_category',
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const secondResult = await ensureFinancialEntity(client, {
|
|
49
|
+
name: 'Duplicate Test',
|
|
50
|
+
type: 'tax_category',
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
expect(firstResult.id).toBe(secondResult.id);
|
|
54
|
+
|
|
55
|
+
// Verify only one row exists
|
|
56
|
+
const countResult = await client.query(
|
|
57
|
+
`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')} WHERE name = $1 AND type = $2`,
|
|
58
|
+
['Duplicate Test', 'tax_category'],
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(parseInt(countResult.rows[0].count)).toBe(1);
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
it('should handle entities with owner_id', async () =>
|
|
65
|
+
db.withTransaction(async client => {
|
|
66
|
+
// First create an owner entity (business)
|
|
67
|
+
const ownerEntityResult = await ensureFinancialEntity(client, {
|
|
68
|
+
name: 'Owner Entity',
|
|
69
|
+
type: 'business',
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Create corresponding business record (required for foreign key)
|
|
73
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
74
|
+
ownerEntityResult.id,
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// Create owned entity (tax_category)
|
|
78
|
+
const result = await ensureFinancialEntity(client, {
|
|
79
|
+
name: 'Owned Entity',
|
|
80
|
+
type: 'tax_category',
|
|
81
|
+
ownerId: ownerEntityResult.id,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect(result).toHaveProperty('id');
|
|
85
|
+
|
|
86
|
+
// Verify owner_id is set correctly
|
|
87
|
+
const checkResult = await client.query(
|
|
88
|
+
`SELECT owner_id FROM ${qualifyTable('financial_entities')} WHERE id = $1`,
|
|
89
|
+
[result.id],
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(checkResult.rows[0].owner_id).toBe(ownerEntityResult.id);
|
|
93
|
+
}));
|
|
94
|
+
|
|
95
|
+
it('should be idempotent for entities with owner_id', async () =>
|
|
96
|
+
db.withTransaction(async client => {
|
|
97
|
+
const ownerEntityResult = await ensureFinancialEntity(client, {
|
|
98
|
+
name: 'Owner Business',
|
|
99
|
+
type: 'business',
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Create corresponding business record
|
|
103
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
104
|
+
ownerEntityResult.id,
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
const firstResult = await ensureFinancialEntity(client, {
|
|
108
|
+
name: 'Child Entity',
|
|
109
|
+
type: 'tax_category',
|
|
110
|
+
ownerId: ownerEntityResult.id,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const secondResult = await ensureFinancialEntity(client, {
|
|
114
|
+
name: 'Child Entity',
|
|
115
|
+
type: 'tax_category',
|
|
116
|
+
ownerId: ownerEntityResult.id,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
expect(firstResult.id).toBe(secondResult.id);
|
|
120
|
+
|
|
121
|
+
// Verify only one row
|
|
122
|
+
const countResult = await client.query(
|
|
123
|
+
`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')}
|
|
142
124
|
WHERE name = $1 AND type = $2 AND owner_id = $3`,
|
|
143
|
-
|
|
144
|
-
|
|
125
|
+
['Child Entity', 'tax_category', ownerEntityResult.id],
|
|
126
|
+
);
|
|
145
127
|
|
|
146
|
-
|
|
147
|
-
|
|
128
|
+
expect(parseInt(countResult.rows[0].count)).toBe(1);
|
|
129
|
+
}));
|
|
148
130
|
|
|
149
|
-
it('should distinguish entities by type', async () =>
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
131
|
+
it('should distinguish entities by type', async () =>
|
|
132
|
+
db.withTransaction(async client => {
|
|
133
|
+
const businessResult = await ensureFinancialEntity(client, {
|
|
134
|
+
name: 'Same Name',
|
|
135
|
+
type: 'business',
|
|
136
|
+
});
|
|
154
137
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
138
|
+
const taxCategoryResult = await ensureFinancialEntity(client, {
|
|
139
|
+
name: 'Same Name',
|
|
140
|
+
type: 'tax_category',
|
|
141
|
+
});
|
|
159
142
|
|
|
160
|
-
|
|
161
|
-
|
|
143
|
+
expect(businessResult.id).not.toBe(taxCategoryResult.id);
|
|
144
|
+
}));
|
|
162
145
|
|
|
163
|
-
it('should distinguish entities by owner_id', async () =>
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`,
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
const owner2Entity = await ensureFinancialEntity(client, {
|
|
174
|
-
name: 'Owner 2',
|
|
175
|
-
type: 'business',
|
|
176
|
-
});
|
|
177
|
-
await client.query(
|
|
178
|
-
`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`,
|
|
179
|
-
[owner2Entity.id],
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
const entity1 = await ensureFinancialEntity(client, {
|
|
183
|
-
name: 'Same Child',
|
|
184
|
-
type: 'tax_category',
|
|
185
|
-
ownerId: owner1Entity.id,
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
const entity2 = await ensureFinancialEntity(client, {
|
|
189
|
-
name: 'Same Child',
|
|
190
|
-
type: 'tax_category',
|
|
191
|
-
ownerId: owner2Entity.id,
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
expect(entity1.id).not.toBe(entity2.id);
|
|
195
|
-
});
|
|
146
|
+
it('should distinguish entities by owner_id', async () =>
|
|
147
|
+
db.withTransaction(async client => {
|
|
148
|
+
const owner1Entity = await ensureFinancialEntity(client, {
|
|
149
|
+
name: 'Owner 1',
|
|
150
|
+
type: 'business',
|
|
151
|
+
});
|
|
152
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
153
|
+
owner1Entity.id,
|
|
154
|
+
]);
|
|
196
155
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
156
|
+
const owner2Entity = await ensureFinancialEntity(client, {
|
|
157
|
+
name: 'Owner 2',
|
|
158
|
+
type: 'business',
|
|
159
|
+
});
|
|
160
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
161
|
+
owner2Entity.id,
|
|
162
|
+
]);
|
|
163
|
+
|
|
164
|
+
const entity1 = await ensureFinancialEntity(client, {
|
|
165
|
+
name: 'Same Child',
|
|
166
|
+
type: 'tax_category',
|
|
167
|
+
ownerId: owner1Entity.id,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const entity2 = await ensureFinancialEntity(client, {
|
|
171
|
+
name: 'Same Child',
|
|
172
|
+
type: 'tax_category',
|
|
173
|
+
ownerId: owner2Entity.id,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
expect(entity1.id).not.toBe(entity2.id);
|
|
177
|
+
}));
|
|
178
|
+
|
|
179
|
+
it('should handle null vs undefined owner_id consistently', async () =>
|
|
180
|
+
db.withTransaction(async client => {
|
|
181
|
+
const result1 = await ensureFinancialEntity(client, {
|
|
182
|
+
name: 'No Owner Entity',
|
|
183
|
+
type: 'business',
|
|
184
|
+
ownerId: undefined,
|
|
185
|
+
});
|
|
203
186
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
187
|
+
const result2 = await ensureFinancialEntity(client, {
|
|
188
|
+
name: 'No Owner Entity',
|
|
189
|
+
type: 'business',
|
|
190
|
+
});
|
|
208
191
|
|
|
209
|
-
|
|
210
|
-
|
|
192
|
+
expect(result1.id).toBe(result2.id);
|
|
193
|
+
}));
|
|
211
194
|
|
|
212
|
-
it('should not leak data between tests', async () =>
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
195
|
+
it('should not leak data between tests', async () =>
|
|
196
|
+
db.withTransaction(async client => {
|
|
197
|
+
// This test verifies that ROLLBACK works correctly
|
|
198
|
+
// Create an entity in this test
|
|
199
|
+
await ensureFinancialEntity(client, {
|
|
200
|
+
name: 'Transient Entity',
|
|
201
|
+
type: 'business',
|
|
202
|
+
});
|
|
219
203
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
204
|
+
// The entity should exist within this transaction
|
|
205
|
+
const checkInTransaction = await client.query(
|
|
206
|
+
`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')} WHERE name = $1`,
|
|
207
|
+
['Transient Entity'],
|
|
208
|
+
);
|
|
225
209
|
|
|
226
|
-
|
|
210
|
+
expect(parseInt(checkInTransaction.rows[0].count)).toBe(1);
|
|
227
211
|
|
|
228
|
-
|
|
229
|
-
|
|
212
|
+
// After ROLLBACK in afterEach, this data won't be visible in next test
|
|
213
|
+
}));
|
|
230
214
|
|
|
231
215
|
// Validation tests
|
|
232
|
-
it('should reject empty entity name', async () =>
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
216
|
+
it('should reject empty entity name', async () =>
|
|
217
|
+
db.withTransaction(async client => {
|
|
218
|
+
await expect(
|
|
219
|
+
ensureFinancialEntity(client, {
|
|
220
|
+
name: '',
|
|
221
|
+
type: 'business',
|
|
222
|
+
}),
|
|
223
|
+
).rejects.toThrow(EntityValidationError);
|
|
224
|
+
}));
|
|
225
|
+
|
|
226
|
+
it('should reject invalid entity type', async () =>
|
|
227
|
+
db.withTransaction(async client => {
|
|
228
|
+
await expect(
|
|
229
|
+
ensureFinancialEntity(client, {
|
|
230
|
+
name: 'Test Entity',
|
|
231
|
+
type: 'invalid_type' as any,
|
|
232
|
+
}),
|
|
233
|
+
).rejects.toThrow(EntityValidationError);
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
it('should reject whitespace-only name', async () =>
|
|
237
|
+
db.withTransaction(async client => {
|
|
238
|
+
await expect(
|
|
239
|
+
ensureFinancialEntity(client, {
|
|
240
|
+
name: ' ',
|
|
241
|
+
type: 'business',
|
|
242
|
+
}),
|
|
243
|
+
).rejects.toThrow(EntityValidationError);
|
|
244
|
+
}));
|
|
258
245
|
});
|