42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { createSceneAPI } from '@/lib/api/stage-api-scene';
|
|
import type { StageStore } from '@/lib/api/stage-api-types';
|
|
import type { Scene, Stage, StageMode } from '@/lib/types/stage';
|
|
|
|
function mockStore() {
|
|
const state = {
|
|
stage: { id: 'stage-1', name: 'S', createdAt: 1, updatedAt: 1 } as Stage,
|
|
scenes: [] as Scene[],
|
|
currentSceneId: null as string | null,
|
|
mode: 'edit' as StageMode,
|
|
};
|
|
const store: StageStore = {
|
|
getState: () => state,
|
|
setState: (partial) => Object.assign(state, partial),
|
|
subscribe: () => () => {},
|
|
};
|
|
return { api: createSceneAPI(store), scenes: () => state.scenes };
|
|
}
|
|
|
|
describe('stage api scene.create — type/content authority', () => {
|
|
it('keeps params.type authoritative and pins content.type to it', () => {
|
|
const { api, scenes } = mockStore();
|
|
const r = api.create({ type: 'slide', title: 'T' });
|
|
expect(r.success).toBe(true);
|
|
const scene = scenes()[0];
|
|
expect(scene.type).toBe('slide');
|
|
expect(scene.content.type).toBe('slide');
|
|
});
|
|
|
|
it('rejects a content.type that disagrees with the scene type (no silent override)', () => {
|
|
const { api, scenes } = mockStore();
|
|
const r = api.create({
|
|
type: 'slide',
|
|
title: 'T',
|
|
content: { type: 'interactive', html: 'x' },
|
|
});
|
|
expect(r.success).toBe(false);
|
|
expect(scenes()).toHaveLength(0);
|
|
});
|
|
});
|