Skip to content

Commit ca335ae

Browse files
committed
feat: allow to fake dispatch
1 parent 8e87592 commit ca335ae

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

src/Testing/fakeInitResult.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
11
import { InitResult, MessageBase, Nullable } from "../Types";
2+
import { Dispatch } from "../Cmd";
23

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

5-
let initResult: FakeInitResult;
6+
let currentFakeInitResult: FakeInitResult;
7+
let currentFakeDispatch: Nullable<Dispatch<MessageBase>>;
68

7-
function setFakeInitResult (model: FakeInitResult): void {
8-
initResult = model;
9+
function setFakes (fakeInitResult: FakeInitResult, fakeDispatch?: Nullable<Dispatch<MessageBase>>): void {
10+
currentFakeInitResult = fakeInitResult;
11+
currentFakeDispatch = fakeDispatch ?? null;
912
}
1013

1114
function getFakeInitResultOnce<TModel, TMessage extends MessageBase> (): Nullable<InitResult<TModel, TMessage>> {
12-
const temp = initResult as Nullable<InitResult<TModel, TMessage>>;
15+
const temp = currentFakeInitResult as Nullable<InitResult<TModel, TMessage>>;
1316

14-
initResult = null;
17+
currentFakeInitResult = null;
18+
19+
return temp;
20+
}
21+
22+
function getFakeDispatchOnce<TMessage extends MessageBase> (): Nullable<Dispatch<TMessage>> {
23+
const temp = currentFakeDispatch;
24+
25+
currentFakeDispatch = null;
1526

1627
return temp;
1728
}
1829

1930
export {
20-
setFakeInitResult,
31+
setFakes,
2132
getFakeInitResultOnce,
33+
getFakeDispatchOnce,
2234
};

src/Testing/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import { Cmd, Dispatch } from "../Cmd";
12
import { InitResult, MessageBase, Nullable, UpdateMap, UpdateReturnType } from "../Types";
23
import { callUpdateMap } from "../useElmish";
3-
import { Cmd } from "../Cmd";
4-
import { setFakeInitResult } from "./fakeInitResult";
4+
import { setFakes } from "./fakeInitResult";
55

66
/**
77
* Extracts the messages out of a command.
@@ -87,12 +87,12 @@ function createUpdateArgsFactory <TProps, TModel, TMessage extends MessageBase>
8787
};
8888
}
8989

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

9393
const result = render();
9494

95-
setFakeInitResult(null);
95+
setFakes(null, null);
9696

9797
return result;
9898
}
@@ -106,5 +106,5 @@ export {
106106
execCmd,
107107
getUpdateFn,
108108
createUpdateArgsFactory,
109-
renderWithFakeInit,
109+
renderWithFake,
110110
};

src/useElmish.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/* eslint-disable react-hooks/exhaustive-deps */
22
import { Cmd, Dispatch } from "./Cmd";
3+
import { getFakeDispatchOnce, getFakeInitResultOnce } from "./Testing/fakeInitResult";
34
import { InitFunction, MessageBase, Nullable, UpdateFunction, UpdateMap, UpdateReturnType } from "./Types";
45
import { useCallback, useEffect, useRef, useState } from "react";
5-
import { getFakeInitResultOnce } from "./Testing/fakeInitResult";
66
import { Services } from "./Init";
77

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

50-
const dispatch = useCallback((msg: TMessage): void => {
50+
const fakeDispatch = getFakeDispatchOnce();
51+
const dispatch = useCallback(fakeDispatch ?? ((msg: TMessage): void => {
5152
if (!initializedModel) {
5253
return;
5354
}
@@ -100,7 +101,7 @@ function useElmish<TProps, TModel, TMessage extends MessageBase> ({ name, props,
100101
});
101102
}
102103
}
103-
}, []);
104+
}), []);
104105

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

0 commit comments

Comments
 (0)