Skip to content

Commit

Permalink
feat: add testing function to fake the init
Browse files Browse the repository at this point in the history
  • Loading branch information
atheck committed Aug 9, 2022
1 parent 26927e0 commit 01bf5a6
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 3 deletions.
3 changes: 2 additions & 1 deletion src/ElmComponent.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { InitFunction, Nullable, UpdateFunction } from "./Types";
import { Message, Services } from "./Init";
import { Cmd } from "./Cmd";
import { getFakeInitResultOnce } from "./Testing/fakeInitResult";
import React from "react";

/**
Expand Down Expand Up @@ -31,7 +32,7 @@ abstract class ElmComponent<TModel, TMsg extends Message, TProps> extends React.
public constructor (props: TProps, init: InitFunction<TProps, TModel, TMsg>, name: string) {
super(props);

const [model, cmd] = init(this.props);
const [model, cmd] = getFakeInitResultOnce<TModel, TMsg>() ?? init(this.props);

this.componentName = name;
this.currentModel = model;
Expand Down
22 changes: 22 additions & 0 deletions src/Testing/fakeInitResult.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { InitResult, MessageBase, Nullable } from "../Types";

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

let initResult: FakeInitResult;

function setFakeInitResult (model: FakeInitResult): void {
initResult = model;
}

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

initResult = null;

return temp;
}

export {
setFakeInitResult,
getFakeInitResultOnce,
};
11 changes: 10 additions & 1 deletion src/Testing/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { MessageBase, Nullable, UpdateMap, UpdateReturnType } from "../Types";
import { InitResult, MessageBase, Nullable, UpdateMap, UpdateReturnType } from "../Types";
import { callUpdateMap } from "../useElmish";
import { Cmd } from "../Cmd";
import React from "react";
import { setFakeInitResult } from "./fakeInitResult";

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

function renderWithFakeInit<TModel, TMessage extends MessageBase> (initResult: InitResult<TModel, TMessage>, render: () => React.ReactNode): void {
setFakeInitResult(initResult);
render();
setFakeInitResult(null);
}

export type {
UpdateArgsFactory,
};
Expand All @@ -95,4 +103,5 @@ export {
execCmd,
getUpdateFn,
createUpdateArgsFactory,
renderWithFakeInit,
};
3 changes: 2 additions & 1 deletion src/useElmish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { Cmd, Dispatch } from "./Cmd";
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 @@ -102,7 +103,7 @@ function useElmish<TProps, TModel, TMessage extends MessageBase> ({ name, props,
}, []);

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

initializedModel = initModel;
setModel(initializedModel);
Expand Down

0 comments on commit 01bf5a6

Please sign in to comment.