1
- import { render } from '@testing-library/react' ;
1
+ import { act , render } from '@testing-library/react' ;
2
2
import { GraphQLInt , GraphQLObjectType , GraphQLSchema } from 'graphql' ;
3
3
import { FC , useEffect } from 'react' ;
4
- import { SchemaContext , SchemaContextType } from '@graphiql/react' ;
4
+ import type { SchemaContextType } from '@graphiql/react' ;
5
5
import {
6
6
DocExplorerContextProvider ,
7
7
useDocExplorer ,
8
8
useDocExplorerActions ,
9
9
} from '../../context' ;
10
10
import { DocExplorer } from '../doc-explorer' ;
11
+ import { schemaStore } from '../../../../graphiql-react/dist/schema' ;
11
12
12
13
function makeSchema ( fieldName = 'field' ) {
13
14
return new GraphQLSchema ( {
@@ -34,8 +35,6 @@ const defaultSchemaContext: SchemaContextType = {
34
35
isFetching : false ,
35
36
schema : makeSchema ( ) ,
36
37
validationErrors : [ ] ,
37
- schemaReference : null ! ,
38
- setSchemaReference : null ! ,
39
38
} ;
40
39
41
40
const withErrorSchemaContext : SchemaContextType = {
@@ -58,59 +57,37 @@ const DocExplorerWithContext: FC = () => {
58
57
59
58
describe ( 'DocExplorer' , ( ) => {
60
59
it ( 'renders spinner when the schema is loading' , ( ) => {
61
- const { container } = render (
62
- < SchemaContext . Provider
63
- value = { {
64
- ...defaultSchemaContext ,
65
- isFetching : true ,
66
- schema : undefined ,
67
- } }
68
- >
69
- < DocExplorerWithContext />
70
- </ SchemaContext . Provider > ,
71
- ) ;
60
+ schemaStore . setState ( { isFetching : true } ) ;
61
+ const { container } = render ( < DocExplorerWithContext /> ) ;
72
62
const spinner = container . querySelectorAll ( '.graphiql-spinner' ) ;
73
63
expect ( spinner ) . toHaveLength ( 1 ) ;
74
64
} ) ;
75
65
it ( 'renders with null schema' , ( ) => {
76
- const { container } = render (
77
- < SchemaContext . Provider value = { { ...defaultSchemaContext , schema : null } } >
78
- < DocExplorerWithContext />
79
- </ SchemaContext . Provider > ,
80
- ) ;
66
+ schemaStore . setState ( { ...defaultSchemaContext , schema : null } ) ;
67
+ const { container } = render ( < DocExplorerWithContext /> ) ;
81
68
const error = container . querySelectorAll ( '.graphiql-doc-explorer-error' ) ;
82
69
expect ( error ) . toHaveLength ( 1 ) ;
83
70
expect ( error [ 0 ] ) . toHaveTextContent ( 'No GraphQL schema available' ) ;
84
71
} ) ;
85
72
it ( 'renders with schema' , ( ) => {
86
- const { container } = render (
87
- < SchemaContext . Provider value = { defaultSchemaContext } >
88
- < DocExplorerWithContext /> ,
89
- </ SchemaContext . Provider > ,
90
- ) ;
73
+ schemaStore . setState ( defaultSchemaContext ) ;
74
+ const { container } = render ( < DocExplorerWithContext /> ) ;
91
75
const error = container . querySelectorAll ( '.graphiql-doc-explorer-error' ) ;
92
76
expect ( error ) . toHaveLength ( 0 ) ;
93
77
expect (
94
78
container . querySelector ( '.graphiql-markdown-description' ) ,
95
79
) . toHaveTextContent ( 'GraphQL Schema for testing' ) ;
96
80
} ) ;
97
81
it ( 'renders correctly with schema error' , ( ) => {
98
- const { rerender, container } = render (
99
- < SchemaContext . Provider value = { withErrorSchemaContext } >
100
- < DocExplorerWithContext /> ,
101
- </ SchemaContext . Provider > ,
102
- ) ;
103
-
82
+ schemaStore . setState ( withErrorSchemaContext ) ;
83
+ const { rerender, container } = render ( < DocExplorerWithContext /> ) ;
104
84
const error = container . querySelector ( '.graphiql-doc-explorer-error' ) ;
105
-
106
85
expect ( error ) . toHaveTextContent ( 'Error fetching schema' ) ;
107
86
108
- rerender (
109
- < SchemaContext . Provider value = { defaultSchemaContext } >
110
- < DocExplorerWithContext /> ,
111
- </ SchemaContext . Provider > ,
112
- ) ;
113
-
87
+ act ( ( ) => {
88
+ schemaStore . setState ( defaultSchemaContext ) ;
89
+ } ) ;
90
+ rerender ( < DocExplorerWithContext /> ) ;
114
91
const errors = container . querySelectorAll ( '.graphiql-doc-explorer-error' ) ;
115
92
expect ( errors ) . toHaveLength ( 0 ) ;
116
93
} ) ;
@@ -133,48 +110,43 @@ describe('DocExplorer', () => {
133
110
} ;
134
111
135
112
// Initial render, set initial state
113
+ schemaStore . setState ( {
114
+ ...defaultSchemaContext ,
115
+ schema : initialSchema ,
116
+ } ) ;
136
117
const { container, rerender } = render (
137
- < SchemaContext . Provider
138
- value = { {
139
- ...defaultSchemaContext ,
140
- schema : initialSchema ,
141
- } }
142
- >
143
- < DocExplorerContextProvider >
144
- < SetInitialStack />
145
- </ DocExplorerContextProvider >
146
- </ SchemaContext . Provider > ,
118
+ < DocExplorerContextProvider >
119
+ < SetInitialStack />
120
+ </ DocExplorerContextProvider > ,
147
121
) ;
148
122
149
123
// First proper render of doc explorer
124
+ act ( ( ) => {
125
+ schemaStore . setState ( {
126
+ ...defaultSchemaContext ,
127
+ schema : initialSchema ,
128
+ } ) ;
129
+ } ) ;
150
130
rerender (
151
- < SchemaContext . Provider
152
- value = { {
153
- ...defaultSchemaContext ,
154
- schema : initialSchema ,
155
- } }
156
- >
157
- < DocExplorerContextProvider >
158
- < DocExplorer />
159
- </ DocExplorerContextProvider >
160
- </ SchemaContext . Provider > ,
131
+ < DocExplorerContextProvider >
132
+ < DocExplorer />
133
+ </ DocExplorerContextProvider > ,
161
134
) ;
162
135
163
136
const [ title ] = container . querySelectorAll ( '.graphiql-doc-explorer-title' ) ;
164
137
expect ( title . textContent ) . toEqual ( 'field' ) ;
165
138
166
139
// Second render of doc explorer, this time with a new schema, with _same_ field name
140
+ act ( ( ) => {
141
+ schemaStore . setState ( {
142
+ ...defaultSchemaContext ,
143
+ schema : makeSchema ( ) , // <<< New, but equivalent, schema
144
+ } ) ;
145
+ } ) ;
167
146
rerender (
168
- < SchemaContext . Provider
169
- value = { {
170
- ...defaultSchemaContext ,
171
- schema : makeSchema ( ) , // <<< New, but equivalent, schema
172
- } }
173
- >
174
- < DocExplorerContextProvider >
175
- < DocExplorer />
176
- </ DocExplorerContextProvider >
177
- </ SchemaContext . Provider > ,
147
+ < DocExplorerContextProvider >
148
+ < DocExplorer />
149
+ </ DocExplorerContextProvider > ,
178
150
) ;
179
151
const [ title2 ] = container . querySelectorAll ( '.graphiql-doc-explorer-title' ) ;
180
152
// Because `Query.field` still exists in the new schema, we can still render it
@@ -200,48 +172,43 @@ describe('DocExplorer', () => {
200
172
} ;
201
173
202
174
// Initial render, set initial state
175
+ schemaStore . setState ( {
176
+ ...defaultSchemaContext ,
177
+ schema : initialSchema ,
178
+ } ) ;
203
179
const { container, rerender } = render (
204
- < SchemaContext . Provider
205
- value = { {
206
- ...defaultSchemaContext ,
207
- schema : initialSchema ,
208
- } }
209
- >
210
- < DocExplorerContextProvider >
211
- < SetInitialStack />
212
- </ DocExplorerContextProvider >
213
- </ SchemaContext . Provider > ,
180
+ < DocExplorerContextProvider >
181
+ < SetInitialStack />
182
+ </ DocExplorerContextProvider > ,
214
183
) ;
215
184
216
185
// First proper render of doc explorer
186
+ act ( ( ) => {
187
+ schemaStore . setState ( {
188
+ ...defaultSchemaContext ,
189
+ schema : initialSchema ,
190
+ } ) ;
191
+ } ) ;
217
192
rerender (
218
- < SchemaContext . Provider
219
- value = { {
220
- ...defaultSchemaContext ,
221
- schema : initialSchema ,
222
- } }
223
- >
224
- < DocExplorerContextProvider >
225
- < DocExplorer />
226
- </ DocExplorerContextProvider >
227
- </ SchemaContext . Provider > ,
193
+ < DocExplorerContextProvider >
194
+ < DocExplorer />
195
+ </ DocExplorerContextProvider > ,
228
196
) ;
229
197
230
198
const [ title ] = container . querySelectorAll ( '.graphiql-doc-explorer-title' ) ;
231
199
expect ( title . textContent ) . toEqual ( 'field' ) ;
232
200
233
- // Second render of doc explorer, this time with a new schema, with different field name
201
+ // Second render of doc explorer, this time with a new schema, with a different field name
202
+ act ( ( ) => {
203
+ schemaStore . setState ( {
204
+ ...defaultSchemaContext ,
205
+ schema : makeSchema ( 'field2' ) , // <<< New schema with a new field name
206
+ } ) ;
207
+ } ) ;
234
208
rerender (
235
- < SchemaContext . Provider
236
- value = { {
237
- ...defaultSchemaContext ,
238
- schema : makeSchema ( 'field2' ) , // <<< New schema with a new field name
239
- } }
240
- >
241
- < DocExplorerContextProvider >
242
- < DocExplorer />
243
- </ DocExplorerContextProvider >
244
- </ SchemaContext . Provider > ,
209
+ < DocExplorerContextProvider >
210
+ < DocExplorer />
211
+ </ DocExplorerContextProvider > ,
245
212
) ;
246
213
const [ title2 ] = container . querySelectorAll ( '.graphiql-doc-explorer-title' ) ;
247
214
// Because `Query.field` doesn't exist anymore, the top-most item we can render is `Query`
0 commit comments