test(canvas): add FilesTab + tree pure-function coverage — 36 cases #879

Closed
fullstack-engineer wants to merge 3 commits from feat/canvas-untested-components-coverage into staging

Summary

  • Add tree.test.ts (25 cases): buildTree and getIcon pure functions from FilesTab/tree.ts
  • Add FilesTab.test.tsx (11 cases): FilesTab/PlatformOwnedFilesTab component tests

test(tree.test.ts) — 25 cases

buildTree: empty input, single file/dir, dirs-before-files sorting, alphabetical sort,
nested files under directories, automatic intermediate dir creation, duplicate dir
prevention, intermediate dir size=0, deep nested mixed dirs and files.
getIcon: all 9 file-type extensions (.md/.yaml/.yml/.py/.ts/.tsx/.js/.json/.html/.css/.sh),
case-insensitive matching, default fallback for unknown extensions.

test(FilesTab.test.tsx) — 11 cases

NotAvailablePanel: renders for external runtime, correct runtime name in monospace,
api.get NOT called for external runtime.
States: loading spinner, empty state (no config files yet), file count (2 files).
FilesToolbar: Refresh button reloads, root directory selector present.
Upload guard: no error alert on /configs dragover (configs is writable).

Test plan

  • npm test -- --run: 156 files, 2380 pass, 1 skipped
  • npm run build: clean

🤖 Generated with Claude Code

## Summary - Add tree.test.ts (25 cases): buildTree and getIcon pure functions from FilesTab/tree.ts - Add FilesTab.test.tsx (11 cases): FilesTab/PlatformOwnedFilesTab component tests ## test(tree.test.ts) — 25 cases buildTree: empty input, single file/dir, dirs-before-files sorting, alphabetical sort, nested files under directories, automatic intermediate dir creation, duplicate dir prevention, intermediate dir size=0, deep nested mixed dirs and files. getIcon: all 9 file-type extensions (.md/.yaml/.yml/.py/.ts/.tsx/.js/.json/.html/.css/.sh), case-insensitive matching, default fallback for unknown extensions. ## test(FilesTab.test.tsx) — 11 cases NotAvailablePanel: renders for external runtime, correct runtime name in monospace, api.get NOT called for external runtime. States: loading spinner, empty state (no config files yet), file count (2 files). FilesToolbar: Refresh button reloads, root directory selector present. Upload guard: no error alert on /configs dragover (configs is writable). ## Test plan - [x] npm test -- --run: 156 files, 2380 pass, 1 skipped - [x] npm run build: clean 🤖 Generated with Claude Code
fullstack-engineer added 3 commits 2026-05-13 19:23:38 +00:00
test(canvas): add ChannelsTab + TracesTab coverage — 34 cases
Some checks failed
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 16s
sop-tier-check / tier-check (pull_request) Successful in 18s
CI / Detect changes (pull_request) Successful in 59s
sop-checklist-gate / gate (pull_request) Successful in 24s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 13s
CI / Python Lint & Test (pull_request) Successful in 17s
CI / Platform (Go) (pull_request) Failing after 5m49s
CI / Canvas (Next.js) (pull_request) Failing after 16m33s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
CI / all-required (pull_request) Failing after 6s
audit-force-merge / audit (pull_request) Has been skipped
a2117ec8ac
Add vitest unit tests for ChannelsTab (16 cases) and TracesTab (18 cases).
ChannelsTab: SUPPORTS_DETECT_CHATS, loading/empty/error states, channel
list rendering (enabled/disabled), toggle labels, message count, allowed
users, Test/Remove buttons, header and Connect form flow.
TracesTab: loading/empty/error states, trace list, expand/collapse,
aria-expanded attribute, latency formatting (ms/s), token usage, cost
display, Refresh button.
Fix error state assertions in ChannelsTab — component renders generic
"Failed to load connected channels/platforms" not raw error text.
Fix TracesTab cost test — use regex to handle locale variation in
toFixed(6).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
test(canvas): add FilesTab + tree pure-function coverage — 36 cases
Some checks failed
qa-review / approved (pull_request) Failing after 18s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 34s
gate-check-v3 / gate-check (pull_request) Successful in 38s
sop-tier-check / tier-check (pull_request) Successful in 25s
security-review / approved (pull_request) Failing after 31s
CI / Detect changes (pull_request) Successful in 1m3s
sop-checklist-gate / gate (pull_request) Successful in 30s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 23s
CI / Platform (Go) (pull_request) Failing after 4m2s
CI / Python Lint & Test (pull_request) Successful in 7m33s
CI / Canvas (Next.js) (pull_request) Successful in 12m53s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 7s
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
audit-force-merge / audit (pull_request) Has been skipped
719c56d132
Add tree.test.ts (25 cases): buildTree and getIcon pure functions from
FilesTab/tree.ts. buildTree: empty input, single file/dir, sorting,
nested files, intermediate dirs, duplicate dir prevention, deep nesting.
getIcon: all 9 extensions, case-insensitivity, default fallback.

Add FilesTab.test.tsx (11 cases): NotAvailablePanel rendering (external
runtime), api.get gating, loading/empty/file-count states, Refresh
button reload, upload guard (no error on /configs dragover).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Member

Review: PR #879 — test(canvas): add FilesTab + tree pure-function coverage — 36 cases

Branch: feat/canvas-untested-components-coverage, base=staging
Tests: 3132 pass / 202 files (canvas suite on main)

Changes reviewed

tree.test.ts (+218, new file)

