Add support for message history pagination, preserve scroll in rendering, and improve draft/message workflows.
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { appendAttachments, createAttachmentComposer } from "../public/js/attachments.js";
|
||||
import {createDraftStore} from "../public/js/draftStore.js";
|
||||
|
||||
class Element {
|
||||
constructor() { this.children = []; this.listeners = {}; this.classList = { add() { }, remove() { } }; }
|
||||
@@ -13,6 +14,34 @@ class Element {
|
||||
addEventListener(name, listener) { this.listeners[name] = listener; }
|
||||
click() { this.clicked = true; }
|
||||
}
|
||||
|
||||
test("uploaded draft references recover after reload and unavailable images cannot be sent", async t => {
|
||||
const elements = Object.fromEntries(["attachImage", "imagePicker", "uploadPreviews", "composer"].map(id => [id, new Element()]));
|
||||
const originalDocument = globalThis.document;
|
||||
t.after(() => { globalThis.document = originalDocument; });
|
||||
globalThis.document = {getElementById: id => elements[id], querySelector: () => elements.composer, createElement: () => new Element()};
|
||||
t.mock.method(globalThis, "fetch", async () => Response.json({maxFiles: 5, maxSizeMb: 10}));
|
||||
const values = new Map();
|
||||
const storage = {getItem: key => values.get(key), setItem: (key, value) => values.set(key, value)};
|
||||
const saved = createDraftStore("alice", {storage});
|
||||
const metadata = {id: "12345678-1234-1234-1234-123456789abc", originalName: "draft.png"};
|
||||
saved.setAttachments(7, [metadata]);
|
||||
const composer = createAttachmentComposer({onChange() {}, onError: message => assert.fail(message)});
|
||||
composer.setDraftStore(createDraftStore("alice", {storage}));
|
||||
composer.restoreDraft(7);
|
||||
assert.equal(elements.uploadPreviews.children[0].children[0].src, `/attachments/${metadata.id}`);
|
||||
assert.equal(composer.pending, true);
|
||||
elements.uploadPreviews.children[0].children[0].onload();
|
||||
assert.equal(composer.pending, false);
|
||||
assert.deepEqual(composer.attachments, [metadata]);
|
||||
elements.uploadPreviews.children[0].children[0].onerror();
|
||||
assert.equal(composer.pending, true);
|
||||
assert.deepEqual(composer.attachments, []);
|
||||
assert.deepEqual(createDraftStore("alice", {storage}).attachments(7), [metadata]);
|
||||
elements.uploadPreviews.children[0].children.at(-1).onclick();
|
||||
assert.equal(composer.pending, false);
|
||||
assert.deepEqual(createDraftStore("alice", {storage}).attachments(7), []);
|
||||
});
|
||||
test("composer preview, pending state, upload failure/retry, removal, paste, and history rendering", async t => {
|
||||
const originalDocument = globalThis.document, originalFetch = globalThis.fetch;
|
||||
t.after(() => { globalThis.document = originalDocument; globalThis.fetch = originalFetch; });
|
||||
|
||||
Reference in New Issue
Block a user