import { describe, test } from 'node:test'; import assert from 'node:assert'; import { RecordsModel } from '../src/data/index.js'; const rows = [ { id: 1, name: 'Northwind', status: 'open', total: 1200 }, { id: 2, name: 'Blue Harbor', status: 'review', total: 800 }, { id: 3, name: 'Summit', status: 'open', total: 2400 }, { id: 4, name: 'Lattice', status: 'closed', total: 400 } ]; describe('RecordsModel', () => { test('queryStructure infers columns from row data', async () => { const model = new RecordsModel({ rows }); const result = await model.queryStructure(); assert.ok(result.columns.name); assert.ok(result.columns.status); assert.ok(result.columns.total); assert.strictEqual(result.columns.total.align, 'right'); }); test('queryRecords filters, sorts, and paginates', async () => { const model = new RecordsModel({ rows }); const result = await model.queryRecords({ filter_by: { status: 'open' }, sort_by: [{ field: 'total', direction: 'desc' }], offset: 0, page_size: 1 }); assert.strictEqual(result.total, 2); assert.strictEqual(result.rows.length, 1); assert.strictEqual(result.rows[0].name, 'Summit'); }); test('queryRecords supports text search through search filter', async () => { const model = new RecordsModel({ rows }); const result = await model.queryRecords({ filter_by: { search: 'harbor' } }); assert.strictEqual(result.total, 1); assert.strictEqual(result.rows[0].name, 'Blue Harbor'); }); test('querySummary supports count and sum metrics', async () => { const model = new RecordsModel({ rows }); const result = await model.querySummary( { filter_by: { status: 'open' } }, ['count', 'sum:total'] ); assert.strictEqual(result.values.count, 2); assert.strictEqual(result.values['sum:total'], 3600); }); });