diff --git a/src/renderer/src/components/native-chat/NativeChatAgentMessageRow.test.tsx b/src/renderer/src/components/native-chat/NativeChatAgentMessageRow.test.tsx index bb3008438e5..477254b3567 100644 --- a/src/renderer/src/components/native-chat/NativeChatAgentMessageRow.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatAgentMessageRow.test.tsx @@ -1,12 +1,12 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, describe, expect, it, vi } from 'vitest' import type { AgentMessageSource } from '../../../../shared/agent-session/agent-session-message-source' import type { NativeChatMessage } from '../../../../shared/native-chat-types' import { MessageRow } from './NativeChatMessageRow' import { NativeChatQueuedMessageCard } from './NativeChatQueuedMessageCard' -import { TooltipProvider } from '@/components/ui/tooltip' const openAgentMessageSender = vi.hoisted(() => vi.fn(async () => {})) vi.mock('@/lib/open-agent-message-sender', () => ({ openAgentMessageSender })) @@ -126,24 +126,22 @@ describe("another agent's message in the transcript", () => { describe("another agent's queued card", () => { function renderCard(source: AgentMessageSource, chatWorktreeId: string | null = 'wt-chat') { return render( - - - + ) } diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.font-windowing.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.font-windowing.test.tsx index 5806f66cc62..445a663db4a 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.font-windowing.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.font-windowing.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { act, cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { createGlobalSettingsFixture } from '../../../../shared/global-settings-test-fixture' import { useAppStore } from '../../store' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.growth-windowing.spec.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.growth-windowing.spec.tsx index c8b1a688d6f..ca3732aee62 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.growth-windowing.spec.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.growth-windowing.spec.tsx @@ -1,4 +1,5 @@ -import { act, fireEvent, render, screen } from '@testing-library/react' +import { act, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { NativeChatMessage } from '../../../../shared/native-chat-types' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.live-reasoning.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.live-reasoning.test.tsx index 8abb275eda0..4e4e7f6f55f 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.live-reasoning.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.live-reasoning.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen, within } from '@testing-library/react' +import { cleanup, fireEvent, screen, within } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' import type { AgentJournalItemBody, diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.new-rows-marker.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.new-rows-marker.test.tsx index 6fdbc542523..0f3513dd2f1 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.new-rows-marker.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.new-rows-marker.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { act, cleanup, render, screen } from '@testing-library/react' +import { act, cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { createRef } from 'react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { NativeChatMessage } from '../../../../shared/native-chat-types' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.older-history.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.older-history.test.tsx index 8cfa502b610..e77998c9962 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.older-history.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.older-history.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { act, cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.opening-send.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.opening-send.test.tsx index 076c606b148..3f22853028f 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.opening-send.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.opening-send.test.tsx @@ -2,7 +2,8 @@ // Queued sends wait after the opening turn’s live status until actual handover, including across Stop. import '@testing-library/jest-dom/vitest' -import { cleanup, render, screen } from '@testing-library/react' +import { cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.queued-turn-order.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.queued-turn-order.test.tsx index 6415fabc4b0..2b17d3f6ea5 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.queued-turn-order.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.queued-turn-order.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, render, screen } from '@testing-library/react' +import { cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsx index d0069f530d2..028fbdcaa44 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { act, cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { useCallback, useMemo, useState } from 'react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.reader-navigation.spec.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.reader-navigation.spec.tsx index 006b66c910d..33c2bb1769e 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.reader-navigation.spec.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.reader-navigation.spec.tsx @@ -1,4 +1,5 @@ -import { act, fireEvent, render, screen } from '@testing-library/react' +import { act, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { createRef } from 'react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.render-cost.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.render-cost.test.tsx index 3ce7b5cf16a..b9a9e623537 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.render-cost.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.render-cost.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.subagent-sections.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.subagent-sections.test.tsx index e47889971fd..4f7daf056e2 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.subagent-sections.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.subagent-sections.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen, within, act } from '@testing-library/react' +import { cleanup, fireEvent, screen, within, act } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.test.tsx index b10616bab16..cbd2cfd724d 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx index 1c88162f11a..921ae02edfd 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx @@ -1,5 +1,6 @@ // @vitest-environment happy-dom -import { cleanup, render, screen } from '@testing-library/react' +import { cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-indicator.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-indicator.test.tsx index 6e7e02d5a9c..e67da33a553 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-indicator.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-indicator.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-membership.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-membership.test.tsx index b8bc2171307..c6614ec0e85 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-membership.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-membership.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, render, screen, fireEvent } from '@testing-library/react' +import { cleanup, screen, fireEvent } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx index 439cc955f2a..42873370f3d 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, render, screen } from '@testing-library/react' +import { cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. @@ -24,7 +25,6 @@ afterEach(() => { expect(unusedChatLeaves.inlineVisual).not.toHaveBeenCalled() expect(unusedChatLeaves.openSender).not.toHaveBeenCalled() }) -import { TooltipProvider } from '@/components/ui/tooltip' import { NativeChatOrcaStopContext } from './native-chat-orca-stop-context' import { agentSessionFailureWords } from '../../../../shared/agent-session-failure-words' import type { @@ -299,22 +299,20 @@ const usageLimitView = { } ] render( - - - - - + + + ) expect(screen.getByRole('button', { name: 'Toggle turn details' })).toHaveAttribute( 'aria-expanded', diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.unsent-message.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.unsent-message.test.tsx index ce6fa127d08..95ef44ec59d 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.unsent-message.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.unsent-message.test.tsx @@ -4,7 +4,8 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, render } from '@testing-library/react' +import { cleanup } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageList.windowing.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageList.windowing.test.tsx index 64826684a0e..43f8ece5b88 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageList.windowing.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageList.windowing.test.tsx @@ -2,7 +2,8 @@ import '@testing-library/jest-dom/vitest' -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { act, cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageRow.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageRow.test.tsx index 54185024b15..5a72f5647da 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageRow.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageRow.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' +import { cleanup, fireEvent, screen, waitFor } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. @@ -24,7 +25,6 @@ afterEach(() => { }) import type { NativeChatMessage } from '../../../../shared/native-chat-types' import { MessageRow, type NativeChatDeliveryNotice } from './NativeChatMessageRow' -import { TooltipProvider } from '@/components/ui/tooltip' import type { NativeChatRewindSurface } from './use-native-chat-rewind' import { readNativeChatQuotableSelection } from './native-chat-quote-selection' @@ -45,20 +45,18 @@ function renderMessage( rewind?: NativeChatRewindSurface ) { return render( - - - + ) } @@ -120,24 +118,22 @@ describe('MessageRow control visibility', () => { Object.assign(window, { api: { ui: { writeClipboardText } } }) render( - - - + ) fireEvent.click(screen.getByRole('button', { name: 'Copy message' })) @@ -184,21 +180,19 @@ describe('MessageRow control visibility', () => { it('holds the agent controls back until the turn stops working', () => { const row = (activeTurnIsWorking: boolean) => ( - - - + ) const { rerender } = render(row(true)) expect(screen.getByText('Message text')).toBeInTheDocument() diff --git a/src/renderer/src/components/native-chat/NativeChatMessageRow.work-run.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageRow.work-run.test.tsx index 4653953e172..c2fbaa8da2c 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageRow.work-run.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageRow.work-run.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, describe, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. diff --git a/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.test.tsx b/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.test.tsx index 4c4dadd56bf..8d9288807d4 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.test.tsx @@ -1,9 +1,14 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { act, cleanup, render, screen } from '@testing-library/react' +import { act, cleanup, screen } from '@testing-library/react' +import userEvent from '@testing-library/user-event' import { afterEach, describe, expect, it } from 'vitest' import { i18n } from '@/i18n/i18n' import { NativeChatMessageTimestamp } from './NativeChatMessageTimestamp' +import { render } from './native-chat-tooltip-test-harness' + +const fullLabel = (timestamp: number): string => + new Intl.DateTimeFormat('en', { dateStyle: 'full', timeStyle: 'long' }).format(timestamp) afterEach(async () => { cleanup() @@ -28,19 +33,27 @@ describe('NativeChatMessageTimestamp', () => { expect(time).toHaveTextContent( new Intl.DateTimeFormat('en', { hour: 'numeric', minute: '2-digit' }).format(timestamp) ) - expect(time).toHaveAccessibleName( - new Intl.DateTimeFormat('en', { dateStyle: 'full', timeStyle: 'long' }).format(timestamp) - ) + expect(time).toHaveAccessibleName(fullLabel(timestamp)) expect(time).not.toHaveAttribute('tabindex') } ) - it('provides a focus target only when requested for user metadata', () => { - render() + it('shows the full date and time on hover', async () => { + const timestamp = Date.parse('2026-09-06T19:04:05Z') + render() + await userEvent.setup().hover(screen.getByRole('time')) + expect(await screen.findByRole('tooltip')).toHaveTextContent(fullLabel(timestamp)) + }) + + it('names a focusable timestamp before focus and shows, not re-announces, the tooltip on focus', async () => { + const timestamp = Date.parse('2026-09-06T19:04:05Z') + render() const time = screen.getByRole('time') - time.focus() + expect(time).toHaveAccessibleName(fullLabel(timestamp)) + await userEvent.setup().tab() expect(time).toHaveFocus() - expect(time).toHaveAttribute('tabindex', '0') + expect(await screen.findByRole('tooltip')).toHaveTextContent(fullLabel(timestamp)) + expect(time).not.toHaveAttribute('aria-describedby') }) it('updates settled time when the UI language changes without a parent rerender', async () => { diff --git a/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.tsx b/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.tsx index 22d99d1edd4..b5876cacd5f 100644 --- a/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.tsx +++ b/src/renderer/src/components/native-chat/NativeChatMessageTimestamp.tsx @@ -1,4 +1,5 @@ import { useTranslation } from 'react-i18next' +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import { getIntlLocale } from '@/i18n/i18n' import { cn } from '@/lib/utils' import { @@ -42,18 +43,27 @@ export function NativeChatMessageTimestamp({ return null } const formatters = getTimestampFormatters() + const fullLabel = formatters.full.format(date) return ( - - {formatters.time.format(date)} - + + {/* The label already carries the full date in every reading mode; the tooltip would repeat it. */} + + + {formatters.time.format(date)} + + + + {fullLabel} + + ) } diff --git a/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.empty-answer.test.tsx b/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.empty-answer.test.tsx index c8571e7cdb8..b96ee492325 100644 --- a/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.empty-answer.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.empty-answer.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { cleanup, render, screen } from '@testing-library/react' +import { cleanup, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, describe, expect, it } from 'vitest' import type { AgentJournalQuestionItem } from '../../../../shared/agent-session-journal-types' import { NativeChatResolutionReceipt } from './NativeChatResolutionReceipt' diff --git a/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.test.tsx b/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.test.tsx index aa7ad5e2956..82b1a7b6c9c 100644 --- a/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatResolutionReceipt.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom import '@testing-library/jest-dom/vitest' -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { act, cleanup, fireEvent, screen } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import { afterEach, describe, expect, it } from 'vitest' import { i18n } from '@/i18n/i18n' import type { diff --git a/src/renderer/src/components/native-chat/NativeChatResolvedView.images.test.tsx b/src/renderer/src/components/native-chat/NativeChatResolvedView.images.test.tsx index 3c632b9e952..f62ecdf517d 100644 --- a/src/renderer/src/components/native-chat/NativeChatResolvedView.images.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatResolvedView.images.test.tsx @@ -1,7 +1,8 @@ // @vitest-environment happy-dom import { afterEach, beforeEach, expect, it, vi } from 'vitest' -import { cleanup, render, screen, waitFor } from '@testing-library/react' +import { cleanup, screen, waitFor } from '@testing-library/react' +import { render } from './native-chat-tooltip-test-harness' import type { NativeChatLiveSession } from './use-native-chat-live-session' import { resetLocalImageSrcStateForTests } from '@/components/editor/useLocalImageSrc' import { useAppStore } from '@/store' diff --git a/src/renderer/src/components/native-chat/native-chat-tooltip-test-harness.tsx b/src/renderer/src/components/native-chat/native-chat-tooltip-test-harness.tsx new file mode 100644 index 00000000000..3cfbe21e329 --- /dev/null +++ b/src/renderer/src/components/native-chat/native-chat-tooltip-test-harness.tsx @@ -0,0 +1,7 @@ +import { render as renderUnwrapped, type RenderOptions } from '@testing-library/react' +import { TooltipProvider } from '@/components/ui/tooltip' + +// Transcript rows carry tooltips (message timestamps), which App's TooltipProvider supplies in production. +export function render(ui: React.ReactElement, options?: Omit) { + return renderUnwrapped(ui, { ...options, wrapper: TooltipProvider }) +} diff --git a/tests/e2e/native-chat-transcript-reasoning.unit.test.ts b/tests/e2e/native-chat-transcript-reasoning.unit.test.ts index bb542d24705..92c55b3ec20 100644 --- a/tests/e2e/native-chat-transcript-reasoning.unit.test.ts +++ b/tests/e2e/native-chat-transcript-reasoning.unit.test.ts @@ -2,7 +2,7 @@ import '@testing-library/jest-dom/vitest' -import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { cleanup, fireEvent, screen } from '@testing-library/react' import { afterAll, afterEach, beforeAll, expect, it, vi } from 'vitest' // Why: these fixtures have neither inline visual owners nor sender navigation. @@ -27,6 +27,7 @@ afterEach(() => { import { createElement } from 'react' import { NativeChatMessageList } from '../../src/renderer/src/components/native-chat/NativeChatMessageList' import { installNativeChatMessageListTestViewport } from '../../src/renderer/src/components/native-chat/native-chat-message-list-test-viewport' +import { render } from '../../src/renderer/src/components/native-chat/native-chat-tooltip-test-harness' let restoreViewport = (): void => {} beforeAll(() => { diff --git a/tests/tools/omp-transcript-rendered/fixture.tsx b/tests/tools/omp-transcript-rendered/fixture.tsx index 2f4ed169058..c105736fb35 100644 --- a/tests/tools/omp-transcript-rendered/fixture.tsx +++ b/tests/tools/omp-transcript-rendered/fixture.tsx @@ -1,5 +1,6 @@ import React from 'react' import { createRoot } from 'react-dom/client' +import { TooltipProvider } from '@/components/ui/tooltip' import { NativeChatMessageList } from '../../../src/renderer/src/components/native-chat/NativeChatMessageList' import type { NativeChatMessage } from '../../../src/shared/native-chat-types' import './fixture.css' @@ -17,24 +18,26 @@ if (!root) { throw new Error('Missing fixture root') } createRoot(root).render( - - OMP · Native chat - - Promise.resolve('exhausted' as const), - readPhase: 'ready' - }} - isWorking={false} - expandSignal={false} - /> - - + + + OMP · Native chat + + Promise.resolve('exhausted' as const), + readPhase: 'ready' + }} + isWorking={false} + expandSignal={false} + /> + + + )