Skip to content

Commit 5077d69

Browse files
test(dom-to-react): refactor react tests to snapshot tests
1 parent 48099c1 commit 5077d69

File tree

2 files changed

+118
-83
lines changed

2 files changed

+118
-83
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`DOM to React converts <textarea> correctly 1`] = `
4+
<textarea
5+
defaultValue="foo"
6+
/>
7+
`;
8+
9+
exports[`DOM to React converts SVG element with viewBox attribute 1`] = `
10+
<svg
11+
id="foo"
12+
viewBox="0 0 512 512"
13+
>
14+
Inner
15+
</svg>
16+
`;
17+
18+
exports[`DOM to React converts multiple DOM nodes to React 1`] = `
19+
Array [
20+
<p>
21+
foo
22+
</p>,
23+
<p>
24+
bar
25+
</p>,
26+
]
27+
`;
28+
29+
exports[`DOM to React converts single DOM node to React 1`] = `
30+
<p>
31+
foo
32+
</p>
33+
`;
34+
35+
exports[`DOM to React does not escape <script> content 1`] = `
36+
<script
37+
dangerouslySetInnerHTML={
38+
Object {
39+
"__html": "alert(1 < 2);",
40+
}
41+
}
42+
/>
43+
`;
44+
45+
exports[`DOM to React does not escape <style> content 1`] = `
46+
<style
47+
dangerouslySetInnerHTML={
48+
Object {
49+
"__html": "body > .foo { color: #f00; }",
50+
}
51+
}
52+
/>
53+
`;
54+
55+
exports[`DOM to React does not modify attributes on custom elements 1`] = `
56+
<custom-button
57+
class="myClass"
58+
custom-attribute="value"
59+
/>
60+
`;
61+
62+
exports[`DOM to React skips doctype and comments 1`] = `
63+
Array [
64+
<p>
65+
foo
66+
</p>,
67+
<p>
68+
foo
69+
</p>,
70+
]
71+
`;
72+
73+
exports[`DOM to React when React <16 removes unknown attributes 1`] = `
74+
<custom-button
75+
className="myClass"
76+
/>
77+
`;
78+
79+
exports[`DOM to React when React >=16 preserves unknown attributes 1`] = `
80+
<custom-button
81+
class="myClass"
82+
custom-attribute="value"
83+
/>
84+
`;

test/dom-to-react.test.js

Lines changed: 34 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ describe('DOM to React', () => {
1111
const reactElement = domToReact(htmlToDOM(html));
1212

1313
assert(React.isValidElement(reactElement));
14-
assert.deepEqual(reactElement, React.createElement('p', {}, 'foo'));
14+
expect(reactElement).toMatchSnapshot();
1515
});
1616

1717
it('converts multiple DOM nodes to React', () => {
@@ -23,10 +23,7 @@ describe('DOM to React', () => {
2323
assert(reactElement.key);
2424
});
2525

26-
assert.deepEqual(reactElements, [
27-
React.createElement('p', { key: 0 }, 'foo'),
28-
React.createElement('p', { key: 1 }, 'bar')
29-
]);
26+
expect(reactElements).toMatchSnapshot();
3027
});
3128

3229
// https://reactjs.org/docs/forms.html#the-textarea-tag
@@ -35,54 +32,23 @@ describe('DOM to React', () => {
3532
const reactElement = domToReact(htmlToDOM(html));
3633

3734
assert(React.isValidElement(reactElement));
38-
assert.deepEqual(
39-
reactElement,
40-
React.createElement(
41-
'textarea',
42-
{
43-
defaultValue: 'foo'
44-
},
45-
null
46-
)
47-
);
35+
expect(reactElement).toMatchSnapshot();
4836
});
4937

5038
it('does not escape <script> content', () => {
5139
const html = data.html.script;
5240
const reactElement = domToReact(htmlToDOM(html));
5341

5442
assert(React.isValidElement(reactElement));
55-
assert.deepEqual(
56-
reactElement,
57-
React.createElement(
58-
'script',
59-
{
60-
dangerouslySetInnerHTML: {
61-
__html: 'alert(1 < 2);'
62-
}
63-
},
64-
null
65-
)
66-
);
43+
expect(reactElement).toMatchSnapshot();
6744
});
6845

6946
it('does not escape <style> content', () => {
7047
const html = data.html.style;
7148
const reactElement = domToReact(htmlToDOM(html));
7249

7350
assert(React.isValidElement(reactElement));
74-
assert.deepEqual(
75-
reactElement,
76-
React.createElement(
77-
'style',
78-
{
79-
dangerouslySetInnerHTML: {
80-
__html: 'body > .foo { color: #f00; }'
81-
}
82-
},
83-
null
84-
)
85-
);
51+
expect(reactElement).toMatchSnapshot();
8652
});
8753

