import Gio from 'gi://Gio'; import GLib from 'gi://GLib'; import { SettingsEditor } from '../apps/gnome-extension/jarvis@qvac.local/settings-editor.js'; const configDir = GLib.get_user_config_dir(); if (!configDir.startsWith('/tmp/jarvis-settings-')) throw new Error('Use an isolated /tmp/jarvis-settings-* XDG_CONFIG_HOME for this check'); const root = Gio.File.new_for_uri(import.meta.url).get_parent().get_parent().get_path(); const directory = `${root}/apps/gnome-extension/jarvis@qvac.local`; GLib.mkdir_with_parents(`${configDir}/jarvis`, 0o700); const file = Gio.File.new_for_path(`${configDir}/jarvis/config.json`); const write = text => file.replace_contents(text, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); const read = () => new TextDecoder().decode(file.load_contents(null)[1]); write(JSON.stringify({ ttsEnabled: false, unrelated: 'original' })); const editor = new SettingsEditor(directory); if (editor.values.ttsEnabled !== false) throw new Error('Existing settings were lost'); editor.setValue(editor.fields.find(f => f.key === 'voiceId'), 'M5'); write(JSON.stringify({ ttsEnabled: false, unrelated: 'updated elsewhere', ttsSpeed: 1.25 })); editor.save(); const saved = JSON.parse(read()); if (saved.voiceId !== 'M5' || saved.ttsSpeed !== 1.25 || saved.unrelated !== 'updated elsewhere' || saved.ttsEnabled !== false) throw new Error('Settings merge failed'); write('{ invalid JSON'); let refused = false; try { editor.save(); } catch { refused = true; } if (!refused || read() !== '{ invalid JSON') throw new Error('Invalid JSON was overwritten'); file.delete(null); print('Settings store smoke passed: existing values, concurrent merge, malformed-file protection');