Skip to content

Commit 5bcfd38

Browse files
Merge pull request #57 from headless-ninja/new-loading-logic
Use more performant loading logic
2 parents d76bc87 + b4efd5f commit 5bcfd38

File tree

13 files changed

+601
-468
lines changed

13 files changed

+601
-468
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"tslint-config-airbnb": "5.10.0",
3939
"tslint-config-prettier": "1.18.0",
4040
"tslint-react": "3.6.0",
41-
"typescript": "3.1.6"
41+
"typescript": "3.2.2"
4242
},
4343
"scripts": {
4444
"build": "gulp build",

packages/hn-react/src/components/DrupalPage.test.tsx

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
11
import * as React from 'react';
22
import * as renderer from 'react-test-renderer';
33
import site from '../utils/site';
4-
import { asyncMapper, mapper, uuid, uuid2 } from '../utils/tests';
4+
import { asyncMapper, mapper, SiteMock, uuid, uuid2 } from '../utils/tests';
55
import waitForHnData from '../utils/waitForHnData';
66
import DrupalPage from './DrupalPage';
77

8+
const siteMock: SiteMock = site as any;
9+
810
jest.mock('../utils/site', () => {
911
return require('../utils/tests').mockSite();
1012
});
1113

1214
jest.mock('util-deprecate', () => jest.fn(func => func));
1315

1416
describe('DrupalPage', async () => {
17+
test('without any mapper', async () => {
18+
const component = <DrupalPage url={'/'} />;
19+
20+
expect(renderer.create(await waitForHnData(component)).toJSON()).toBe(null);
21+
});
22+
1523
test('with required props', async () => {
1624
const component = <DrupalPage mapper={mapper} url={'/'} />;
1725

18-
expect(renderer.create(component).toJSON()).toMatchSnapshot();
26+
const withoutWaiting = renderer.create(component).toJSON();
27+
const withWaiting = renderer
28+
.create(await waitForHnData(component))
29+
.toJSON();
1930

20-
expect(
21-
renderer.create(await waitForHnData(component)).toJSON(),
22-
).toMatchSnapshot();
31+
expect(withoutWaiting).toMatchSnapshot();
32+
expect(withWaiting).toEqual(withoutWaiting);
2333
});
2434

2535
test('with all props', async () => {
@@ -34,8 +44,10 @@ describe('DrupalPage', async () => {
3444
/>
3545
);
3646

47+
siteMock.getUuid.mockReturnValue(undefined);
3748
expect(renderer.create(component).toJSON()).toMatchSnapshot();
3849

50+
siteMock.getUuid.mockReturnValue(uuid);
3951
expect(
4052
renderer.create(await waitForHnData(component)).toJSON(),
4153
).toMatchSnapshot();
@@ -71,26 +83,47 @@ describe('DrupalPage', async () => {
7183
/>
7284
);
7385

86+
siteMock.getUuid.mockReturnValueOnce(undefined);
87+
7488
expect(renderer.create(component).toJSON()).toMatchSnapshot();
7589

90+
siteMock.getUuid.mockReturnValueOnce(undefined);
7691
expect(
7792
renderer.create(await waitForHnData(component)).toJSON(),
7893
).toMatchSnapshot();
7994
});
8095

8196
test('when getPage fails', async () => {
82-
const component = <DrupalPage mapper={{}} url={'/newUrl'} />;
97+
const log = jest.fn();
98+
99+
class ErrorBoundary extends React.Component {
100+
componentDidCatch() {
101+
log();
102+
}
103+
render() {
104+
return this.props.children;
105+
}
106+
}
107+
const component = (
108+
<ErrorBoundary>
109+
<DrupalPage mapper={{}} url={'/newUrl'} />
110+
</ErrorBoundary>
111+
);
83112

84-
const getPage = (site.getPage as any) as jest.Mock<any>;
85-
getPage.mockImplementationOnce(() => Promise.resolve('500'));
113+
siteMock.getUuid.mockReturnValue(undefined);
114+
siteMock.getPage.mockImplementationOnce(async () => {
115+
throw new Error('Error!');
116+
});
86117

87118
const rendererEntry = renderer.create(component);
88119

89120
await new Promise(r => process.nextTick(r));
90121

91122
expect(rendererEntry.toJSON()).toBe(null);
123+
expect(log).toHaveBeenCalledTimes(1);
124+
expect(siteMock.getPage).toHaveBeenCalledTimes(1);
92125

93-
expect(getPage).toHaveBeenCalledTimes(1);
126+
siteMock.getUuid.mockReturnValue(uuid);
94127
});
95128

96129
test('changing props', async () => {
@@ -104,10 +137,10 @@ describe('DrupalPage', async () => {
104137

105138
// Intercept the next site.getPage call.
106139
let resolveGetPage;
107-
const getPage = (site.getPage as any) as jest.Mock<any>;
108-
getPage.mockImplementationOnce(
140+
siteMock.getPage.mockImplementationOnce(
109141
() => new Promise(r => (resolveGetPage = r)),
110142
);
143+
siteMock.getUuid.mockReturnValue(undefined);
111144

112145
// Change the url.
113146
rendererEntry.update(<DrupalPage mapper={mapper} url={'/new-url'} />);
@@ -117,6 +150,9 @@ describe('DrupalPage', async () => {
117150
expect(rendererEntry.toJSON()).toEqual(null);
118151

119152
// Make new data available.
153+
siteMock.getUuid.mockImplementation(page =>
154+
page === '/new-url' ? uuid2 : undefined,
155+
);
120156
resolveGetPage(uuid2);
121157
await new Promise(r => process.nextTick(r));
122158

@@ -126,7 +162,7 @@ describe('DrupalPage', async () => {
126162

127163
// Intercept the next site.getPage call.
128164
let resolveGetPage2;
129-
getPage.mockImplementationOnce(
165+
siteMock.getPage.mockImplementationOnce(
130166
() => new Promise(r => (resolveGetPage2 = r)),
131167
);
132168

@@ -161,7 +197,7 @@ describe('DrupalPage', async () => {
161197

162198
// Intercept the next set.getPage call.
163199
let resolveGetPage3;
164-
getPage.mockImplementationOnce(
200+
siteMock.getPage.mockImplementationOnce(
165201
() => new Promise(r => (resolveGetPage3 = r)),
166202
);
167203

@@ -175,11 +211,18 @@ describe('DrupalPage', async () => {
175211
expect(rendererEntry.toJSON()).toEqual(entity2Result);
176212

177213
// We resolve the first page. This shouldn't do anything, because it's not the latest url.
178-
resolveGetPage2(uuid);
214+
siteMock.getUuid.mockImplementation(page =>
215+
page === '/fresh-url' ? undefined : uuid2,
216+
);
217+
resolveGetPage2(uuid2);
218+
179219
await new Promise(r => process.nextTick(r));
180220
expect(rendererEntry.toJSON()).toEqual(entity2Result);
181221

182222
// Now we resolve the latest page. This should render entity 1.
223+
siteMock.getUuid.mockImplementation(page =>
224+
page === '/fresh-url' ? uuid : uuid2,
225+
);
183226
resolveGetPage3(uuid);
184227
await new Promise(r => process.nextTick(r));
185228
expect(rendererEntry.toJSON()).toMatchSnapshot();

0 commit comments

Comments
 (0)