Files
openmaic/OpenMAIC/tests/store/disable-switches-selection.test.ts
2026-08-16 14:58:47 +08:00

105 lines
4.2 KiB
TypeScript

/**
* Regression (#784): disabling the currently-selected media/TTS/web-search
* provider must switch the active selection away from that provider. Otherwise
* removing a token plan (which disables its providers) leaves the app pointed
* at a disabled provider with an empty key, and the next generation fails.
*/
import { describe, it, expect, beforeEach } from 'vitest';
import { useSettingsStore } from '@/lib/store/settings';
describe('disabling the active provider switches selection away', () => {
beforeEach(() => {
// Reset selections to known non-default providers per test below.
useSettingsStore.setState({
imageProviderId: 'seedream',
videoProviderId: 'seedance',
ttsProviderId: 'browser-native-tts',
webSearchProviderId: 'tavily',
});
});
it('image: disabling the selected provider falls back to seedream', () => {
const s = useSettingsStore.getState();
s.setImageProvider('openai-image');
expect(useSettingsStore.getState().imageProviderId).toBe('openai-image');
s.setImageProviderConfig('openai-image', { enabled: false });
expect(useSettingsStore.getState().imageProviderId).toBe('seedream');
});
it('image: disabling the default selected provider does not select itself', () => {
useSettingsStore.setState((state) => ({
imageProviderId: 'seedream',
imageGenerationEnabled: true,
imageProvidersConfig: {
...state.imageProvidersConfig,
seedream: { apiKey: 'ark-test', baseUrl: '', enabled: true },
'openai-image': { apiKey: '', baseUrl: '', enabled: false },
},
}));
const s = useSettingsStore.getState();
s.setImageProviderConfig('seedream', { apiKey: '', enabled: false });
expect(useSettingsStore.getState().imageProviderId).not.toBe('seedream');
expect(useSettingsStore.getState().imageGenerationEnabled).toBe(false);
});
it('image: disabling a NON-selected provider leaves the selection alone', () => {
const s = useSettingsStore.getState();
s.setImageProvider('seedream');
s.setImageProviderConfig('openai-image', { enabled: false });
expect(useSettingsStore.getState().imageProviderId).toBe('seedream');
});
it('video: disabling the selected provider falls back to seedance', () => {
const s = useSettingsStore.getState();
s.setVideoProvider('kling');
expect(useSettingsStore.getState().videoProviderId).toBe('kling');
s.setVideoProviderConfig('kling', { enabled: false });
expect(useSettingsStore.getState().videoProviderId).toBe('seedance');
});
it('video: disabling the default selected provider does not select itself', () => {
useSettingsStore.setState((state) => ({
videoProviderId: 'seedance',
videoGenerationEnabled: true,
videoProvidersConfig: {
...state.videoProvidersConfig,
seedance: { apiKey: 'ark-test', baseUrl: '', enabled: true },
kling: { apiKey: '', baseUrl: '', enabled: false },
},
}));
const s = useSettingsStore.getState();
s.setVideoProviderConfig('seedance', { apiKey: '', enabled: false });
expect(useSettingsStore.getState().videoProviderId).not.toBe('seedance');
expect(useSettingsStore.getState().videoGenerationEnabled).toBe(false);
});
it('tts: disabling the selected provider falls back to browser TTS', () => {
const s = useSettingsStore.getState();
s.setTTSProvider('openai-tts');
expect(useSettingsStore.getState().ttsProviderId).toBe('openai-tts');
s.setTTSProviderConfig('openai-tts', { enabled: false });
expect(useSettingsStore.getState().ttsProviderId).toBe('browser-native-tts');
});
it('web search: disabling the selected provider falls back to tavily', () => {
const s = useSettingsStore.getState();
s.setWebSearchProvider('bocha');
expect(useSettingsStore.getState().webSearchProviderId).toBe('bocha');
s.setWebSearchProviderConfig('bocha', { enabled: false });
expect(useSettingsStore.getState().webSearchProviderId).toBe('tavily');
});
it('enabling/other edits do NOT force a switch away', () => {
const s = useSettingsStore.getState();
s.setImageProvider('openai-image');
s.setImageProviderConfig('openai-image', { apiKey: 'sk-x', enabled: true });
expect(useSettingsStore.getState().imageProviderId).toBe('openai-image');
});
});