UNPKG

@react-mvi/testing

Version:

Test module for React MVI.

75 lines (74 loc) 3.32 kB
/** * The MIT License (MIT) * Copyright (c) Taketoshi Aono * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * @fileoverview * @author Taketoshi Aono */ import { Provisioning, registerHandlers, isObject, SubjectTree, } from '@react-mvi/core'; import { Subscription } from 'rxjs'; import { Mocker, MockManipulator } from './mocker'; /** * Prepare Intent and Store. * @param IntentClass Intent constructor. * @param StoreClass Store constructor or Array of Store constructor. * @param opt Options if contains handlers, call registerHandlers with that, * if contains state, set as parent state of intent arguments. */ export function prepareTest(IntentClass, StoreClass, opt = { state: {}, multiIntent: false }) { if (opt && opt.handlers) { registerHandlers(opt.handlers); } const context = { state: opt.state, mergedState: opt.state, __intent: null, __subject: null, }; const provisioning = new Provisioning('Prepare', context, isObject(IntentClass) ? IntentClass : { intent: IntentClass }, Array.isArray(StoreClass) ? StoreClass : [StoreClass], undefined, opt.services || {}, {}, intent => new Mocker(intent, opt.state)); provisioning.prepare(); return { store: provisioning.getStores()[0], stores: provisioning.getStores(), mock: opt.multiIntent ? (() => { const map = provisioning.getIntentInstance(); const ret = {}; for (const key in map) { ret[key] = new MockManipulator(map[key]); } return ret; })() : new MockManipulator(provisioning.getIntentInstance().intent), }; } export function initAppTester(app, initialState, opt = { states: {} }) { const input = new SubjectTree({ send() { } }, null); const output = app(input.observable, initialState); input.setState(opt.states); return { input(type, payload = null) { input.notify({ type, payload }); }, output, }; } export function safeSubscribe(observable, callback, done, subscription = new Subscription()) { subscription.add(observable.subscribe(v => { callback(v).then(() => done(), done); })); return subscription; }