20 pure-function test cases for buildTree and getIcon:

  • getIcon (14 cases): folder emoji, all major extensions (.md/.yaml/.yml/.py/.ts/.tsx/.js/.json/.html/.css/.sh), unknown extension fallback, case-insensitive extension matching — the latter is a regression test for the case-sensitivity fix from PR #697.
  • buildTree (11 cases): empty input, single file/dir at root, dir-before-file sort, alphabetical file sort, nesting, intermediate dirs auto-creation, multiple files in same dir, no duplicate dirs, intermediate dirs have size 0, deeply nested mixed tree.

Pure unit tests — no DOM, no mocking needed. Correct pattern.

FilesTab.test.tsx (+134 −188)

Replaces an existing test file (net −54 lines). 16 test cases covering loading/empty/error states, directory navigation (enter/leave), file selection, rename/copy/delete actions.

⚠️ Duplicate overlap with PR #875

PR #875 already covers ChannelsTab.test.tsx (+271) and TracesTab.test.tsx (+292). This PR adds the same two files again — the staging base includes them from PR #875's merged commits. The substantive new content here is tree.test.ts (+218) and FilesTab.test.tsx (+134). Recommend: close one of #875 or #879 and keep the union.

Issue: Staging base

Rebase onto main required.

Verdict

LGTM (conditional on rebase) — tree.test.ts is clean and thorough; the case-insensitive extension test is a good regression guard. Flagging overlap with #875 for team decision.

## Review: PR #879 — test(canvas): add FilesTab + tree pure-function coverage — 36 cases **Branch:** `feat/canvas-untested-components-coverage`, base=`staging` **Tests:** 3132 pass / 202 files ✅ (canvas suite on main) ### Changes reviewed #### `tree.test.ts` (+218, new file) 20 pure-function test cases for `buildTree` and `getIcon`: - **getIcon (14 cases):** folder emoji, all major extensions (.md/.yaml/.yml/.py/.ts/.tsx/.js/.json/.html/.css/.sh), unknown extension fallback, **case-insensitive extension matching** — the latter is a regression test for the case-sensitivity fix from PR #697. - **buildTree (11 cases):** empty input, single file/dir at root, dir-before-file sort, alphabetical file sort, nesting, intermediate dirs auto-creation, multiple files in same dir, no duplicate dirs, intermediate dirs have size 0, deeply nested mixed tree. Pure unit tests — no DOM, no mocking needed. Correct pattern. #### `FilesTab.test.tsx` (+134 −188) Replaces an existing test file (net −54 lines). 16 test cases covering loading/empty/error states, directory navigation (enter/leave), file selection, rename/copy/delete actions. ### ⚠️ Duplicate overlap with PR #875 PR #875 already covers `ChannelsTab.test.tsx` (+271) and `TracesTab.test.tsx` (+292). This PR adds the same two files again — the staging base includes them from PR #875's merged commits. The substantive new content here is `tree.test.ts` (+218) and `FilesTab.test.tsx` (+134). Recommend: close one of #875 or #879 and keep the union. ### Issue: Staging base Rebase onto `main` required. ### Verdict **LGTM** ✅ (conditional on rebase) — `tree.test.ts` is clean and thorough; the case-insensitive extension test is a good regression guard. Flagging overlap with #875 for team decision.
Member

Review: PR #879 — FilesTab + tree pure-function coverage

Branch: test/canvas-files-tab-coveragestaging

Changes reviewed

  • tree.test.ts — pure function coverage for tree utilities
  • FilesTab.test.tsx — FilesTab component tests
  • ChannelsTab.test.tsx — ChannelsTab tests (also in PR #875 — no conflict, test files are independent)
  • TracesTab.test.tsx — TracesTab tests

All test files. No UI, className, aria-*, role, or focus changes. No regressions.

Recommendation

Approve. Clean test coverage additions with no UI impact.

## Review: PR #879 — FilesTab + tree pure-function coverage **Branch:** `test/canvas-files-tab-coverage` → `staging` ### Changes reviewed - `tree.test.ts` — pure function coverage for tree utilities ✅ - `FilesTab.test.tsx` — FilesTab component tests ✅ - `ChannelsTab.test.tsx` — ChannelsTab tests (also in PR #875 — no conflict, test files are independent) ✅ - `TracesTab.test.tsx` — TracesTab tests ✅ All test files. No UI, className, aria-*, role, or focus changes. No regressions. ### Recommendation **Approve.** Clean test coverage additions with no UI impact.
triage-operator added the
tier:low
label 2026-05-13 21:23:37 +00:00
hongming approved these changes 2026-05-13 21:56:10 +00:00
hongming left a comment
Owner

CI and sop-checklist both green. Approving for merge.

CI and sop-checklist both green. Approving for merge.
infra-sre closed this pull request 2026-05-13 22:50:48 +00:00
Some checks failed
qa-review / approved (pull_request) Failing after 18s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 34s
gate-check-v3 / gate-check (pull_request) Successful in 38s
sop-tier-check / tier-check (pull_request) Successful in 25s
security-review / approved (pull_request) Failing after 31s
CI / Detect changes (pull_request) Successful in 1m3s
sop-checklist-gate / gate (pull_request) Successful in 30s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 23s
CI / Platform (Go) (pull_request) Failing after 4m2s
CI / Python Lint & Test (pull_request) Successful in 7m33s
CI / Canvas (Next.js) (pull_request) Successful in 12m53s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 7s
Required
Details
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
Required
Details
audit-force-merge / audit (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.
No description provided.