@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,26 +1,18 @@
|
|
|
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, ensureBusinessForEntity } 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
|
describe('ensureBusinessForEntity', () => {
|
|
7
|
-
let
|
|
8
|
-
let client;
|
|
7
|
+
let db;
|
|
9
8
|
beforeAll(async () => {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
db = new TestDatabase();
|
|
10
|
+
await db.connect();
|
|
12
11
|
});
|
|
13
12
|
afterAll(async () => {
|
|
14
|
-
|
|
15
|
-
await pool.end();
|
|
13
|
+
await db.close();
|
|
16
14
|
});
|
|
17
|
-
|
|
18
|
-
await client.query('BEGIN');
|
|
19
|
-
});
|
|
20
|
-
afterEach(async () => {
|
|
21
|
-
await client.query('ROLLBACK');
|
|
22
|
-
});
|
|
23
|
-
it('should create a new business for a financial entity', async () => {
|
|
15
|
+
it('should create a new business for a financial entity', async () => db.withTransaction(async (client) => {
|
|
24
16
|
// Create a financial entity first
|
|
25
17
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
26
18
|
name: 'Test Business Entity',
|
|
@@ -33,8 +25,8 @@ describe('ensureBusinessForEntity', () => {
|
|
|
33
25
|
expect(result.rows).toHaveLength(1);
|
|
34
26
|
expect(result.rows[0].id).toBe(entityId);
|
|
35
27
|
expect(result.rows[0].no_invoices_required).toBe(false);
|
|
36
|
-
});
|
|
37
|
-
it('should be idempotent - repeated calls do not create duplicates', async () => {
|
|
28
|
+
}));
|
|
29
|
+
it('should be idempotent - repeated calls do not create duplicates', async () => db.withTransaction(async (client) => {
|
|
38
30
|
// Create a financial entity first
|
|
39
31
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
40
32
|
name: 'Test Business Entity 2',
|
|
@@ -48,8 +40,8 @@ describe('ensureBusinessForEntity', () => {
|
|
|
48
40
|
const result = await client.query(`SELECT id FROM ${qualifyTable('businesses')} WHERE id = $1`, [entityId]);
|
|
49
41
|
expect(result.rows).toHaveLength(1);
|
|
50
42
|
expect(result.rows[0].id).toBe(entityId);
|
|
51
|
-
});
|
|
52
|
-
it('should support noInvoicesRequired option', async () => {
|
|
43
|
+
}));
|
|
44
|
+
it('should support noInvoicesRequired option', async () => db.withTransaction(async (client) => {
|
|
53
45
|
// Create a financial entity first
|
|
54
46
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
55
47
|
name: 'Test Business Entity 3',
|
|
@@ -62,8 +54,8 @@ describe('ensureBusinessForEntity', () => {
|
|
|
62
54
|
expect(result.rows).toHaveLength(1);
|
|
63
55
|
expect(result.rows[0].id).toBe(entityId);
|
|
64
56
|
expect(result.rows[0].no_invoices_required).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
it('should default noInvoicesRequired to false when not specified', async () => {
|
|
57
|
+
}));
|
|
58
|
+
it('should default noInvoicesRequired to false when not specified', async () => db.withTransaction(async (client) => {
|
|
67
59
|
// Create a financial entity first
|
|
68
60
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
69
61
|
name: 'Test Business Entity 4',
|
|
@@ -75,8 +67,8 @@ describe('ensureBusinessForEntity', () => {
|
|
|
75
67
|
const result = await client.query(`SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`, [entityId]);
|
|
76
68
|
expect(result.rows).toHaveLength(1);
|
|
77
69
|
expect(result.rows[0].no_invoices_required).toBe(false);
|
|
78
|
-
});
|
|
79
|
-
it('should not modify existing business when called again', async () => {
|
|
70
|
+
}));
|
|
71
|
+
it('should not modify existing business when called again', async () => db.withTransaction(async (client) => {
|
|
80
72
|
// Create a financial entity first
|
|
81
73
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
82
74
|
name: 'Test Business Entity 5',
|
|
@@ -90,21 +82,21 @@ describe('ensureBusinessForEntity', () => {
|
|
|
90
82
|
const result = await client.query(`SELECT no_invoices_required FROM ${qualifyTable('businesses')} WHERE id = $1`, [entityId]);
|
|
91
83
|
expect(result.rows).toHaveLength(1);
|
|
92
84
|
expect(result.rows[0].no_invoices_required).toBe(true); // Original value preserved
|
|
93
|
-
});
|
|
94
|
-
it('should not leak data between tests', async () => {
|
|
85
|
+
}));
|
|
86
|
+
it('should not leak data between tests', async () => db.withTransaction(async (client) => {
|
|
95
87
|
// This test verifies transactional isolation by checking that data
|
|
96
88
|
// from previous tests is not visible
|
|
97
89
|
const result = await client.query(`SELECT COUNT(*) as count FROM ${qualifyTable('businesses')} WHERE id IN (SELECT id FROM ${qualifyTable('financial_entities')} WHERE name LIKE 'Test Business Entity%')`);
|
|
98
90
|
// Due to ROLLBACK after each test, count should be 0
|
|
99
91
|
expect(parseInt(result.rows[0].count)).toBe(0);
|
|
100
|
-
});
|
|
92
|
+
}));
|
|
101
93
|
// Validation tests
|
|
102
|
-
it('should reject invalid UUID format', async () => {
|
|
94
|
+
it('should reject invalid UUID format', async () => db.withTransaction(async (client) => {
|
|
103
95
|
await expect(ensureBusinessForEntity(client, 'not-a-valid-uuid')).rejects.toThrow(EntityValidationError);
|
|
104
|
-
});
|
|
105
|
-
it('should reject non-existent financial entity', async () => {
|
|
96
|
+
}));
|
|
97
|
+
it('should reject non-existent financial entity', async () => db.withTransaction(async (client) => {
|
|
106
98
|
const fakeId = '00000000-0000-0000-0000-000000000000';
|
|
107
99
|
await expect(ensureBusinessForEntity(client, fakeId)).rejects.toThrow(EntityValidationError);
|
|
108
|
-
});
|
|
100
|
+
}));
|
|
109
101
|
});
|
|
110
102
|
//# sourceMappingURL=seed-helpers.business.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-helpers.business.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.business.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"seed-helpers.business.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.business.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
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
|
describe('ensureFinancialEntity - Concurrent Access', () => {
|
|
7
|
-
let
|
|
6
|
+
let db;
|
|
8
7
|
beforeAll(async () => {
|
|
9
|
-
|
|
8
|
+
db = new TestDatabase();
|
|
9
|
+
await db.connect();
|
|
10
10
|
});
|
|
11
11
|
afterAll(async () => {
|
|
12
|
-
await
|
|
12
|
+
await db.close();
|
|
13
13
|
});
|
|
14
14
|
it('should handle concurrent inserts of same entity gracefully', async () => {
|
|
15
15
|
const params = {
|
|
@@ -17,7 +17,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
|
|
|
17
17
|
type: 'business',
|
|
18
18
|
};
|
|
19
19
|
// Two separate transactions attempting to create the same entity
|
|
20
|
-
const [result1, result2] = await withConcurrentTransactions(
|
|
20
|
+
const [result1, result2] = await withConcurrentTransactions(db.getPool(), [
|
|
21
21
|
async (client) => ensureFinancialEntity(client, params),
|
|
22
22
|
async (client) => ensureFinancialEntity(client, params),
|
|
23
23
|
]);
|
|
@@ -29,7 +29,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
|
|
|
29
29
|
// This is expected behavior with ROLLBACK isolation
|
|
30
30
|
});
|
|
31
31
|
it('should handle concurrent inserts of different entities', async () => {
|
|
32
|
-
const [result1, result2, result3] = await withConcurrentTransactions(
|
|
32
|
+
const [result1, result2, result3] = await withConcurrentTransactions(db.getPool(), [
|
|
33
33
|
async (client) => ensureFinancialEntity(client, {
|
|
34
34
|
name: 'Concurrent Entity A',
|
|
35
35
|
type: 'business',
|
|
@@ -51,7 +51,7 @@ describe('ensureFinancialEntity - Concurrent Access', () => {
|
|
|
51
51
|
it('should handle concurrent creation with separate namespaces', async () => {
|
|
52
52
|
// Test that concurrent operations in separate transactions don't interfere
|
|
53
53
|
const timestamp = Date.now();
|
|
54
|
-
const [result1, result2, result3] = await withConcurrentTransactions(
|
|
54
|
+
const [result1, result2, result3] = await withConcurrentTransactions(db.getPool(), [
|
|
55
55
|
async (client) => ensureFinancialEntity(client, {
|
|
56
56
|
name: `Namespace A - ${timestamp}`,
|
|
57
57
|
type: 'business',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-helpers.concurrent.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.concurrent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"seed-helpers.concurrent.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.concurrent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,18 @@
|
|
|
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
|
describe('ensureFinancialEntity', () => {
|
|
7
|
-
let
|
|
8
|
-
let client;
|
|
7
|
+
let db;
|
|
9
8
|
beforeAll(async () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// Get a client for transactions
|
|
13
|
-
client = await pool.connect();
|
|
9
|
+
db = new TestDatabase();
|
|
10
|
+
await db.connect();
|
|
14
11
|
});
|
|
15
12
|
afterAll(async () => {
|
|
16
|
-
|
|
17
|
-
if (client) {
|
|
18
|
-
client.release();
|
|
19
|
-
}
|
|
20
|
-
if (pool) {
|
|
21
|
-
await pool.end();
|
|
22
|
-
}
|
|
13
|
+
await db.close();
|
|
23
14
|
});
|
|
24
|
-
|
|
25
|
-
// Start transaction before each test
|
|
26
|
-
await client.query('BEGIN');
|
|
27
|
-
});
|
|
28
|
-
afterEach(async () => {
|
|
29
|
-
// Rollback transaction after each test to clean up
|
|
30
|
-
await client.query('ROLLBACK');
|
|
31
|
-
});
|
|
32
|
-
it('should create a new financial entity when it does not exist', async () => {
|
|
15
|
+
it('should create a new financial entity when it does not exist', async () => db.withTransaction(async (client) => {
|
|
33
16
|
const result = await ensureFinancialEntity(client, {
|
|
34
17
|
name: 'Test Entity',
|
|
35
18
|
type: 'business',
|
|
@@ -42,8 +25,8 @@ describe('ensureFinancialEntity', () => {
|
|
|
42
25
|
expect(checkResult.rows[0].name).toBe('Test Entity');
|
|
43
26
|
expect(checkResult.rows[0].type).toBe('business');
|
|
44
27
|
expect(checkResult.rows[0].owner_id).toBeNull();
|
|
45
|
-
});
|
|
46
|
-
it('should return existing entity when called twice with same parameters', async () => {
|
|
28
|
+
}));
|
|
29
|
+
it('should return existing entity when called twice with same parameters', async () => db.withTransaction(async (client) => {
|
|
47
30
|
const firstResult = await ensureFinancialEntity(client, {
|
|
48
31
|
name: 'Duplicate Test',
|
|
49
32
|
type: 'tax_category',
|
|
@@ -56,15 +39,17 @@ describe('ensureFinancialEntity', () => {
|
|
|
56
39
|
// Verify only one row exists
|
|
57
40
|
const countResult = await client.query(`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')} WHERE name = $1 AND type = $2`, ['Duplicate Test', 'tax_category']);
|
|
58
41
|
expect(parseInt(countResult.rows[0].count)).toBe(1);
|
|
59
|
-
});
|
|
60
|
-
it('should handle entities with owner_id', async () => {
|
|
42
|
+
}));
|
|
43
|
+
it('should handle entities with owner_id', async () => db.withTransaction(async (client) => {
|
|
61
44
|
// First create an owner entity (business)
|
|
62
45
|
const ownerEntityResult = await ensureFinancialEntity(client, {
|
|
63
46
|
name: 'Owner Entity',
|
|
64
47
|
type: 'business',
|
|
65
48
|
});
|
|
66
49
|
// Create corresponding business record (required for foreign key)
|
|
67
|
-
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
50
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
51
|
+
ownerEntityResult.id,
|
|
52
|
+
]);
|
|
68
53
|
// Create owned entity (tax_category)
|
|
69
54
|
const result = await ensureFinancialEntity(client, {
|
|
70
55
|
name: 'Owned Entity',
|
|
@@ -75,14 +60,16 @@ describe('ensureFinancialEntity', () => {
|
|
|
75
60
|
// Verify owner_id is set correctly
|
|
76
61
|
const checkResult = await client.query(`SELECT owner_id FROM ${qualifyTable('financial_entities')} WHERE id = $1`, [result.id]);
|
|
77
62
|
expect(checkResult.rows[0].owner_id).toBe(ownerEntityResult.id);
|
|
78
|
-
});
|
|
79
|
-
it('should be idempotent for entities with owner_id', async () => {
|
|
63
|
+
}));
|
|
64
|
+
it('should be idempotent for entities with owner_id', async () => db.withTransaction(async (client) => {
|
|
80
65
|
const ownerEntityResult = await ensureFinancialEntity(client, {
|
|
81
66
|
name: 'Owner Business',
|
|
82
67
|
type: 'business',
|
|
83
68
|
});
|
|
84
69
|
// Create corresponding business record
|
|
85
|
-
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
70
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
71
|
+
ownerEntityResult.id,
|
|
72
|
+
]);
|
|
86
73
|
const firstResult = await ensureFinancialEntity(client, {
|
|
87
74
|
name: 'Child Entity',
|
|
88
75
|
type: 'tax_category',
|
|
@@ -98,8 +85,8 @@ describe('ensureFinancialEntity', () => {
|
|
|
98
85
|
const countResult = await client.query(`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')}
|
|
99
86
|
WHERE name = $1 AND type = $2 AND owner_id = $3`, ['Child Entity', 'tax_category', ownerEntityResult.id]);
|
|
100
87
|
expect(parseInt(countResult.rows[0].count)).toBe(1);
|
|
101
|
-
});
|
|
102
|
-
it('should distinguish entities by type', async () => {
|
|
88
|
+
}));
|
|
89
|
+
it('should distinguish entities by type', async () => db.withTransaction(async (client) => {
|
|
103
90
|
const businessResult = await ensureFinancialEntity(client, {
|
|
104
91
|
name: 'Same Name',
|
|
105
92
|
type: 'business',
|
|
@@ -109,18 +96,22 @@ describe('ensureFinancialEntity', () => {
|
|
|
109
96
|
type: 'tax_category',
|
|
110
97
|
});
|
|
111
98
|
expect(businessResult.id).not.toBe(taxCategoryResult.id);
|
|
112
|
-
});
|
|
113
|
-
it('should distinguish entities by owner_id', async () => {
|
|
99
|
+
}));
|
|
100
|
+
it('should distinguish entities by owner_id', async () => db.withTransaction(async (client) => {
|
|
114
101
|
const owner1Entity = await ensureFinancialEntity(client, {
|
|
115
102
|
name: 'Owner 1',
|
|
116
103
|
type: 'business',
|
|
117
104
|
});
|
|
118
|
-
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
105
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
106
|
+
owner1Entity.id,
|
|
107
|
+
]);
|
|
119
108
|
const owner2Entity = await ensureFinancialEntity(client, {
|
|
120
109
|
name: 'Owner 2',
|
|
121
110
|
type: 'business',
|
|
122
111
|
});
|
|
123
|
-
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
112
|
+
await client.query(`INSERT INTO ${qualifyTable('businesses')} (id) VALUES ($1)`, [
|
|
113
|
+
owner2Entity.id,
|
|
114
|
+
]);
|
|
124
115
|
const entity1 = await ensureFinancialEntity(client, {
|
|
125
116
|
name: 'Same Child',
|
|
126
117
|
type: 'tax_category',
|
|
@@ -132,8 +123,8 @@ describe('ensureFinancialEntity', () => {
|
|
|
132
123
|
ownerId: owner2Entity.id,
|
|
133
124
|
});
|
|
134
125
|
expect(entity1.id).not.toBe(entity2.id);
|
|
135
|
-
});
|
|
136
|
-
it('should handle null vs undefined owner_id consistently', async () => {
|
|
126
|
+
}));
|
|
127
|
+
it('should handle null vs undefined owner_id consistently', async () => db.withTransaction(async (client) => {
|
|
137
128
|
const result1 = await ensureFinancialEntity(client, {
|
|
138
129
|
name: 'No Owner Entity',
|
|
139
130
|
type: 'business',
|
|
@@ -144,8 +135,8 @@ describe('ensureFinancialEntity', () => {
|
|
|
144
135
|
type: 'business',
|
|
145
136
|
});
|
|
146
137
|
expect(result1.id).toBe(result2.id);
|
|
147
|
-
});
|
|
148
|
-
it('should not leak data between tests', async () => {
|
|
138
|
+
}));
|
|
139
|
+
it('should not leak data between tests', async () => db.withTransaction(async (client) => {
|
|
149
140
|
// This test verifies that ROLLBACK works correctly
|
|
150
141
|
// Create an entity in this test
|
|
151
142
|
await ensureFinancialEntity(client, {
|
|
@@ -156,25 +147,25 @@ describe('ensureFinancialEntity', () => {
|
|
|
156
147
|
const checkInTransaction = await client.query(`SELECT COUNT(*) FROM ${qualifyTable('financial_entities')} WHERE name = $1`, ['Transient Entity']);
|
|
157
148
|
expect(parseInt(checkInTransaction.rows[0].count)).toBe(1);
|
|
158
149
|
// After ROLLBACK in afterEach, this data won't be visible in next test
|
|
159
|
-
});
|
|
150
|
+
}));
|
|
160
151
|
// Validation tests
|
|
161
|
-
it('should reject empty entity name', async () => {
|
|
152
|
+
it('should reject empty entity name', async () => db.withTransaction(async (client) => {
|
|
162
153
|
await expect(ensureFinancialEntity(client, {
|
|
163
154
|
name: '',
|
|
164
155
|
type: 'business',
|
|
165
156
|
})).rejects.toThrow(EntityValidationError);
|
|
166
|
-
});
|
|
167
|
-
it('should reject invalid entity type', async () => {
|
|
157
|
+
}));
|
|
158
|
+
it('should reject invalid entity type', async () => db.withTransaction(async (client) => {
|
|
168
159
|
await expect(ensureFinancialEntity(client, {
|
|
169
160
|
name: 'Test Entity',
|
|
170
161
|
type: 'invalid_type',
|
|
171
162
|
})).rejects.toThrow(EntityValidationError);
|
|
172
|
-
});
|
|
173
|
-
it('should reject whitespace-only name', async () => {
|
|
163
|
+
}));
|
|
164
|
+
it('should reject whitespace-only name', async () => db.withTransaction(async (client) => {
|
|
174
165
|
await expect(ensureFinancialEntity(client, {
|
|
175
166
|
name: ' ',
|
|
176
167
|
type: 'business',
|
|
177
168
|
})).rejects.toThrow(EntityValidationError);
|
|
178
|
-
});
|
|
169
|
+
}));
|
|
179
170
|
});
|
|
180
171
|
//# sourceMappingURL=seed-helpers.financial-entity.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-helpers.financial-entity.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.financial-entity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"seed-helpers.financial-entity.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.financial-entity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import { describe, expect, it, beforeAll, afterAll
|
|
2
|
-
import
|
|
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
|
describe('ensureTaxCategoryForEntity', () => {
|
|
7
|
-
let
|
|
8
|
-
let client;
|
|
7
|
+
let db;
|
|
9
8
|
beforeAll(async () => {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
db = new TestDatabase();
|
|
10
|
+
await db.connect();
|
|
12
11
|
});
|
|
13
12
|
afterAll(async () => {
|
|
14
|
-
|
|
15
|
-
await pool.end();
|
|
13
|
+
await db.close();
|
|
16
14
|
});
|
|
17
|
-
|
|
18
|
-
await client.query('BEGIN');
|
|
19
|
-
});
|
|
20
|
-
afterEach(async () => {
|
|
21
|
-
await client.query('ROLLBACK');
|
|
22
|
-
});
|
|
23
|
-
it('should create tax category on first call', async () => {
|
|
15
|
+
it('should create tax category on first call', async () => db.withTransaction(async (client) => {
|
|
24
16
|
// Create financial entity
|
|
25
17
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
26
18
|
name: 'VAT Category',
|
|
@@ -32,8 +24,8 @@ describe('ensureTaxCategoryForEntity', () => {
|
|
|
32
24
|
const result = await client.query(`SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`, [entityId]);
|
|
33
25
|
expect(result.rows).toHaveLength(1);
|
|
34
26
|
expect(result.rows[0].id).toBe(entityId);
|
|
35
|
-
});
|
|
36
|
-
it('should be idempotent (no-op on repeated calls)', async () => {
|
|
27
|
+
}));
|
|
28
|
+
it('should be idempotent (no-op on repeated calls)', async () => db.withTransaction(async (client) => {
|
|
37
29
|
// Create financial entity
|
|
38
30
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
39
31
|
name: 'Income Tax',
|
|
@@ -45,8 +37,8 @@ describe('ensureTaxCategoryForEntity', () => {
|
|
|
45
37
|
// Verify only one row exists
|
|
46
38
|
const result = await client.query(`SELECT COUNT(*) as count FROM ${qualifyTable('tax_categories')} WHERE id = $1`, [entityId]);
|
|
47
39
|
expect(result.rows[0].count).toBe('1');
|
|
48
|
-
});
|
|
49
|
-
it('should preserve existing values on subsequent calls', async () => {
|
|
40
|
+
}));
|
|
41
|
+
it('should preserve existing values on subsequent calls', async () => db.withTransaction(async (client) => {
|
|
50
42
|
// Create financial entity
|
|
51
43
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
52
44
|
name: 'Expense Category',
|
|
@@ -63,24 +55,24 @@ describe('ensureTaxCategoryForEntity', () => {
|
|
|
63
55
|
const finalResult = await client.query(`SELECT * FROM ${qualifyTable('tax_categories')} WHERE id = $1`, [entityId]);
|
|
64
56
|
const finalRow = finalResult.rows[0];
|
|
65
57
|
expect(finalRow).toEqual(initialRow);
|
|
66
|
-
});
|
|
67
|
-
it('should reject invalid UUID format', async () => {
|
|
58
|
+
}));
|
|
59
|
+
it('should reject invalid UUID format', async () => db.withTransaction(async (client) => {
|
|
68
60
|
await expect(ensureTaxCategoryForEntity(client, 'not-a-uuid')).rejects.toThrow(EntityValidationError);
|
|
69
61
|
await expect(ensureTaxCategoryForEntity(client, '')).rejects.toThrow(EntityValidationError);
|
|
70
62
|
await expect(ensureTaxCategoryForEntity(client, '12345')).rejects.toThrow(EntityValidationError);
|
|
71
|
-
});
|
|
72
|
-
it('should reject non-existent financial entity', async () => {
|
|
63
|
+
}));
|
|
64
|
+
it('should reject non-existent financial entity', async () => db.withTransaction(async (client) => {
|
|
73
65
|
const fakeUuid = '00000000-0000-0000-0000-000000000001';
|
|
74
66
|
await expect(ensureTaxCategoryForEntity(client, fakeUuid)).rejects.toThrow(EntityValidationError);
|
|
75
|
-
});
|
|
76
|
-
it('should not leak data between tests', async () => {
|
|
67
|
+
}));
|
|
68
|
+
it('should not leak data between tests', async () => db.withTransaction(async (client) => {
|
|
77
69
|
// This test verifies transactional isolation by checking that data
|
|
78
70
|
// from previous tests is not visible
|
|
79
71
|
const result = await client.query(`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')`);
|
|
80
72
|
// Due to ROLLBACK after each test, count should be 0
|
|
81
73
|
expect(parseInt(result.rows[0].count)).toBe(0);
|
|
82
|
-
});
|
|
83
|
-
it('should work with entities that have owner_id', async () => {
|
|
74
|
+
}));
|
|
75
|
+
it('should work with entities that have owner_id', async () => db.withTransaction(async (client) => {
|
|
84
76
|
// Create owner business entity (without owner_id requirement)
|
|
85
77
|
const { id: _ownerId } = await ensureFinancialEntity(client, {
|
|
86
78
|
name: 'Owner Business',
|
|
@@ -97,8 +89,8 @@ describe('ensureTaxCategoryForEntity', () => {
|
|
|
97
89
|
const result = await client.query(`SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`, [taxCatId]);
|
|
98
90
|
expect(result.rows).toHaveLength(1);
|
|
99
91
|
expect(result.rows[0].id).toBe(taxCatId);
|
|
100
|
-
});
|
|
101
|
-
it('should handle options parameter gracefully (future-proofing)', async () => {
|
|
92
|
+
}));
|
|
93
|
+
it('should handle options parameter gracefully (future-proofing)', async () => db.withTransaction(async (client) => {
|
|
102
94
|
// Create financial entity
|
|
103
95
|
const { id: entityId } = await ensureFinancialEntity(client, {
|
|
104
96
|
name: 'Category with Options',
|
|
@@ -109,6 +101,6 @@ describe('ensureTaxCategoryForEntity', () => {
|
|
|
109
101
|
// Verify tax category exists
|
|
110
102
|
const result = await client.query(`SELECT id FROM ${qualifyTable('tax_categories')} WHERE id = $1`, [entityId]);
|
|
111
103
|
expect(result.rows).toHaveLength(1);
|
|
112
|
-
});
|
|
104
|
+
}));
|
|
113
105
|
});
|
|
114
106
|
//# sourceMappingURL=seed-helpers.tax-category.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-helpers.tax-category.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.tax-category.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"seed-helpers.tax-category.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/helpers/seed-helpers.tax-category.test.ts"],"names":[],"mappings":"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"}
|