1
1
import { warnCache } from '@algolia/autocomplete-shared' ;
2
+ import { fireEvent , waitFor } from '@testing-library/dom' ;
2
3
import {
3
4
createElement as preactCreateElement ,
4
5
Fragment as PreactFragment ,
@@ -17,6 +18,8 @@ describe('renderer', () => {
17
18
} ) ;
18
19
19
20
test ( 'defaults to the Preact implementation' , ( ) => {
21
+ expect . assertions ( 3 ) ;
22
+
20
23
const container = document . createElement ( 'div' ) ;
21
24
const panelContainer = document . createElement ( 'div' ) ;
22
25
@@ -47,19 +50,14 @@ describe('renderer', () => {
47
50
expect ( Fragment ) . toBe ( PreactFragment ) ;
48
51
expect ( render ) . toBe ( preactRender ) ;
49
52
50
- render ( createElement ( Fragment , null , 'testSource' ) , root ) ;
51
- } ,
52
- renderNoResults ( { createElement, Fragment, render } , root ) {
53
- expect ( createElement ) . toBe ( preactCreateElement ) ;
54
- expect ( Fragment ) . toBe ( PreactFragment ) ;
55
- expect ( render ) . toBe ( preactRender ) ;
56
-
57
53
render ( createElement ( Fragment , null , 'testSource' ) , root ) ;
58
54
} ,
59
55
} ) ;
60
56
} ) ;
61
57
62
58
test ( 'accepts a custom renderer' , ( ) => {
59
+ expect . assertions ( 6 ) ;
60
+
63
61
const container = document . createElement ( 'div' ) ;
64
62
const panelContainer = document . createElement ( 'div' ) ;
65
63
const CustomFragment = ( props : any ) => props . children ;
@@ -106,26 +104,6 @@ describe('renderer', () => {
106
104
expect . any ( Object )
107
105
) ;
108
106
} ,
109
- renderNoResults (
110
- { children, createElement, Fragment, render, html } ,
111
- root
112
- ) {
113
- expect ( createElement ) . toBe ( mockCreateElement ) ;
114
- expect ( Fragment ) . toBe ( CustomFragment ) ;
115
- expect ( render ) . toBe ( mockRender ) ;
116
- expect ( mockCreateElement ) . toHaveBeenCalled ( ) ;
117
-
118
- mockCreateElement . mockClear ( ) ;
119
-
120
- render ( html `< div > ${ children } </ div > ` , root ) ;
121
-
122
- expect ( mockCreateElement ) . toHaveBeenCalledTimes ( 1 ) ;
123
- expect ( mockCreateElement ) . toHaveBeenLastCalledWith (
124
- 'div' ,
125
- null ,
126
- expect . any ( Object )
127
- ) ;
128
- } ,
129
107
renderer : {
130
108
createElement : mockCreateElement ,
131
109
Fragment : CustomFragment ,
@@ -135,6 +113,8 @@ describe('renderer', () => {
135
113
} ) ;
136
114
137
115
test ( 'defaults `render` when not specified in the renderer' , ( ) => {
116
+ expect . assertions ( 1 ) ;
117
+
138
118
const container = document . createElement ( 'div' ) ;
139
119
const panelContainer = document . createElement ( 'div' ) ;
140
120
const CustomFragment = ( props : any ) => props . children ;
@@ -168,16 +148,96 @@ describe('renderer', () => {
168
148
169
149
preactRender ( createElement ( Fragment , null , 'testSource' ) , root ) ;
170
150
} ,
171
- renderNoResults ( { createElement, Fragment, render } , root ) {
172
- expect ( render ) . toBe ( preactRender ) ;
151
+ renderer : {
152
+ createElement : mockCreateElement ,
153
+ Fragment : CustomFragment ,
154
+ } ,
155
+ } ) ;
156
+ } ) ;
173
157
174
- preactRender ( createElement ( Fragment , null , 'testSource' ) , root ) ;
158
+ test ( 'uses a custom `render` via `renderer`' , async ( ) => {
159
+ const container = document . createElement ( 'div' ) ;
160
+ const panelContainer = document . createElement ( 'div' ) ;
161
+
162
+ document . body . appendChild ( panelContainer ) ;
163
+
164
+ const CustomFragment = ( props : any ) => props . children ;
165
+ const mockCreateElement = jest . fn ( preactCreateElement ) ;
166
+ const mockRender = jest . fn ( ) . mockImplementation ( preactRender ) ;
167
+
168
+ autocomplete < { label : string } > ( {
169
+ container,
170
+ panelContainer,
171
+ id : 'autocomplete-0' ,
172
+ getSources ( ) {
173
+ return [
174
+ {
175
+ sourceId : 'testSource' ,
176
+ getItems ( ) {
177
+ return [ { label : '1' } ] ;
178
+ } ,
179
+ templates : {
180
+ item ( { item } ) {
181
+ return item . label ;
182
+ } ,
183
+ } ,
184
+ } ,
185
+ ] ;
175
186
} ,
176
187
renderer : {
177
- createElement : mockCreateElement ,
178
188
Fragment : CustomFragment ,
189
+ render : mockRender ,
190
+ createElement : mockCreateElement ,
179
191
} ,
180
192
} ) ;
193
+
194
+ const input = container . querySelector < HTMLInputElement > ( '.aa-Input' ) ;
195
+
196
+ fireEvent . input ( input , { target : { value : 'apple' } } ) ;
197
+
198
+ await waitFor ( ( ) => {
199
+ expect (
200
+ panelContainer . querySelector < HTMLElement > ( '.aa-Panel' )
201
+ ) . toBeInTheDocument ( ) ;
202
+ expect ( mockRender ) . toHaveBeenCalled ( ) ;
203
+ expect ( panelContainer ) . toMatchInlineSnapshot ( `
204
+ <div>
205
+ <div
206
+ class="aa-Panel"
207
+ data-testid="panel"
208
+ style="top: 0px; left: 0px; right: 0px; max-width: unset;"
209
+ >
210
+ <div
211
+ class="aa-PanelLayout aa-Panel--scrollable"
212
+ >
213
+ <section
214
+ class="aa-Source"
215
+ data-autocomplete-source-id="testSource"
216
+ >
217
+ <ul
218
+ aria-labelledby="autocomplete-0-label"
219
+ class="aa-List"
220
+ id="autocomplete-0-list"
221
+ role="listbox"
222
+ >
223
+ <li
224
+ aria-selected="false"
225
+ class="aa-Item"
226
+ id="autocomplete-0-item-0"
227
+ role="option"
228
+ >
229
+ 1
230
+ </li>
231
+ </ul>
232
+ </section>
233
+ </div>
234
+ <div
235
+ class="aa-GradientBottom"
236
+ />
237
+ </div>
238
+ </div>
239
+ ` ) ;
240
+ } ) ;
181
241
} ) ;
182
242
183
243
test ( 'warns about renderer mismatch when specifying an incomplete renderer' , ( ) => {
0 commit comments