import { describe, expect, it } from 'vitest'; import { GENERAL_FORM_FIELDS, GeneralSettingsForm, toFormValues, toSettingsPatch, } from './admin-settings-form'; describe('admin general settings form model (issue #322)', () => { // The regression this file exists for: a dotted field name makes // react-hook-form nest the typed value and the strict PATCH schema // reject the body — the form then looks fine but never saves. it('uses no dots in any form field name', () => { for (const field of Object.keys(GENERAL_FORM_FIELDS)) { expect(field).not.toContain('.'); } }); it('round-trips settings through form values back to a flat patch', () => { const settings = { 'instance.name': 'My Wiki', 'instance.defaultLocale': 'de', 'auth.registrationMode': 'closed', 'invitations.maxOpenPerUser': 5, 'classification.newPageDefault': 'unclassified', 'classification.uploadPolicy': 'warn', 'quota.editorsPerPond': 5, 'quota.readersPerPond': 50, 'quota.additionalPonds': 0, 'quota.storageBytes': 1024, 'quota.maxFileBytes': 25, }; expect(toSettingsPatch(toFormValues(settings))).toEqual(settings); }); it('patches only the settings this form edits, under their dotted keys', () => { const input: GeneralSettingsForm = { instanceName: 'Renamed', defaultLocale: 'en', registrationMode: 'open', invitationsMaxOpenPerUser: 5, newPageClassification: 'vs_nfd', uploadPolicy: 'block', quotaEditorsPerPond: 1, quotaReadersPerPond: 2, quotaAdditionalPonds: 3, quotaStorageBytes: 4, quotaMaxFileBytes: 5, }; const patch = toSettingsPatch(input); expect(patch['instance.name']).toBe('Renamed'); expect(Object.keys(patch).sort()).toEqual(Object.values(GENERAL_FORM_FIELDS).slice().sort()); }); });