このコミットが含まれているのは:
@@ -37,11 +37,14 @@ describe ('PostNewPage', () => {
|
||||
|
||||
renderWithProviders (<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
|
||||
const textboxes = screen.getAllByRole ('textbox')
|
||||
fireEvent.change (textboxes[0], { target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (textboxes[1], { target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (textboxes[3], { target: { value: '1 2' } })
|
||||
fireEvent.change (textboxes[4], { target: { value: 'tag1 tag2' } })
|
||||
fireEvent.change (screen.getByLabelText ('URL'), {
|
||||
target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (screen.getByLabelText ('タイトル'), {
|
||||
target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (screen.getByLabelText ('親投稿'), {
|
||||
target: { value: '1 2' } })
|
||||
fireEvent.change (screen.getByLabelText ('タグ'), {
|
||||
target: { value: 'tag1 tag2' } })
|
||||
fireEvent.click (screen.getByRole ('button', { name: '追加' }))
|
||||
|
||||
await waitFor (() => {
|
||||
@@ -59,24 +62,27 @@ describe ('PostNewPage', () => {
|
||||
expect (toastApi.toast).toHaveBeenCalledWith ({ title: '投稿成功!' })
|
||||
})
|
||||
|
||||
it ('preserves duration while the video tag is temporarily removed', () => {
|
||||
it ('shows the shared creation field order without duration or unrequested helper copy', () => {
|
||||
api.apiGet.mockResolvedValue ([])
|
||||
|
||||
renderWithProviders (<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
const { container } =
|
||||
renderWithProviders (<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
|
||||
const tags = screen.getAllByRole ('textbox')[4]
|
||||
fireEvent.change (tags, { target: { value: '動画' } })
|
||||
fireEvent.change (
|
||||
screen.getByPlaceholderText ('例: 2 / 2.5 / 1:23'),
|
||||
{ target: { value: '180.5' } })
|
||||
const labels = Array.from (container.querySelectorAll ('label'))
|
||||
.map (node => node.textContent?.trim ())
|
||||
|
||||
fireEvent.change (tags, { target: { value: 'general-tag' } })
|
||||
expect (labels.slice (0, 6)).toEqual ([
|
||||
'URL',
|
||||
'サムネール',
|
||||
'タイトル',
|
||||
'オリジナルの作成日時',
|
||||
'タグ',
|
||||
'親投稿'])
|
||||
expect (screen.queryByPlaceholderText ('例: 2 / 2.5 / 1:23')).not.toBeInTheDocument ()
|
||||
|
||||
fireEvent.change (tags, {
|
||||
target: { value: '動画 general-tag' },
|
||||
})
|
||||
expect (screen.getByPlaceholderText ('例: 2 / 2.5 / 1:23')).toHaveValue ('180.5')
|
||||
expect (screen.queryByText ('必要なタイミングで URL から取得できます.'))
|
||||
.not.toBeInTheDocument ()
|
||||
expect (screen.getAllByRole ('button', { name: '取得' })).toHaveLength (2)
|
||||
expect (screen.queryByRole ('button', { name: '変更をリセット' })).not.toBeInTheDocument ()
|
||||
})
|
||||
|
||||
it ('shows 422 validation errors for post fields', async () => {
|
||||
@@ -96,30 +102,32 @@ describe ('PostNewPage', () => {
|
||||
|
||||
renderWithProviders (<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
|
||||
const textboxes = screen.getAllByRole ('textbox')
|
||||
fireEvent.change (textboxes[0], { target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (textboxes[1], { target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (textboxes[4], { target: { value: 'nico:nico_tag' } })
|
||||
fireEvent.change (screen.getByLabelText ('URL'), {
|
||||
target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (screen.getByLabelText ('タイトル'), {
|
||||
target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (screen.getByLabelText ('タグ'), {
|
||||
target: { value: 'nico:nico_tag' } })
|
||||
fireEvent.click (screen.getByRole ('button', { name: '追加' }))
|
||||
|
||||
expect (await screen.findByText ('投稿内容を確認してください.')).toBeInTheDocument ()
|
||||
expect (screen.getByText ('ニコニコ・タグは直接指定できません.')).toBeInTheDocument ()
|
||||
expect (screen.getAllByRole ('textbox')[4]).toHaveAttribute ('aria-invalid', 'true')
|
||||
expect (screen.getByLabelText ('タグ')).toHaveAttribute ('aria-invalid', 'true')
|
||||
})
|
||||
|
||||
it ('uses the shared duration, tags, and datetime value contract for post submission', async () => {
|
||||
it ('keeps shared tags and datetime submission values without showing duration', async () => {
|
||||
api.apiPost.mockResolvedValueOnce ({})
|
||||
api.apiGet.mockResolvedValue ([])
|
||||
|
||||
const { container } = renderWithProviders (<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
const { container } = renderWithProviders (
|
||||
<PostNewPage user={buildUser ({ role: 'member' })}/>)
|
||||
|
||||
const textboxes = screen.getAllByRole ('textbox')
|
||||
fireEvent.change (textboxes[0], { target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (textboxes[1], { target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (textboxes[4], { target: { value: '動画 tag1 tag2' } })
|
||||
fireEvent.change (
|
||||
screen.getByPlaceholderText ('例: 2 / 2.5 / 1:23'),
|
||||
{ target: { value: '2.5' } })
|
||||
fireEvent.change (screen.getByLabelText ('URL'), {
|
||||
target: { value: 'https://example.com/post' } })
|
||||
fireEvent.change (screen.getByLabelText ('タイトル'), {
|
||||
target: { value: '投稿タイトル' } })
|
||||
fireEvent.change (screen.getByLabelText ('タグ'), {
|
||||
target: { value: '動画 tag1 tag2' } })
|
||||
const datetimeInputs = container.querySelectorAll ('input[type="datetime-local"]')
|
||||
fireEvent.change (datetimeInputs[0] as HTMLInputElement, {
|
||||
target: { value: '2024-01-01T12:34' } })
|
||||
@@ -129,13 +137,15 @@ describe ('PostNewPage', () => {
|
||||
|
||||
const formData = api.apiPost.mock.calls[0]?.[1] as FormData
|
||||
expect (container.querySelector ('input[type="file"]')).not.toBeNull ()
|
||||
expect (formData.get ('duration')).toBe ('2.5')
|
||||
expect (formData.get ('duration')).toBeNull ()
|
||||
expect (formData.get ('tags')).toBe ('動画 tag1 tag2')
|
||||
expect (formData.get ('original_created_from')).toBe (
|
||||
toMinutePrecisionIsoUtc ('2024-01-01T12:34'))
|
||||
})
|
||||
|
||||
it ('shows deduplicated original-created endpoint errors on the shared datetime field', async () => {
|
||||
it (
|
||||
'shows deduplicated original-created endpoint errors on the shared datetime field',
|
||||
async () => {
|
||||
api.apiGet.mockResolvedValue ([])
|
||||
api.isApiError.mockReturnValue (true)
|
||||
api.apiPost.mockRejectedValueOnce ({
|
||||
@@ -158,5 +168,5 @@ describe ('PostNewPage', () => {
|
||||
expect (await screen.findByText ('日時を確認してください.')).toBeInTheDocument ()
|
||||
expect (screen.getByText ('終了を確認してください.')).toBeInTheDocument ()
|
||||
expect (screen.getAllByText ('日時を確認してください.')).toHaveLength (1)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
新しい課題から参照
ユーザをブロックする