11import { warnCache } from '@algolia/autocomplete-shared' ;
2+ import { fireEvent , waitFor } from '@testing-library/dom' ;
23import {
34 createElement as preactCreateElement ,
45 Fragment as PreactFragment ,
@@ -17,6 +18,8 @@ describe('renderer', () => {
1718 } ) ;
1819
1920 test ( 'defaults to the Preact implementation' , ( ) => {
21+ expect . assertions ( 3 ) ;
22+
2023 const container = document . createElement ( 'div' ) ;
2124 const panelContainer = document . createElement ( 'div' ) ;
2225
@@ -47,19 +50,14 @@ describe('renderer', () => {
4750 expect ( Fragment ) . toBe ( PreactFragment ) ;
4851 expect ( render ) . toBe ( preactRender ) ;
4952
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-
5753 render ( createElement ( Fragment , null , 'testSource' ) , root ) ;
5854 } ,
5955 } ) ;
6056 } ) ;
6157
6258 test ( 'accepts a custom renderer' , ( ) => {
59+ expect . assertions ( 6 ) ;
60+
6361 const container = document . createElement ( 'div' ) ;
6462 const panelContainer = document . createElement ( 'div' ) ;
6563 const CustomFragment = ( props : any ) => props . children ;
@@ -106,26 +104,6 @@ describe('renderer', () => {
106104 expect . any ( Object )
107105 ) ;
108106 } ,
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- } ,
129107 renderer : {
130108 createElement : mockCreateElement ,
131109 Fragment : CustomFragment ,
@@ -135,6 +113,8 @@ describe('renderer', () => {
135113 } ) ;
136114
137115 test ( 'defaults `render` when not specified in the renderer' , ( ) => {
116+ expect . assertions ( 1 ) ;
117+
138118 const container = document . createElement ( 'div' ) ;
139119 const panelContainer = document . createElement ( 'div' ) ;
140120 const CustomFragment = ( props : any ) => props . children ;
@@ -168,16 +148,96 @@ describe('renderer', () => {
168148
169149 preactRender ( createElement ( Fragment , null , 'testSource' ) , root ) ;
170150 } ,
171- renderNoResults ( { createElement, Fragment, render } , root ) {
172- expect ( render ) . toBe ( preactRender ) ;
151+ renderer : {
152+ createElement : mockCreateElement ,
153+ Fragment : CustomFragment ,
154+ } ,
155+ } ) ;
156+ } ) ;
173157
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+ ] ;
175186 } ,
176187 renderer : {
177- createElement : mockCreateElement ,
178188 Fragment : CustomFragment ,
189+ render : mockRender ,
190+ createElement : mockCreateElement ,
179191 } ,
180192 } ) ;
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+ } ) ;
181241 } ) ;
182242
183243 test ( 'warns about renderer mismatch when specifying an incomplete renderer' , ( ) => {
0 commit comments