diff
May 25, 02:10 AMdiff-artifact/v1{
"artifact": {
"files": [
{
"path": "apps/web/tests/dashboard-visual-smoke.spec.tsx",
"hunks": [
{
"lines": [
{
"type": "addition",
"content": "import React from \"react\";",
"newLineNumber": 1,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { readFileSync } from \"node:fs\";",
"newLineNumber": 2,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { fileURLToPath } from \"node:url\";",
"newLineNumber": 3,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { renderToString } from \"react-dom/server\";",
"newLineNumber": 4,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { BillingView } from \"../components/dashboard/billing-view\";",
"newLineNumber": 5,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { CiFailuresView } from \"../components/dashboard/ci-failures-view\";",
"newLineNumber": 6,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { DashboardShell } from \"../components/dashboard/dashboard-shell\";",
"newLineNumber": 7,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { FindingsView } from \"../components/dashboard/findings-view\";",
"newLineNumber": 8,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { GitHubInstallationsView } from \"../components/dashboard/github-installations-view\";",
"newLineNumber": 9,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { OverviewView } from \"../components/dashboard/overview-view\";",
"newLineNumber": 10,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { PullRequestsView } from \"../components/dashboard/pull-requests-view\";",
"newLineNumber": 11,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { RepositoriesView } from \"../components/dashboard/repositories-view\";",
"newLineNumber": 12,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { ReviewRunsView } from \"../components/dashboard/review-runs-view\";",
"newLineNumber": 13,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { RulesPoliciesView } from \"../components/dashboard/rules-policies-view\";",
"newLineNumber": 14,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { SettingsView } from \"../components/dashboard/settings-view\";",
"newLineNumber": 15,
"oldLineNumber": null
},
{
"type": "addition",
"content": "import { DASHBOARD_NAV_ITEMS } from \"../lib/dashboard-navigation\";",
"newLineNumber": 16,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 17,
"oldLineNumber": null
},
{
"type": "addition",
"content": "describe(\"dashboard visual navigation smoke\", () => {",
"newLineNumber": 18,
"oldLineNumber": null
},
{
"type": "addition",
"content": " it(\"renders the full-width light shell with desktop and mobile navigation states\", () => {",
"newLineNumber": 19,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const html = renderToString(",
"newLineNumber": 20,
"oldLineNumber": null
},
{
"type": "addition",
"content": " <DashboardShell activeItem=\"Review Runs\">",
"newLineNumber": 21,
"oldLineNumber": null
},
{
"type": "addition",
"content": " <main>Dashboard body</main>",
"newLineNumber": 22,
"oldLineNumber": null
},
{
"type": "addition",
"content": " </DashboardShell>",
"newLineNumber": 23,
"oldLineNumber": null
},
{
"type": "addition",
"content": " );",
"newLineNumber": 24,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 25,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"min-h-screen bg-shell text-primary\");",
"newLineNumber": 26,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"lg:pl-[17rem]\");",
"newLineNumber": 27,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"lg:pl-64\");",
"newLineNumber": 28,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain('aria-label=\"Dashboard\"');",
"newLineNumber": 29,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain('aria-label=\"Mobile dashboard\"');",
"newLineNumber": 30,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"<details\");",
"newLineNumber": 31,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"lg:hidden\");",
"newLineNumber": 32,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"fixed inset-y-0 left-0\");",
"newLineNumber": 33,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 34,
"oldLineNumber": null
},
{
"type": "addition",
"content": " for (const item of DASHBOARD_NAV_ITEMS) {",
"newLineNumber": 35,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, item.label).toContain(`href=\"${item.href}\"`);",
"newLineNumber": 36,
"oldLineNumber": null
},
{
"type": "addition",
"content": " }",
"newLineNumber": 37,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 38,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(countMatches(html, 'href=\"/review-runs\" aria-current=\"page\"')).toBe(2);",
"newLineNumber": 39,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).not.toContain('aria-disabled=\"true\"');",
"newLineNumber": 40,
"oldLineNumber": null
},
{
"type": "addition",
"content": " });",
"newLineNumber": 41,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 42,
"oldLineNumber": null
},
{
"type": "addition",
"content": " it(\"covers every active dashboard page with route-safe shell rendering\", () => {",
"newLineNumber": 43,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const pages = [",
"newLineNumber": 44,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Overview\" as const, expected: \"Review operations\", view: <OverviewView state={{ status: \"loading\" }} /> },",
"newLineNumber": 45,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"PR Review\" as const, expected: \"PR Review\", view: <GitHubInstallationsView state={{ status: \"loading\" }} installConfig={installConfig} /> },",
"newLineNumber": 46,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Repositories\" as const, expected: \"Repository review coverage\", view: <RepositoriesView state={{ status: \"loading\" }} /> },",
"newLineNumber": 47,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Pull Requests\" as const, expected: \"Engineering review queue\", view: <PullRequestsView state={{ status: \"loading\" }} /> },",
"newLineNumber": 48,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Review Runs\" as const, expected: \"Pipeline executions\", view: <ReviewRunsView state={{ status: \"loading\" }} /> },",
"newLineNumber": 49,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Findings\" as const, expected: \"Findings inbox\", view: <FindingsView state={{ status: \"loading\" }} /> },",
"newLineNumber": 50,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"CI Failures\" as const, expected: \"Broken checks queue\", view: <CiFailuresView state={{ status: \"loading\" }} /> },",
"newLineNumber": 51,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Rules\" as const, expected: \"Loading rules policies\", view: <RulesPoliciesView state={{ status: \"loading\" }} /> },",
"newLineNumber": 52,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Settings\" as const, expected: \"Workspace settings\", view: <SettingsView state={{ status: \"loading\" }} activeTab=\"general\" /> },",
"newLineNumber": 53,
"oldLineNumber": null
},
{
"type": "addition",
"content": " { active: \"Billing\" as const, expected: \"Subscription\", view: <BillingView state={{ status: \"loading\" }} billingPortalUrl={null} /> }",
"newLineNumber": 54,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ];",
"newLineNumber": 55,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 56,
"oldLineNumber": null
},
{
"type": "addition",
"content": " for (const page of pages) {",
"newLineNumber": 57,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const html = renderToString(<DashboardShell activeItem={page.active}>{page.view}</DashboardShell>);",
"newLineNumber": 58,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 59,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, page.active).toContain('data-clerk-authenticated=\"required\"');",
"newLineNumber": 60,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, page.active).toContain(page.expected);",
"newLineNumber": 61,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, page.active).toContain('aria-current=\"page\"');",
"newLineNumber": 62,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, page.active).not.toContain(\"404\");",
"newLineNumber": 63,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html, page.active).not.toContain(\"Not Found\");",
"newLineNumber": 64,
"oldLineNumber": null
},
{
"type": "addition",
"content": " }",
"newLineNumber": 65,
"oldLineNumber": null
},
{
"type": "addition",
"content": " });",
"newLineNumber": 66,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 67,
"oldLineNumber": null
},
{
"type": "addition",
"content": " it(\"keeps loading, empty, and error states usable for the browser smoke pages\", () => {",
"newLineNumber": 68,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const states = [",
"newLineNumber": 69,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<OverviewView state={{ status: \"error\", message: \"Dashboard API returned 503\" }} />),",
"newLineNumber": 70,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<RepositoriesView state={{ status: \"empty\" }} />),",
"newLineNumber": 71,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<ReviewRunsView state={{ status: \"empty\" }} />),",
"newLineNumber": 72,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<FindingsView state={{ status: \"empty\", data: emptyFindings }} />),",
"newLineNumber": 73,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<SettingsView state={{ status: \"error\", message: \"Dashboard API returned 401\" }} activeTab=\"general\" />),",
"newLineNumber": 74,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<BillingView state={{ status: \"error\", message: \"Dashboard API returned 403\" }} billingPortalUrl={null} />),",
"newLineNumber": 75,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<PullRequestsView state={{ status: \"empty\", data: emptyPullRequests }} />),",
"newLineNumber": 76,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<CiFailuresView state={{ status: \"empty\", data: emptyCiFailures }} />)",
"newLineNumber": 77,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ].join(\"\\n\");",
"newLineNumber": 78,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 79,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"Overview could not be loaded\");",
"newLineNumber": 80,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"No repositories yet\");",
"newLineNumber": 81,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"No review runs match these filters\");",
"newLineNumber": 82,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"No findings match these filters\");",
"newLineNumber": 83,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"Settings could not be loaded\");",
"newLineNumber": 84,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"Billing could not be loaded\");",
"newLineNumber": 85,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"No pull requests match these filters\");",
"newLineNumber": 86,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"No CI failures match these filters\");",
"newLineNumber": 87,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(states).toContain(\"disabled=\\\"\\\"\");",
"newLineNumber": 88,
"oldLineNumber": null
},
{
"type": "addition",
"content": " });",
"newLineNumber": 89,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 90,
"oldLineNumber": null
},
{
"type": "addition",
"content": " it(\"preserves responsive overflow protections for dense dashboard content\", () => {",
"newLineNumber": 91,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const files = [",
"newLineNumber": 92,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/overview-view.tsx\",",
"newLineNumber": 93,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/repositories-view.tsx\",",
"newLineNumber": 94,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/review-runs-view.tsx\",",
"newLineNumber": 95,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/findings-view.tsx\",",
"newLineNumber": 96,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/pull-requests-view.tsx\",",
"newLineNumber": 97,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/ci-failures-view.tsx\",",
"newLineNumber": 98,
"oldLineNumber": null
},
{
"type": "addition",
"content": " \"components/dashboard/settings-view.tsx\"",
"newLineNumber": 99,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ];",
"newLineNumber": 100,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 101,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const source = files.map(readWebFile).join(\"\\n\");",
"newLineNumber": 102,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 103,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"overflow-x-auto\");",
"newLineNumber": 104,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"truncate\");",
"newLineNumber": 105,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"break-words\");",
"newLineNumber": 106,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"md:hidden\");",
"newLineNumber": 107,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"hidden overflow-x-auto md:block\");",
"newLineNumber": 108,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).toContain(\"min-w-[900px]\");",
"newLineNumber": 109,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(source).not.toContain(\"text-[clamp(\");",
"newLineNumber": 110,
"oldLineNumber": null
},
{
"type": "addition",
"content": " });",
"newLineNumber": 111,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 112,
"oldLineNumber": null
},
{
"type": "addition",
"content": " it(\"keeps planned controls visibly disabled with accessible titles\", () => {",
"newLineNumber": 113,
"oldLineNumber": null
},
{
"type": "addition",
"content": " const html = [",
"newLineNumber": 114,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<GitHubInstallationsView state={{ status: \"empty\", data: syncData }} installConfig={installConfig} />),",
"newLineNumber": 115,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<SettingsView state={{ status: \"populated\", data: viewerSettings }} activeTab=\"api-keys\" />),",
"newLineNumber": 116,
"oldLineNumber": null
},
{
"type": "addition",
"content": " renderToString(<BillingView state={{ status: \"populated\", data: viewerBilling }} billingPortalUrl={null} />)",
"newLineNumber": 117,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ].join(\"\\n\");",
"newLineNumber": 118,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 119,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain('aria-disabled=\"true\"');",
"newLineNumber": 120,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"Planned provider\");",
"newLineNumber": 121,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"Connect GitHub OAuth before installing the GitHub App.\");",
"newLineNumber": 122,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"Workspace API key creation is not enabled in the MVP.\");",
"newLineNumber": 123,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"Owner billing permission is required to manage subscriptions.\");",
"newLineNumber": 124,
"oldLineNumber": null
},
{
"type": "addition",
"content": " expect(html).toContain(\"disabled=\\\"\\\"\");",
"newLineNumber": 125,
"oldLineNumber": null
},
{
"type": "addition",
"content": " });",
"newLineNumber": 126,
"oldLineNumber": null
},
{
"type": "addition",
"content": "});",
"newLineNumber": 127,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 128,
"oldLineNumber": null
},
{
"type": "addition",
"content": "function readWebFile(path: string): string {",
"newLineNumber": 129,
"oldLineNumber": null
},
{
"type": "addition",
"content": " return readFileSync(fileURLToPath(new URL(`../${path}`, import.meta.url)), \"utf8\");",
"newLineNumber": 130,
"oldLineNumber": null
},
{
"type": "addition",
"content": "}",
"newLineNumber": 131,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 132,
"oldLineNumber": null
},
{
"type": "addition",
"content": "function countMatches(value: string, pattern: string): number {",
"newLineNumber": 133,
"oldLineNumber": null
},
{
"type": "addition",
"content": " return value.split(pattern).length - 1;",
"newLineNumber": 134,
"oldLineNumber": null
},
{
"type": "addition",
"content": "}",
"newLineNumber": 135,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 136,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const installConfig = {",
"newLineNumber": 137,
"oldLineNumber": null
},
{
"type": "addition",
"content": " status: \"configured\" as const,",
"newLineNumber": 138,
"oldLineNumber": null
},
{
"type": "addition",
"content": " installUrl: \"https://github.com/apps/firmcode/installations/new\",",
"newLineNumber": 139,
"oldLineNumber": null
},
{
"type": "addition",
"content": " source: \"GITHUB_APP_INSTALL_URL\" as const",
"newLineNumber": 140,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 141,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 142,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const viewerSettings = {",
"newLineNumber": 143,
"oldLineNumber": null
},
{
"type": "addition",
"content": " workspace: {",
"newLineNumber": 144,
"oldLineNumber": null
},
{
"type": "addition",
"content": " id: \"workspace-1\",",
"newLineNumber": 145,
"oldLineNumber": null
},
{
"type": "addition",
"content": " name: \"Firmcode\",",
"newLineNumber": 146,
"oldLineNumber": null
},
{
"type": "addition",
"content": " clerkOrgId: \"org_firmcode\",",
"newLineNumber": 147,
"oldLineNumber": null
},
{
"type": "addition",
"content": " role: \"viewer\" as const,",
"newLineNumber": 148,
"oldLineNumber": null
},
{
"type": "addition",
"content": " canManageSensitiveSettings: false",
"newLineNumber": 149,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 150,
"oldLineNumber": null
},
{
"type": "addition",
"content": " clerk: {",
"newLineNumber": 151,
"oldLineNumber": null
},
{
"type": "addition",
"content": " userProfileUrl: \"https://accounts.clerk.example/user\",",
"newLineNumber": 152,
"oldLineNumber": null
},
{
"type": "addition",
"content": " organizationProfileUrl: \"https://accounts.clerk.example/organization\",",
"newLineNumber": 153,
"oldLineNumber": null
},
{
"type": "addition",
"content": " memberManagementUrl: \"https://accounts.clerk.example/members\"",
"newLineNumber": 154,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 155,
"oldLineNumber": null
},
{
"type": "addition",
"content": " githubApp: {",
"newLineNumber": 156,
"oldLineNumber": null
},
{
"type": "addition",
"content": " installUrl: \"/github/installations\",",
"newLineNumber": 157,
"oldLineNumber": null
},
{
"type": "addition",
"content": " repositoryConfigurationUrl: \"/repositories\",",
"newLineNumber": 158,
"oldLineNumber": null
},
{
"type": "addition",
"content": " installations: []",
"newLineNumber": 159,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 160,
"oldLineNumber": null
},
{
"type": "addition",
"content": " retention: {",
"newLineNumber": 161,
"oldLineNumber": null
},
{
"type": "addition",
"content": " artifactRetentionDays: 30,",
"newLineNumber": 162,
"oldLineNumber": null
},
{
"type": "addition",
"content": " changedFilePatchDays: 30,",
"newLineNumber": 163,
"oldLineNumber": null
},
{
"type": "addition",
"content": " fullSnapshotDays: 14,",
"newLineNumber": 164,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ciLogDays: 14,",
"newLineNumber": 165,
"oldLineNumber": null
},
{
"type": "addition",
"content": " llmArtifactDays: 14,",
"newLineNumber": 166,
"oldLineNumber": null
},
{
"type": "addition",
"content": " semgrepArtifactDays: 30,",
"newLineNumber": 167,
"oldLineNumber": null
},
{
"type": "addition",
"content": " treeSitterArtifactDays: 30,",
"newLineNumber": 168,
"oldLineNumber": null
},
{
"type": "addition",
"content": " findingMetadataDays: 180,",
"newLineNumber": 169,
"oldLineNumber": null
},
{
"type": "addition",
"content": " aggregatedMetricDays: 365",
"newLineNumber": 170,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 171,
"oldLineNumber": null
},
{
"type": "addition",
"content": " apiKeys: {",
"newLineNumber": 172,
"oldLineNumber": null
},
{
"type": "addition",
"content": " enabled: false,",
"newLineNumber": 173,
"oldLineNumber": null
},
{
"type": "addition",
"content": " message: \"Workspace API key creation is not enabled in the MVP.\"",
"newLineNumber": 174,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 175,
"oldLineNumber": null
},
{
"type": "addition",
"content": " notifications: {",
"newLineNumber": 176,
"oldLineNumber": null
},
{
"type": "addition",
"content": " enabled: false,",
"newLineNumber": 177,
"oldLineNumber": null
},
{
"type": "addition",
"content": " message: \"Email and Slack notification routing is planned after review delivery stabilizes.\"",
"newLineNumber": 178,
"oldLineNumber": null
},
{
"type": "addition",
"content": " }",
"newLineNumber": 179,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 180,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 181,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const syncData = {",
"newLineNumber": 182,
"oldLineNumber": null
},
{
"type": "addition",
"content": " settings: viewerSettings,",
"newLineNumber": 183,
"oldLineNumber": null
},
{
"type": "addition",
"content": " oauth: { connected: false, user: null },",
"newLineNumber": 184,
"oldLineNumber": null
},
{
"type": "addition",
"content": " repositories: {",
"newLineNumber": 185,
"oldLineNumber": null
},
{
"type": "addition",
"content": " filters: {},",
"newLineNumber": 186,
"oldLineNumber": null
},
{
"type": "addition",
"content": " repositories: []",
"newLineNumber": 187,
"oldLineNumber": null
},
{
"type": "addition",
"content": " }",
"newLineNumber": 188,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 189,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 190,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const viewerBilling = {",
"newLineNumber": 191,
"oldLineNumber": null
},
{
"type": "addition",
"content": " workspace: {",
"newLineNumber": 192,
"oldLineNumber": null
},
{
"type": "addition",
"content": " id: \"workspace-1\",",
"newLineNumber": 193,
"oldLineNumber": null
},
{
"type": "addition",
"content": " role: \"viewer\" as const,",
"newLineNumber": 194,
"oldLineNumber": null
},
{
"type": "addition",
"content": " canManageBilling: false,",
"newLineNumber": 195,
"oldLineNumber": null
},
{
"type": "addition",
"content": " source: \"clerk\" as const",
"newLineNumber": 196,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 197,
"oldLineNumber": null
},
{
"type": "addition",
"content": " plan: {",
"newLineNumber": 198,
"oldLineNumber": null
},
{
"type": "addition",
"content": " name: \"Clerk managed\",",
"newLineNumber": 199,
"oldLineNumber": null
},
{
"type": "addition",
"content": " status: \"managed_by_clerk\" as const",
"newLineNumber": 200,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 201,
"oldLineNumber": null
},
{
"type": "addition",
"content": " usage: {",
"newLineNumber": 202,
"oldLineNumber": null
},
{
"type": "addition",
"content": " reviewRunsThisMonth: null,",
"newLineNumber": 203,
"oldLineNumber": null
},
{
"type": "addition",
"content": " aiTokensThisMonth: null,",
"newLineNumber": 204,
"oldLineNumber": null
},
{
"type": "addition",
"content": " repositoriesMonitored: null,",
"newLineNumber": 205,
"oldLineNumber": null
},
{
"type": "addition",
"content": " seats: null",
"newLineNumber": 206,
"oldLineNumber": null
},
{
"type": "addition",
"content": " }",
"newLineNumber": 207,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 208,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 209,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const emptyFindings = {",
"newLineNumber": 210,
"oldLineNumber": null
},
{
"type": "addition",
"content": " filters: {},",
"newLineNumber": 211,
"oldLineNumber": null
},
{
"type": "addition",
"content": " findings: []",
"newLineNumber": 212,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 213,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 214,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const emptyPullRequests = {",
"newLineNumber": 215,
"oldLineNumber": null
},
{
"type": "addition",
"content": " filters: {},",
"newLineNumber": 216,
"oldLineNumber": null
},
{
"type": "addition",
"content": " pagination: {",
"newLineNumber": 217,
"oldLineNumber": null
},
{
"type": "addition",
"content": " limit: 50,",
"newLineNumber": 218,
"oldLineNumber": null
},
{
"type": "addition",
"content": " returned: 0",
"newLineNumber": 219,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 220,
"oldLineNumber": null
},
{
"type": "addition",
"content": " pullRequests: []",
"newLineNumber": 221,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 222,
"oldLineNumber": null
},
{
"type": "addition",
"content": "",
"newLineNumber": 223,
"oldLineNumber": null
},
{
"type": "addition",
"content": "const emptyCiFailures = {",
"newLineNumber": 224,
"oldLineNumber": null
},
{
"type": "addition",
"content": " filters: {},",
"newLineNumber": 225,
"oldLineNumber": null
},
{
"type": "addition",
"content": " pagination: {",
"newLineNumber": 226,
"oldLineNumber": null
},
{
"type": "addition",
"content": " limit: 50,",
"newLineNumber": 227,
"oldLineNumber": null
},
{
"type": "addition",
"content": " returned: 0",
"newLineNumber": 228,
"oldLineNumber": null
},
{
"type": "addition",
"content": " },",
"newLineNumber": 229,
"oldLineNumber": null
},
{
"type": "addition",
"content": " ciFailures: []",
"newLineNumber": 230,
"oldLineNumber": null
},
{
"type": "addition",
"content": "};",
"newLineNumber": 231,
"oldLineNumber": null
}
],
"newStart": 1,
"oldStart": 0,
"newLineCount": 231,
"oldLineCount": 0,
"sectionHeader": ""
}
],
"patch": "@@ -0,0 +1,231 @@\n+import React from \"react\";\n+import { readFileSync } from \"node:fs\";\n+import { fileURLToPath } from \"node:url\";\n+import { renderToString } from \"react-dom/server\";\n+import { BillingView } from \"../components/dashboard/billing-view\";\n+import { CiFailuresView } from \"../components/dashboard/ci-failures-view\";\n+import { DashboardShell } from \"../components/dashboard/dashboard-shell\";\n+import { FindingsView } from \"../components/dashboard/findings-view\";\n+import { GitHubInstallationsView } from \"../components/dashboard/github-installations-view\";\n+import { OverviewView } from \"../components/dashboard/overview-view\";\n+import { PullRequestsView } from \"../components/dashboard/pull-requests-view\";\n+import { RepositoriesView } from \"../components/dashboard/repositories-view\";\n+import { ReviewRunsView } from \"../components/dashboard/review-runs-view\";\n+import { RulesPoliciesView } from \"../components/dashboard/rules-policies-view\";\n+import { SettingsView } from \"../components/dashboard/settings-view\";\n+import { DASHBOARD_NAV_ITEMS } from \"../lib/dashboard-navigation\";\n+\n+describe(\"dashboard visual navigation smoke\", () => {\n+ it(\"renders the full-width light shell with desktop and mobile navigation states\", () => {\n+ const html = renderToString(\n+ <DashboardShell activeItem=\"Review Runs\">\n+ <main>Dashboard body</main>\n+ </DashboardShell>\n+ );\n+\n+ expect(html).toContain(\"min-h-screen bg-shell text-primary\");\n+ expect(html).toContain(\"lg:pl-[17rem]\");\n+ expect(html).toContain(\"lg:pl-64\");\n+ expect(html).toContain('aria-label=\"Dashboard\"');\n+ expect(html).toContain('aria-label=\"Mobile dashboard\"');\n+ expect(html).toContain(\"<details\");\n+ expect(html).toContain(\"lg:hidden\");\n+ expect(html).toContain(\"fixed inset-y-0 left-0\");\n+\n+ for (const item of DASHBOARD_NAV_ITEMS) {\n+ expect(html, item.label).toContain(`href=\"${item.href}\"`);\n+ }\n+\n+ expect(countMatches(html, 'href=\"/review-runs\" aria-current=\"page\"')).toBe(2);\n+ expect(html).not.toContain('aria-disabled=\"true\"');\n+ });\n+\n+ it(\"covers every active dashboard page with route-safe shell rendering\", () => {\n+ const pages = [\n+ { active: \"Overview\" as const, expected: \"Review operations\", view: <OverviewView state={{ status: \"loading\" }} /> },\n+ { active: \"PR Review\" as const, expected: \"PR Review\", view: <GitHubInstallationsView state={{ status: \"loading\" }} installConfig={installConfig} /> },\n+ { active: \"Repositories\" as const, expected: \"Repository review coverage\", view: <RepositoriesView state={{ status: \"loading\" }} /> },\n+ { active: \"Pull Requests\" as const, expected: \"Engineering review queue\", view: <PullRequestsView state={{ status: \"loading\" }} /> },\n+ { active: \"Review Runs\" as const, expected: \"Pipeline executions\", view: <ReviewRunsView state={{ status: \"loading\" }} /> },\n+ { active: \"Findings\" as const, expected: \"Findings inbox\", view: <FindingsView state={{ status: \"loading\" }} /> },\n+ { active: \"CI Failures\" as const, expected: \"Broken checks queue\", view: <CiFailuresView state={{ status: \"loading\" }} /> },\n+ { active: \"Rules\" as const, expected: \"Loading rules policies\", view: <RulesPoliciesView state={{ status: \"loading\" }} /> },\n+ { active: \"Settings\" as const, expected: \"Workspace settings\", view: <SettingsView state={{ status: \"loading\" }} activeTab=\"general\" /> },\n+ { active: \"Billing\" as const, expected: \"Subscription\", view: <BillingView state={{ status: \"loading\" }} billingPortalUrl={null} /> }\n+ ];\n+\n+ for (const page of pages) {\n+ const html = renderToString(<DashboardShell activeItem={page.active}>{page.view}</DashboardShell>);\n+\n+ expect(html, page.active).toContain('data-clerk-authenticated=\"required\"');\n+ expect(html, page.active).toContain(page.expected);\n+ expect(html, page.active).toContain('aria-current=\"page\"');\n+ expect(html, page.active).not.toContain(\"404\");\n+ expect(html, page.active).not.toContain(\"Not Found\");\n+ }\n+ });\n+\n+ it(\"keeps loading, empty, and error states usable for the browser smoke pages\", () => {\n+ const states = [\n+ renderToString(<OverviewView state={{ status: \"error\", message: \"Dashboard API returned 503\" }} />),\n+ renderToString(<RepositoriesView state={{ status: \"empty\" }} />),\n+ renderToString(<ReviewRunsView state={{ status: \"empty\" }} />),\n+ renderToString(<FindingsView state={{ status: \"empty\", data: emptyFindings }} />),\n+ renderToString(<SettingsView state={{ status: \"error\", message: \"Dashboard API returned 401\" }} activeTab=\"general\" />),\n+ renderToString(<BillingView state={{ status: \"error\", message: \"Dashboard API returned 403\" }} billingPortalUrl={null} />),\n+ renderToString(<PullRequestsView state={{ status: \"empty\", data: emptyPullRequests }} />),\n+ renderToString(<CiFailuresView state={{ status: \"empty\", data: emptyCiFailures }} />)\n+ ].join(\"\\n\");\n+\n+ expect(states).toContain(\"Overview could not be loaded\");\n+ expect(states).toContain(\"No repositories yet\");\n+ expect(states).toContain(\"No review runs match these filters\");\n+ expect(states).toContain(\"No findings match these filters\");\n+ expect(states).toContain(\"Settings could not be loaded\");\n+ expect(states).toContain(\"Billing could not be loaded\");\n+ expect(states).toContain(\"No pull requests match these filters\");\n+ expect(states).toContain(\"No CI failures match these filters\");\n+ expect(states).toContain(\"disabled=\\\"\\\"\");\n+ });\n+\n+ it(\"preserves responsive overflow protections for dense dashboard content\", () => {\n+ const files = [\n+ \"components/dashboard/overview-view.tsx\",\n+ \"components/dashboard/repositories-view.tsx\",\n+ \"components/dashboard/review-runs-view.tsx\",\n+ \"components/dashboard/findings-view.tsx\",\n+ \"components/dashboard/pull-requests-view.tsx\",\n+ \"components/dashboard/ci-failures-view.tsx\",\n+ \"components/dashboard/settings-view.tsx\"\n+ ];\n+\n+ const source = files.map(readWebFile).join(\"\\n\");\n+\n+ expect(source).toContain(\"overflow-x-auto\");\n+ expect(source).toContain(\"truncate\");\n+ expect(source).toContain(\"break-words\");\n+ expect(source).toContain(\"md:hidden\");\n+ expect(source).toContain(\"hidden overflow-x-auto md:block\");\n+ expect(source).toContain(\"min-w-[900px]\");\n+ expect(source).not.toContain(\"text-[clamp(\");\n+ });\n+\n+ it(\"keeps planned controls visibly disabled with accessible titles\", () => {\n+ const html = [\n+ renderToString(<GitHubInstallationsView state={{ status: \"empty\", data: syncData }} installConfig={installConfig} />),\n+ renderToString(<SettingsView state={{ status: \"populated\", data: viewerSettings }} activeTab=\"api-keys\" />),\n+ renderToString(<BillingView state={{ status: \"populated\", data: viewerBilling }} billingPortalUrl={null} />)\n+ ].join(\"\\n\");\n+\n+ expect(html).toContain('aria-disabled=\"true\"');\n+ expect(html).toContain(\"Planned provider\");\n+ expect(html).toContain(\"Connect GitHub OAuth before installing the GitHub App.\");\n+ expect(html).toContain(\"Workspace API key creation is not enabled in the MVP.\");\n+ expect(html).toContain(\"Owner billing permission is required to manage subscriptions.\");\n+ expect(html).toContain(\"disabled=\\\"\\\"\");\n+ });\n+});\n+\n+function readWebFile(path: string): string {\n+ return readFileSync(fileURLToPath(new URL(`../${path}`, import.meta.url)), \"utf8\");\n+}\n+\n+function countMatches(value: string, pattern: string): number {\n+ return value.split(pattern).length - 1;\n+}\n+\n+const installConfig = {\n+ status: \"configured\" as const,\n+ installUrl: \"https://github.com/apps/firmcode/installations/new\",\n+ source: \"GITHUB_APP_INSTALL_URL\" as const\n+};\n+\n+const viewerSettings = {\n+ workspace: {\n+ id: \"workspace-1\",\n+ name: \"Firmcode\",\n+ clerkOrgId: \"org_firmcode\",\n+ role: \"viewer\" as const,\n+ canManageSensitiveSettings: false\n+ },\n+ clerk: {\n+ userProfileUrl: \"https://accounts.clerk.example/user\",\n+ organizationProfileUrl: \"https://accounts.clerk.example/organization\",\n+ memberManagementUrl: \"https://accounts.clerk.example/members\"\n+ },\n+ githubApp: {\n+ installUrl: \"/github/installations\",\n+ repositoryConfigurationUrl: \"/repositories\",\n+ installations: []\n+ },\n+ retention: {\n+ artifactRetentionDays: 30,\n+ changedFilePatchDays: 30,\n+ fullSnapshotDays: 14,\n+ ciLogDays: 14,\n+ llmArtifactDays: 14,\n+ semgrepArtifactDays: 30,\n+ treeSitterArtifactDays: 30,\n+ findingMetadataDays: 180,\n+ aggregatedMetricDays: 365\n+ },\n+ apiKeys: {\n+ enabled: false,\n+ message: \"Workspace API key creation is not enabled in the MVP.\"\n+ },\n+ notifications: {\n+ enabled: false,\n+ message: \"Email and Slack notification routing is planned after review delivery stabilizes.\"\n+ }\n+};\n+\n+const syncData = {\n+ settings: viewerSettings,\n+ oauth: { connected: false, user: null },\n+ repositories: {\n+ filters: {},\n+ repositories: []\n+ }\n+};\n+\n+const viewerBilling = {\n+ workspace: {\n+ id: \"workspace-1\",\n+ role: \"viewer\" as const,\n+ canManageBilling: false,\n+ source: \"clerk\" as const\n+ },\n+ plan: {\n+ name: \"Clerk managed\",\n+ status: \"managed_by_clerk\" as const\n+ },\n+ usage: {\n+ reviewRunsThisMonth: null,\n+ aiTokensThisMonth: null,\n+ repositoriesMonitored: null,\n+ seats: null\n+ }\n+};\n+\n+const emptyFindings = {\n+ filters: {},\n+ findings: []\n+};\n+\n+const emptyPullRequests = {\n+ filters: {},\n+ pagination: {\n+ limit: 50,\n+ returned: 0\n+ },\n+ pullRequests: []\n+};\n+\n+const emptyCiFailures = {\n+ filters: {},\n+ pagination: {\n+ limit: 50,\n+ returned: 0\n+ },\n+ ciFailures: []\n+};",
"status": "added",
"language": "typescript",
"additions": 231,
"deletions": 0,
"sizeBytes": 9487,
"previousPath": null,
"changedNewLines": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231
],
"headContentSha256": "22f7fe4f8e7a015a53fdf1a468f8d2d47629289a0e2a7edd25967baf67b95dcf"
}
],
"baseSha": "74dd7712bb03fe56708d6311644eb8f44b03442d",
"headSha": "7bcf796899d510bfaa9ef01b82eeaa550580547f",
"reviewRunId": "87c5c744-898a-4e36-a26e-fd094b10cba7",
"skippedFiles": [
{
"path": "docs/DASHBOARD_VISUAL_SMOKE.md",
"detail": "File extension is not enabled yet.",
"reason": "unsupported",
"status": "modified",
"previousPath": null,
"excludedFromSemgrep": true,
"excludedFromLlmContext": true,
"excludedFromTreeSitter": true
},
{
"path": "docs/task-notes/dashboard-visual-navigation-qa-2026-05-25.md",
"detail": "File extension is not enabled yet.",
"reason": "unsupported",
"status": "added",
"previousPath": null,
"excludedFromSemgrep": true,
"excludedFromLlmContext": true,
"excludedFromTreeSitter": true
}
],
"schemaVersion": "diff-artifact/v1",
"pullRequestNumber": 85,
"repositoryFullName": "firmcloudapps/firmcode-tester"
}
}