Files
odysseus/tests/editorRichUpdate.mjs
T
Alexandre Teixeira f74a262f73 merge: reconcile PR 40 with current lab
Integrate lab fff55a78 into PR #40 (cc25d5ba). Lab's modular email
backend/frontend, modular settings, split stylesheets (static/style.css
stays deleted), procfs compatibility, and request-scoped TurnContract
authority win; PR #40's routing classifiers, editor/email/task features,
and style.css changes are ported into lab's module and stylesheet homes.

Integration fixes:
- settings/api.js imports ui.js under its canonical versioned URL
- browser observations keep legacy CAPTCHA/access-block evidence
- artifact turns do not re-trigger broad-web research recovery
- env reference documents PR test-tool variables; page regenerated

PR #40 defects surfaced by lab gates and fixed here:
- web_fetch generic schema drops top-level anyOf (OpenAI contract);
  the compact preview contract still requires url or urls
- get_weather registered as a brokered network read
- new lazy editor modules precached for offline use
- SearXNG pin mirrored into GPU standalone compose files
- image model picker again skips offline endpoints

Tests updated where PR #40 changed behaviour on purpose, and PR tests
moved onto lab's document_source helpers.
2026-10-01 05:03:58 +01:00

50 lines
2.9 KiB
JavaScript

import assert from 'node:assert/strict';
import { documentSource } from './helpers/document_source.mjs';
import { chromium } from 'playwright';
const source = documentSource();
function extract(name) {
const start = source.indexOf(` function ${name}(`);
const rest = source.slice(start + 2);
const next = rest.slice(10).search(/\n (?:export )?(?:async )?function /);
return rest.slice(0, next + 10);
}
const functions = ['_showRichTextEditor', '_syncEmailRichbody'].map(extract).join('\n');
const browser = await chromium.launch({headless:true});
try {
const page = await browser.newPage();
await page.setContent('<div class="doc-editor-pane"><div id="doc-editor-wrap"></div><textarea id="doc-editor-textarea"></textarea><div id="doc-email-richbody" contenteditable="true"></div></div>');
const result = await page.evaluate(async (functions) => {
const docs = new Map(); const activeDocId = 'fixture';
let _richInlineCodeTypingArmed = false;
const _clearRichImageSelection = () => {};
const _normalizeRichTextImages = () => {};
const _normalizeRichChecklists = () => {};
const _normalizeRichInlineCode = () => {};
const _wireEmailRichbody = () => {};
const _syncRichEmptyImport = () => {};
const _isRichTextLang = lang => lang === 'richtext';
const _sanitizedRichTextHtml = rich => rich.innerHTML;
const _richTextContentToHtml = content => content;
const _emailRichbodyActive = () => document.getElementById('doc-email-richbody');
const newContent = '<p>This sentence needs work.</p><p><strong>Keep this.</strong></p>';
const doc = {id:activeDocId, language:'richtext',content:newContent}; docs.set(activeDocId,doc);
eval(functions + '\n_showRichTextEditor(doc);');
return {overlayGone:!document.querySelector('.doc-rich-diff-overlay'),rich:_emailRichbodyActive().innerHTML,mirror:document.getElementById('doc-editor-textarea').value,content:doc.content,newContent};
}, functions);
assert.equal(result.overlayGone, true);
assert.equal(result.rich,result.newContent); assert.equal(result.mirror,result.newContent); assert.equal(result.content,result.newContent);
const discardSource = source.slice(source.indexOf(' function exitDiffMode('), source.indexOf(' function isDiffModeActive('));
const staleSaveCount = await page.evaluate(discardSource => {
let _diffModeActive = true, _diffChunks = [], _diffOldContent = 'stale text', _diffNewContent = 'saved text', _diffUnresolvedCount = 1;
let saves = 0;
const saveDocument = () => { saves++; };
const syncHighlighting = () => {};
const updateLineNumbers = () => {};
eval(discardSource + '\nexitDiffMode(true, { persist: false });');
return saves;
}, discardSource);
assert.equal(staleSaveCount, 0);
console.log('PASS: saved rich-text changes appear immediately with no transient diff overlay.');
console.log('PASS: clearing a stale review diff cannot overwrite a newer saved edit.');
} finally {await browser.close();}