Ctrl K
ComunidadGuías…

tests/builder-mcp-setup.unit.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// @vitest-environment happy-dom
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { createApp, nextTick } from 'vue'
import AppOnboardingBuilderAiSetup from '../src/components/dashboard/AppOnboardingBuilderAiSetup.vue'

const mocks = vi.hoisted(() => ({ writeText: vi.fn(), success: vi.fn() }))
vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => key }) }))
vi.mock('vue-sonner', () => ({ toast: { success: mocks.success } }))

let app: ReturnType<typeof createApp> | undefined
let container: HTMLDivElement
const onCopy = vi.fn()

beforeEach(() => {
  vi.clearAllMocks()
  mocks.writeText.mockResolvedValue(undefined)
  vi.stubGlobal('navigator', { clipboard: { writeText: mocks.writeText } })
  container = document.createElement('div')
  app = createApp(AppOnboardingBuilderAiSetup, { onCopy })
  app.mount(container)
})

afterEach(() => {
  app?.unmount()
  vi.unstubAllGlobals()
})

describe('explicit Builder MCP installation', () => {
  it.each(['codex', 'cursor', 'claude-code', 'windsurf', 'vscode', 'zed'])('copies the installation command for %s without starting account setup', async (client) => {
    container.querySelector<HTMLButtonElement>(`[data-test="builder-mcp-client-${client}"]`)!.click()
    await nextTick()
    const expected = `npx install-mcp "npx @capgo/cli@latest mcp" --client ${client}`
    expect(container.querySelector('[data-test="builder-mcp-install-command"]')!.textContent).toBe(expected)
    expect(container.querySelector(`[data-test="builder-mcp-client-${client}"]`)!.getAttribute('aria-pressed')).toBe('true')
    container.querySelector<HTMLButtonElement>('[data-test="builder-mcp-copy-install"]')!.click()
    await vi.waitFor(() => expect(mocks.success).toHaveBeenCalledOnce())
    expect(mocks.writeText).toHaveBeenCalledWith(expected)
    expect(onCopy).not.toHaveBeenCalled()
  })

  it('keeps the command visible and avoids a false success when clipboard access fails', async () => {
    mocks.writeText.mockRejectedValueOnce(new Error('Clipboard unavailable'))
    container.querySelector<HTMLButtonElement>('[data-test="builder-mcp-copy-install"]')!.click()
    await vi.waitFor(() => expect(container.querySelector('[role="alert"]')).not.toBeNull())
    expect(container.querySelector('[data-test="builder-mcp-install-command"]')!.textContent).toContain('--client codex')
    expect(mocks.success).not.toHaveBeenCalled()
    expect(onCopy).not.toHaveBeenCalled()
  })

  it('hands account-connected setup to the existing copy handler separately from installation', () => {
    container.querySelector<HTMLButtonElement>('[data-test="builder-checklist-copy-ai"]')!.click()
    expect(onCopy).toHaveBeenCalledOnce()
    expect(mocks.writeText).not.toHaveBeenCalled()
  })
})