mirror of https://github.com/kern/filepizza
Add comprehensive component tests
parent
ffd64d8d99
commit
2e949a4a43
@ -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