8854
it('does not have `children` for void elements', () => {
@@ -108,17 +74,12 @@ describe('DOM to React', () => {
10874
].join('');
10975

11076
const reactElements = domToReact(htmlToDOM(html));
111-
reactElements.forEach(reactElement => {
112-
assert(React.isValidElement(reactElement));
113-
assert(reactElement.key);
77+
reactElements.forEach((reactElement, index) => {
78+
assert.strictEqual(React.isValidElement(reactElement), true);
79+
assert(reactElement.key, String(index));
11480
});
11581

116-
assert.deepEqual(reactElements, [
117-
// doctype
118-
React.createElement('p', { key: 1 }, 'foo'),
119-
// comment is in the middle
120-
React.createElement('p', { key: 3 }, 'foo')
121-
]);
82+
expect(reactElements).toMatchSnapshot();
12283
});
12384

12485
it('converts SVG element with viewBox attribute', () => {
@@ -127,32 +88,26 @@ describe('DOM to React', () => {
12788
htmlToDOM(html, { lowerCaseAttributeNames: false })
12889
);
12990

130-
assert.deepEqual(
131-
reactElement,
132-
React.createElement('svg', { viewBox: '0 0 512 512', id: 'foo' }, 'Inner')
133-
);
91+
expect(reactElement).toMatchSnapshot();
13492
});
13593

13694
it('does not modify attributes on custom elements', () => {
13795
const html = data.html.customElement;
13896
const reactElement = domToReact(htmlToDOM(html));
13997

140-
assert.deepEqual(
141-
reactElement,
142-
React.createElement(
143-
'custom-button',
144-
{
145-
class: 'myClass',
146-
'custom-attribute': 'value'
147-
},
148-
null
149-
)
150-
);
98+
expect(reactElement).toMatchSnapshot();
15199
});
152100

153101
describe('library', () => {
154102
const Preact = require('preact');
155103

104+
it('converts with React (default)', () => {
105+
const html = data.html.single;
106+
const reactElement = domToReact(htmlToDOM(html));
107+
108+
assert.deepEqual(reactElement, React.createElement('p', {}, 'foo'));
109+
});
110+
156111
it('converts with Preact instead of React', () => {
157112
const html = data.html.single;
158113
const preactElement = domToReact(htmlToDOM(html), { library: Preact });
@@ -162,16 +117,16 @@ describe('DOM to React', () => {
162117
});
163118

164119
describe('replace', () => {
165-
it("does not set key if there's 1 node", () => {
120+
it("does not set key if there's a single node", () => {
166121
const replaceElement = React.createElement('p');
167122
const reactElement = domToReact(htmlToDOM(data.html.single), {
168123
replace: () => replaceElement
169124
});
170-
assert.deepEqual(reactElement, replaceElement);
125+
assert.strictEqual(reactElement.key, null);
171126
});
172127

173128
it("does not modify keys if it's already set", () => {
174-
const html = [data.html.single, data.html.customElement].join('');
129+
const html = data.html.single + data.html.customElement;
175130

176131
const reactElements = domToReact(htmlToDOM(html), {
177132
replace: node => {
@@ -192,18 +147,17 @@ describe('DOM to React', () => {
192147
}
193148
});
194149

195-
assert.deepEqual(reactElements, [
196-
React.createElement('p', { key: 0 }, 'replaced foo'),
197-
React.createElement(
198-
'custom-button',
199-
{
200-
key: 'myKey',
201-
class: 'myClass',
202-
'custom-attribute': 'replaced value'
203-
},
204-
null
205-
)
206-
]);
150+
assert.strictEqual(reactElements[0].key, '0');
151+
assert.strictEqual(reactElements[1].key, 'myKey');
152+
});
153+
});
154+
155+
describe('when React >=16', () => {
156+
it('preserves unknown attributes', () => {
157+
const html = data.html.customElement;
158+
const reactElement = domToReact(htmlToDOM(html));
159+
160+
expect(reactElement).toMatchSnapshot();
207161
});
208162
});
209163

@@ -218,14 +172,11 @@ describe('DOM to React', () => {
218172
utilities.PRESERVE_CUSTOM_ATTRIBUTES = PRESERVE_CUSTOM_ATTRIBUTES;
219173
});
220174

221-
it('modifies attributes on custom elements', () => {
175+
it('removes unknown attributes', () => {
222176
const html = data.html.customElement;
223177
const reactElement = domToReact(htmlToDOM(html));
224178

225-
assert.deepEqual(
226-
reactElement,
227-
React.createElement('custom-button', { className: 'myClass' }, null)
228-
);
179+
expect(reactElement).toMatchSnapshot();
229180
});
230181
});
231182
});

0 commit comments

Comments
 (0)