Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion src/testing/renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ function isWrappedNode(value: any): value is (WNode & { id: string }) | (WNode &

function findNode<T extends Wrapped<any>>(renderResult: RenderResult, wrapped: T): VNode | WNode {
renderResult = decorateNodes(renderResult).nodes;
let nodes = Array.isArray(renderResult) ? [...renderResult] : [renderResult];
let nodes: any[] = Array.isArray(renderResult) ? [...renderResult] : [renderResult];
while (nodes.length) {
let node = nodes.pop();
if (isWrappedNode(node)) {
Expand All @@ -111,8 +111,24 @@ function findNode<T extends Wrapped<any>>(renderResult: RenderResult, wrapped: T
if (isVNode(node) || isWNode(node)) {
const children = node.children || [];
nodes = [...children, ...nodes];
} else if (node && typeof node === 'object') {
nodes = [
...Object.keys(node).reduce(
(newNodes, key) => {
if (typeof node[key] === 'function') {
const result = node[key]();
node[key] = result;
return Array.isArray(result) ? [...result, ...newNodes] : [result, ...newNodes];
}
return newNodes;
},
[] as any[]
),
...nodes
];
}
}

throw new Error('Unable to find node');
}

Expand Down
4 changes: 2 additions & 2 deletions tests/testing/unit/assertRender.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ class WidgetWithMap extends WidgetBase {
}

function getExpectedError() {
const mockWidgetName = (MockWidget as any).name || 'Widget-3';
const widgetWithChildrenName = (MockWidget as any).name ? 'WidgetWithNamedChildren' : 'Widget-4';
const mockWidgetName = (MockWidget as any).name || 'Widget-4';
const widgetWithChildrenName = (MockWidget as any).name ? 'WidgetWithNamedChildren' : 'Widget-5';
return `
<div
(A) classes={["one","two","three"]}
Expand Down
46 changes: 45 additions & 1 deletion tests/testing/unit/assertion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const { assert } = intern.getPlugin('chai');
import { renderer, wrap, ignore, assertion } from '../../../src/testing/renderer';
import { WidgetBase } from '../../../src/core/WidgetBase';
import { v, w, tsx, create } from '../../../src/core/vdom';
import { DNode } from '../../../src/core/interfaces';
import { DNode, RenderResult } from '../../../src/core/interfaces';

class MyWidget extends WidgetBase<{
toggleProperty?: boolean;
Expand Down Expand Up @@ -117,6 +117,21 @@ describe('new/assertion', () => {
assert.equal(Array.isArray(children) ? children[0] : children, 'hello');
});

it('can get a child of a functional child widget', () => {
const AWidget = create().children<{ foo(): RenderResult }>()(({ children }) => children()[0].foo());
const WrappedDiv = wrap('div');
const testAssertion = assertion(() => (
<div>
<AWidget>
{{
foo: () => [<WrappedDiv>child</WrappedDiv>]
}}
</AWidget>
</div>
));
assert.deepEqual(testAssertion.getChildren(WrappedDiv), ['child']);
});

it('can assert a base assertion', () => {
const r = renderer(() => w(MyWidget, {}));
r.expect(baseAssertion);
Expand Down Expand Up @@ -199,6 +214,35 @@ describe('new/assertion', () => {
r.expect(baseAssertion.setChildren(WrappedHeader, () => ['replace']));
});

it('can set a child of a functional child widget', () => {
const AWidget = create().children<{ bar: RenderResult; foo(): RenderResult }>()(({ children }) => (
<div>
{children()[0].foo()}
{children()[0].bar}
</div>
));
const ParentWidget = create()(() => (
<div>
<AWidget>{{ foo: () => <div>bar</div>, bar: <div>foo</div> }}</AWidget>
</div>
));
const WrappedWidget = wrap(AWidget);
const r = renderer(() => <ParentWidget />);
r.child(WrappedWidget, { foo: [] });
const WrappedDiv = wrap('div');
const testAssertion = assertion(() => (
<div>
<WrappedWidget>
{{
foo: () => <WrappedDiv>foo</WrappedDiv>,
bar: <div>foo</div>
}}
</WrappedWidget>
</div>
));
r.expect(testAssertion.setChildren(WrappedDiv, () => ['bar']));
});

it('children set should be immutable', () => {
const factory = create();
const Widget = factory(function Widget() {
Expand Down