global topbar
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
'use strict';
|
||||
|
||||
const assert = require('assert');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function read(relativePath) {
|
||||
const filePath = path.join(__dirname, '..', relativePath);
|
||||
assert(fs.existsSync(filePath), `${relativePath} should exist`);
|
||||
return fs.readFileSync(filePath, 'utf8');
|
||||
}
|
||||
|
||||
function assertIncludes(haystack, needle, message) {
|
||||
assert(
|
||||
haystack.includes(needle),
|
||||
message || `Expected file to include ${needle}`
|
||||
);
|
||||
}
|
||||
|
||||
function assertExcludes(haystack, needle, message) {
|
||||
assert(
|
||||
!haystack.includes(needle),
|
||||
message || `Expected file not to include ${needle}`
|
||||
);
|
||||
}
|
||||
|
||||
const header = read('templates/header.tpl');
|
||||
const footer = read('templates/footer.tpl');
|
||||
const topbar = read('templates/partials/header/topbar.tpl');
|
||||
const theme = read('theme.scss');
|
||||
const stylesheet = read('scss/westgate/_topbar.scss');
|
||||
const client = read('public/client.js');
|
||||
|
||||
assertIncludes(
|
||||
header,
|
||||
'<!-- IMPORT partials/header/topbar.tpl -->',
|
||||
'Header should mount the Westgate topbar partial'
|
||||
);
|
||||
assertExcludes(
|
||||
header,
|
||||
'<!-- IMPORT partials/sidebar-left.tpl -->',
|
||||
"Header should no longer render Harmony's left global sidebar"
|
||||
);
|
||||
assertExcludes(
|
||||
footer,
|
||||
'<!-- IMPORT partials/sidebar-right.tpl -->',
|
||||
"Footer should no longer render Harmony's right global sidebar"
|
||||
);
|
||||
assertIncludes(
|
||||
theme,
|
||||
'@import "./scss/westgate/topbar";',
|
||||
'theme.scss should import the focused topbar partial'
|
||||
);
|
||||
assertIncludes(
|
||||
stylesheet,
|
||||
'.wg-topbar',
|
||||
'Topbar styles should be scoped to .wg-topbar'
|
||||
);
|
||||
assertIncludes(
|
||||
client,
|
||||
'initWestgateTopbar',
|
||||
'Client bundle should initialize Westgate topbar behavior'
|
||||
);
|
||||
|
||||
[
|
||||
'component="sidebar/search"',
|
||||
'component="notifications"',
|
||||
'component="sidebar/drafts"',
|
||||
].forEach((component) => {
|
||||
assertIncludes(topbar, component, `Topbar should preserve live NodeBB hook ${component}`);
|
||||
});
|
||||
|
||||
[
|
||||
'<!-- IMPORT partials/sidebar/search.tpl -->',
|
||||
'<!-- IMPORT partials/sidebar/notifications.tpl -->',
|
||||
'<!-- IMPORT partials/sidebar/chats.tpl -->',
|
||||
'<!-- IMPORT partials/sidebar/drafts.tpl -->',
|
||||
'<!-- IMPORT partials/sidebar/user-menu.tpl -->',
|
||||
].forEach((templateImport) => {
|
||||
assertIncludes(topbar, templateImport, `Topbar should reuse Harmony live partial ${templateImport}`);
|
||||
});
|
||||
|
||||
[
|
||||
'Velessa Thorne',
|
||||
'Guildmaster Orin',
|
||||
'A letter left at the Undergate',
|
||||
'wg-topbar-demo',
|
||||
"localStorage.setItem('wg-topbar-presence'",
|
||||
].forEach((fixture) => {
|
||||
assertExcludes(topbar, fixture, `Topbar should not ship preview fixture ${fixture}`);
|
||||
});
|
||||
|
||||
assertIncludes(topbar, '{{{ if config.loggedIn }}}', 'Topbar should branch on the real logged-in state');
|
||||
assertIncludes(topbar, '{{{ if canChat }}}', 'Chat controls should remain permission-gated');
|
||||
assertIncludes(topbar, '{{{ if allowRegistration }}}', 'Registration should remain server-gated');
|
||||
assertIncludes(topbar, '{{{ each navigation }}}', 'Topbar should render ACP Navigation items');
|
||||
Reference in New Issue
Block a user