feat: refine UI, improve UX, optimize the analysis pipeline, and add character standing positions
This commit is contained in:
84
tests/integration/api/contract/runs-list.route.test.ts
Normal file
84
tests/integration/api/contract/runs-list.route.test.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { buildMockRequest } from '../../../helpers/request'
|
||||
|
||||
const authState = vi.hoisted(() => ({ authenticated: true }))
|
||||
const listRunsMock = vi.hoisted(() => vi.fn())
|
||||
const createRunMock = vi.hoisted(() => vi.fn())
|
||||
|
||||
vi.mock('@/lib/api-auth', () => {
|
||||
const unauthorized = () => new Response(
|
||||
JSON.stringify({ error: { code: 'UNAUTHORIZED' } }),
|
||||
{ status: 401, headers: { 'content-type': 'application/json' } },
|
||||
)
|
||||
|
||||
return {
|
||||
isErrorResponse: (value: unknown) => value instanceof Response,
|
||||
requireUserAuth: async () => {
|
||||
if (!authState.authenticated) return unauthorized()
|
||||
return { session: { user: { id: 'user-1' } } }
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
vi.mock('@/lib/run-runtime/service', () => ({
|
||||
listRuns: listRunsMock,
|
||||
createRun: createRunMock,
|
||||
}))
|
||||
|
||||
describe('api contract - runs list route', () => {
|
||||
const emptyRouteContext = {
|
||||
params: Promise.resolve({}),
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
authState.authenticated = true
|
||||
listRunsMock.mockResolvedValue([
|
||||
{
|
||||
id: 'run-1',
|
||||
status: 'running',
|
||||
},
|
||||
])
|
||||
})
|
||||
|
||||
it('tightens scoped active run queries to the latest recoverable run', async () => {
|
||||
const { GET } = await import('@/app/api/runs/route')
|
||||
|
||||
const req = buildMockRequest({
|
||||
path: '/api/runs?projectId=project-1&workflowType=story_to_script_run&targetType=NovelPromotionEpisode&targetId=episode-1&episodeId=episode-1&status=queued&status=running&status=canceling&limit=20',
|
||||
method: 'GET',
|
||||
})
|
||||
const res = await GET(req, emptyRouteContext)
|
||||
|
||||
expect(res.status).toBe(200)
|
||||
expect(listRunsMock).toHaveBeenCalledWith(expect.objectContaining({
|
||||
userId: 'user-1',
|
||||
projectId: 'project-1',
|
||||
workflowType: 'story_to_script_run',
|
||||
targetType: 'NovelPromotionEpisode',
|
||||
targetId: 'episode-1',
|
||||
episodeId: 'episode-1',
|
||||
statuses: ['queued', 'running', 'canceling'],
|
||||
limit: 20,
|
||||
recoverableOnly: true,
|
||||
latestOnly: true,
|
||||
}))
|
||||
})
|
||||
|
||||
it('keeps non-active queries as normal list requests', async () => {
|
||||
const { GET } = await import('@/app/api/runs/route')
|
||||
|
||||
const req = buildMockRequest({
|
||||
path: '/api/runs?projectId=project-1&workflowType=story_to_script_run&targetType=NovelPromotionEpisode&targetId=episode-1&status=completed&limit=20',
|
||||
method: 'GET',
|
||||
})
|
||||
const res = await GET(req, emptyRouteContext)
|
||||
|
||||
expect(res.status).toBe(200)
|
||||
expect(listRunsMock).toHaveBeenCalledWith(expect.objectContaining({
|
||||
statuses: ['completed'],
|
||||
recoverableOnly: false,
|
||||
latestOnly: false,
|
||||
}))
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user