Skip to content

Commit 71c9aba

Browse files
committed
generalize to be independent of enzyme
1 parent bb2ac90 commit 71c9aba

1 file changed

Lines changed: 21 additions & 19 deletions

File tree

samples/src/Samples/ProgramSample.test.tsx

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { extendJest, Cmd, Sub, Task, Program, ProgramProps } from "react-tea-cup
33
import React, { ReactNode } from 'react';
44
import { Dispatcher } from 'tea-cup-core';
55
import { view } from './Counter';
6+
import { ReactElement } from 'react';
67
// import 'jest-enzyme';
78

89
extendJest(expect);
@@ -45,7 +46,7 @@ describe('Test Program', () => {
4546
update: update1,
4647
subscriptions: () => Sub.none<string>()
4748
}
48-
return updateUntilIdle(props).then(([model, wrapper]) => {
49+
return updateUntilIdle(props, mount).then(([model, wrapper]) => {
4950
expect(model).toEqual(6)
5051
// expect(wrapper).toHaveHTML('')
5152
expect(wrapper.find('.count')).toHaveText('6')
@@ -59,32 +60,33 @@ function mountWhenIdle<Model, Msg>(props: ProgramProps<Model, Msg>) {
5960
return testable.mountWhenIdle()
6061
}
6162

62-
type WrapperType<Model, Msg> = ReactWrapper<Program<Model, Msg>, ProgramProps<Model, Msg>, never>
63-
type ResolveType<Model, Msg> = (idle: [Model, WrapperType<Model, Msg>]) => void;
63+
type Trigger<Model, Msg, T> = (node: ReactElement<ProgramProps<Model, Msg>>) => T
64+
// type WrapperType<Model, Msg> = ReactWrapper<Program<Model, Msg>, ProgramProps<Model, Msg>, never>
65+
type ResolveType<Model, T> = (idle: [Model, T]) => void;
6466

65-
function updateUntilIdle<Model, Msg>(props: ProgramProps<Model, Msg>): Promise<[Model, WrapperType<Model, Msg>]> {
67+
function updateUntilIdle<Model, Msg, T>(props: ProgramProps<Model, Msg>, fun: Trigger<Model, Msg, T>): Promise<[Model, T]> {
6668
return new Promise(resolve => {
67-
mount(<Program {...testableProps(resolve, props)} />)
69+
fun(<Program {...testableProps(resolve, props, fun)} />)
6870
})
6971
}
7072

71-
function testableProps<Model, Msg>(resolve: ResolveType<Model, Msg>, props: ProgramProps<Model, Msg>) {
72-
const tprops: ProgramProps<TestableModel<Model, Msg>, Msg> = {
73+
function testableProps<Model, Msg, T>(resolve: ResolveType<Model, T>, props: ProgramProps<Model, Msg>, fun: Trigger<Model, Msg, T>) {
74+
const tprops: ProgramProps<TestableModel<Model, Msg, T>, Msg> = {
7375
init: initTestable(resolve, props.init),
7476
view: viewTestable(props.view),
7577
update: updateTestable((props.update)),
76-
subscriptions: suscriptionsTestable(props)
78+
subscriptions: suscriptionsTestable(props, fun)
7779
}
7880
return tprops
7981
}
8082

81-
type TestableModel<Model, Msg> = {
82-
readonly resolve: ResolveType<Model, Msg>;
83+
type TestableModel<Model, Msg, T> = {
84+
readonly resolve: ResolveType<Model, T>;
8385
readonly cmds: Cmd<Msg>[];
8486
readonly model: Model;
8587
}
8688

87-
function initTestable<Model, Msg>(resolve: ResolveType<Model, Msg>, init: ProgramProps<Model, Msg>['init']): ProgramProps<TestableModel<Model, Msg>, Msg>['init'] {
89+
function initTestable<Model, Msg, T>(resolve: ResolveType<Model, T>, init: ProgramProps<Model, Msg>['init']): ProgramProps<TestableModel<Model, Msg, T>, Msg>['init'] {
8890
const mac = init();
8991
return () => [{
9092
resolve,
@@ -93,12 +95,12 @@ function initTestable<Model, Msg>(resolve: ResolveType<Model, Msg>, init: Progra
9395
}, Cmd.none()];
9496
}
9597

96-
function viewTestable<Model, Msg>(view: ProgramProps<Model, Msg>['view']): ProgramProps<TestableModel<Model, Msg>, Msg>['view'] {
97-
return (dispatch: Dispatcher<Msg>, model: TestableModel<Model, Msg>) => view(dispatch, model.model);
98+
function viewTestable<Model, Msg, T>(view: ProgramProps<Model, Msg>['view']): ProgramProps<TestableModel<Model, Msg, T>, Msg>['view'] {
99+
return (dispatch: Dispatcher<Msg>, model: TestableModel<Model, Msg, T>) => view(dispatch, model.model);
98100
}
99101

100-
function updateTestable<Model, Msg>(update: ProgramProps<Model, Msg>['update']): ProgramProps<TestableModel<Model, Msg>, Msg>['update'] {
101-
return (msg: Msg, model: TestableModel<Model, Msg>) => {
102+
function updateTestable<Model, Msg, T>(update: ProgramProps<Model, Msg>['update']): ProgramProps<TestableModel<Model, Msg, T>, Msg>['update'] {
103+
return (msg: Msg, model: TestableModel<Model, Msg, T>) => {
102104
const [model1, cmd1] = update(msg, model.model);
103105
const cmds = [cmd1].filter(cmd => cmd.constructor.name !== 'CmdNone')
104106
return [{
@@ -109,17 +111,17 @@ function updateTestable<Model, Msg>(update: ProgramProps<Model, Msg>['update']):
109111
}
110112
}
111113

112-
function suscriptionsTestable<Model, Msg>(props: ProgramProps<Model, Msg>): ProgramProps<TestableModel<Model, Msg>, Msg>['subscriptions'] {
113-
return (model: TestableModel<Model, Msg>) => {
114+
function suscriptionsTestable<Model, Msg, T>(props: ProgramProps<Model, Msg>, fun: Trigger<Model, Msg, T>): ProgramProps<TestableModel<Model, Msg, T>, Msg>['subscriptions'] {
115+
return (model: TestableModel<Model, Msg, T>) => {
114116
const subs = props.subscriptions(model.model);
115117
if (model.cmds.length === 0) {
116-
const wrapper: WrapperType<Model, Msg> = mount(<Program
118+
const result = fun(<Program
117119
init={() => [model.model, Cmd.none()]}
118120
update={(msg, model) => [model, Cmd.none()]}
119121
view={(d, m) => props.view(d, m)}
120122
subscriptions={(d) => Sub.none()}
121123
/>)
122-
model.resolve([model.model, wrapper]);
124+
model.resolve([model.model, result]);
123125
return subs;
124126
}
125127
return Sub.batch([new TestableSub(model.cmds), subs]);

0 commit comments

Comments
 (0)