const assert = require('node:assert/strict'); const test = require('node:test'); const runUpsertWithPayload = async (payload) => { const queries = []; const client = { query: async (sql, params) => { queries.push({ sql, params }); return { rows: [] }; }, release: () => { queries.push({ sql: 'RELEASE' }); } }; const dbPath = require.resolve('../db'); const servicePath = require.resolve('../services/ordersService'); const originalDbCache = require.cache[dbPath]; const originalServiceCache = require.cache[servicePath]; delete require.cache[servicePath]; require.cache[dbPath] = { id: dbPath, filename: dbPath, loaded: true, exports: { pool: { connect: async () => client } } }; try { const { upsertOrders } = require('../services/ordersService'); await upsertOrders(payload); } finally { delete require.cache[servicePath]; if (originalServiceCache) { require.cache[servicePath] = originalServiceCache; } if (originalDbCache) { require.cache[dbPath] = originalDbCache; } else { delete require.cache[dbPath]; } } return queries.find(query => query.sql.includes('INSERT INTO orders')); }; const assertPreservesEmptyConflictValue = (sql, fieldName) => { assert.match( sql, new RegExp(`${fieldName} = COALESCE\\(NULLIF\\(EXCLUDED\\.${fieldName}, ''\\), orders\\.${fieldName}\\)`) ); }; test('upsertOrders persists non-empty Tiny ERP metadata columns', async () => { const insert = await runUpsertWithPayload([{ Nome_Cliente: 'Cliente Teste', Data_Pedido: '28/05/2026', Valor_Pedido: '120.50', ID_Produto: 'SKU-1', Descricao_Produto: 'Produto', Quantidade: '2', Valor_Unitario: '60.25', ID_Pedido: 'ORDER-1', Fone_Cliente: '(16) 99999-9999', cliente_nome_fantasia: 'Cliente Fantasia', id_vendedor: 'VEN-1', nome_vendedor: 'Maria', marketplace: 'Mercado Livre', canal_venda: 'Online', numero_ecommerce: 'EC-987' }]); assert.ok(insert); assert.equal(insert.params.length, 16); assert.deepEqual(insert.params.slice(9), [ '(16) 99999-9999', 'Cliente Fantasia', 'VEN-1', 'Maria', 'Mercado Livre', 'Online', 'EC-987' ]); }); test('upsertOrders preserves existing phone and metadata when incoming values are empty', async () => { const insert = await runUpsertWithPayload([{ Nome_Cliente: 'Cliente Teste', Data_Pedido: '28/05/2026', Valor_Pedido: '120.50', ID_Produto: 'SKU-1', Descricao_Produto: 'Produto', Quantidade: '2', Valor_Unitario: '60.25', ID_Pedido: 'ORDER-1', Fone_Cliente: '', cliente_nome_fantasia: '', id_vendedor: '', nome_vendedor: '', marketplace: '', canal_venda: '', numero_ecommerce: '' }]); assert.ok(insert); [ 'cliente_fone', 'cliente_nome_fantasia', 'id_vendedor', 'nome_vendedor', 'marketplace', 'canal_venda', 'numero_ecommerce' ].forEach(fieldName => assertPreservesEmptyConflictValue(insert.sql, fieldName)); assert.deepEqual(insert.params.slice(9), ['', '', '', '', '', '', '']); }); test('upsertOrders keeps existing payloads without Tiny ERP metadata working', async () => { const insert = await runUpsertWithPayload([{ Nome_Cliente: 'Cliente Teste', Data_Pedido: '28/05/2026', Valor_Pedido: '120.50', ID_Produto: 'SKU-1', Descricao_Produto: 'Produto', Quantidade: '2', Valor_Unitario: '60.25', ID_Pedido: 'ORDER-1' }]); assert.ok(insert); assert.equal(insert.params.length, 16); assert.deepEqual(insert.params.slice(9), ['', '', '', '', '', '', '']); assert.match(insert.sql, /quantidade = EXCLUDED\.quantidade/); assert.match(insert.sql, /valor_unitario = EXCLUDED\.valor_unitario/); assertPreservesEmptyConflictValue(insert.sql, 'cliente_fone'); assertPreservesEmptyConflictValue(insert.sql, 'cliente_nome_fantasia'); });