このコミットが含まれているのは:
@@ -0,0 +1,147 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { creatableImportRows,
|
||||
initialisePreviewRows,
|
||||
mergeImportResults,
|
||||
mergeValidatedImportRows,
|
||||
processableImportRows,
|
||||
resultSummaryCounts,
|
||||
retryImportRow,
|
||||
reviewSummaryCounts } from '@/lib/postImportSession'
|
||||
import { buildPostImportRow } from '@/test/postImportFactories'
|
||||
|
||||
describe ('post import row state', () => {
|
||||
it ('separates processable existing rows from creatable rows', () => {
|
||||
const ready = buildPostImportRow ({ sourceRow: 1 })
|
||||
const existing = buildPostImportRow ({
|
||||
sourceRow: 2,
|
||||
skipReason: 'existing',
|
||||
existingPostId: 20 })
|
||||
const invalid = buildPostImportRow ({
|
||||
sourceRow: 3,
|
||||
status: 'error',
|
||||
validationErrors: { url: ['invalid'] } })
|
||||
const created = buildPostImportRow ({
|
||||
sourceRow: 4,
|
||||
importStatus: 'created',
|
||||
createdPostId: 40 })
|
||||
const rows = [ready, existing, invalid, created]
|
||||
|
||||
expect (processableImportRows (rows)).toEqual ([ready, existing])
|
||||
expect (creatableImportRows (rows)).toEqual ([ready])
|
||||
expect (reviewSummaryCounts (rows)).toEqual ({
|
||||
total: 4,
|
||||
submittable: 1,
|
||||
skipPlanned: 1 })
|
||||
})
|
||||
|
||||
it ('preserves terminal rows while merging validation results', () => {
|
||||
const created = buildPostImportRow ({
|
||||
sourceRow: 1,
|
||||
importStatus: 'created',
|
||||
createdPostId: 10,
|
||||
attributes: { title: 'created title' } })
|
||||
const pending = buildPostImportRow ({
|
||||
sourceRow: 2,
|
||||
fieldWarnings: { title: ['old warning'] },
|
||||
provenance: { title: 'manual' },
|
||||
attributes: { title: 'manual title' } })
|
||||
const validated = [
|
||||
buildPostImportRow ({ sourceRow: 1, attributes: { title: 'changed' } }),
|
||||
buildPostImportRow ({
|
||||
sourceRow: 2,
|
||||
fieldWarnings: { title: ['fetch warning'], tags: ['tag warning'] },
|
||||
provenance: { title: 'manual' },
|
||||
attributes: { title: 'manual title' } })]
|
||||
|
||||
const result = mergeValidatedImportRows ([created, pending], validated)
|
||||
|
||||
expect (result[0]).toBe (created)
|
||||
expect (result[1]?.fieldWarnings).toEqual ({ tags: ['tag warning'] })
|
||||
})
|
||||
|
||||
it ('updates the reset snapshot only after metadata URL changes', () => {
|
||||
const current = buildPostImportRow ({
|
||||
attributes: { title: 'manual title' },
|
||||
metadataUrl: 'https://example.com/old' })
|
||||
const validated = buildPostImportRow ({
|
||||
attributes: { title: 'new metadata title' },
|
||||
metadataUrl: 'https://example.com/new',
|
||||
fieldWarnings: { title: ['warning'] },
|
||||
baseWarnings: ['base warning'] })
|
||||
|
||||
const result = mergeValidatedImportRows ([current], [validated])[0]
|
||||
|
||||
expect (result?.resetSnapshot).toMatchObject ({
|
||||
attributes: { title: 'new metadata title' },
|
||||
fieldWarnings: { title: ['warning'] },
|
||||
baseWarnings: ['base warning'],
|
||||
metadataUrl: 'https://example.com/new' })
|
||||
})
|
||||
|
||||
it ('merges result states and clears incompatible post identifiers', () => {
|
||||
const created = mergeImportResults ([buildPostImportRow ({
|
||||
skipReason: 'existing',
|
||||
existingPostId: 2 })], [{
|
||||
sourceRow: 1,
|
||||
status: 'created',
|
||||
post: { id: 3 } }])[0]
|
||||
const skipped = mergeImportResults ([buildPostImportRow ({
|
||||
createdPostId: 3,
|
||||
importStatus: 'created' })], [{
|
||||
sourceRow: 1,
|
||||
status: 'skipped',
|
||||
existingPostId: 4 }])[0]
|
||||
const failed = mergeImportResults ([buildPostImportRow ({
|
||||
skipReason: 'existing',
|
||||
existingPostId: 4 })], [{
|
||||
sourceRow: 1,
|
||||
status: 'failed',
|
||||
errors: { base: ['failure'] } }])[0]
|
||||
|
||||
expect (created).toMatchObject ({
|
||||
importStatus: 'created',
|
||||
createdPostId: 3,
|
||||
existingPostId: undefined,
|
||||
skipReason: undefined })
|
||||
expect (skipped).toMatchObject ({
|
||||
importStatus: 'skipped',
|
||||
existingPostId: 4,
|
||||
createdPostId: undefined,
|
||||
skipReason: 'existing' })
|
||||
expect (failed).toMatchObject ({
|
||||
importStatus: 'failed',
|
||||
createdPostId: undefined,
|
||||
existingPostId: undefined,
|
||||
skipReason: undefined,
|
||||
importErrors: { base: ['failure'] } })
|
||||
})
|
||||
|
||||
it ('retries only the selected failed row and counts results exclusively', () => {
|
||||
const rows = [
|
||||
buildPostImportRow ({ sourceRow: 1, importStatus: 'created', createdPostId: 1 }),
|
||||
buildPostImportRow ({ sourceRow: 2, importStatus: 'skipped',
|
||||
existingPostId: 2, skipReason: 'existing' }),
|
||||
buildPostImportRow ({ sourceRow: 3, importStatus: 'failed',
|
||||
importErrors: { base: ['failed'] } })]
|
||||
|
||||
expect (resultSummaryCounts (rows)).toEqual ({ created: 1, skipped: 1, failed: 1 })
|
||||
expect (retryImportRow (rows, 3)[2]).toMatchObject ({
|
||||
importStatus: 'pending',
|
||||
importErrors: undefined })
|
||||
})
|
||||
|
||||
it ('copies reset snapshot values instead of sharing mutable records', () => {
|
||||
const row = buildPostImportRow ({ fieldWarnings: { title: ['warning'] } })
|
||||
const initialised = initialisePreviewRows ([row])[0]
|
||||
expect (initialised).toBeDefined ()
|
||||
if (initialised == null)
|
||||
return
|
||||
|
||||
initialised.attributes.title = 'changed'
|
||||
initialised.fieldWarnings.title?.push ('another')
|
||||
|
||||
expect (initialised.resetSnapshot.attributes.title).toBe ('')
|
||||
expect (initialised.resetSnapshot.fieldWarnings.title).toEqual (['warning'])
|
||||
})
|
||||
})
|
||||
新しい課題から参照
ユーザをブロックする