react-micro-reducer
Version:
A React reducer hook, with a "micro"-reducer style, made for a Typescript world 💙
90 lines (89 loc) • 3.27 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var index_1 = require("./index");
var immer_1 = __importDefault(require("immer"));
var react_hooks_1 = require("@testing-library/react-hooks");
var defaultReducer = function (state) { return ({
increment: function () { return state + 1; },
decrement: function () { return state - 1; },
set: function (value) { return value; },
multiplySeed: function (a, b) { return a * b; }
}); };
var defaultState = 0;
var setupHook = function (reducer, initialState, producer) {
return react_hooks_1.renderHook(function () {
var _a = index_1.useMicroReducer(reducer, initialState, producer), state = _a[0], dispatch = _a[1];
// Get out state and dispatch in a cleaner fashion
return {
state: state,
dispatch: dispatch
};
});
};
test("Initial state: undefined", function () {
var result = setupHook(function () { return ({}); }).result;
expect(result.current.state).toBe(undefined);
});
test("Initial state: 0", function () {
var result = setupHook(defaultReducer, defaultState).result;
expect(result.current.state).toBe(0);
});
test("Dispatch gets the expected actions", function () {
var expectedActions = ["decrement", "increment", "multiplySeed", "set"];
var result = setupHook(defaultReducer, defaultState).result;
var actualActions = Object.keys(result.current.dispatch);
actualActions.sort();
expect(actualActions).toEqual(expectedActions);
});
test("Dispatch with NO arguments work", function () {
var result = setupHook(defaultReducer, defaultState).result;
var currentState = result.current.state;
react_hooks_1.act(function () {
result.current.dispatch.increment();
});
expect(result.current.state).toBe(currentState + 1);
});
test("Dispatch with ONE arguments work", function () {
var result = setupHook(defaultReducer, defaultState).result;
react_hooks_1.act(function () {
result.current.dispatch.set(42);
});
expect(result.current.state).toBe(42);
});
test("Dispatch with MULTIPLE arguments work", function () {
var result = setupHook(defaultReducer, defaultState).result;
react_hooks_1.act(function () {
result.current.dispatch.multiplySeed(7, 6);
});
expect(result.current.state).toBe(42);
});
// Immer defaults
var immerReducer = function (draft) { return ({
search: function (query1, query2) {
draft.query = query1 + " " + query2;
}
}); };
var immerState = {
query: ""
};
test("Immer initial state", function () {
var result = setupHook(immerReducer, immerState, immer_1.default).result;
expect(result.current.state).not.toEqual({
query: "hi"
});
expect(result.current.state).toEqual({
query: ""
});
});
test("Immer dispatch", function () {
var result = setupHook(immerReducer, immerState, immer_1.default).result;
react_hooks_1.act(function () {
result.current.dispatch.search("I am", "awesome");
});
expect(result.current.state).toEqual({
query: "I am awesome"
});
});
;