Skip to content

Commit b40b356

Browse files
committed
Add more tests
1 parent eb51153 commit b40b356

File tree

3 files changed

+160
-18
lines changed

3 files changed

+160
-18
lines changed

js-tests/js-tests.jsx

Lines changed: 81 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,91 @@
11
import React from 'react';
2+
import ReactDOM from 'react';
3+
import { renderToString, renderToStaticMarkup } from 'react-dom/server';
4+
import parseXml from '@rgrove/parse-xml';
5+
import ReactHtmlParser from 'react-html-parser';
6+
7+
/**
8+
* Needed by react-tools.js
9+
* In normal operation, these are added to the page as htmlDependencies.
10+
*/
11+
window.React = React;
12+
window.ReactDOM = ReactDOM;
13+
14+
class Shout extends React.Component {
15+
render() {
16+
return <span>{this.props.message.toUpperCase()}</span>;
17+
}
18+
}
19+
20+
const FunctionalShout = ({ message }) => {
21+
return <span>{message.toUpperCase()}</span>;
22+
}
23+
24+
class TodoList extends React.Component {
25+
render() {
26+
return <ol>
27+
{this.props.children.map((child, i) => {
28+
return <li key={i}>{child}</li>;
29+
})}
30+
</ol>
31+
}
32+
}
33+
34+
// Converts a parse-xml style tree to an htmltools::tag style tree of JSON.
35+
function objectToTag(obj) {
36+
return {
37+
name: obj.name,
38+
attribs: obj.attributes,
39+
children: obj.children.map(child => {
40+
if (child.type === 'text') {
41+
return child.text;
42+
} else {
43+
return objectToTag(child);
44+
}
45+
})
46+
}
47+
}
48+
49+
// Converts a string of markup to an htmltools::tag style tree of JSON.
50+
function stringToTag(str) {
51+
return objectToTag(parseXml(str).children[0]);
52+
}
53+
54+
// Compares two parse-xml style trees for "deep" equality
55+
function xmlEqual(x1, x2) {
56+
if (x1.type === 'text'
57+
&& x2.type === 'text'
58+
&& x1.text === x2.text)
59+
return true;
60+
return x1.name === x2.name
61+
// Test attributes for equalitiy
62+
&& Object.keys(x1).length === Object.keys(x2).length
63+
&& Object.keys(x1).every(k => x1[k] === x2[k])
64+
// Test children for equality
65+
&& x1.children.length === x2.children.length
66+
&& x1.children.every((child, i) => markupEqual(child, x2.children[i]))
67+
}
268

