feat: barre d'outils de lecture epinglee, coloration syntaxique des fichiers de code et avatars predefinis (#115, #117, BUG-078)
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
import { strict as assert } from "node:assert";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
@@ -136,11 +136,46 @@ test("style.css — preview circle and sidebar image rules exist", () => {
|
||||
assert.match(css, /\.sidebar-user-avatar-img\s*\{/, "no .sidebar-user-avatar-img rule");
|
||||
});
|
||||
|
||||
// ── #117: preset avatar gallery ─────────────────────────────────────────────
|
||||
test("index.html — #cfg-profile exposes 12 bundled preset avatars", () => {
|
||||
const section = indexHtml.match(/<section[^>]*id="cfg-profile"[\s\S]*?<\/section>/);
|
||||
assert.ok(section, "#cfg-profile section not found");
|
||||
const html = section[0];
|
||||
assert.match(html, /id="profile-avatar-presets"/, "preset gallery container missing");
|
||||
const buttons = [...html.matchAll(/class="profile-avatar-preset"[^>]*data-avatar="([^"]+)"/g)];
|
||||
assert.equal(buttons.length, 12, `expected 12 preset avatars, found ${buttons.length}`);
|
||||
const names = buttons.map((m) => m[1]);
|
||||
assert.equal(new Set(names).size, 12, "preset avatar names must be unique");
|
||||
for (const name of names) {
|
||||
const rel = path.join(ROOT, "frontend", "icons", "avatar", name);
|
||||
assert.ok(existsSync(rel), `missing avatar file: ${rel}`);
|
||||
assert.ok(html.includes(`/static/icons/avatar/${name}`),
|
||||
`#${name} must be served from /static/icons/avatar/`);
|
||||
}
|
||||
});
|
||||
|
||||
test("config.js — preset avatars reuse the upload pipeline", () => {
|
||||
assert.match(configJs, /profile-avatar-presets/, "preset container lookup missing");
|
||||
assert.match(configJs, /\.profile-avatar-preset/, "preset button selector missing");
|
||||
assert.match(configJs, /\/static\/icons\/avatar\//, "preset image base URL missing");
|
||||
assert.match(configJs, /_resizeAvatarFile\(blob\)/, "preset must go through the resize pipeline");
|
||||
assert.match(configJs, /_patchProfileAvatar\(dataUrl\)/, "preset must be persisted via PATCH");
|
||||
assert.match(configJs, /obsigate-avatar-preset/, "active preset marker missing");
|
||||
assert.match(configJs, /markActivePreset/, "active preset highlight missing");
|
||||
});
|
||||
|
||||
test("style.css — preset avatar rules exist", () => {
|
||||
assert.match(css, /\.profile-avatar-presets\s*\{/, "no .profile-avatar-presets rule");
|
||||
assert.match(css, /\.profile-avatar-preset\s*\{/, "no .profile-avatar-preset rule");
|
||||
assert.match(css, /\.profile-avatar-preset\.active\s*\{/, "no active preset rule");
|
||||
});
|
||||
|
||||
// ── #113c: i18n + backend ───────────────────────────────────────────────────
|
||||
test("i18n — avatar keys exist in FR and EN", () => {
|
||||
const keys = [
|
||||
"config.avatar_label",
|
||||
"config.avatar_hint",
|
||||
"config.avatar_presets_label",
|
||||
"config.avatar_choose",
|
||||
"config.avatar_remove",
|
||||
"config.avatar_updated",
|
||||
|
||||
Reference in New Issue
Block a user