import 'reflect-metadata'; import assert from 'node:assert/strict'; import test from 'node:test'; import type { DataSource, EntityManager } from 'typeorm'; import { AssetHistoryService } from '../../src/asset-master/asset-history.service'; import { AssetVersionChangeType } from '../../src/database/entities/asset-version.entity'; import type { AuthPrincipal, RequestWithContext } from '../../src/common/http/request-context'; test('asset history capture increments then reads current_version before inserting the revision', async () => { const calls: Array<{ sql: string; parameters: unknown[] }> = []; const manager = { query: async (sql: string, parameters: unknown[] = []) => { calls.push({ sql, parameters }); if (/^\s*UPDATE assets/i.test(sql)) return []; if (/^\s*SELECT current_version/i.test(sql)) return [{ current_version: 1 }]; if (/FROM asset_versions/i.test(sql)) return []; if (/^\s*INSERT INTO asset_versions/i.test(sql)) return []; throw new Error(`Consulta no esperada en test: ${sql}`); }, } as unknown as EntityManager; const service = new AssetHistoryService({} as DataSource); (service as unknown as { loadCurrentSnapshot: () => Promise> }) .loadCurrentSnapshot = async () => ({ id: 'asset-1', currentVersion: 1 }); const principal = { userId: '00000000-0000-4000-8000-000000000001', username: 'admin', sessionId: 'test', firstName: 'Admin', lastName: 'Test', email: null, mustChangePassword: false, roles: ['admin'], permissions: [], transport: 'cookie', } as AuthPrincipal; const request = { requestId: 'test-request' } as RequestWithContext; const version = await service.capture( manager, '00000000-0000-4000-8000-000000000002', AssetVersionChangeType.CREATED, principal, request, ); assert.equal(version, 1); assert.match(calls[0].sql, /COALESCE\(current_version, 0\) \+ 1/); assert.match(calls[1].sql, /SELECT current_version/); const insert = calls.find((call) => /INSERT INTO asset_versions/i.test(call.sql)); assert.ok(insert); assert.equal(insert.parameters[1], 1); });