Skip to content

Commit

Permalink
feat: allow to fake dispatch
Browse files Browse the repository at this point in the history
  • Loading branch information
atheck committed Aug 11, 2022
1 parent 8e87592 commit ca335ae
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 15 deletions.
24 changes: 18 additions & 6 deletions src/Testing/fakeInitResult.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
import { InitResult, MessageBase, Nullable } from "../Types";
import { Dispatch } from "../Cmd";

type FakeInitResult = Nullable<[unknown, unknown?]>;

let initResult: FakeInitResult;
let currentFakeInitResult: FakeInitResult;
let currentFakeDispatch: Nullable<Dispatch<MessageBase>>;

function setFakeInitResult (model: FakeInitResult): void {
initResult = model;
function setFakes (fakeInitResult: FakeInitResult, fakeDispatch?: Nullable<Dispatch<MessageBase>>): void {
currentFakeInitResult = fakeInitResult;
currentFakeDispatch = fakeDispatch ?? null;
}

function getFakeInitResultOnce<TModel, TMessage extends MessageBase> (): Nullable<InitResult<TModel, TMessage>> {
const temp = initResult as Nullable<InitResult<TModel, TMessage>>;
const temp = currentFakeInitResult as Nullable<InitResult<TModel, TMessage>>;

initResult = null;
currentFakeInitResult = null;

return temp;
}

function getFakeDispatchOnce<TMessage extends MessageBase> (): Nullable<Dispatch<TMessage>> {
const temp = currentFakeDispatch;

currentFakeDispatch = null;

return temp;
}

export {
setFakeInitResult,
setFakes,
getFakeInitResultOnce,
getFakeDispatchOnce,
};
12 changes: 6 additions & 6 deletions src/Testing/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Cmd, Dispatch } from "../Cmd";
import { InitResult, MessageBase, Nullable, UpdateMap, UpdateReturnType } from "../Types";
import { callUpdateMap } from "../useElmish";
import { Cmd } from "../Cmd";
import { setFakeInitResult } from "./fakeInitResult";
import { setFakes } from "./fakeInitResult";

/**
* Extracts the messages out of a command.
Expand Down Expand Up @@ -87,12 +87,12 @@ function createUpdateArgsFactory <TProps, TModel, TMessage extends MessageBase>
};
}

function renderWithFakeInit<TModel, TMessage extends MessageBase, TResult = unknown> (initResult: InitResult<TModel, TMessage>, render: () => TResult): TResult {
setFakeInitResult(initResult);
function renderWithFake<TModel, TMessage extends MessageBase, TResult = unknown> (initResult: InitResult<TModel, TMessage>, render: () => TResult, fakeDispatch?: Dispatch<TMessage>): TResult {
setFakes(initResult, (fakeDispatch ?? null) as Nullable<Dispatch<unknown>>);

const result = render();

setFakeInitResult(null);
setFakes(null, null);

return result;
}
Expand All @@ -106,5 +106,5 @@ export {
execCmd,
getUpdateFn,
createUpdateArgsFactory,
renderWithFakeInit,
renderWithFake,
};
7 changes: 4 additions & 3 deletions src/useElmish.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/* eslint-disable react-hooks/exhaustive-deps */
import { Cmd, Dispatch } from "./Cmd";
import { getFakeDispatchOnce, getFakeInitResultOnce } from "./Testing/fakeInitResult";
import { InitFunction, MessageBase, Nullable, UpdateFunction, UpdateMap, UpdateReturnType } from "./Types";
import { useCallback, useEffect, useRef, useState } from "react";
import { getFakeInitResultOnce } from "./Testing/fakeInitResult";
import { Services } from "./Init";

type SubscriptionResult<TMessage> = [Cmd<TMessage>, (() => void)?];
Expand Down Expand Up @@ -47,7 +47,8 @@ function useElmish<TProps, TModel, TMessage extends MessageBase> ({ name, props,
});
}, []);

const dispatch = useCallback((msg: TMessage): void => {
const fakeDispatch = getFakeDispatchOnce();
const dispatch = useCallback(fakeDispatch ?? ((msg: TMessage): void => {
if (!initializedModel) {
return;
}
Expand Down Expand Up @@ -100,7 +101,7 @@ function useElmish<TProps, TModel, TMessage extends MessageBase> ({ name, props,
});
}
}
}, []);
}), []);

if (!initializedModel) {
const [initModel, initCmd] = getFakeInitResultOnce<TModel, TMessage>() ?? init(props);
Expand Down

0 comments on commit ca335ae

Please sign in to comment.