11import * as React from 'react' ;
22import * as renderer from 'react-test-renderer' ;
33import site from '../utils/site' ;
4- import { asyncMapper , mapper , uuid , uuid2 } from '../utils/tests' ;
4+ import { asyncMapper , mapper , SiteMock , uuid , uuid2 } from '../utils/tests' ;
55import waitForHnData from '../utils/waitForHnData' ;
66import DrupalPage from './DrupalPage' ;
77
8+ const siteMock : SiteMock = site as any ;
9+
810jest . mock ( '../utils/site' , ( ) => {
911 return require ( '../utils/tests' ) . mockSite ( ) ;
1012} ) ;
1113
1214jest . mock ( 'util-deprecate' , ( ) => jest . fn ( func => func ) ) ;
1315
1416describe ( '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