updux/src/splat.test.ts

114 lines
2.2 KiB
TypeScript

import tap from 'tap';
import Updux, {dux} from '.';
import u from '@yanick/updeep';
import { expectType } from 'tsd';
const tracer = (chr: string) => u({ tracer: (s = '') => s + chr });
tap.test('mutations, simple', t => {
const dux : any = new Updux({
mutations: {
foo: () => tracer('a'),
'*': () => tracer('b'),
},
});
const store = dux.createStore();
t.same(store.getState(),{ tracer: 'b' });
store.dispatch( store.actions.foo() );
t.same(store.getState(),{ tracer: 'ba' });
store.dispatch({ type: 'bar' });
t.same(store.getState(),{ tracer: 'bab' });
t.end();
});
tap.test('with subduxes', t => {
const d = dux({
mutations: {
foo: () => tracer('a'),
'*': () => tracer('b'),
bar: () => ({ bar }: any) => ({ bar, tracer: bar.tracer }),
},
subduxes: {
bar: dux({
mutations: {
foo: () => tracer('d'),
'*': () => tracer('e'),
},
}),
},
});
const store = d.createStore();
t.same(store.getState(),{
tracer: 'b',
bar: { tracer: 'e' },
});
store.dispatch( (store.actions as any).foo() );
t.same(store.getState(),{
tracer: 'ba',
bar: { tracer: 'ed' },
});
store.dispatch({ type: 'bar' });
t.same(store.getState(),{
tracer: 'ede',
bar: { tracer: 'ede' },
});
t.end();
});
tap.test( 'splat and state', async t => {
const inner = dux({ initial: 3 });
inner.initial;
const arrayDux = dux({
initial: [],
subduxes: {
'*': inner
}
});
expectType<number[]>(arrayDux.initial)
t.same(arrayDux.initial,[]);
const objDux = dux({
initial: {},
subduxes: {
'*': dux({initial: 3})
}
});
expectType<{
[key: string]: number
}>(objDux.initial);
t.same(objDux.initial,{});
});
tap.test( 'multi-splat', async t => {
dux({
subduxes: {
foo: dux({ mutations: { '*': () => s => s }}),
bar: dux({ mutations: { '*': () => s => s }}),
}
});
t.pass();
});