mirror of https://github.com/kern/filepizza
chore(ci): install playwright
parent
ffd64d8d99
commit
525012ad69
@ -0,0 +1,11 @@
|
||||
import { defineConfig } from '@playwright/test'
|
||||
|
||||
export default defineConfig({
|
||||
testDir: './tests/e2e',
|
||||
webServer: {
|
||||
command: 'node .next/standalone/server.js',
|
||||
port: 3000,
|
||||
timeout: 120 * 1000,
|
||||
reuseExistingServer: true,
|
||||
},
|
||||
})
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,9 @@
|
||||
/// <reference types="@playwright/test" />
|
||||
import { test, expect } from '@playwright/test'
|
||||
|
||||
test('home page loads', async ({ page }) => {
|
||||
await page.goto('http://localhost:3000/')
|
||||
await expect(
|
||||
page.getByText('Peer-to-peer file transfers in your browser.'),
|
||||
).toBeVisible()
|
||||
})
|
||||
@ -0,0 +1,14 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import CancelButton from '../../src/components/CancelButton'
|
||||
|
||||
describe('CancelButton', () => {
|
||||
it('calls onClick when clicked', () => {
|
||||
const onClick = vi.fn()
|
||||
const { getByText } = render(<CancelButton onClick={onClick} />)
|
||||
fireEvent.click(getByText('Cancel'))
|
||||
expect(onClick).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,25 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { ConnectionListItem } from '../../src/components/ConnectionListItem'
|
||||
import { UploaderConnectionStatus } from '../../src/types'
|
||||
|
||||
const baseConn = {
|
||||
status: UploaderConnectionStatus.Uploading,
|
||||
dataConnection: {} as any,
|
||||
completedFiles: 1,
|
||||
totalFiles: 2,
|
||||
currentFileProgress: 0.5,
|
||||
browserName: 'Chrome',
|
||||
browserVersion: '120',
|
||||
}
|
||||
|
||||
describe('ConnectionListItem', () => {
|
||||
it('shows status and progress', () => {
|
||||
const { getByText } = render(<ConnectionListItem conn={baseConn} />)
|
||||
expect(getByText((c, e) => e?.textContent === 'Chrome v120')).toBeInTheDocument()
|
||||
expect(getByText('UPLOADING')).toBeInTheDocument()
|
||||
expect(getByText('Completed: 1 / 2 files')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,22 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { act } from 'react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import { CopyableInput } from '../../src/components/CopyableInput'
|
||||
|
||||
Object.assign(navigator, {
|
||||
clipboard: {
|
||||
writeText: vi.fn().mockResolvedValue(undefined),
|
||||
},
|
||||
})
|
||||
|
||||
describe('CopyableInput', () => {
|
||||
it('copies text when button clicked', async () => {
|
||||
const { getByText } = render(<CopyableInput label="URL" value="hello" />)
|
||||
await act(async () => {
|
||||
fireEvent.click(getByText('Copy'))
|
||||
})
|
||||
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('hello')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,14 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import DownloadButton from '../../src/components/DownloadButton'
|
||||
|
||||
describe('DownloadButton', () => {
|
||||
it('calls onClick', () => {
|
||||
const fn = vi.fn()
|
||||
const { getByText } = render(<DownloadButton onClick={fn} />)
|
||||
fireEvent.click(getByText('Download'))
|
||||
expect(fn).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,60 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import { vi } from 'vitest'
|
||||
vi.mock('next-view-transitions', () => ({ Link: (p: any) => <a {...p}>{p.children}</a> }))
|
||||
import React from 'react'
|
||||
import { render, fireEvent, waitFor } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import {
|
||||
ConnectingToUploader,
|
||||
DownloadComplete,
|
||||
DownloadInProgress,
|
||||
ReadyToDownload,
|
||||
PasswordEntry,
|
||||
} from '../../src/components/Downloader'
|
||||
|
||||
const files = [{ fileName: 'a.txt', size: 1, type: 'text/plain' }]
|
||||
|
||||
describe('Downloader subcomponents', () => {
|
||||
it('ConnectingToUploader shows troubleshooting', async () => {
|
||||
const { getByText } = render(
|
||||
<ConnectingToUploader showTroubleshootingAfter={0} />,
|
||||
)
|
||||
await waitFor(() => {
|
||||
expect(getByText('Having trouble connecting?')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
it('DownloadComplete lists files', () => {
|
||||
const { getByText } = render(
|
||||
<DownloadComplete filesInfo={files} bytesDownloaded={1} totalSize={1} />,
|
||||
)
|
||||
expect(getByText('You downloaded 1 file.')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('DownloadInProgress shows stop button', () => {
|
||||
const { getByText } = render(
|
||||
<DownloadInProgress filesInfo={files} bytesDownloaded={0} totalSize={1} onStop={() => {}} />,
|
||||
)
|
||||
expect(getByText('Stop Download')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('ReadyToDownload shows start button', () => {
|
||||
const { getByText } = render(
|
||||
<ReadyToDownload filesInfo={files} onStart={() => {}} />,
|
||||
)
|
||||
expect(getByText('Download')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('PasswordEntry submits value', () => {
|
||||
let submitted = ''
|
||||
const { getByPlaceholderText, getByText } = render(
|
||||
<PasswordEntry errorMessage={null} onSubmit={(v) => (submitted = v)} />,
|
||||
)
|
||||
fireEvent.change(
|
||||
getByPlaceholderText('Enter a secret password for this slice of FilePizza...'),
|
||||
{ target: { value: 'secret' } },
|
||||
)
|
||||
fireEvent.submit(getByText('Unlock'))
|
||||
expect(submitted).toBe('secret')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,19 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import DropZone from '../../src/components/DropZone'
|
||||
|
||||
function createFile(name: string) {
|
||||
return new File(['hello'], name, { type: 'text/plain' })
|
||||
}
|
||||
|
||||
describe('DropZone', () => {
|
||||
it('calls onDrop when file selected', () => {
|
||||
const fn = vi.fn()
|
||||
const { container } = render(<DropZone onDrop={fn} />)
|
||||
const input = container.querySelector('input') as HTMLInputElement
|
||||
fireEvent.change(input, { target: { files: [createFile('a.txt')] } })
|
||||
expect(fn).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { ErrorMessage } from '../../src/components/ErrorMessage'
|
||||
|
||||
describe('ErrorMessage', () => {
|
||||
it('renders message', () => {
|
||||
const { getByText } = render(<ErrorMessage message="oops" />)
|
||||
expect(getByText('oops')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,18 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import Footer from '../../src/components/Footer'
|
||||
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: { href: '' },
|
||||
writable: true,
|
||||
})
|
||||
|
||||
describe('Footer', () => {
|
||||
it('redirects to donate link', () => {
|
||||
const { getByText } = render(<Footer />)
|
||||
fireEvent.click(getByText('Donate'))
|
||||
expect(window.location.href).toContain('coinbase')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,16 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import InputLabel from '../../src/components/InputLabel'
|
||||
|
||||
describe('InputLabel', () => {
|
||||
it('shows tooltip on hover', () => {
|
||||
const { getByRole, getByText } = render(
|
||||
<InputLabel tooltip="tip">Label</InputLabel>,
|
||||
)
|
||||
const button = getByRole('button')
|
||||
fireEvent.mouseOver(button)
|
||||
expect(getByText('tip')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import Loading from '../../src/components/Loading'
|
||||
|
||||
describe('Loading', () => {
|
||||
it('renders text', () => {
|
||||
const { getByText } = render(<Loading text="wait" />)
|
||||
expect(getByText('wait')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,16 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import { ModeToggle } from '../../src/components/ModeToggle'
|
||||
|
||||
const setTheme = vi.fn()
|
||||
vi.mock('next-themes', () => ({ useTheme: () => ({ setTheme, resolvedTheme: 'light' }) }))
|
||||
|
||||
describe('ModeToggle', () => {
|
||||
it('toggles theme', () => {
|
||||
const { getByRole } = render(<ModeToggle />)
|
||||
fireEvent.click(getByRole('button'))
|
||||
expect(setTheme).toHaveBeenCalledWith('dark')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,18 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import PasswordField from '../../src/components/PasswordField'
|
||||
|
||||
describe('PasswordField', () => {
|
||||
it('calls onChange', () => {
|
||||
let val = ''
|
||||
const { getByPlaceholderText } = render(
|
||||
<PasswordField value="" onChange={(v) => (val = v)} />,
|
||||
)
|
||||
fireEvent.change(getByPlaceholderText('Enter a secret password for this slice of FilePizza...'), {
|
||||
target: { value: 'a' },
|
||||
})
|
||||
expect(val).toBe('a')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import ProgressBar from '../../src/components/ProgressBar'
|
||||
|
||||
describe('ProgressBar', () => {
|
||||
it('shows percentage', () => {
|
||||
const { getAllByText } = render(<ProgressBar value={50} max={100} />)
|
||||
expect(getAllByText('50%').length).toBeGreaterThan(0)
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,16 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import FilePizzaQueryClientProvider from '../../src/components/QueryClientProvider'
|
||||
|
||||
describe('QueryClientProvider', () => {
|
||||
it('renders children', () => {
|
||||
const { getByText } = render(
|
||||
<FilePizzaQueryClientProvider>
|
||||
<span>child</span>
|
||||
</FilePizzaQueryClientProvider>,
|
||||
)
|
||||
expect(getByText('child')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,23 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import FilePizzaQueryClientProvider from '../../src/components/QueryClientProvider'
|
||||
|
||||
vi.mock('../../src/components/WebRTCProvider', () => ({
|
||||
useWebRTCPeer: () => ({ peer: { connect: vi.fn(() => ({ on: vi.fn(), close: vi.fn() })) } }),
|
||||
}))
|
||||
|
||||
import ReportTermsViolationButton from '../../src/components/ReportTermsViolationButton'
|
||||
|
||||
describe('ReportTermsViolationButton', () => {
|
||||
it('opens modal on click', () => {
|
||||
const { getByText } = render(
|
||||
<FilePizzaQueryClientProvider>
|
||||
<ReportTermsViolationButton uploaderPeerID="peer" slug="slug" />
|
||||
</FilePizzaQueryClientProvider>,
|
||||
)
|
||||
fireEvent.click(getByText('Report suspicious pizza delivery'))
|
||||
expect(getByText('Found a suspicious delivery?')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,14 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
vi.mock("next-view-transitions", () => ({ Link: (p: any) => <a {...p}>{p.children}</a> }))
|
||||
import { vi } from "vitest"
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import ReturnHome from '../../src/components/ReturnHome'
|
||||
|
||||
describe('ReturnHome', () => {
|
||||
it('links to home', () => {
|
||||
const { getByText } = render(<ReturnHome />)
|
||||
expect(getByText(/Serve up/).getAttribute('href')).toBe('/')
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,19 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { act } from 'react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import Spinner from '../../src/components/Spinner'
|
||||
import { setRotating } from '../../src/hooks/useRotatingSpinner'
|
||||
|
||||
describe('Spinner', () => {
|
||||
it('reflects rotating state', () => {
|
||||
// @ts-ignore
|
||||
act(() => { setRotating(true) })
|
||||
// @ts-ignore
|
||||
const { getByLabelText } = render(<Spinner />)
|
||||
expect(getByLabelText('Rotating pizza')).toBeInTheDocument()
|
||||
// @ts-ignore
|
||||
act(() => { setRotating(false) })
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,14 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import StartButton from '../../src/components/StartButton'
|
||||
|
||||
describe('StartButton', () => {
|
||||
it('calls handler', () => {
|
||||
const fn = vi.fn()
|
||||
const { getByText } = render(<StartButton onClick={fn} />)
|
||||
fireEvent.click(getByText('Start'))
|
||||
expect(fn).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,19 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import StopButton from '../../src/components/StopButton'
|
||||
|
||||
describe('StopButton', () => {
|
||||
it('labels correctly when downloading', () => {
|
||||
const { getByText } = render(<StopButton onClick={() => {}} isDownloading />)
|
||||
expect(getByText('Stop Download')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('calls handler', () => {
|
||||
const fn = vi.fn()
|
||||
const { getByText } = render(<StopButton onClick={fn} />)
|
||||
fireEvent.click(getByText('Stop Upload'))
|
||||
expect(fn).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,13 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import TermsAcceptance from '../../src/components/TermsAcceptance'
|
||||
|
||||
describe('TermsAcceptance', () => {
|
||||
it('opens modal', () => {
|
||||
const { getByText } = render(<TermsAcceptance />)
|
||||
fireEvent.click(getByText('our terms'))
|
||||
expect(getByText('FilePizza Terms')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,17 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
Object.defineProperty(window, "matchMedia", { value: () => ({ matches: false, addListener: () => {}, removeListener: () => {} }) })
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { ThemeProvider } from '../../src/components/ThemeProvider'
|
||||
|
||||
describe('ThemeProvider', () => {
|
||||
it('renders children', () => {
|
||||
const { getByText } = render(
|
||||
<ThemeProvider>
|
||||
<span>child</span>
|
||||
</ThemeProvider>,
|
||||
)
|
||||
expect(getByText('child')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import TitleText from '../../src/components/TitleText'
|
||||
|
||||
describe('TitleText', () => {
|
||||
it('renders children', () => {
|
||||
const { getByText } = render(<TitleText>hello</TitleText>)
|
||||
expect(getByText('hello')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import TypeBadge from '../../src/components/TypeBadge'
|
||||
|
||||
describe('TypeBadge', () => {
|
||||
it('renders type', () => {
|
||||
const { getByText } = render(<TypeBadge type="image/png" />)
|
||||
expect(getByText('image/png')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,14 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import UnlockButton from '../../src/components/UnlockButton'
|
||||
|
||||
describe('UnlockButton', () => {
|
||||
it('calls onClick', () => {
|
||||
const fn = vi.fn()
|
||||
const { getByText } = render(<UnlockButton onClick={fn} />)
|
||||
fireEvent.click(getByText('Unlock'))
|
||||
expect(fn).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,15 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, fireEvent } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import UploadFileList from '../../src/components/UploadFileList'
|
||||
|
||||
describe('UploadFileList', () => {
|
||||
it('calls onRemove', () => {
|
||||
const fn = vi.fn()
|
||||
const files = [{ fileName: 'a.txt', type: 'text/plain' }]
|
||||
const { getByText } = render(<UploadFileList files={files} onRemove={fn} />)
|
||||
fireEvent.click(getByText('✕'))
|
||||
expect(fn).toHaveBeenCalledWith(0)
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,35 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
|
||||
var mockUseUploaderChannel: any
|
||||
|
||||
vi.mock('../../src/components/WebRTCProvider', () => ({
|
||||
useWebRTCPeer: () => ({ peer: { id: '1' }, stop: vi.fn() }),
|
||||
}))
|
||||
vi.mock('../../src/hooks/useUploaderChannel', () => ({
|
||||
useUploaderChannel: (...args: any[]) => mockUseUploaderChannel(...args),
|
||||
}))
|
||||
vi.mock('../../src/hooks/useUploaderConnections', () => ({ useUploaderConnections: () => [] }))
|
||||
vi.mock('react-qr-code', () => ({ default: () => <div>QR</div> }))
|
||||
vi.mock('../../src/components/CopyableInput', () => ({ CopyableInput: () => <div>Input</div> }))
|
||||
vi.mock('../../src/components/ConnectionListItem', () => ({ ConnectionListItem: () => <div>Item</div> }))
|
||||
vi.mock('../../src/components/StopButton', () => ({ default: () => <button>Stop</button> }))
|
||||
|
||||
import Uploader from '../../src/components/Uploader'
|
||||
|
||||
describe('Uploader', () => {
|
||||
it('shows loading when channel loading', () => {
|
||||
mockUseUploaderChannel = vi.fn().mockReturnValueOnce({
|
||||
isLoading: true,
|
||||
error: null,
|
||||
longSlug: undefined,
|
||||
shortSlug: undefined,
|
||||
longURL: undefined,
|
||||
shortURL: undefined,
|
||||
})
|
||||
const { getByText } = render(<Uploader files={[]} password="" onStop={() => {}} />)
|
||||
expect(getByText('Creating channel...')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,24 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render, waitFor } from '@testing-library/react'
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
|
||||
vi.stubGlobal('fetch', vi.fn(() => Promise.resolve(new Response(JSON.stringify({ iceServers: [] })))) )
|
||||
vi.mock('peerjs', () => ({
|
||||
default: class { id = 'peer1'; on(event: string, cb: (id: string) => void) { if (event === 'open') cb('peer1') } off() {} },
|
||||
}))
|
||||
|
||||
import WebRTCProvider from '../../src/components/WebRTCProvider'
|
||||
|
||||
const Child = () => <div>child</div>
|
||||
|
||||
describe('WebRTCProvider', () => {
|
||||
it('renders children after init', async () => {
|
||||
const { getByText } = render(
|
||||
<WebRTCProvider>
|
||||
<Child />
|
||||
</WebRTCProvider>,
|
||||
)
|
||||
await waitFor(() => expect(getByText('child')).toBeInTheDocument())
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference types="@testing-library/jest-dom" />
|
||||
import React from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import Wordmark from '../../src/components/Wordmark'
|
||||
|
||||
describe('Wordmark', () => {
|
||||
it('renders svg', () => {
|
||||
const { getByLabelText } = render(<Wordmark />)
|
||||
expect(getByLabelText('FilePizza logo')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,21 @@
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import {
|
||||
setRotating,
|
||||
addRotationListener,
|
||||
removeRotationListener,
|
||||
getRotating,
|
||||
} from '../../src/hooks/useRotatingSpinner'
|
||||
|
||||
describe('useRotatingSpinner state helpers', () => {
|
||||
it('notifies listeners on state change', () => {
|
||||
const listener = vi.fn()
|
||||
addRotationListener(listener)
|
||||
setRotating(true)
|
||||
expect(listener).toHaveBeenCalledWith(true)
|
||||
expect(getRotating()).toBe(true)
|
||||
setRotating(false)
|
||||
expect(listener).toHaveBeenCalledWith(false)
|
||||
expect(getRotating()).toBe(false)
|
||||
removeRotationListener(listener)
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,16 @@
|
||||
import react from '@vitejs/plugin-react'
|
||||
import { defineConfig } from 'vitest/config'
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
test: {
|
||||
environment: 'jsdom',
|
||||
globals: true,
|
||||
setupFiles: './vitest.setup.ts',
|
||||
exclude: ['tests/e2e/**', '**/node_modules/**'],
|
||||
coverage: {
|
||||
provider: 'v8',
|
||||
reporter: ['text', 'html'],
|
||||
},
|
||||
},
|
||||
})
|
||||
@ -0,0 +1 @@
|
||||
import '@testing-library/jest-dom'
|
||||
Loading…
Reference in New Issue