mirror of
https://github.com/hansjone/netxops.git
synced 2026-10-20 03:51:01 +08:00
Fix preset publication, volatile settings and client form binding
This commit is contained in:
parent
fe0fe70d33
commit
0b9a3a82bc
66 changed files with 8546 additions and 3690 deletions
71
test/publication-form.test.mjs
Normal file
71
test/publication-form.test.mjs
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { CardForm, booleanFieldPersistFalse, textField, presetIdsField } from '../src/client/card-form.ts'
|
||||
|
||||
function formScope(options = {}) {
|
||||
const value = { groupOpsPublic: false, groupOpsPresets: 'standard', apiUrl: 'http://saved' }
|
||||
const listeners = new Set(), writes = []
|
||||
const scope = { getSnapshot: () => ({ status: 'ready', writable: true, value, base: { ...value }, user: { ...value } }),
|
||||
subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn) },
|
||||
async set(field, next) {
|
||||
writes.push([field, next]); await options.beforeWrite?.()
|
||||
if (options.fail) throw new Error('save failed')
|
||||
value[field] = next; for (const fn of listeners) fn()
|
||||
}, async unset(field) { delete value[field] } }
|
||||
return { scope, value, writes }
|
||||
}
|
||||
const specs = [booleanFieldPersistFalse('groupOpsPublic'), textField('apiUrl'), presetIdsField('groupOpsPresets')]
|
||||
|
||||
test('publication autosave does not commit unrelated drafts', async () => {
|
||||
const { scope, value, writes } = formScope()
|
||||
const form = new CardForm(scope, specs), actions = form.actions()
|
||||
actions.edit('apiUrl', 'http://draft')
|
||||
actions.edit('groupOpsPublic', 'true')
|
||||
await form.save(['groupOpsPublic'])
|
||||
assert.equal(value.apiUrl, 'http://saved')
|
||||
assert.equal(form.field('apiUrl').text, 'http://draft')
|
||||
assert.deepEqual(writes, [['groupOpsPublic', true]])
|
||||
assert.equal(form.shell().dirty, true)
|
||||
})
|
||||
|
||||
test('rapid on then off saves the latest edit without losing it', async () => {
|
||||
let resolveWrite, started
|
||||
const ready = new Promise(resolve => { started = resolve })
|
||||
const gate = new Promise(resolve => { resolveWrite = resolve })
|
||||
let first = true
|
||||
const { scope, value, writes } = formScope({ beforeWrite: async () => { if (first) { first = false; started(); await gate } } })
|
||||
const form = new CardForm(scope, specs), actions = form.actions()
|
||||
actions.edit('groupOpsPublic', 'true')
|
||||
const one = form.save(['groupOpsPublic'])
|
||||
await ready
|
||||
actions.edit('groupOpsPublic', 'false')
|
||||
const two = form.save(['groupOpsPublic'])
|
||||
resolveWrite()
|
||||
await Promise.all([one, two])
|
||||
assert.deepEqual(writes, [['groupOpsPublic', true], ['groupOpsPublic', false]])
|
||||
assert.equal(value.groupOpsPublic, false)
|
||||
assert.equal(form.shell().dirty, false)
|
||||
})
|
||||
|
||||
test('write failure releases saving state and retains draft for retry', async () => {
|
||||
const options = { fail: true }, { scope, value } = formScope(options)
|
||||
const form = new CardForm(scope, specs)
|
||||
form.actions().edit('groupOpsPublic', 'true')
|
||||
await form.save(['groupOpsPublic'])
|
||||
assert.equal(form.shell().saving, false)
|
||||
assert.equal(form.shell().failed, true)
|
||||
assert.equal(form.shell().dirty, true)
|
||||
options.fail = false
|
||||
await form.save(['groupOpsPublic'])
|
||||
assert.equal(value.groupOpsPublic, true)
|
||||
assert.equal(form.shell().failed, false)
|
||||
})
|
||||
|
||||
test('empty target selection persists an explicit override', async () => {
|
||||
const { scope, value, writes } = formScope()
|
||||
const form = new CardForm(scope, specs)
|
||||
form.actions().edit('groupOpsPresets', '')
|
||||
await form.save(['groupOpsPresets'])
|
||||
assert.equal(value.groupOpsPresets, '')
|
||||
assert.deepEqual(writes, [['groupOpsPresets', '']])
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue