From f6996600804a75bdfe2aa6455da6f9165e7db433 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Tue, 27 Oct 2026 02:22:43 -0700 Subject: [PATCH] test: remove 32 low-value cases and five suites (#34346) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- config/scripts/ci-shard-timings.json | 5 - .../dashboard/useAgentBucketCounts.test.tsx | 24 --- .../editor/ChangesModeView.test.tsx | 101 ------------- ...nel.markdown-review-tools-setting.test.tsx | 93 ------------ .../editor/MarkdownPreviewBody.test.tsx | 28 ---- .../editor/editor-artifact-upload.test.ts | 20 --- .../ChecksPanel.review-header.test.tsx | 138 ------------------ ...Control.hosted-review-header-link.test.tsx | 114 --------------- .../settings/LinearAgentSkillGuide.test.tsx | 97 ------------ .../settings/task-source-setup-state.test.ts | 79 ---------- 10 files changed, 699 deletions(-) delete mode 100644 src/renderer/src/components/editor/ChangesModeView.test.tsx delete mode 100644 src/renderer/src/components/editor/EditorPanel.markdown-review-tools-setting.test.tsx delete mode 100644 src/renderer/src/components/right-sidebar/ChecksPanel.review-header.test.tsx delete mode 100644 src/renderer/src/components/right-sidebar/SourceControl.hosted-review-header-link.test.tsx delete mode 100644 src/renderer/src/components/settings/LinearAgentSkillGuide.test.tsx diff --git a/config/scripts/ci-shard-timings.json b/config/scripts/ci-shard-timings.json index 30d575e0904..4e56c1fcff9 100644 --- a/config/scripts/ci-shard-timings.json +++ b/config/scripts/ci-shard-timings.json @@ -7394,7 +7394,6 @@ "src/renderer/src/components/diff-comments/use-visible-worktree-diff-comments.test.ts": 198, "src/renderer/src/components/diff-comments/useDiffCommentDecorator.lifecycle.test.tsx": 1231, "src/renderer/src/components/diff-comments/useDiffCommentDecorator.range-selection.test.tsx": 3422, - "src/renderer/src/components/editor/ChangesModeView.test.tsx": 385, "src/renderer/src/components/editor/CheckRunCopyButton.test.tsx": 343, "src/renderer/src/components/editor/CheckRunDetailsPanel.captured-failure.test.tsx": 1706, "src/renderer/src/components/editor/CheckRunDetailsPanel.copy.test.tsx": 1825, @@ -7411,7 +7410,6 @@ "src/renderer/src/components/editor/EditorFileLoadErrorView.test.tsx": 442, "src/renderer/src/components/editor/EditorFileLocationMenuItems.test.tsx": 468, "src/renderer/src/components/editor/EditorPanel.markdown-classification-memoization.test.tsx": 1989, - "src/renderer/src/components/editor/EditorPanel.markdown-review-tools-setting.test.tsx": 1495, "src/renderer/src/components/editor/EditorPanelActionsMenu.test.tsx": 102, "src/renderer/src/components/editor/EditorPanelHeader.test.tsx": 1416, "src/renderer/src/components/editor/EditorPanelHeaderPath.test.tsx": 1703, @@ -8359,7 +8357,6 @@ "src/renderer/src/components/right-sidebar/AiVaultSessionVirtualList.measurement.test.tsx": 2554, "src/renderer/src/components/right-sidebar/AiVaultShowMoreSessionsRow.test.tsx": 369, "src/renderer/src/components/right-sidebar/AiVaultVirtualRow.test.tsx": 2253, - "src/renderer/src/components/right-sidebar/ChecksPanel.review-header.test.tsx": 575, "src/renderer/src/components/right-sidebar/ChecksPanel.updated-at-metadata.test.tsx": 243, "src/renderer/src/components/right-sidebar/CommitArea.chevron-spinner.test.tsx": 1564, "src/renderer/src/components/right-sidebar/CommitArea.generate.test.tsx": 1781, @@ -8387,7 +8384,6 @@ "src/renderer/src/components/right-sidebar/SourceControl.commit-failure-recovery.test.ts": 68, "src/renderer/src/components/right-sidebar/SourceControl.commit-generation-records.test.ts": 30, "src/renderer/src/components/right-sidebar/SourceControl.compare-summary.test.ts": 122, - "src/renderer/src/components/right-sidebar/SourceControl.hosted-review-header-link.test.tsx": 78, "src/renderer/src/components/right-sidebar/SourceControl.open-file-highlight.test.tsx": 2978, "src/renderer/src/components/right-sidebar/SourceControl.pr-generation-records.test.ts": 125, "src/renderer/src/components/right-sidebar/SourceControl.preview-open.test.tsx": 3358, @@ -8700,7 +8696,6 @@ "src/renderer/src/components/settings/HostAccountSignInPrompt.test.tsx": 158, "src/renderer/src/components/settings/HostAgentLaunchSettings.test.tsx": 4184, "src/renderer/src/components/settings/KagiSessionLinkForm.test.ts": 193, - "src/renderer/src/components/settings/LinearAgentSkillGuide.test.tsx": 220, "src/renderer/src/components/settings/LinearAgentSkillPane.test.tsx": 675, "src/renderer/src/components/settings/LocalNetworkConnectionTest.test.tsx": 556, "src/renderer/src/components/settings/MachineNameField.test.tsx": 481, diff --git a/src/renderer/src/components/dashboard/useAgentBucketCounts.test.tsx b/src/renderer/src/components/dashboard/useAgentBucketCounts.test.tsx index 5c2ac278724..6ea97065139 100644 --- a/src/renderer/src/components/dashboard/useAgentBucketCounts.test.tsx +++ b/src/renderer/src/components/dashboard/useAgentBucketCounts.test.tsx @@ -48,30 +48,6 @@ afterEach(() => { }) describe('useAgentBucketCounts', () => { - it('includes folder workspaces in the count snapshot inputs', () => { - mocks.buildDashboardBucketCounts.mockImplementation( - (state: { folderWorkspaces?: unknown[] }) => ({ - attention: 0, - working: state.folderWorkspaces?.length ? 1 : 0, - done: 0, - idle: 0 - }) - ) - - const { result } = renderHook(() => useAgentBucketCounts()) - - expect(result.current).toEqual({ attention: 0, working: 1, done: 0, idle: 0 }) - expect(mocks.buildDashboardBucketCounts).toHaveBeenCalledWith( - expect.objectContaining({ - folderWorkspaces: mocks.state.folderWorkspaces, - unifiedTabsByWorktree: mocks.state.unifiedTabsByWorktree - }), - expect.any(Number), - expect.objectContaining({ byWorktree: expect.any(Map) }), - expect.anything() - ) - }) - it('moves acknowledged completions to idle without recomputing for unrelated writes', () => { mocks.buildDashboardBucketCounts.mockImplementation( (state: { acknowledgedAgentsByPaneKey?: Record }) => ({ diff --git a/src/renderer/src/components/editor/ChangesModeView.test.tsx b/src/renderer/src/components/editor/ChangesModeView.test.tsx deleted file mode 100644 index ae8d13f5a34..00000000000 --- a/src/renderer/src/components/editor/ChangesModeView.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -// @vitest-environment happy-dom -import { act, Suspense } from 'react' -import { createRoot, type Root } from 'react-dom/client' -import { afterEach, describe, expect, it, vi } from 'vitest' -import type { OpenFile } from '@/store/slices/editor' -import type { DiffViewerProps } from './diff-viewer-props' -import { - MAX_RENDERED_DIFF_COMBINED_CHARACTERS, - MAX_RENDERED_DIFF_LINES_PER_SIDE, - type LargeDiffRenderLimit -} from './large-diff-render-limit' - -const diffViewerMock = vi.hoisted(() => ({ - latestProps: null as DiffViewerProps | null -})) - -vi.mock('./DiffViewer', () => ({ - default: (props: DiffViewerProps) => { - diffViewerMock.latestProps = props - return
- } -})) - -import { ChangesModeView } from './ChangesModeView' - -function createOpenFile(): OpenFile { - return { - id: 'file-1', - filePath: '/repo/large.txt', - relativePath: 'large.txt', - worktreeId: 'repo::/repo', - language: 'plaintext', - isDirty: false, - mode: 'edit' - } as OpenFile -} - -function createLargeDiffRenderLimit(): LargeDiffRenderLimit { - return { - limited: true, - reason: 'character-count', - lineCounts: null, - characterCount: MAX_RENDERED_DIFF_COMBINED_CHARACTERS + 1, - limits: { - maxLinesPerSide: MAX_RENDERED_DIFF_LINES_PER_SIDE, - maxCombinedCharacters: MAX_RENDERED_DIFF_COMBINED_CHARACTERS - } - } -} - -describe('ChangesModeView', () => { - let container: HTMLDivElement | null = null - let root: Root | null = null - - afterEach(() => { - if (root) { - act(() => root?.unmount()) - } - container?.remove() - container = null - root = null - diffViewerMock.latestProps = null - }) - - it('passes pruned diff limits through and suppresses the identical-content banner', async () => { - container = document.createElement('div') - document.body.appendChild(container) - root = createRoot(container) - const largeDiffRenderLimit = createLargeDiffRenderLimit() - - await act(async () => { - root?.render( - - - - ) - }) - - await vi.waitFor(() => expect(diffViewerMock.latestProps).not.toBeNull()) - expect(diffViewerMock.latestProps?.largeDiffRenderLimit).toBe(largeDiffRenderLimit) - expect(container.textContent).not.toContain('No uncommitted changes.') - }) -}) diff --git a/src/renderer/src/components/editor/EditorPanel.markdown-review-tools-setting.test.tsx b/src/renderer/src/components/editor/EditorPanel.markdown-review-tools-setting.test.tsx deleted file mode 100644 index 3590d0e5997..00000000000 --- a/src/renderer/src/components/editor/EditorPanel.markdown-review-tools-setting.test.tsx +++ /dev/null @@ -1,93 +0,0 @@ -// @vitest-environment happy-dom -import { act } from 'react' -import { createRoot, type Root } from 'react-dom/client' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { useAppStore } from '@/store' -import type { OpenFile } from '@/store/slices/editor' -import { getDefaultSettings } from '../../../../shared/constants' - -const probe = vi.hoisted(() => { - const state: { markdownAnnotationsEnabled: boolean | null } = { - markdownAnnotationsEnabled: null - } - return state -}) - -vi.mock('./EditorPanelShell', () => ({ - EditorPanelShell: (props: { markdownAnnotationsEnabled: boolean }) => { - probe.markdownAnnotationsEnabled = props.markdownAnnotationsEnabled - return null - } -})) - -vi.mock('./useEditorPanelContentState', () => ({ - useEditorPanelContentState: () => ({ - fileContents: { '/repo/notes.md': { content: '# Notes\n', isBinary: false } }, - diffContents: {}, - reloadContent: () => {} - }) -})) - -import EditorPanel from './EditorPanel' - -const file: OpenFile = { - id: '/repo/notes.md', - filePath: '/repo/notes.md', - relativePath: 'notes.md', - worktreeId: 'wt-1', - language: 'markdown', - mode: 'edit', - isDirty: false -} - -const initialAppState = useAppStore.getInitialState() -let container: HTMLDivElement -let root: Root - -async function renderWithSetting( - markdownReviewToolsEnabled: boolean, - props: { markdownAnnotationsEnabled?: boolean } = {} -): Promise { - useAppStore.setState({ - settings: { ...getDefaultSettings('/tmp'), markdownReviewToolsEnabled } - }) - await act(async () => root.render()) -} - -describe('EditorPanel markdown review tools setting', () => { - beforeEach(() => { - globalThis.IS_REACT_ACT_ENVIRONMENT = true - probe.markdownAnnotationsEnabled = null - useAppStore.setState(initialAppState, true) - useAppStore.setState({ - openFiles: [file], - activeFileId: file.id, - markdownViewMode: { [file.id]: 'preview' }, - gitStatusByWorktree: { 'wt-1': [] } - }) - container = document.createElement('div') - document.body.appendChild(container) - root = createRoot(container) - }) - - afterEach(async () => { - await act(async () => root.unmount()) - document.body.replaceChildren() - useAppStore.setState(initialAppState, true) - }) - - it('enables review tools when the setting is on', async () => { - await renderWithSetting(true) - expect(probe.markdownAnnotationsEnabled).toBe(true) - }) - - it('disables review tools when the setting is off', async () => { - await renderWithSetting(false) - expect(probe.markdownAnnotationsEnabled).toBe(false) - }) - - it('keeps a caller opt-out even when the setting is on', async () => { - await renderWithSetting(true, { markdownAnnotationsEnabled: false }) - expect(probe.markdownAnnotationsEnabled).toBe(false) - }) -}) diff --git a/src/renderer/src/components/editor/MarkdownPreviewBody.test.tsx b/src/renderer/src/components/editor/MarkdownPreviewBody.test.tsx index c47301fde90..2bf0c1422cb 100644 --- a/src/renderer/src/components/editor/MarkdownPreviewBody.test.tsx +++ b/src/renderer/src/components/editor/MarkdownPreviewBody.test.tsx @@ -1,8 +1,4 @@ import { renderToStaticMarkup } from 'react-dom/server' -import remarkCjkFriendly from 'remark-cjk-friendly/parseOnly' -import remarkGfm from 'remark-gfm' -import remarkParse from 'remark-parse' -import { unified } from 'unified' import { describe, expect, it } from 'vitest' import { MarkdownPreviewBody } from './MarkdownPreviewBody' @@ -34,26 +30,6 @@ const cjkEmphasisExamples = [ } ] -const unchangedMarkdownExamples = [ - '# Heading', - '**bold** text and *italic* text', - 'foo_bar_baz', - '`**literal**`', - '[link](https://example.com)', - '- [x] completed task', - '| left | right |\n| --- | --- |\n| a | b |', - '~~deleted~~ text', - '~~"삭제"~~문장' -] - -function parseMarkdown(markdown: string) { - return unified().use(remarkParse).use(remarkGfm).parse(markdown) -} - -function parseCjkFriendlyMarkdown(markdown: string) { - return unified().use(remarkParse).use(remarkGfm).use(remarkCjkFriendly).parse(markdown) -} - describe('MarkdownPreviewBody', () => { it('renders forward reference links in research prose and tables without exposing definitions', () => { const url = 'https://github.com/example/app/blob/revision/src/app/(mobile)/language.tsx#L95' @@ -89,8 +65,4 @@ describe('MarkdownPreviewBody', () => { expect(html).toContain(expectedHtml) }) - - it.each(unchangedMarkdownExamples)('keeps existing parsing for %s', (markdown) => { - expect(parseCjkFriendlyMarkdown(markdown)).toEqual(parseMarkdown(markdown)) - }) }) diff --git a/src/renderer/src/components/editor/editor-artifact-upload.test.ts b/src/renderer/src/components/editor/editor-artifact-upload.test.ts index 73d1da69fdc..f1b4593d1d6 100644 --- a/src/renderer/src/components/editor/editor-artifact-upload.test.ts +++ b/src/renderer/src/components/editor/editor-artifact-upload.test.ts @@ -2,8 +2,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import type { OpenFile } from '@/store/slices/editor' import { createCurrentEditorArtifactRequest, - createEditorArtifactRequest, - editorArtifactContentType, editorArtifactSourceKey } from './editor-artifact-upload' @@ -38,16 +36,6 @@ function openFile(overrides: Partial = {}): OpenFile { } describe('Editor artifact upload', () => { - it('uses the ordinary file path for local and folder workspaces', () => { - expect(editorArtifactSourceKey(openFile())).toBe('/repo/notes.md') - expect(createEditorArtifactRequest(openFile(), '# Draft', 'text/markdown')).toEqual({ - sourceKey: '/repo/notes.md', - content: '# Draft', - contentType: 'text/markdown', - fileName: 'notes.md' - }) - }) - it('isolates source identity by runtime owner', () => { const file = openFile({ runtimeEnvironmentId: 'server-1', @@ -94,12 +82,4 @@ describe('Editor artifact upload', () => { ).toBe('# Latest edit') expect(mocks.flush).toHaveBeenCalledWith(expect.anything(), '/repo/notes.md') }) - - it('shares Markdown and HTML documents only', () => { - expect(editorArtifactContentType('/repo/notes.md', true)).toBe('text/markdown') - expect(editorArtifactContentType('/repo/report.html', false)).toBe('text/html') - expect(editorArtifactContentType('/repo/REPORT.HTM', false)).toBe('text/html') - expect(editorArtifactContentType('/repo/index.jsp', false)).toBeNull() - expect(editorArtifactContentType('/repo/main.ts', false)).toBeNull() - }) }) diff --git a/src/renderer/src/components/right-sidebar/ChecksPanel.review-header.test.tsx b/src/renderer/src/components/right-sidebar/ChecksPanel.review-header.test.tsx deleted file mode 100644 index eee54ba2870..00000000000 --- a/src/renderer/src/components/right-sidebar/ChecksPanel.review-header.test.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import type { ReactNode } from 'react' -import { renderToStaticMarkup } from 'react-dom/server' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { ChecksPanelReviewHeader } from './checks-panel/review-header' -import type { ChecksPanelHostedReviewModifierDestination } from './checks-panel-hosted-review-click-routing' - -vi.mock('@/components/ui/dropdown-menu', () => ({ - DropdownMenu: ({ children }: { children: ReactNode }) =>
{children}
, - DropdownMenuTrigger: ({ children }: { children: ReactNode; asChild?: boolean }) => ( - <>{children} - ), - DropdownMenuContent: ({ children }: { children: ReactNode }) =>
{children}
, - DropdownMenuItem: ({ - children, - disabled - }: { - children: ReactNode - disabled?: boolean - onSelect?: () => void - }) =>
{children}
-})) - -vi.mock('@/components/ui/tooltip', () => ({ - Tooltip: ({ children }: { children: ReactNode }) => <>{children}, - TooltipContent: ({ children }: { children: ReactNode }) => <>{children}, - TooltipTrigger: ({ children }: { children: ReactNode }) => <>{children} -})) - -beforeEach(() => { - vi.stubGlobal('navigator', { userAgent: 'Macintosh' }) -}) - -afterEach(() => { - vi.unstubAllGlobals() -}) - -function renderHeader({ - canUnlinkReview = true, - provider = 'github', - modifierHintDestination = 'system-browser' -}: { - canUnlinkReview?: boolean - provider?: 'github' | 'gitlab' - modifierHintDestination?: ChecksPanelHostedReviewModifierDestination -} = {}): string { - const isGitLab = provider === 'gitlab' - return renderToStaticMarkup( - - ) -} - -describe('ChecksPanelReviewHeader', () => { - it('opens the PR from the number and puts link management behind the menu', () => { - const markup = renderHeader() - - expect(markup).toContain('Open on GitHub') - expect(markup).toContain('system browser') - expect(markup).toContain('⇧⌘+click') - expect(markup).not.toContain('⌘+click to open') - expect(markup).toContain('#2964') - expect(markup).toContain('underline decoration-border underline-offset-2') - expect(markup).toContain('More PR actions') - expect(markup).toContain('Unlink PR from workspace') - expect(markup).toContain( - 'Orca will hide PR #2964 details for this workspace. The PR and branch on GitHub won’t be changed.' - ) - expect(markup).toContain('Link another PR') - expect(markup).toContain('lucide-ellipsis') - expect(markup).not.toContain('lucide-external-link') - }) - - it('omits the modifier hint when it lands where a plain click already does', () => { - const markup = renderHeader({ modifierHintDestination: null }) - - expect(markup).toContain('Open on GitHub') - expect(markup).not.toContain('system browser') - expect(markup).not.toContain('⇧⌘+click') - }) - - // With inversion on and Link Routing off, the modifier goes to Orca; label that destination. - it('names Orca when the modifier inverts toward the built-in browser', () => { - expect(renderHeader({ modifierHintDestination: 'orca' })).toContain('⇧⌘+click to open in Orca') - - vi.stubGlobal('navigator', { userAgent: 'Windows' }) - expect(renderHeader({ modifierHintDestination: 'orca' })).toContain( - 'Shift+Ctrl+click to open in Orca' - ) - }) - - it('shows the Ctrl system-browser hint off macOS', () => { - vi.stubGlobal('navigator', { userAgent: 'Windows' }) - - const markup = renderHeader() - - expect(markup).toContain('Shift+Ctrl+click for system browser') - expect(markup).not.toContain('Ctrl+click to open') - }) - - it('enables unlinking for a displayed auto-detected PR', () => { - const markup = renderHeader({ canUnlinkReview: true }) - - expect(markup).not.toContain('data-disabled="true"') - expect(markup).toContain('Unlink PR from workspace') - }) - - it('shows GitLab MR identity with provider-appropriate link management actions', () => { - const markup = renderHeader({ provider: 'gitlab' }) - - expect(markup).toContain('Open on GitLab') - expect(markup).toContain('!31') - expect(markup).toContain('More MR actions') - expect(markup).toContain('Unlink MR from workspace') - expect(markup).toContain( - 'Orca will hide MR !31 details for this workspace. The MR and branch on GitLab won’t be changed.' - ) - expect(markup).toContain('Link another MR') - }) -}) diff --git a/src/renderer/src/components/right-sidebar/SourceControl.hosted-review-header-link.test.tsx b/src/renderer/src/components/right-sidebar/SourceControl.hosted-review-header-link.test.tsx deleted file mode 100644 index 0875707f888..00000000000 --- a/src/renderer/src/components/right-sidebar/SourceControl.hosted-review-header-link.test.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react' -import { renderToStaticMarkup } from 'react-dom/server' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { HostedReviewInfo } from '../../../../shared/hosted-review' -import { HostedReviewHeaderLink } from './source-control/review/hosted-review-header-chrome' - -const { openHttpLinkMock } = vi.hoisted(() => ({ openHttpLinkMock: vi.fn() })) - -vi.mock('@/lib/http-link-routing', () => ({ - openHttpLink: openHttpLinkMock, - registerHttpLinkStoreAccessor: vi.fn(), - registerWorkspaceHttpLinkBrowserOpener: vi.fn() -})) - -function makeReview(overrides: Partial = {}): HostedReviewInfo { - return { - provider: 'github', - number: 2192, - title: 'Open PR in checks', - state: 'open', - url: 'https://github.com/stablyai/orca/pull/2192', - status: 'pending', - updatedAt: '2026-05-17T00:00:00Z', - mergeable: 'UNKNOWN', - ...overrides - } -} - -type MinimalClickEvent = Pick< - React.MouseEvent, - 'nativeEvent' | 'stopPropagation' -> -type ClickModifiers = Partial> - -function clickEvent(modifiers: ClickModifiers = {}): MinimalClickEvent { - return { - nativeEvent: { - metaKey: modifiers.metaKey ?? false, - ctrlKey: modifiers.ctrlKey ?? false, - shiftKey: modifiers.shiftKey ?? false - } as MouseEvent, - stopPropagation: vi.fn() - } -} - -beforeEach(() => { - openHttpLinkMock.mockReset() -}) - -describe('HostedReviewHeaderLink', () => { - it('opens GitHub PRs in the Checks tab instead of rendering an external link', () => { - const onOpenHostedReviewInChecks = vi.fn() - const element = HostedReviewHeaderLink({ - review: makeReview(), - onOpenHostedReviewInChecks - }) - const markup = renderToStaticMarkup(element) - - expect(markup).toContain(' void)(event) - expect(event.stopPropagation).toHaveBeenCalledTimes(1) - expect(onOpenHostedReviewInChecks).toHaveBeenCalledTimes(1) - expect(openHttpLinkMock).not.toHaveBeenCalled() - }) - - it('opens GitLab MRs in the Checks tab instead of rendering an external link', () => { - const onOpenHostedReviewInChecks = vi.fn() - const element = HostedReviewHeaderLink({ - review: makeReview({ - provider: 'gitlab', - number: 31, - url: 'https://gitlab.com/acme/widgets/-/merge_requests/31' - }), - onOpenHostedReviewInChecks - }) - const markup = renderToStaticMarkup(element) - - expect(markup).toContain(' void)(event) - expect(event.stopPropagation).toHaveBeenCalledTimes(1) - expect(onOpenHostedReviewInChecks).toHaveBeenCalledTimes(1) - expect(openHttpLinkMock).not.toHaveBeenCalled() - }) - - it('keeps other provider reviews as external hosted-review links', () => { - const markup = renderToStaticMarkup( - - ) - - expect(markup).toContain('): string { - return renderToStaticMarkup( - Skill install panel
} - /> - ) -} - -describe('LinearAgentSkillGuide', () => { - it('renders the setup checklist with an inlined skill panel', () => { - const markup = renderGuide({}) - - expect(markup).toContain('Setup checklist') - expect(markup).toContain('2 of 3 ready') - expect(markup).toContain('Task Sources') - expect(markup).toContain('Skill install panel') - expect(markup).not.toContain('Ready below') - expect(markup).not.toContain('Install below') - expect(markup).not.toContain('Agent skill') - expect(markup).not.toContain('Open Task Sources setup') - }) - - it('marks the checklist complete when every step is done', () => { - expect(renderGuide({ skillInstalled: true })).toContain('All set') - }) - - it('keeps durable progress while a skill recheck is in flight', () => { - const markup = renderGuide({ skillInstalled: true, skillChecking: true }) - - expect(markup).toContain('Checking…') - expect(markup).not.toContain('2 of 3 ready') - expect(markup).not.toContain('All set') - }) - - it('keeps durable progress while a connection check is in flight', () => { - const markup = renderGuide({ skillInstalled: true, checking: true }) - - expect(markup).toContain('Checking…') - expect(markup).not.toContain('2 of 3 ready') - }) - - it('reports an unverifiable skill scan as unknown instead of an unfinished step', () => { - const markup = renderGuide({ skillUnverifiable: true }) - - expect(markup).toContain('Cannot verify') - expect(markup).toContain('2/3') - expect(markup).toContain('bg-amber-500') - expect(markup).not.toContain('2 of 3 ready') - expect(markup).not.toContain('All set') - }) - - it('still claims nothing while a rescan of an unverifiable step runs', () => { - const markup = renderGuide({ skillUnverifiable: true, skillChecking: true }) - - expect(markup).toContain('Checking…') - expect(markup).not.toContain('Cannot verify') - }) - - it('lets a found skill outrank a stale unverifiable flag', () => { - const markup = renderGuide({ skillInstalled: true, skillUnverifiable: true }) - - expect(markup).toContain('All set') - expect(markup).not.toContain('Cannot verify') - }) - - it('keeps the confirmed count when the unfinished step is the connection', () => { - const markup = renderGuide({ connected: false, skillUnverifiable: true }) - - expect(markup).toContain('1 of 3 ready') - expect(markup).not.toContain('Cannot verify') - }) - - it('does not headline an unknown skill over an unfinished visibility step', () => { - const markup = renderGuide({ visible: false, skillUnverifiable: true }) - - expect(markup).toContain('1 of 3 ready') - expect(markup).not.toContain('Cannot verify') - // Hiding Linear is deliberate, so the shared table keeps this pill neutral. - expect(markup).not.toContain('bg-amber-500') - }) -}) diff --git a/src/renderer/src/components/settings/task-source-setup-state.test.ts b/src/renderer/src/components/settings/task-source-setup-state.test.ts index 400d60b3cae..0a817f42dc9 100644 --- a/src/renderer/src/components/settings/task-source-setup-state.test.ts +++ b/src/renderer/src/components/settings/task-source-setup-state.test.ts @@ -36,23 +36,6 @@ function buildReadiness( } describe('task-source-setup-state', () => { - it('counts Linear readiness as three steps', () => { - expect( - getTaskProviderCompletedSteps({ - connected: true, - checking: false, - skillInstalled: false, - visible: true - }) - ).toEqual({ completed: 2, total: 3 }) - }) - - it('counts code-host readiness as two steps', () => { - expect( - getTaskProviderCompletedSteps({ connected: true, checking: false, visible: true }) - ).toEqual({ completed: 2, total: 2 }) - }) - it('marks Linear ready only when connected, skill installed, and visible', () => { expect( isTaskProviderReady({ @@ -256,66 +239,4 @@ describe('task-source-setup-state', () => { }) ).toBe('linear') }) - - it('does not switch to a later incomplete provider during the previous provider recheck', () => { - const whileChecking = buildReadiness({ - linear: { skillInstalled: false, skillChecking: true }, - jira: { connected: false } - }) - - expect(getAutoExpandedTaskProvider(ORDER, whileChecking)).toBe('jira') - expect( - resolveStickyAutoExpandedTaskProvider({ - providers: ORDER, - readinessByProvider: whileChecking, - previousAutoExpanded: 'linear' - }) - ).toBe('linear') - }) - - it('does not hand the expansion to a provider whose check landed later', () => { - // Model slower gh/glab preflight completing after Linear claimed expansion. - const afterPreflight = buildReadiness({ - github: { connected: false }, - gitlab: { connected: false }, - linear: { skillInstalled: false } - }) - - expect(getAutoExpandedTaskProvider(ORDER, afterPreflight)).toBe('github') - expect( - resolveStickyAutoExpandedTaskProvider({ - providers: ORDER, - readinessByProvider: afterPreflight, - previousAutoExpanded: 'linear' - }) - ).toBe('linear') - }) - - it('keeps the auto-expand slot after the chosen provider finishes', () => { - const afterLinearCompletes = buildReadiness({ github: { connected: false } }) - - expect(getAutoExpandedTaskProvider(ORDER, afterLinearCompletes)).toBe('github') - expect( - resolveStickyAutoExpandedTaskProvider({ - providers: ORDER, - readinessByProvider: afterLinearCompletes, - previousAutoExpanded: 'linear' - }) - ).toBe('linear') - }) - - it('keeps the auto-expand slot when the chosen provider is hidden', () => { - const afterHidingLinear = buildReadiness({ - github: { connected: false }, - linear: { skillInstalled: false, visible: false } - }) - - expect( - resolveStickyAutoExpandedTaskProvider({ - providers: ORDER, - readinessByProvider: afterHidingLinear, - previousAutoExpanded: 'linear' - }) - ).toBe('linear') - }) })