import test from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { join } from 'node:path'
import { load, draw, here, React, renderToString } from './load.mjs'
const lib = () => import('../src/lib/model.js')
const status = (over = {}) => ({
ok: true, admin: true, serving: ['brave', 'duckduckgo'],
settings: {
order: ['brave', 'duckduckgo'],
providers: [
{ name: 'brave', keyed: true, keySet: true, ready: true },
{ name: 'tavily', keyed: true, keySet: false, ready: false, missing: 'no key' },
{ name: 'google', keyed: true, keySet: false, ready: false, missing: 'no key and no search engine ID' },
{ name: 'keenable', keyed: true, keySet: false, ready: true },
{ name: 'searxng', keyed: false, keySet: false, ready: false, missing: 'no address' },
{ name: 'duckduckgo', keyed: false, keySet: false, ready: true },
],
googleEngine: '', searxngUrl: '',
},
...over,
})
test('settings: only an administrator gets the settings', async () => {
const { settingsModel } = await lib()
assert.equal(settingsModel(status({ admin: false })).hidden, true)
assert.equal(settingsModel(null).hidden, true)
assert.equal(settingsModel({ ok: false, error: 'x' }).hidden, true)
assert.equal(settingsModel(status()).hidden, false)
})
test('settings: the providers of the order come first, in order', async () => {
const { settingsModel, draftOf, rows, move, toggle } = await lib()
const m = settingsModel(status())
let d = draftOf(m)
assert.deepEqual(rows(m, d).map(r => [r.name, r.on]), [['brave', true], ['duckduckgo', true], ['tavily', false], ['google', false], ['keenable', false], ['searxng', false]])
d = move(d, 'duckduckgo', -1)
assert.deepEqual(d.order, ['duckduckgo', 'brave'])
assert.deepEqual(move(d, 'duckduckgo', -1).order, ['duckduckgo', 'brave'], 'the first stays first')
d = toggle(d, 'tavily')
assert.deepEqual(d.order, ['duckduckgo', 'brave', 'tavily'])
assert.deepEqual(toggle(d, 'brave').order, ['duckduckgo', 'tavily'])
})
test('settings: a saved key is never sent back, a typed one is, and a removal is explicit', async () => {
const { settingsModel, draftOf, setKey, clearKey, change } = await lib()
const d = draftOf(settingsModel(status()))
assert.deepEqual(change(d), { order: ['brave', 'duckduckgo'], googleEngine: '', searxngUrl: '' })
assert.deepEqual(change(setKey(d, 'tavily', ' abcdefghij ')).keys, { tavily: 'abcdefghij' })
const cleared = clearKey(d, 'brave')
assert.deepEqual(change(cleared).clear, ['brave'])
assert.equal(change(cleared).keys, undefined)
assert.deepEqual(setKey(cleared, 'brave', 'newkey12345').clear, [], 'typing a new key cancels the removal')
})
test('settings: the test rows keep known providers and text only', async () => {
const { testRows } = await lib()
assert.deepEqual(testRows({ ok: true, providers: [{ name: 'brave', ok: true, ready: true, results: 3, host: 'api.search.brave.com' }, { name: 'nope' }, { name: 'tavily', ready: false, error: 'no key' }] }), [
{ name: 'brave', ok: true, ready: true, results: 3, host: 'api.search.brave.com', error: '' },
{ name: 'tavily', ok: false, ready: false, results: 0, host: '', error: 'no key' },
])
assert.deepEqual(testRows({ ok: false }), [])
})
test('settings: the view draws the order, the key state as text and no saved key', async () => {
const { settingsModel, draftOf } = await lib()
const { mod, sdk } = await load()
const addon = await mod.createAddon(sdk)
const View = addon.components.WebSettingsView
const m = settingsModel(status({ settings: { ...status().settings, note: '' } }))
const html = renderToString(React.createElement(View, { model: m, draft: draftOf(m), busy: false, error: '', saved: false, tests: [], onDraft() {}, onSave() {}, onTest() {} }))
assert.ok(!html.includes('