/** * USB kiosk settings save. * * The page used to send every field as 'true'/'false', token included, so one * save replaced the kiosk device token with the word 'true' and every * provisioned kiosk then got 404. The token must travel as text: the mask back * unchanged (the server keeps the stored token) or a newly generated value. */ import { describe, it, expect, vi, beforeEach } from 'vitest' import { mount, flushPromises } from '@vue/test-utils' vi.mock('@/api', () => ({ settingsApi: { list: vi.fn(), update: vi.fn() } })) vi.mock('@/utils/basePath', () => ({ withBase: (path) => path })) import { settingsApi } from '@/api' import USBSettings from './USBSettings.vue' const MASK = '********' async function render(rows) { settingsApi.list.mockResolvedValue({ data: { data: rows } }) settingsApi.update.mockResolvedValue({ data: { status: 'success' } }) const wrapper = mount(USBSettings) await flushPromises() return wrapper } function saved() { return Object.fromEntries(settingsApi.update.mock.calls) } describe('USBSettings save', () => { beforeEach(() => { settingsApi.list.mockReset() settingsApi.update.mockReset() }) it('sends the masked token back unchanged, not true', async () => { const wrapper = await render([ { key: 'usb_kiosk_enabled', value: 'true' }, { key: 'usb_kiosk_allow_return_for_others', value: 'false' }, { key: 'usb_kiosk_token', value: MASK }, ]) await wrapper.find('button.btn-primary').trigger('click') await flushPromises() expect(saved()).toEqual({ usb_kiosk_enabled: 'true', usb_kiosk_allow_return_for_others: 'false', usb_kiosk_token: MASK, usb_kiosk_allowed_cidrs: '', }) }) it('saves the network allowlist as text, not as true/false', async () => { // Same trap the token fell into: a text setting sent through the boolean // path becomes the word 'true', and the gate then admits nobody while the // settings page still shows something plausible. const wrapper = await render([ { key: 'usb_kiosk_enabled', value: 'true' }, { key: 'usb_kiosk_allowed_cidrs', value: '192.0.2.0/24, 198.51.100.0/24' }, ]) await wrapper.find('button.btn-primary').trigger('click') await flushPromises() expect(saved().usb_kiosk_allowed_cidrs).toBe('192.0.2.0/24, 198.51.100.0/24') }) it('saves a generated token as the token itself', async () => { const wrapper = await render([ { key: 'usb_kiosk_enabled', value: 'true' }, { key: 'usb_kiosk_token', value: '' }, ]) const generate = wrapper.findAll('button').find(b => b.text() === 'Generate') await generate.trigger('click') await wrapper.find('button.btn-primary').trigger('click') await flushPromises() expect(saved().usb_kiosk_token).toMatch(/^[0-9a-f]{48}$/) }) it('keeps an unset token empty', async () => { const wrapper = await render([{ key: 'usb_kiosk_token', value: '' }]) await wrapper.find('button.btn-primary').trigger('click') await flushPromises() expect(saved().usb_kiosk_token).toBe('') }) })