Files
sow-nodebb-theme/tests/wiki-search-badge-contract.test.js
T
archvillainette 96f83868b1 Wiki badge and /wiki links in global search results (#14)
Theme half of the cross-repo wiki global search work (plugin half: sow-nodebb-plugin-wiki#12).

Search results tagged by the wiki plugin (`isWikiArticle` + `wikiPath`) now render with a gold "Wiki" badge and link to `/wiki/...` instead of `/post/...`:

- `templates/partials/quick-search-results.tpl` — navbar quick-search dropdown
- `templates/partials/search-results.tpl` — `/search` page, topics view
- `templates/partials/posts_list_item.tpl` — `/search` page, posts view (default). Shared with account/group post lists, where the wiki flags are never set and the conditional no-ops.
- `scss/westgate/_search.scss` — badge styling from existing `--wg-gold` / ledger-border tokens; imported from `theme.scss`
- `languages/en-GB/westgate.json` — `[[westgate:wiki-badge]]` label
- Spec updated with the resolved approach (template override, not client-side decoration)

Untagged forum results render byte-identical to Harmony stock.

Verification: all three overrides compiled and rendered against benchpressjs with mixed wiki/forum fixture rows (wiki row gets `/wiki/...` href + exactly one badge; forum rows keep stock `/post/...` links, `RE:` prefix and main-post icon preserved). New contract test in `tests/wiki-search-badge-contract.test.js`; suite passes except the pre-existing `global-footer-contract.test.js` failure (stale `join-the-team` link assertion from #10, also failing on main — not touched here).

End-to-end visual check (badge in the live dropdown + /search) still needs the dev stack with plugin PR #12 merged.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Reviewed-on: #14
Co-authored-by: vickydotbat <vickydotbat@tutamail.com>
Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
2026-07-03 07:10:47 +00:00

43 lines
1.9 KiB
JavaScript

'use strict';
// Contract: search results tagged by nodebb-plugin-westgate-wiki
// (isWikiArticle + wikiPath) render with a wiki badge and link to /wiki/...,
// while untagged forum results keep the stock /post/... link.
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}`
);
}
[
['templates/partials/posts_list_item.tpl', './isWikiArticle', '{./wikiPath}', '/post/{encodeURIComponent(./pid)}'],
['templates/partials/search-results.tpl', './isWikiArticle', '{./wikiPath}', '/post/{encodeURIComponent(./pid)}'],
['templates/partials/quick-search-results.tpl', 'posts.isWikiArticle', '{posts.wikiPath}', '/post/{encodeURIComponent(posts.pid)}'],
].forEach(([templatePath, flag, wikiHref, forumHref]) => {
const template = read(templatePath);
assertIncludes(template, flag, `${templatePath} should branch on the wiki result flag`);
assertIncludes(template, wikiHref, `${templatePath} should link wiki results to their wikiPath`);
assertIncludes(template, forumHref, `${templatePath} should keep the stock post link for forum results`);
assertIncludes(template, 'westgate-wiki-badge', `${templatePath} should render the wiki badge`);
});
assertIncludes(read('theme.scss'), 'westgate/search', 'theme.scss should import the search styles');
assertIncludes(read('scss/westgate/_search.scss'), '.westgate-wiki-badge', 'search styles should define the wiki badge');
const languageKeys = JSON.parse(read('languages/en-GB/westgate.json'));
assert(languageKeys['wiki-badge'], 'westgate language file should define the wiki-badge label');
console.log('wiki search badge contract tests passed');