// mark relevant parts of result tree with __tetsId & __testClass
const TestTarget = props =>
<div>
<Foo foo={props.foo} __tetsId="foo" />
<ul>
<li num={1} __testClass="baz" />
<li num={2} __testClass="baz" />
</ul>
</div>
// (tree, testId) -> null | element
const getByTestID = ...
getByID(tree, 'foo') = <Foo foo="bar" __tetsId="foo" />
// (tree, testClass) -> [element]
const getByTestClass = ...
getByTestClass(tree, 'baz') = [<li num={1} __testClass="baz" />, <li num={2} __testClass="baz" />]
// (tree, ids, classes) -> {[id|class]: null | element | [element]}
const getRelevant = ...
getRelevant(tree, ['foo'], ['baz']) = {
foo: <Foo foo="bar" __tetsId="foo" />,
baz: [<li num={1} __testClass="baz" />, <li num={2} __testClass="baz" />]
}
// ({[id|class]: null | element | [element]}) -> {[id|class]: null | props | [props]}
const getProps = ...
getProps(relevantElements) = {foo: {foo: 'bar'}, baz: [{num: 1}, {num: 2}]}
const render = element =>
TestUtils.createRenderer().render(element).getRenderOutput()
const renderToRelevant = (Comp, ids, classes) => props =>
getRelevant(render(<Comp {...props} />), ids, classes)
const renderToRelevantProps = (Comp, ids, classes) => props =>
getProps(renderToRelevant(Comp, ids, classes)(props))
// Example
render = renderToRelevantProps(TestTarget, ['foo'], ['baz'])
expect(render({foo: 'bar'}).foo.foo).toBe('bar')
expect(render({foo: 'lol'}).foo.foo).toBe('lol')
const treeToRelevantProps = (ids, classes) => tree => getProps(getRelevant(tree, ids, classes))
run(TestTarget, treeToRelevantProps(ids, classes), addToLog => {
const events
})
// We get log, which contains all versions of the tree & any items we add manualy using addTolog()
[tree1, 'click'] = run(Button, treeToRelevantProps(ids, classes), addTolog => {
// We return list of input events
return [
// An {} is "update props" event, we should always start with initial props
{onClick: () => {addTolog('click')}},
// A function is "arbitrary action" event, we get
(relevantProps, latestTree, logSoFar) => {relevantProps.innerButton.onClick()}
]
})
// Now we can run some assertions agains the log
run()
should also be partially applicable —run = (Comp, getRelevantProps) => runner => log
Maybe
run = (Comp, ids, classes) => (addToLog => events) => log