feat(scan): support iX1600 duplex scanning on Linux
This commit is contained in:
72
frontend/tests/file-scan.test.cjs
Normal file
72
frontend/tests/file-scan.test.cjs
Normal file
@@ -0,0 +1,72 @@
|
||||
const { test } = require('node:test')
|
||||
const assert = require('node:assert/strict')
|
||||
const fs = require('node:fs')
|
||||
const vm = require('node:vm')
|
||||
const vue = require('vue')
|
||||
|
||||
async function setup(getJob) {
|
||||
const notices = []
|
||||
const requests = []
|
||||
let unmount
|
||||
const context = vm.createContext({
|
||||
ref: vue.ref, reactive: vue.reactive, computed: vue.computed, watch: vue.watch,
|
||||
onBeforeUnmount: handler => { unmount = handler },
|
||||
defineProps: () => ({ scanData: { folder: 'folder-1', type: 'document' } }),
|
||||
defineEmits: () => () => {},
|
||||
useModal: () => ({ close() {} }),
|
||||
useToast: () => ({ add: notice => notices.push(notice) }),
|
||||
setTimeout: callback => queueMicrotask(callback),
|
||||
useNuxtApp: () => ({ $api: async (url, options) => {
|
||||
requests.push({ url, options })
|
||||
if (url === '/api/instance-agents') return { agents: [{ id: 'agent', active: true, capabilities: { scan: true }, scannerNames: ['fujitsu:ScanSnap iX1600:test'] }] }
|
||||
if (url === '/api/scan-jobs') return { job: { id: 'job' } }
|
||||
return getJob()
|
||||
} }),
|
||||
})
|
||||
const source = fs.readFileSync(`${__dirname}/../components/FileScanModal.vue`, 'utf8').split('<script setup>')[1].split('</script>')[0]
|
||||
vm.runInContext(source, context)
|
||||
await new Promise(setImmediate)
|
||||
return { run: code => vm.runInContext(code, context), notices, requests, close: () => unmount() }
|
||||
}
|
||||
|
||||
test('duplex scanning continues past the former three-minute polling limit', async () => {
|
||||
let polls = 0
|
||||
const ui = await setup(() => ({ job: { status: ++polls > 95 ? 'completed' : 'running', agentMessage: '4 Seiten gescannt.' } }))
|
||||
await ui.run('startScan()')
|
||||
assert.equal(polls, 96)
|
||||
assert.equal(ui.notices[0].title, 'Scan gespeichert')
|
||||
const body = ui.requests.find(request => request.url === '/api/scan-jobs').options.body
|
||||
assert.equal(body.settings.source, 'ADF Duplex')
|
||||
assert.equal(body.settings.paperSize, 'A4')
|
||||
assert.equal(body.target.folder, 'folder-1')
|
||||
})
|
||||
|
||||
test('temporary status connection failures do not create duplicate scans', async () => {
|
||||
let polls = 0
|
||||
const ui = await setup(() => {
|
||||
if (++polls < 3) throw Error('offline')
|
||||
return { job: { status: 'completed' } }
|
||||
})
|
||||
await ui.run('startScan()')
|
||||
assert.equal(ui.requests.filter(request => request.url === '/api/scan-jobs').length, 1)
|
||||
assert.equal(ui.notices[0].title, 'Scan gespeichert')
|
||||
})
|
||||
|
||||
test('closing the modal stops polling without reporting that a background scan failed', async () => {
|
||||
const ui = await setup(() => { throw Error('must not poll') })
|
||||
ui.close()
|
||||
assert.equal(await ui.run('waitForJob("job")'), null)
|
||||
assert.equal(ui.notices.length, 0)
|
||||
})
|
||||
|
||||
test('iX1600 preset resets image settings and normalizes the output filename to PDF', async () => {
|
||||
const ui = await setup(() => ({}))
|
||||
ui.run('scanForm.format="png"; scanForm.source="Flatbed"; scanForm.filename="document.png"; scanForm.postprocess=true')
|
||||
await new Promise(setImmediate)
|
||||
ui.run('applyIx1600Preset()')
|
||||
await new Promise(setImmediate)
|
||||
assert.equal(ui.run('scanForm.format'), 'pdf')
|
||||
assert.equal(ui.run('scanForm.filename'), 'document.pdf')
|
||||
assert.equal(ui.run('scanForm.postprocess'), false)
|
||||
assert.equal(ui.run('scanForm.resolution'), 300)
|
||||
})
|
||||
Reference in New Issue
Block a user