Skip to content

claude-code-chat-browser: Frontend rendering/routing test coverage #78

@clean6378-max-it

Description

@clean6378-max-it

Calendar Day

Monday, June 15, 2026

Planned Effort

8 story points — sprint item #1 (Medium)

Out of scope this issue: CSP header (Tuesday #2), __all__ cleanup (Tuesday #3), role Literal (Tuesday #7), session cache (Wednesday #4), benchmark gate (Wednesday #6), v0.1.0 release (Thursday #5).

Problem

The frontend JavaScript layer is modularized across static/js/ (router in app.js, page modules, 25+ renderer files under render/tool_result/ and render/tool_use/), but vitest coverage is concentrated in only four test files (shared/markdown.test.js, shared/state.test.js, shared/utils.test.js, render/registry.test.js). No tests exist for the router, session/project/search/export page modules, or individual renderer modules. vitest.config.js already targets static/js/**/*.test.js with jsdom and v8 coverage — the gap is test authoring.

Goal

One merged PR that lifts static/js/ line coverage from ~15% to ≥50% with vitest suites for the router, page modules, and ≥3 representative renderers — all green on the ubuntu/windows/macOS js-tests matrix.

Scope

Touch points

  • static/js/app.jsapp.test.js
  • static/js/sessions.js, projects.js, search.js, export.js → co-located *.test.js
  • ≥3 renderer modules under render/tool_result/ or render/tool_use/ (e.g. bash.js, file_read.js, edit.js)
  • vitest.config.js (read-only — confirm jsdom + coverage config)

Router (app.test.js)

  • Hash-based route dispatch (#project/, #search, default)
  • safeDecode fallback on malformed URIs
  • window.location.hash changes triggering handleRoute

Page modules

  • sessions.js: showWorkspace, loadSession, selectSession, copyAll
  • projects.js: showProjects, empty-state handling
  • search.js: doSearch (query, render, highlight, empty result)
  • export.js: bulkExport (progress + 4xx/5xx), downloadSession (blob URL)

Renderers

  • Minimal ToolResultUnion / ToolUseDict payloads; assert DOM textContent / className
  • jsdom scaffolding + mocked fetch (shapes from models/session.py, models/project.py, models/search.py)

Acceptance Criteria

  • app.test.js covers hash dispatch, safeDecode fallback, and hashchange → handleRoute
  • sessions.test.js covers showWorkspace, loadSession, selectSession, copyAll
  • projects.test.js covers showProjects + empty state
  • search.test.js covers query submission, result rendering, snippet highlighting, empty result
  • export.test.js covers bulkExport progress/errors and downloadSession blob URL
  • ≥3 renderer modules have tests verifying correct DOM output
  • npm test passes in CI on ubuntu, windows, and macos (js-tests job)
  • npm run test:coverage shows static/js/ line coverage ≥50% (from ~15%)
  • No production-code changes (tests only)
  • PR approved by at least 1 reviewer

Metadata

Metadata

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions