updux/src/tutorial.test.ts

62 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-03-02 18:19:31 +00:00
import Updux, { createAction, withPayload } from './index.js';
2023-03-06 15:09:39 +00:00
import u from '@yanick/updeep-remeda';
2023-03-02 16:10:25 +00:00
2023-03-07 15:52:19 +00:00
export const expectType = <T>(value: T) => value;
2023-03-02 16:10:25 +00:00
2023-03-23 22:15:32 +00:00
test('initialState state', () => {
const initialState = {
2023-03-02 17:32:27 +00:00
next_id: 1,
todos: [],
};
const dux = new Updux({
2023-03-23 22:15:32 +00:00
initialState,
2023-03-02 16:10:25 +00:00
});
expectType<{
next_id: number;
todos: unknown[];
2023-03-23 22:15:32 +00:00
}>(dux.initialState);
2023-03-02 16:10:25 +00:00
2023-03-23 22:15:32 +00:00
expect(dux.initialState).toEqual(initialState);
2023-03-02 17:32:27 +00:00
const store = dux.createStore();
2023-03-23 22:15:32 +00:00
expect(store.getState()).toEqual(initialState);
2023-03-02 17:32:27 +00:00
});
2023-03-06 15:09:39 +00:00
test('actions', () => {
2023-03-02 18:19:31 +00:00
const addTodo = createAction('addTodo', withPayload<string>());
2023-03-02 18:10:20 +00:00
const todoDone = createAction('todoDone');
const todosDux = new Updux({
actions: {
addTodo,
todoDone,
},
});
expect(todosDux.actions.addTodo('write tutorial')).toEqual({
type: 'addTodo',
payload: 'write tutorial',
});
});
2023-03-06 15:09:39 +00:00
test('mutation', () => {
const addTodo = createAction('addTodo', withPayload<string>());
type Todo = {
description: string;
id: number;
done: boolean;
};
const dux = new Updux({
2023-03-23 22:15:32 +00:00
initialState: { nextId: 0, todos: [] as Todo[] },
2023-03-06 15:09:39 +00:00
});
2023-03-09 19:23:50 +00:00
dux.addMutation(addTodo, (description) => (state) => {
2023-03-06 15:09:39 +00:00
state.todos.unshift({ description, id: state.nextId, done: false });
state.nextId++;
});
});