Files
ps5upload/client/src/lib/sourcePickers.test.ts
T
phantomptrandClaude Opus 5.5 41d6e10c37 Tasks, Stats, Audit log, Logs, Notifications, About, FAQ: say what they do
Tasks (/tasks): drop the Telemetry view (a copy of Hardware, mostly blank
on retail firmware); fold Timeline into History (same data); Stats becomes
a tab (?tab=stats, /stats redirects, nav item removed). The History tab has
its own label instead of the changelog's "Full history". Clear history and
Clear running act on the console being shown, not every console. A running
row's button says what it really does: Cancel for uploads (queue too), FS
ops and op-id ops; Stop watching for downloads; none when nothing can stop.

Stats: count upload-queue bytes as uploaded, rank only network transfers as
fastest (no on-console copies or installs), scope to the shown console, and
say the totals cover the last 100 operations.

Audit log: also record File System / library deletes, unregisters,
uninstalls and installs; describe it truthfully (a 256-entry local ring).

Logs: hide the recording level in the browser build (no disk log there);
the kernel category explainer described a default-hidden set that is empty.
Health: label the engine's network category. Notifications: both texts now
say it lists ps5upload's own TV messages. Changelog: the whole file is
bundled. About: tiles for the current features, payload sending only where
it works. FAQ: Copy link only in the browser build, under the served base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 05:42:45 -07:00

46 lines
1.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
// Which Browse buttons reach saved servers. A picker that reads a source gets the ▾ server menu
// (<BrowseButton … remote …>); a picker that chooses where to SAVE stays local until saving to a
// server exists, because every consumer of its path writes to local disk.
// Read the screens as raw text at transform time, like browserInvokeCoverage.test.ts does.
const SOURCES = import.meta.glob("../screens/**/*.tsx", {
query: "?raw",
import: "default",
eager: true,
}) as Record<string, string>;
const src = (p: string) => {
const text = SOURCES[`../${p}`];
if (text === undefined) throw new Error(`no source ${p}`);
return text;
};
const remoteButtons = (text: string) => (text.match(/<BrowseButton[^>]*?\bremote\b/gs) ?? []).length;
describe("source pickers reach saved servers", () => {
it.each([
["screens/Upload/index.tsx", 2],
["screens/InstallPackage/index.tsx", 1],
["screens/FileSystem/index.tsx", 1],
["screens/Payloads/SendPanel.tsx", 1],
["screens/Payloads/PlaylistsPanel.tsx", 1],
["screens/FpkgConvert/GameCard.tsx", 2],
])("%s offers servers on its source picker", (file, n) => {
expect(remoteButtons(src(file))).toBe(n);
});
it.each([
"screens/Screenshots/index.tsx",
"screens/Videos/index.tsx",
"screens/BugReport/index.tsx",
"screens/Settings/index.tsx",
"screens/Search/index.tsx",
"screens/Logs/AppLogsPanel.tsx",
"screens/Activity/StatsPanel.tsx",
"screens/Saves/index.tsx",
"screens/LocalImage/index.tsx",
"screens/Upload/FfpkgInspectorPanel.tsx",
])("%s keeps local pickers", (file) => {
expect(remoteButtons(src(file))).toBe(0);
});
});