@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
153 lines (121 loc) • 4.58 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { setNamespace } from './storeDebug';
describe('storeDebug utilities', () => {
describe('setNamespace', () => {
it('should create a namespaced action creator', () => {
const createAction = setNamespace('user');
expect(typeof createAction).toBe('function');
});
it('should return string action type when no payload provided', () => {
const createAction = setNamespace('user');
const actionType = createAction('login');
expect(actionType).toBe('user/login');
expect(typeof actionType).toBe('string');
});
it('should return action object when payload provided', () => {
const createAction = setNamespace('user');
const action = createAction('login', { email: 'test@example.com' });
expect(action).toEqual({
type: 'user/login',
payload: { email: 'test@example.com' },
});
expect(typeof action).toBe('object');
});
it('should handle empty namespace', () => {
const createAction = setNamespace('');
const actionType = createAction('action');
expect(actionType).toBe('action');
});
it('should handle truthy payload values (return objects)', () => {
const createAction = setNamespace('data');
// String payload
const stringAction = createAction('update', 'hello');
expect(stringAction).toEqual({
type: 'data/update',
payload: 'hello',
});
// Number payload
const numberAction = createAction('increment', 42);
expect(numberAction).toEqual({
type: 'data/increment',
payload: 42,
});
// Boolean payload
const booleanAction = createAction('toggle', true);
expect(booleanAction).toEqual({
type: 'data/toggle',
payload: true,
});
// Array payload
const arrayAction = createAction('batch', [1, 2, 3]);
expect(arrayAction).toEqual({
type: 'data/batch',
payload: [1, 2, 3],
});
});
it('should handle falsy payload values (return strings)', () => {
const createAction = setNamespace('data');
// Null payload (falsy)
const nullAction = createAction('reset', null);
expect(nullAction).toBe('data/reset');
// Undefined payload (falsy)
const undefinedAction = createAction('clear', undefined);
expect(undefinedAction).toBe('data/clear');
// Zero payload (falsy)
const zeroAction = createAction('setValue', 0);
expect(zeroAction).toBe('data/setValue');
// Empty string payload (falsy)
const emptyStringAction = createAction('clearField', '');
expect(emptyStringAction).toBe('data/clearField');
// False payload (falsy)
const falseAction = createAction('disable', false);
expect(falseAction).toBe('data/disable');
});
it('should handle complex nested object payload', () => {
const createAction = setNamespace('app');
const complexPayload = {
user: {
id: 123,
profile: {
name: 'John Doe',
settings: {
theme: 'dark',
notifications: true,
},
},
},
metadata: {
timestamp: Date.now(),
source: 'api',
},
};
const action = createAction('userUpdate', complexPayload);
expect(action).toEqual({
type: 'app/userUpdate',
payload: complexPayload,
});
});
it('should create unique namespaces for different instances', () => {
const userActions = setNamespace('user');
const postActions = setNamespace('post');
const userLogin = userActions('login');
const postCreate = postActions('create');
expect(userLogin).toBe('user/login');
expect(postCreate).toBe('post/create');
});
it('should handle special characters in namespace and type', () => {
const createAction = setNamespace('my-feature_v2');
const actionType = createAction('save-data_with-id');
expect(actionType).toBe('my-feature_v2/save-data_with-id');
});
it('should maintain type consistency across calls', () => {
const createAction = setNamespace('counter');
// Multiple calls should work consistently
const increment1 = createAction('increment');
const increment2 = createAction('increment');
expect(increment1).toBe('counter/increment');
expect(increment2).toBe('counter/increment');
expect(increment1).toBe(increment2);
});
});
});