feat(editor): F4.6d the web browser and web server on a computer's desktop
The oracle BrowserWindowRun uses Java's browser and web server windows as a person does; the room keeps a browser window per computer and sends a program window's view, the start names the person's language. The editor shows the page in a sandboxed frame, links and forms go to the room, the web server has its button, virtual hosts and lines. Better than Java: relative images and links count from the page's folder, a mark stays in the page, the error page from Java's template, the virtual hosts' file with complete rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
// A server's lines as Java's web server window wrote them
|
||||
// (packages/sim/test/browserWindow.java.json, BrowserWindowRun): each kind
|
||||
// the window got there, in Java's words.
|
||||
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import type { ServerLogEntry } from '@mdg-filius/core';
|
||||
import { serverLine } from '../src/desktop/serverLines.js';
|
||||
import { translate } from '../src/i18n/i18n.js';
|
||||
|
||||
const java = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../../sim/test/browserWindow.java.json'), 'utf8')) as { steps: { step: string; log?: string }[] };
|
||||
const log = java.steps.find((step) => step.step === 'server:stop')!.log!;
|
||||
const t = (key: string, values?: Readonly<Record<string, string | number>>) => translate('de', key, values);
|
||||
|
||||
describe("a server's lines", () => {
|
||||
it("are Java's, line by line", () => {
|
||||
const [, address, port] = /Verbindung zu ([\d.]+):(\d+) hergestellt/.exec(log)!;
|
||||
const request = 'POST /ziel.html HTTP/1.1\nHost: www.filius.de\n\nname=Fil+ius&c=1&s=y&t=%C3%BC%26%3D&ok=Gut';
|
||||
const answer = 'HTTP/1.1 200 OK\nContent-type: text/html\n\n<html><head><title>Ziel</title></head><body>Ziel</body></html>';
|
||||
const entries: ServerLogEntry[] = [
|
||||
{ kind: 'acceptingStarted' },
|
||||
{ kind: 'connectionAccepted', address: address!, port: Number(port) },
|
||||
{ kind: 'received', text: request },
|
||||
{ kind: 'sent', text: answer },
|
||||
{ kind: 'connectionClosed', address: address!, port: Number(port) },
|
||||
{ kind: 'acceptingStopped' },
|
||||
{ kind: 'serverSocketClosed' },
|
||||
];
|
||||
for (const entry of entries) expect(log, entry.kind).toContain(`${serverLine(entry, t)}\n`);
|
||||
expect(log.startsWith(`${serverLine({ kind: 'acceptingStarted' }, t)}\n`)).toBe(true);
|
||||
});
|
||||
|
||||
it('name a failed send and a port that is taken', () => {
|
||||
expect(serverLine({ kind: 'sendFailed', failure: 'timedOut' }, t)).toBe('Zeitüberschreitung während des Versands einer Nachricht');
|
||||
expect(serverLine({ kind: 'sendFailed', failure: 'notConnected' }, (key) => translate('en', key))).toBe('Connection could not be established!');
|
||||
expect(serverLine({ kind: 'serverSocketFailed' }, t)).toBe('Server-Socket konnte nicht geöffnet werden.');
|
||||
expect(serverLine({ kind: 'connectionAccepted', address: '1.2.3.4', port: 5 }, (key, values) => translate('en', key, values))).toBe('Connection to 1.2.3.4:5 established');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user