このコミットが含まれているのは:
2026-05-13 20:42:25 +09:00
コミット 0a13c00f37
48個のファイルの変更2378行の追加7行の削除
+45
ファイルの表示
@@ -0,0 +1,45 @@
import { screen, waitFor } from '@testing-library/react'
import { Route, Routes } from 'react-router-dom'
import { describe, expect, it, vi } from 'vitest'
import WikiDiffPage from '@/pages/wiki/WikiDiffPage'
import { renderWithProviders } from '@/test/render'
const api = vi.hoisted (() => ({
apiGet: vi.fn (),
}))
vi.mock ('@/lib/api', () => api)
describe ('WikiDiffPage', () => {
it ('fetches and renders wiki diff lines', async () => {
api.apiGet.mockResolvedValueOnce ({
wikiPageId: 3,
title: '差分対象',
olderRevisionId: 1,
newerRevisionId: 2,
diff: [
{ type: 'context', content: 'same' },
{ type: 'added', content: 'added line' },
{ type: 'removed', content: 'removed line' },
],
})
renderWithProviders (
<Routes>
<Route path="/wiki/:id/diff" element={<WikiDiffPage/>}/>
</Routes>,
{ route: '/wiki/3/diff?from=1&to=2' },
)
await waitFor (() => {
expect (api.apiGet).toHaveBeenCalledWith (
'/wiki/3/diff',
{ params: { from: '1', to: '2' } },
)
})
expect (screen.getByText ('差分対象')).toBeInTheDocument ()
expect (screen.getByText ('added line')).toHaveClass ('bg-green-200')
expect (screen.getByText ('removed line')).toHaveClass ('bg-red-200')
})
})
+82
ファイルの表示
@@ -0,0 +1,82 @@
import { fireEvent, screen, waitFor } from '@testing-library/react'
import { Route, Routes } from 'react-router-dom'
import { describe, expect, it, vi } from 'vitest'
import WikiEditPage from '@/pages/wiki/WikiEditPage'
import { buildUser, buildWikiPage } from '@/test/factories'
import { renderWithProviders } from '@/test/render'
const api = vi.hoisted (() => ({
apiGet: vi.fn (),
apiPut: vi.fn (),
}))
const toastApi = vi.hoisted (() => ({
toast: vi.fn (),
}))
vi.mock ('@/lib/api', () => api)
vi.mock ('@/components/ui/use-toast', () => toastApi)
vi.mock ('react-markdown-editor-lite', () => ({
default: ({ value, onChange }: {
value: string
onChange: (event: { text: string }) => void
}) => (
<textarea
aria-label="本文エディタ"
value={value}
onChange={ev => onChange ({ text: ev.target.value })}/>
),
}))
const renderPage = (user = buildUser ({ role: 'member' })) =>
renderWithProviders (
<Routes>
<Route path="/wiki/:id/edit" element={<WikiEditPage user={user}/>}/>
</Routes>,
{ route: '/wiki/9/edit' },
)
describe ('WikiEditPage', () => {
it ('blocks guests', () => {
renderPage (buildUser ({ role: 'guest' }))
expect (screen.getByText ('403')).toBeInTheDocument ()
})
it ('loads the target page for editing', async () => {
api.apiGet.mockResolvedValueOnce (buildWikiPage ({ title: '既存', body: '本文' }))
renderPage ()
await waitFor (() => {
expect (api.apiGet).toHaveBeenCalledWith ('/wiki/9')
})
expect (screen.getAllByRole ('textbox')[0]).toHaveValue ('既存')
expect (screen.getByLabelText ('本文エディタ')).toHaveValue ('本文')
})
it ('submits edited title and body', async () => {
api.apiGet.mockResolvedValueOnce (buildWikiPage ({ title: '既存', body: '本文' }))
api.apiPut.mockResolvedValueOnce ({})
renderPage ()
const title = await screen.findByDisplayValue ('既存')
fireEvent.change (title, { target: { value: '更新済み' } })
fireEvent.change (screen.getByLabelText ('本文エディタ'), { target: { value: '更新本文' } })
fireEvent.click (screen.getByRole ('button', { name: '編輯' }))
await waitFor (() => {
expect (api.apiPut).toHaveBeenCalledWith (
'/wiki/9',
expect.any (FormData),
{ headers: { 'Content-Type': 'multipart/form-data' } },
)
})
const formData = api.apiPut.mock.calls[0]?.[1] as FormData
expect (formData.get ('title')).toBe ('更新済み')
expect (formData.get ('body')).toBe ('更新本文')
expect (toastApi.toast).toHaveBeenCalledWith ({ title: '投稿成功!' })
})
})
+61
ファイルの表示
@@ -0,0 +1,61 @@
import { fireEvent, screen, waitFor } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import WikiNewPage from '@/pages/wiki/WikiNewPage'
import { buildUser, buildWikiPage } from '@/test/factories'
import { renderWithProviders } from '@/test/render'
const api = vi.hoisted (() => ({
apiPost: vi.fn (),
}))
const toastApi = vi.hoisted (() => ({
toast: vi.fn (),
}))
vi.mock ('@/lib/api', () => api)
vi.mock ('@/components/ui/use-toast', () => toastApi)
vi.mock ('react-markdown-editor-lite', () => ({
default: ({ value, onChange }: {
value: string
onChange: (event: { text: string }) => void
}) => (
<textarea
aria-label="本文エディタ"
value={value}
onChange={ev => onChange ({ text: ev.target.value })}/>
),
}))
describe ('WikiNewPage', () => {
it ('blocks guests', () => {
renderWithProviders (<WikiNewPage user={buildUser ({ role: 'guest' })}/>)
expect (screen.getByText ('403')).toBeInTheDocument ()
})
it ('creates a wiki page from title query and body', async () => {
api.apiPost.mockResolvedValueOnce (buildWikiPage ({ title: '作成済み' }))
renderWithProviders (
<WikiNewPage user={buildUser ({ role: 'member' })}/>,
{ route: '/wiki/new?title=%E4%B8%8B%E6%9B%B8%E3%81%8D' },
)
expect (screen.getAllByRole ('textbox')[0]).toHaveValue ('下書き')
fireEvent.change (screen.getByLabelText ('本文エディタ'), { target: { value: '本文' } })
fireEvent.click (screen.getByRole ('button', { name: '追加' }))
await waitFor (() => {
expect (api.apiPost).toHaveBeenCalledWith (
'/wiki',
expect.any (FormData),
{ headers: { 'Content-Type': 'multipart/form-data' } },
)
})
const formData = api.apiPost.mock.calls[0]?.[1] as FormData
expect (formData.get ('title')).toBe ('下書き')
expect (formData.get ('body')).toBe ('本文')
expect (toastApi.toast).toHaveBeenCalledWith ({ title: '投稿成功!' })
})
})
+45
ファイルの表示
@@ -0,0 +1,45 @@
import { fireEvent, screen, waitFor } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import WikiSearchPage from '@/pages/wiki/WikiSearchPage'
import { buildWikiPage } from '@/test/factories'
import { renderWithProviders } from '@/test/render'
const api = vi.hoisted (() => ({
apiGet: vi.fn (),
}))
vi.mock ('@/lib/api', () => api)
describe ('WikiSearchPage', () => {
it ('loads initial wiki pages and renders links', async () => {
api.apiGet.mockResolvedValueOnce ([buildWikiPage ({ title: '虹夏' })])
renderWithProviders (<WikiSearchPage/>)
expect (await screen.findByRole ('link', { name: '虹夏' })).toHaveAttribute (
'href',
'/wiki/%E8%99%B9%E5%A4%8F',
)
expect (api.apiGet).toHaveBeenCalledWith ('/wiki', { params: { title: '' } })
})
it ('searches by title on submit', async () => {
api.apiGet
.mockResolvedValueOnce ([])
.mockResolvedValueOnce ([buildWikiPage ({ title: '検索結果' })])
renderWithProviders (<WikiSearchPage/>)
fireEvent.change (screen.getAllByRole ('textbox')[0], { target: { value: '検索' } })
fireEvent.click (screen.getByRole ('button', { name: '検索' }))
await waitFor (() => {
expect (api.apiGet).toHaveBeenLastCalledWith (
'/wiki',
{ params: { title: '検索' } },
)
})
expect (await screen.findByRole ('link', { name: '検索結果' })).toBeInTheDocument ()
})
})