const { test } = require('node:test') const assert = require('node:assert/strict') const fs = require('node:fs') const path = require('node:path') const source = fs.readFileSync(path.join(__dirname, '../../src/views/goauto/syb-inner-codes/index.vue'), 'utf8').split('')[0].replace(/^import .*$/gm, '').replace('export default', 'return') function instance(write = async () => ({ data: { matchJobId: 'test-job', queued: 2 } })) { const writes = []; const messages = [] const options = new Function('rematchSybInnerCodes', 'createRequestId', 'ElMessage', source)(async body => { writes.push(body); return write(body) }, () => 'isolated-id', { success: m => messages.push(m), warning: m => messages.push(m) }) const vm = { ...options.data(), ...options.methods, load: async () => {}, startPolling: () => {} } for (const [key, get] of Object.entries(options.computed)) Object.defineProperty(vm, key, { get: () => get.call(vm) }) vm.items = ['pending', 'failed', 'skipped', 'updated', 'ready', 'needs_check', 'matching'].map((status, i) => ({ id: i + 1, status, businessDate: '2026-09-29' })) return { vm, writes, messages } } test('initial range and request use local today, clear explicitly removes it', () => { const { vm } = instance(); const now = new Date(); const today = `${now.getFullYear()}-${String(now.getMonth()+1).padStart(2,'0')}-${String(now.getDate()).padStart(2,'0')}` assert.deepEqual(vm.dateRange, [today, today]); assert.equal(vm.query.dateFrom, today); assert.equal(vm.query.dateTo, today) vm.clearFilters(); assert.equal(vm.dateRange, null); assert.equal(vm.query.dateFrom, '') }) test('mixed selection submits only current page eligible rows, does not auto apply', async () => { const { vm, writes } = instance(); vm.selected = [...vm.items, { id: 999, status: 'failed' }] assert.equal(vm.matchEligibleCount, 3); await vm.matchSelected(); assert.deepEqual(writes[0].ids, [1, 2, 3]); assert.equal(writes.length, 1); assert.equal(vm.activeJob.id, 'test-job'); assert.equal(vm.activeBatch, null) await vm.matchSelected(); assert.equal(writes.length, 1) }) test('busy, loading, error and empty selection do not submit', async () => { for (const field of ['busy', 'importing', 'loading', 'loadError']) { const { vm, writes } = instance(); vm.selected = [vm.items[0]]; vm[field] = field === 'loadError' ? 'error' : true await vm.matchSelected(); assert.equal(writes.length, 0) } const { vm, writes } = instance(); await vm.matchSelected(); assert.equal(writes.length, 0) }) test('mixed dates warn without writes', async () => { const { vm, writes, messages } = instance(); vm.items[1].businessDate = '2026-09-28'; vm.selected = vm.items.slice(0, 2) await vm.matchSelected(); assert.equal(writes.length, 0); assert.equal(messages.length, 1) }) test('submission error retains selection and releases busy flag', async () => { const { vm } = instance(async () => { throw new Error('test-only error') }); vm.selected = [vm.items[0]] await assert.rejects(vm.matchSelected()); assert.equal(vm.matchSubmitting, false); assert.equal(vm.selected.length, 1); assert.equal(vm.activeJob, null) })