| author | |
| committer | |
| log | 5eb4f452ee0fcde7b5bbc93d62de9118b70a33b2 |
| tree | 4ac40b64221fa582c98c7400d72be4c6ba656409 |
| parent | d4bd8923ad8cab346a854967015b06d9e5cd77f7 |
| signature | Signed by PGP key B5690EEEBB952194 |
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>6 files changed, 0 insertions(+), 199 deletions(-)
apps/web/src/components/ProjectScriptsControl.test.tsx deleted-65| ... | ... | @@ -1,65 +0,0 @@ |
| 1 | import type { ProjectScript, ResolvedKeybindingsConfig } from "@t3tools/contracts"; | |
| 2 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 3 | import { describe, expect, it } from "vite-plus/test"; | |
| 4 | ||
| 5 | import ProjectScriptsControl from "./ProjectScriptsControl"; | |
| 6 | ||
| 7 | const EMPTY_KEYBINDINGS: ResolvedKeybindingsConfig = []; | |
| 8 | const PRIMARY_SCRIPT: ProjectScript = { | |
| 9 | id: "dev", | |
| 10 | name: "Dev", | |
| 11 | command: "vp dev", | |
| 12 | icon: "play", | |
| 13 | runOnWorktreeCreate: false, | |
| 14 | }; | |
| 15 | ||
| 16 | function renderControl(scripts: ReadonlyArray<ProjectScript>) { | |
| 17 | return renderToStaticMarkup( | |
| 18 | <ProjectScriptsControl | |
| 19 | scripts={scripts} | |
| 20 | keybindings={EMPTY_KEYBINDINGS} | |
| 21 | onRunScript={() => {}} | |
| 22 | onAddScript={async () => undefined as never} | |
| 23 | onUpdateScript={async () => undefined as never} | |
| 24 | onDeleteScript={async () => undefined as never} | |
| 25 | />, | |
| 26 | ); | |
| 27 | } | |
| 28 | ||
| 29 | function buttonTag(html: string, ariaLabel: string) { | |
| 30 | return html.match(new RegExp(`<button[^>]*aria-label="${ariaLabel}"[^>]*>`))?.[0]; | |
| 31 | } | |
| 32 | ||
| 33 | function expectResponsiveXsControl(markup: string | undefined) { | |
| 34 | expect(markup).toBeDefined(); | |
| 35 | expect(markup).toContain("h-7"); | |
| 36 | expect(markup).toContain("gap-1"); | |
| 37 | expect(markup).toContain("text-sm"); | |
| 38 | expect(markup).toContain("sm:h-6"); | |
| 39 | expect(markup).toContain("sm:text-xs"); | |
| 40 | expect(markup).toContain("w-7"); | |
| 41 | expect(markup).toContain("px-0"); | |
| 42 | expect(markup).toContain("sm:w-6"); | |
| 43 | expect(markup).toContain("@3xl/header-actions:w-auto!"); | |
| 44 | expect(markup).toContain("@3xl/header-actions:px-[calc(--spacing(2)-1px)]"); | |
| 45 | } | |
| 46 | ||
| 47 | describe("ProjectScriptsControl compact controls", () => { | |
| 48 | it("keeps the primary Run control compact and expands it with its label", () => { | |
| 49 | const html = renderControl([PRIMARY_SCRIPT]); | |
| 50 | ||
| 51 | expectResponsiveXsControl(buttonTag(html, "Run Dev")); | |
| 52 | expect(html).toContain( | |
| 53 | 'class="sr-only @3xl/header-actions:not-sr-only @3xl/header-actions:ml-0.5"', | |
| 54 | ); | |
| 55 | }); | |
| 56 | ||
| 57 | it("keeps the standalone Add control compact and expands it with its label", () => { | |
| 58 | const html = renderControl([]); | |
| 59 | ||
| 60 | expectResponsiveXsControl(buttonTag(html, "Add action")); | |
| 61 | expect(html).toContain( | |
| 62 | 'class="sr-only @3xl/header-actions:not-sr-only @3xl/header-actions:ml-0.5"', | |
| 63 | ); | |
| 64 | }); | |
| 65 | }); |
apps/web/src/components/chat/ComposerPendingTerminalContexts.test.tsx deleted-28| ... | ... | @@ -1,28 +0,0 @@ |
| 1 | import { ThreadId } from "@t3tools/contracts"; | |
| 2 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 3 | import { describe, expect, it } from "vite-plus/test"; | |
| 4 | ||
| 5 | import { ComposerPendingTerminalContextChip } from "./ComposerPendingTerminalContexts"; | |
| 6 | ||
| 7 | describe("ComposerPendingTerminalContextChip", () => { | |
| 8 | it("renders expired terminal contexts with error styling", () => { | |
| 9 | const markup = renderToStaticMarkup( | |
| 10 | <ComposerPendingTerminalContextChip | |
| 11 | context={{ | |
| 12 | id: "ctx-expired", | |
| 13 | threadId: ThreadId.make("thread-1"), | |
| 14 | terminalId: "default", | |
| 15 | terminalLabel: "Terminal 1", | |
| 16 | lineStart: 2, | |
| 17 | lineEnd: 4, | |
| 18 | text: "", | |
| 19 | createdAt: "2026-03-17T18:42:05.449Z", | |
| 20 | }} | |
| 21 | />, | |
| 22 | ); | |
| 23 | ||
| 24 | expect(markup).toContain('data-terminal-context-expired="true"'); | |
| 25 | expect(markup).toContain("border-destructive/35"); | |
| 26 | expect(markup).toContain("Terminal 1 lines 2-4"); | |
| 27 | }); | |
| 28 | }); |
apps/web/src/components/chat/ComposerPromptLengthValidation.test.tsx deleted-23| ... | ... | @@ -1,23 +0,0 @@ |
| 1 | import { PROVIDER_SEND_TURN_MAX_INPUT_CHARS } from "@t3tools/contracts"; | |
| 2 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 3 | import { describe, expect, it } from "vite-plus/test"; | |
| 4 | ||
| 5 | import { getComposerPromptLengthValidationMessage } from "./composerSubmission"; | |
| 6 | import { ComposerPromptLengthValidation } from "./ComposerPromptLengthValidation"; | |
| 7 | ||
| 8 | describe("ComposerPromptLengthValidation", () => { | |
| 9 | it("renders oversized prompt feedback as an actionable composer alert", () => { | |
| 10 | const message = getComposerPromptLengthValidationMessage( | |
| 11 | "x".repeat(PROVIDER_SEND_TURN_MAX_INPUT_CHARS + 1), | |
| 12 | ); | |
| 13 | ||
| 14 | const markup = renderToStaticMarkup(<ComposerPromptLengthValidation message={message} />); | |
| 15 | ||
| 16 | expect(markup).toContain('role="alert"'); | |
| 17 | expect(markup).toContain('data-chat-composer-validation="prompt-length"'); | |
| 18 | expect(markup).toContain( | |
| 19 | "Prompt is 1 character over the 120,000-character limit. Shorten or split it before sending.", | |
| 20 | ); | |
| 21 | expect(markup).not.toContain("ProviderValidationError"); | |
| 22 | }); | |
| 23 | }); |
apps/web/src/components/chat/PanelLayoutControls.test.tsx deleted-28| ... | ... | @@ -1,28 +0,0 @@ |
| 1 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 2 | import { describe, expect, it } from "vite-plus/test"; | |
| 3 | ||
| 4 | import { PanelLayoutControls } from "./PanelLayoutControls"; | |
| 5 | ||
| 6 | describe("PanelLayoutControls", () => { | |
| 7 | it("keeps unavailable panel tooltip triggers interactive", () => { | |
| 8 | const markup = renderToStaticMarkup( | |
| 9 | <PanelLayoutControls | |
| 10 | showTerminalControl | |
| 11 | terminalAvailable={false} | |
| 12 | terminalOpen={false} | |
| 13 | terminalShortcutLabel={null} | |
| 14 | rightPanelAvailable={false} | |
| 15 | rightPanelOpen={false} | |
| 16 | rightPanelShortcutLabel={null} | |
| 17 | liveAgentCount={0} | |
| 18 | onToggleTerminal={() => {}} | |
| 19 | onToggleRightPanel={() => {}} | |
| 20 | />, | |
| 21 | ); | |
| 22 | ||
| 23 | expect(markup.match(/data-slot="tooltip-trigger"/g)).toHaveLength(2); | |
| 24 | expect(markup.match(/data-slot="tooltip-trigger"[^>]*><button[^>]*disabled=""/g)).toHaveLength( | |
| 25 | 2, | |
| 26 | ); | |
| 27 | }); | |
| 28 | }); |
apps/web/src/components/preview/PreviewChromeRow.test.tsx deleted-24| ... | ... | @@ -1,24 +0,0 @@ |
| 1 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 2 | import { describe, expect, it, vi } from "vite-plus/test"; | |
| 3 | ||
| 4 | import { PreviewChromeRow } from "./PreviewChromeRow"; | |
| 5 | ||
| 6 | describe("PreviewChromeRow", () => { | |
| 7 | it("shows the complete URL while the address bar is not focused", () => { | |
| 8 | const markup = renderToStaticMarkup( | |
| 9 | <PreviewChromeRow | |
| 10 | url="https://example.com/dashboard?mode=edit&tab=1#notes" | |
| 11 | loading={false} | |
| 12 | canGoBack={false} | |
| 13 | canGoForward={false} | |
| 14 | refreshDisabled={false} | |
| 15 | onBack={vi.fn()} | |
| 16 | onForward={vi.fn()} | |
| 17 | onRefresh={vi.fn()} | |
| 18 | onSubmit={vi.fn()} | |
| 19 | />, | |
| 20 | ); | |
| 21 | ||
| 22 | expect(markup).toContain('value="https://example.com/dashboard?mode=edit&amp;tab=1#notes"'); | |
| 23 | }); | |
| 24 | }); |
apps/web/src/components/ui/command.test.tsx deleted-31| ... | ... | @@ -1,31 +0,0 @@ |
| 1 | import { renderToStaticMarkup } from "react-dom/server"; | |
| 2 | import { describe, expect, it } from "vite-plus/test"; | |
| 3 | ||
| 4 | import { Command, CommandFooter, CommandInput } from "./command"; | |
| 5 | ||
| 6 | describe("command compact geometry", () => { | |
| 7 | it("keeps shell selectors on the wrapper and direct-input padding on AutocompleteInput", () => { | |
| 8 | const html = renderToStaticMarkup( | |
| 9 | <Command> | |
| 10 | <CommandInput placeholder="Search commands" /> | |
| 11 | </Command>, | |
| 12 | ); | |
| 13 | const shellClass = html.match(/class="([^"]*px-\[var\(--command-shell-inset\)[^"]*)"/)?.[1]; | |
| 14 | const inputClass = html.match(/class="([^"]*has-focus-visible:ring-0[^"]*)"/)?.[1]; | |
| 15 | ||
| 16 | expect(shellClass).toContain( | |
| 17 | "[&amp;_[data-slot=autocomplete-start-addon]]:ps-[calc(var(--command-shell-inset)+0.0625rem)]", | |
| 18 | ); | |
| 19 | expect(shellClass).not.toContain("sm:*:data-[slot=autocomplete-input]"); | |
| 20 | expect(inputClass).toContain( | |
| 21 | "sm:*:data-[slot=autocomplete-input]:ps-[calc(var(--command-shell-inset)+1.5rem)]!", | |
| 22 | ); | |
| 23 | }); | |
| 24 | ||
| 25 | it("uses the semantic footer inset without changing compact vertical padding", () => { | |
| 26 | const html = renderToStaticMarkup(<CommandFooter>Shortcuts</CommandFooter>); | |
| 27 | ||
| 28 | expect(html).toContain("px-[var(--command-content-inset)]"); | |
| 29 | expect(html).toContain("py-2.5"); | |
| 30 | }); | |
| 31 | }); |