Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / pass / store / optimistic / utils / testing.utils.ts
blob42dfb64291ac69335a533032e87cbc331827af50
1 import type { PayloadAction } from '@reduxjs/toolkit';
2 import type { Action, Reducer } from 'redux';
4 import type { Maybe } from '@proton/pass/types';
6 import type { DeterministicHistoryItem, OptimisticHistoryItem } from '../types';
7 import { HistoryFlag } from '../types';
9 export const createTestAction = <T = any>(type?: string, payload?: T): PayloadAction<Maybe<T>> => ({
10     type: type ?? `action-${Math.random()}`,
11     payload,
12 });
14 export const createTestDeterministicAction = <T = any>(type?: string, payload?: T): DeterministicHistoryItem => ({
15     type: HistoryFlag.DETERMINISTIC,
16     action: createTestAction<T>(type, payload),
17 });
19 export const createTestOptimisticHistoryItem = (
20     type?: string,
21     payload?: any,
22     failed?: boolean
23 ): OptimisticHistoryItem => {
24     return {
25         type: HistoryFlag.OPTIMISTIC,
26         id: `id-${Math.random()}`,
27         action: createTestAction(type, payload),
28         ...(failed !== undefined ? { failed } : {}),
29     };
32 export type TestState<T = number> = { items: T[] };
34 export const createTestReducer =
35     <T = number>(): Reducer<TestState<T>> =>
36     (state = { items: [] }, action: Action) => {
37         switch (action.type) {
38             case 'add': {
39                 return {
40                     items: [...state.items, (action as any).payload],
41                 };
42             }
43             case 'remove': {
44                 return { items: state.items.filter((value) => value !== (action as any).payload) };
45             }
46             default:
47                 return state;
48         }
49     };
51 export const testReducer = createTestReducer();