From 1b20b7670411a86577010534211c0cd95211714b Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 20 Aug 2026 08:46:49 +0300 Subject: [PATCH] test: cover account metadata reimport --- CHANGELOG.md | 6 ++++ backend/package.json | 3 +- .../src/services/import.integration.test.ts | 31 +++++++++++++++++++ backend/src/services/import.ts | 3 +- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 backend/src/services/import.integration.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index e19a7c5..a4427ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Backend 0.7.3] - 2026-08-20 + +### Added + +- Added a runnable database integration test for preserving account metadata during re-import. + ## [Frontend 0.10.2 / Backend 0.7.2] - 2026-08-20 ### Fixed diff --git a/backend/package.json b/backend/package.json index c60c1a5..ce49764 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@family-budget/backend", - "version": "0.7.2", + "version": "0.7.3", "private": true, "scripts": { "dev": "tsx watch src/app.ts", @@ -10,6 +10,7 @@ "migrate:prod": "node dist/db/migrate.js", "test:analytics": "tsx src/services/analyticsSemantics.test.ts", "test:analytics:db": "NODE_ENV=test tsx src/services/analytics.integration.test.ts", + "test:import:db": "NODE_ENV=test tsx src/services/import.integration.test.ts", "test:llm": "tsx src/scripts/testLlm.ts" }, "dependencies": { diff --git a/backend/src/services/import.integration.test.ts b/backend/src/services/import.integration.test.ts new file mode 100644 index 0000000..0d7c7b6 --- /dev/null +++ b/backend/src/services/import.integration.test.ts @@ -0,0 +1,31 @@ +import assert from 'node:assert/strict'; +import { pool } from '../db/pool'; +import { importStatement } from './import'; + +const makeStatement = (sourceId: string) => ({ + schemaVersion: '1.0', bank: 'TEST', + statement: { accountNumber: 'metadata-test', currency: 'RUB', openingBalance: 0, closingBalance: 100, exportedAt: '2026-08-20T12:00:00+03:00' }, + transactions: [{ operationAt: '2026-08-20T10:00:00+03:00', amountSigned: 100, commission: 0, description: 'Пополнение', sourceId }], +}); + +async function run(): Promise { + const client = await pool.connect(); + try { + const db = { connect: async () => client }; + await importStatement(makeStatement('first'), db); + const account = await client.query("UPDATE accounts SET account_type = 'savings', status = 'closed' WHERE bank = 'TEST' AND account_number = 'metadata-test' RETURNING id"); + assert.equal(account.rows.length, 1); + await importStatement(makeStatement('second'), db); + const result = await client.query('SELECT account_type, status FROM accounts WHERE id = $1', [account.rows[0].id]); + assert.deepEqual(result.rows[0], { account_type: 'savings', status: 'closed' }); + console.log('import metadata SQL: OK'); + } finally { + await client.query('DELETE FROM transactions WHERE account_id IN (SELECT id FROM accounts WHERE bank = \'TEST\' AND account_number = \'metadata-test\')'); + await client.query("DELETE FROM imports WHERE account_id IN (SELECT id FROM accounts WHERE bank = 'TEST' AND account_number = 'metadata-test')"); + await client.query("DELETE FROM accounts WHERE bank = 'TEST' AND account_number = 'metadata-test'"); + client.release(); + await pool.end(); + } +} + +run(); diff --git a/backend/src/services/import.ts b/backend/src/services/import.ts index 3d96e55..e9cde1f 100644 --- a/backend/src/services/import.ts +++ b/backend/src/services/import.ts @@ -154,6 +154,7 @@ function validateSemantics(data: StatementFile): ValidationError | null { export async function importStatement( body: unknown, + db: Pick = pool, ): Promise { const structErr = validateStructure(body); if (structErr) return structErr; @@ -162,7 +163,7 @@ export async function importStatement( const semErr = validateSemantics(data); if (semErr) return semErr; - const client = await pool.connect(); + const client = await db.connect(); try { await client.query('BEGIN');