ManimCat / frontend /src /studio /store /studio-selectors.test.ts
Bin29's picture
Sync from main: 68df783 feat: support multimodal studio reference images
d47b053
import { describe, expect, it } from 'vitest'
import { createStudioViewSelectors } from './studio-selectors'
import { createInitialStudioState } from './studio-session-store'
import type { StudioAssistantMessage, StudioSession } from '../protocol/studio-agent-types'
describe('createStudioViewSelectors', () => {
it('preserves the messages array reference when unrelated state changes do not touch messages', () => {
const selectors = createStudioViewSelectors()
const session = createSession()
const assistantMessage = createAssistantMessage()
const state = {
...createInitialStudioState(),
entities: {
...createInitialStudioState().entities,
session,
messagesById: {
[assistantMessage.id]: assistantMessage,
},
messageOrder: [assistantMessage.id],
},
}
const first = selectors.selectStudioMessages(state)
const second = selectors.selectStudioMessages({
...state,
connection: {
...state.connection,
lastEventAt: Date.now(),
lastEventType: 'studio.heartbeat',
},
})
expect(second).toBe(first)
expect(second[0]).toBe(assistantMessage)
})
})
function createSession(): StudioSession {
const now = '2026-03-22T00:00:00.000Z'
return {
id: 'session-1',
projectId: 'project-1',
agentType: 'builder',
title: 'Studio',
directory: 'D:/projects/ManimCat',
permissionLevel: 'L2',
permissionRules: [],
createdAt: now,
updatedAt: now,
}
}
function createAssistantMessage(): StudioAssistantMessage {
const now = '2026-03-22T00:00:00.000Z'
return {
id: 'message-1',
sessionId: 'session-1',
role: 'assistant',
agent: 'builder',
parts: [
{
id: 'part-1',
messageId: 'message-1',
sessionId: 'session-1',
type: 'text',
text: 'hello',
},
],
createdAt: now,
updatedAt: now,
}
}