UNPKG

@sigi/core

Version:
154 lines 6.04 kB
import { __decorate, __metadata } from "tslib"; import '@abraham/reflection'; import { rootInjector } from '@sigi/di'; import { Observable } from 'rxjs'; import { delay, map, tap } from 'rxjs/operators'; import { Reducer, Effect } from '../decorators'; import { EffectModule } from '../module'; import { Module } from '../module.decorator'; import { Store } from '../store'; describe('Smoking tests', () => { it('Module should be able to work without effects', () => { const store = new Store('store', (state, action) => { if (action.type === 'foo') { return Object.assign(Object.assign({}, state), { name: action.payload }); } return state; }); store.setup({ name: 'bar' }); const action = { type: 'foo', payload: 'foo', store, }; store.dispatch(action); expect(store.state.name).toBe(action.payload); store.dispose(); }); it('should be able to dispatch actions from the other module', () => { const asyncTimeToDelay = 2000; const timer = jest.useFakeTimers(); const spy = jest.fn(); let FooModule = class FooModule extends EffectModule { constructor() { super(...arguments); this.defaultState = { foo: '1', }; } set(state, payload) { spy(state, payload); return Object.assign(Object.assign({}, state), { foo: payload }); } }; __decorate([ Reducer(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, String]), __metadata("design:returntype", void 0) ], FooModule.prototype, "set", null); FooModule = __decorate([ Module('Foo') ], FooModule); let BarModule = class BarModule extends EffectModule { constructor(fooModule) { super(); this.fooModule = fooModule; this.defaultState = {}; } asyncSetFoo(payload$) { return payload$.pipe(delay(asyncTimeToDelay), map((payload) => this.fooModule.getActions().set(payload))); } }; __decorate([ Effect(), __metadata("design:type", Function), __metadata("design:paramtypes", [Observable]), __metadata("design:returntype", void 0) ], BarModule.prototype, "asyncSetFoo", null); BarModule = __decorate([ Module('Bar'), __metadata("design:paramtypes", [FooModule]) ], BarModule); const fooModule = rootInjector.getInstance(FooModule); const fooStore = fooModule.store; const barModule = rootInjector.getInstance(BarModule); const barStore = barModule.store; const payload = 'whatever'; const action = barModule.getActions().asyncSetFoo(payload); expect(action.payload).toBe(payload); fooStore.dispatch(action); timer.advanceTimersByTime(asyncTimeToDelay); expect(fooModule.state.foo).toBe(payload); const [[fooState, fooPayload]] = spy.mock.calls; expect(fooState).not.toBe(null); expect(fooPayload).toBe(payload); fooStore.dispose(); barStore.dispose(); jest.useRealTimers(); rootInjector.reset(); }); it('should skip all effects restored from persisted state', () => { const staticState = { foo: 'foo', bar: 42 }; global['SIGI_STATE'] = { SSRPersistModule: staticState, }; const spy = jest.fn(); let SSRPersistModule = class SSRPersistModule extends EffectModule { constructor() { super(...arguments); this.defaultState = { foo: '1', bar: 2, }; } set(state, payload) { if (typeof payload === 'string') { return Object.assign(Object.assign({}, state), { foo: payload }); } else { return Object.assign(Object.assign({}, state), { bar: payload }); } } setFoo(payload$) { return payload$.pipe(tap(spy), map((payload) => this.getActions().set(payload))); } setBar(payload$) { return payload$.pipe(tap(spy), map((payload) => this.getActions().set(payload))); } }; __decorate([ Reducer(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", void 0) ], SSRPersistModule.prototype, "set", null); __decorate([ Effect({ payloadGetter: () => '2', }), __metadata("design:type", Function), __metadata("design:paramtypes", [Observable]), __metadata("design:returntype", void 0) ], SSRPersistModule.prototype, "setFoo", null); __decorate([ Effect({ payloadGetter: () => 3, }), __metadata("design:type", Function), __metadata("design:paramtypes", [Observable]), __metadata("design:returntype", void 0) ], SSRPersistModule.prototype, "setBar", null); SSRPersistModule = __decorate([ Module('SSRPersistModule') ], SSRPersistModule); const module = rootInjector.getInstance(SSRPersistModule); module.dispatchers.setFoo(staticState.foo + 1); module.dispatchers.setBar(staticState.bar + 1); expect(spy).toHaveBeenCalledTimes(0); expect(module.state.foo).toBe(staticState.foo); expect(module.state.bar).toBe(staticState.bar); module.store.dispose(); }); }); //# sourceMappingURL=smoking.spec.js.map