← Public packages
@kody/mailroom
Offline-first PWA for your Kody mailbox: sent and received threads, copy-prompt for agents, no send.
src/ui/page.node.test.ts
46 lines · 1.9 KB · TypeScriptimport assert from 'node:assert/strict'
import test from 'node:test'
import { LOCAL_THREADS_KEY } from './client-script.ts'
import { renderAppPage } from './page.ts'
import { serviceWorkerScript } from './sw-script.ts'
test('app page is an installable offline mail client with copy-prompt', () => {
const html = renderAppPage({
appBasePath: '/packages/mailroom',
hostedUrl: 'https://kody.kody.run/packages/mailroom',
})
assert.match(html, /data-base="\/packages\/mailroom\/"/)
assert.match(html, /indexedDB\.open/)
assert.match(html, new RegExp(LOCAL_THREADS_KEY))
assert.match(html, /navigator\.serviceWorker\.register/)
assert.match(html, /beforeinstallprompt/)
assert.match(html, /popovertarget="mailroom-install-popover"/)
assert.match(html, /data-install-steps/)
assert.match(html, /appinstalled/)
assert.match(html, />Received</)
assert.match(html, />Sent</)
assert.match(html, /Copy thread prompt/)
assert.match(html, /Copy prompt/)
assert.match(html, /data-direction="inbound"/)
assert.match(html, /data-direction="outbound"/)
assert.match(html, /<h1>Mailroom<\/h1>/)
assert.match(html, /data-about/)
assert.match(html, /favicon\.png/)
assert.match(html, /apple-touch-icon\.png/)
assert.equal(html.toLowerCase().includes('compose'), false)
assert.equal(html.includes('mailto:'), false)
assert.match(html, /read-only; do not send/)
assert.match(html, /startInboxPoll/)
assert.match(html, /api\/status/)
const refreshAt = html.indexOf('refresh({ force: true }).then')
const swAt = html.indexOf('navigator.serviceWorker.register')
assert.ok(refreshAt > 0 && swAt > 0 && swAt < refreshAt)
})
test('service worker caches the PWA shell', () => {
const script = serviceWorkerScript('/packages/mailroom')
assert.match(script, /mailroom-v2/)
assert.match(script, /\/packages\/mailroom\/manifest.webmanifest/)
assert.match(script, /networkFirst/)
assert.match(script, /cacheFirst/)
})