Files
worldmonitor/todos/039-pending-p2-font-settings-missing-tests.md
Elie Habib 110ab402c4 feat(intelligence): analytical framework selector for AI panels (#2380)
* feat(frameworks): add settings section and import modal

- Add Analysis Frameworks group to preferences-content.ts between Intelligence and Media sections
- Per-panel active framework display (read-only, 4 panels)
- Skill library list with built-in badge, Rename and Delete actions for imported frameworks
- Import modal with two tabs: From agentskills.io (fetch + preview) and Paste JSON
- All error cases handled inline: network, domain validation, missing instructions, invalid JSON, duplicate name, instructions too long, rate limit
- Add api/skills/fetch-agentskills.ts edge function (proxy to agentskills.io)
- Add analysis-framework-store.ts (loadFrameworkLibrary, saveImportedFramework, deleteImportedFramework, renameImportedFramework, getActiveFrameworkForPanel)
- Add fw-* CSS classes to main.css matching dark panel aesthetic

* feat(panels): wire analytical framework store into InsightsPanel, CountryDeepDive, DailyMarketBrief, DeductionPanel

- InsightsPanel: append active framework to geoContext in updateFromClient(); subscribe in constructor, unsubscribe in destroy()
- CountryIntelManager: pass framework as query param to fetchCountryIntelBrief(); subscribe to re-open brief on framework change; unsubscribe in destroy()
- DataLoaderManager: add dailyBriefGeneration counter for stale-result guard; pass frameworkAppend to buildDailyMarketBrief(); subscribe to framework changes to force refresh; unsubscribe in destroy()
- daily-market-brief service: add frameworkAppend? field to BuildDailyMarketBriefOptions; append to extendedContext before summarize call
- DeductionPanel: append active framework to geoContext in handleSubmit() before RPC call

* feat(frameworks): add FrameworkSelector UI component

- Create FrameworkSelector component with premium/locked states
- Premium: select dropdown with all framework options, change triggers setActiveFrameworkForPanel
- Locked: disabled select + PRO badge, click calls showGatedCta(FREE_TIER)
- InsightsPanel: adds asterisk note (client-generated analysis hint)
- Wire into InsightsPanel, DailyMarketBriefPanel, DeductionPanel (via this.header)
- Wire into CountryDeepDivePanel header right-side (no Panel base, panel=null)
- Add framework-selector CSS to main.css

* fix(frameworks): make new proto fields optional in generated types

* fix(frameworks): extract firstMsg to satisfy strict null checks in tsconfig.api.json

* fix(docs): add blank lines around lists/headings to pass markdownlint

* fix(frameworks): add required proto string fields to call sites after make generate

* chore(review): add code review todos 041-057 for PR #2380

7 review agents (TypeScript, Security, Architecture, Performance,
Simplicity, Agent-Native, Learnings) identified 17 findings across
5 P1, 8 P2, and 4 P3 categories.
2026-03-27 23:36:44 +04:00

52 lines
1.8 KiB
Markdown

---
status: pending
priority: p2
issue_id: "039"
tags: [code-review, quality, i18n, font]
dependencies: []
---
# `font-settings.ts` has no tests — subtle DOM invariant unverified
## Problem Statement
`applyFont()` sets/removes `document.documentElement.dataset.font` based on the font preference.
The key invariant: when `mono` is selected, the attribute must be **absent** entirely (not `''` or `'mono'`).
`delete dataset.font` is correct but non-obvious — setting it to `''` would be wrong and leave `[data-font="system"]` inactive but the attribute still present.
No test currently pins this behavior, so a future refactor could silently break it.
## Proposed Solutions
### Option A: Add `tests/font-settings.test.mts`
Use the existing `jsdom` environment (already used by other `.test.mts` files).
```ts
import { applyFont } from '../src/services/font-settings.ts';
test('system font sets data-font attribute', () => {
applyFont('system');
assert.strictEqual(document.documentElement.dataset.font, 'system');
assert.ok(document.documentElement.hasAttribute('data-font'));
});
test('mono font removes data-font attribute entirely', () => {
document.documentElement.dataset.font = 'system'; // set first
applyFont('mono');
assert.strictEqual(document.documentElement.hasAttribute('data-font'), false);
});
```
**Effort:** Small | **Risk:** None
## Technical Details
- File: `src/services/font-settings.ts`
- Test file to create: `tests/font-settings.test.mts`
- PR: koala73/worldmonitor#2318
## Acceptance Criteria
- [ ] Test covers: `applyFont('system')` sets `data-font="system"`
- [ ] Test covers: `applyFont('mono')` results in attribute fully absent (not empty string)
- [ ] Tests pass in CI
## Work Log
- 2026-03-27: Identified during PR #2318 review via kieran-typescript-reviewer