@react-mvi/testing
Version:
Test module for React MVI.
75 lines (74 loc) • 3.32 kB
JavaScript
/**
* 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;
}