369
describe('window.reactR', () => {
470
describe('#hydrate()', () => {
571
it('should throw an exception with an unknown component', () => {
672
assert.throws(() => {
7-
reactR.hydrate(
8-
{
9-
Foo: class Foo extends React.Component {
10-
render() {
11-
return <h1>Foo!</h1>;
12-
}
13-
}
14-
},
15-
{
16-
name: "Bar",
17-
attribs: {},
18-
children: {}
19-
}
20-
)
73+
reactR.hydrate({ Shout: Shout }, stringToTag('<Bar/>'))
2174
}, Error, /Unknown component/);
2275
});
76+
it('hydrates an HTML5 component with a text child', () => {
77+
const markup = '<h1>Hello</h1>';
78+
assert.equal(
79+
renderToString(ReactHtmlParser(markup)),
80+
renderToString(reactR.hydrate({}, stringToTag(markup)))
81+
)
82+
})
83+
it('hydrates nested HTML5 components', () => {
84+
const markup = '<div><h1>Hello</h1><p>Oh, hello.</p></div>'
85+
assert.equal(
86+
renderToString(ReactHtmlParser(markup)),
87+
renderToString(reactR.hydrate({}, stringToTag(markup)))
88+
)
89+
})
2390
});
2491
});

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"@babel/core": "^7.2.0",
1515
"babel-loader": "^8.0.4",
1616
"@babel/preset-env": "^7.2.0",
17-
"@babel/preset-react": "^7.0.0"
17+
"@babel/preset-react": "^7.0.0",
18+
"@rgrove/parse-xml": "^1.1.1",
19+
"react-html-parser": "^2.0.2"
1820
},
1921
"scripts": {
2022
"test": "karma start --single-run --browsers ChromeHeadless karma.conf.js"

yarn.lock

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,13 @@
641641
lodash "^4.17.10"
642642
to-fast-properties "^2.0.0"
643643

644+
"@rgrove/parse-xml@^1.1.1":
645+
version "1.1.1"
646+
resolved "https://registry.yarnpkg.com/@rgrove/parse-xml/-/parse-xml-1.1.1.tgz#9415b98995e0f2ac86b84d9501af2053b22f4621"
647+
integrity sha512-3wFRoPyAnb7w5oLdUuiXoMN5s19RZjTmdN7pz4G8XDVgjpXFCP6gUvb5k/GtzZwwFRNCYpBFxCEykcYdeWLiPQ==
648+
dependencies:
649+
babel-runtime "^6.23.0"
650+
644651
abbrev@1:
645652
version "1.1.1"
646653
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -836,7 +843,7 @@ babel-loader@^8.0.4:
836843
mkdirp "^0.5.1"
837844
util.promisify "^1.0.0"
838845

839-
babel-runtime@^6.0.0:
846+
babel-runtime@^6.0.0, babel-runtime@^6.23.0:
840847
version "6.26.0"
841848
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
842849
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -1569,11 +1576,44 @@ dom-serialize@^2.2.0:
15691576
extend "^3.0.0"
15701577
void-elements "^2.0.0"
15711578

1579+
dom-serializer@0:
1580+
version "0.1.0"
1581+
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
1582+
integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=
1583+
dependencies:
1584+
domelementtype "~1.1.1"
1585+
entities "~1.1.1"
1586+
15721587
domain-browser@^1.1.1:
15731588
version "1.2.0"
15741589
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
15751590
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
15761591

1592+
domelementtype@1, domelementtype@^1.3.0:
1593+
version "1.3.1"
1594+
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
1595+
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
1596+
1597+
domelementtype@~1.1.1:
1598+
version "1.1.3"
1599+
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
1600+
integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=
1601+
1602+
domhandler@^2.3.0:
1603+
version "2.4.2"
1604+
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
1605+
integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
1606+
dependencies:
1607+
domelementtype "1"
1608+
1609+
domutils@^1.5.1:
1610+
version "1.7.0"
1611+
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
1612+
integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
1613+
dependencies:
1614+
dom-serializer "0"
1615+
domelementtype "1"
1616+
15771617
15781618
version "1.1.1"
15791619
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -1662,6 +1702,11 @@ ent@~2.2.0:
16621702
resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
16631703
integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
16641704

1705+
entities@^1.1.1, entities@~1.1.1:
1706+
version "1.1.2"
1707+
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
1708+
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
1709+
16651710
errno@^0.1.3:
16661711
version "0.1.7"
16671712
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -2194,6 +2239,18 @@ hosted-git-info@^2.1.4:
21942239
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
21952240
integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
21962241

2242+
htmlparser2@^3.9.0:
2243+
version "3.10.0"
2244+
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
2245+
integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==
2246+
dependencies:
2247+
domelementtype "^1.3.0"
2248+
domhandler "^2.3.0"
2249+
domutils "^1.5.1"
2250+
entities "^1.1.1"
2251+
inherits "^2.0.1"
2252+
readable-stream "^3.0.6"
2253+
21972254
[email protected], http-errors@~1.6.3:
21982255
version "1.6.3"
21992256
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
@@ -3505,6 +3562,13 @@ react-dom@^16.7.0:
35053562
prop-types "^15.6.2"
35063563
scheduler "^0.12.0"
35073564

3565+
react-html-parser@^2.0.2:
3566+
version "2.0.2"
3567+
resolved "https://registry.yarnpkg.com/react-html-parser/-/react-html-parser-2.0.2.tgz#6dbe1ddd2cebc1b34ca15215158021db5fc5685e"
3568+
integrity sha512-XeerLwCVjTs3njZcgCOeDUqLgNIt/t+6Jgi5/qPsO/krUWl76kWKXMeVs2LhY2gwM6X378DkhLjur0zUQdpz0g==
3569+
dependencies:
3570+
htmlparser2 "^3.9.0"
3571+
35083572
react@^16.7.0:
35093573
version "16.7.0"
35103574
resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381"
@@ -3545,6 +3609,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable
35453609
string_decoder "~1.1.1"
35463610
util-deprecate "~1.0.1"
35473611

3612+
readable-stream@^3.0.6:
3613+
version "3.1.1"
3614+
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06"
3615+
integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==
3616+
dependencies:
3617+
inherits "^2.0.3"
3618+
string_decoder "^1.1.1"
3619+
util-deprecate "^1.0.1"
3620+
35483621
readdirp@^2.0.0:
35493622
version "2.2.1"
35503623
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@@ -3996,7 +4069,7 @@ string-width@^1.0.1:
39964069
is-fullwidth-code-point "^2.0.0"
39974070
strip-ansi "^4.0.0"
39984071

3999-
string_decoder@^1.0.0:
4072+
string_decoder@^1.0.0, string_decoder@^1.1.1:
40004073
version "1.2.0"
40014074
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
40024075
integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
@@ -4273,7 +4346,7 @@ [email protected]:
42734346
lru-cache "4.1.x"
42744347
tmp "0.0.x"
42754348

4276-
util-deprecate@~1.0.1:
4349+
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
42774350
version "1.0.2"
42784351
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
42794352
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=

0 commit comments

Comments
 (0)