11import { CommonModule } from '@angular/common' ;
22import { fakeAsync , flush } from '@angular/core/testing' ;
3- import { IconType } from '@hypertrace/assets-library' ;
3+ import { IconLibraryTestingModule , IconType } from '@hypertrace/assets-library' ;
44import { NavigationService } from '@hypertrace/common' ;
55import { createHostFactory , mockProvider , SpectatorHost } from '@ngneat/spectator/jest' ;
66import { MockComponent } from 'ng-mocks' ;
77import { NEVER } from 'rxjs' ;
88import { ButtonComponent } from '../button/button.component' ;
99import { DividerComponent } from '../divider/divider.component' ;
1010import { LabelComponent } from '../label/label.component' ;
11+ import { LoadAsyncModule } from '../load-async/load-async.module' ;
1112import { PopoverComponent } from '../popover/popover.component' ;
1213import { PopoverModule } from '../popover/popover.module' ;
1314import { SearchBoxComponent } from '../search-box/search-box.component' ;
1415import { SelectOptionComponent } from '../select/select-option.component' ;
1516import { MultiSelectJustify } from './multi-select-justify' ;
16- import { MultiSelectComponent , TriggerLabelDisplayMode } from './multi-select.component' ;
17+ import { MultiSelectComponent , MultiSelectSearchMode , TriggerLabelDisplayMode } from './multi-select.component' ;
1718
1819describe ( 'Multi Select Component' , ( ) => {
1920 const hostFactory = createHostFactory < MultiSelectComponent < string > > ( {
2021 component : MultiSelectComponent ,
21- imports : [ PopoverModule , CommonModule ] ,
22+ imports : [ PopoverModule , CommonModule , LoadAsyncModule , IconLibraryTestingModule ] ,
2223 providers : [
2324 mockProvider ( NavigationService , {
2425 navigation$ : NEVER
@@ -48,14 +49,15 @@ describe('Multi Select Component', () => {
4849 test ( 'should display initial selections' , fakeAsync ( ( ) => {
4950 spectator = hostFactory (
5051 `
51- <ht-multi-select [selected]="selected" [triggerLabelDisplayMode]="triggerLabelDisplayMode" [enableSearch ]="true ">
52+ <ht-multi-select [selected]="selected" [triggerLabelDisplayMode]="triggerLabelDisplayMode" [searchMode ]="searchMode ">
5253 <ht-select-option *ngFor="let option of options" [label]="option.label" [value]="option.value">
5354 </ht-select-option>
5455 </ht-multi-select>` ,
5556 {
5657 hostProps : {
5758 options : selectionOptions ,
5859 selected : [ selectionOptions [ 1 ] . value ] ,
60+ searchMode : MultiSelectSearchMode . CaseInsensitive ,
5961 triggerLabelDisplayMode : TriggerLabelDisplayMode . Selection
6062 }
6163 }
@@ -187,7 +189,7 @@ describe('Multi Select Component', () => {
187189
188190 spectator = hostFactory (
189191 `
190- <ht-multi-select [selected]="selected" (selectedChange)="onChange($event)" [placeholder]="placeholder" [enableSearch ]="enableSearch ">
192+ <ht-multi-select [selected]="selected" (selectedChange)="onChange($event)" [placeholder]="placeholder" [searchMode ]="searchMode ">
191193 <ht-select-option *ngFor="let option of options" [label]="option.label" [value]="option.value">
192194 </ht-select-option>
193195 </ht-multi-select>` ,
@@ -196,7 +198,7 @@ describe('Multi Select Component', () => {
196198 options : selectionOptions ,
197199 selected : [ selectionOptions [ 1 ] . value ] ,
198200 placeholder : 'Select options' ,
199- enableSearch : true ,
201+ searchMode : MultiSelectSearchMode . CaseInsensitive ,
200202 onChange : onChange
201203 }
202204 }
@@ -231,7 +233,7 @@ describe('Multi Select Component', () => {
231233 expect ( spectator . query ( LabelComponent ) ?. label ) . toEqual ( 'first and 5 more' ) ;
232234
233235 spectator . setHostInput ( {
234- enableSearch : false
236+ searchMode : MultiSelectSearchMode . Disabled
235237 } ) ;
236238
237239 expect ( spectator . query ( '.search-bar' , { root : true } ) ) . not . toExist ( ) ;
@@ -313,16 +315,19 @@ describe('Multi Select Component', () => {
313315 } ) ) ;
314316
315317 test ( 'should show searchbox if applicable and function as expected' , fakeAsync ( ( ) => {
318+ const onSearchValueChangeSpy = jest . fn ( ) ;
319+
316320 spectator = hostFactory (
317321 `
318- <ht-multi-select [enableSearch ]="enableSearch ">
322+ <ht-multi-select [searchMode ]="searchMode" (searchValueChange)="onSearchValueChange($event) ">
319323 <ht-select-option *ngFor="let option of options" [label]="option.label" [value]="option.value">
320324 </ht-select-option>
321325 </ht-multi-select>` ,
322326 {
323327 hostProps : {
324328 options : selectionOptions ,
325- enableSearch : true
329+ searchMode : MultiSelectSearchMode . CaseInsensitive ,
330+ onSearchValueChange : onSearchValueChangeSpy
326331 }
327332 }
328333 ) ;
@@ -334,13 +339,15 @@ describe('Multi Select Component', () => {
334339
335340 spectator . component . searchOptions ( 'fi' ) ;
336341 spectator . tick ( ) ;
342+ expect ( onSearchValueChangeSpy ) . toHaveBeenLastCalledWith ( 'fi' ) ;
337343
338344 let options = spectator . queryAll ( '.multi-select-option' , { root : true } ) ;
339345 expect ( options . length ) . toBe ( 2 ) ;
340346 expect ( options [ 0 ] ) . toContainText ( 'first' ) ;
341347
342348 spectator . component . searchOptions ( 'i' ) ;
343349 spectator . tick ( ) ;
350+ expect ( onSearchValueChangeSpy ) . toHaveBeenLastCalledWith ( 'i' ) ;
344351
345352 options = spectator . queryAll ( '.multi-select-option' , { root : true } ) ;
346353 expect ( options . length ) . toBe ( 4 ) ;
@@ -351,15 +358,64 @@ describe('Multi Select Component', () => {
351358 expect ( spectator . query ( '.clear-selected' , { root : true } ) ) . not . toExist ( ) ; // Due to initial selection
352359 expect ( spectator . query ( '.select-all' , { root : true } ) ) . toExist ( ) ;
353360
354- // Set selected options to less than 5 and search box and buttons should hide
361+ // Set options list to less than 1 and search control buttons should be hidden
355362 spectator . setHostInput ( {
356- options : selectionOptions . slice ( 0 , 3 )
363+ options : [ ]
357364 } ) ;
358365
359- expect ( spectator . query ( '.search-bar' , { root : true } ) ) . not . toExist ( ) ;
360- expect ( spectator . query ( '.divider' , { root : true } ) ) . not . toExist ( ) ;
366+ expect ( spectator . query ( '.search-bar' , { root : true } ) ) . toExist ( ) ;
367+ expect ( spectator . query ( '.divider' , { root : true } ) ) . toExist ( ) ;
361368 expect ( spectator . query ( '.clear-selected' , { root : true } ) ) . not . toExist ( ) ;
362369 expect ( spectator . query ( '.select-all' , { root : true } ) ) . not . toExist ( ) ;
363370 flush ( ) ;
364371 } ) ) ;
372+
373+ test ( 'should show search box and emit only when search mode is emit only' , fakeAsync ( ( ) => {
374+ const onSearchValueChangeSpy = jest . fn ( ) ;
375+
376+ spectator = hostFactory (
377+ `
378+ <ht-multi-select [searchMode]="searchMode" (searchValueChange)="onSearchValueChange($event)">
379+ <ht-select-option *ngFor="let option of options" [label]="option.label" [value]="option.value">
380+ </ht-select-option>
381+ </ht-multi-select>` ,
382+ {
383+ hostProps : {
384+ options : selectionOptions ,
385+ searchMode : MultiSelectSearchMode . EmitOnly ,
386+ onSearchValueChange : onSearchValueChangeSpy
387+ }
388+ }
389+ ) ;
390+
391+ spectator . click ( '.trigger-content' ) ;
392+
393+ const searchBar = spectator . query ( '.search-bar' , { root : true } ) ;
394+ expect ( searchBar ) . toExist ( ) ;
395+
396+ spectator . component . searchOptions ( 'fi' ) ;
397+ spectator . tick ( ) ;
398+ expect ( onSearchValueChangeSpy ) . toHaveBeenLastCalledWith ( 'fi' ) ;
399+
400+ // No change in options length since for this test, externally we did not filter any option
401+ let options = spectator . queryAll ( '.multi-select-option' , { root : true } ) ;
402+ expect ( options . length ) . toBe ( 6 ) ;
403+ spectator . component . searchOptions ( 'i' ) ;
404+ spectator . tick ( ) ;
405+ expect ( onSearchValueChangeSpy ) . toHaveBeenLastCalledWith ( 'i' ) ;
406+
407+ options = spectator . queryAll ( '.multi-select-option' , { root : true } ) ;
408+ expect ( options . length ) . toBe ( 6 ) ;
409+
410+ // Set selected options to less than 5 and search box and buttons should still be visible
411+ spectator . setHostInput ( {
412+ options : selectionOptions . slice ( 0 , 3 )
413+ } ) ;
414+
415+ expect ( spectator . query ( '.search-bar' , { root : true } ) ) . toExist ( ) ;
416+ expect ( spectator . query ( '.divider' , { root : true } ) ) . toExist ( ) ;
417+ expect ( spectator . query ( '.clear-selected' , { root : true } ) ) . not . toExist ( ) ;
418+ expect ( spectator . query ( '.select-all' , { root : true } ) ) . toExist ( ) ;
419+ flush ( ) ;
420+ } ) ) ;
365421} ) ;
0 commit comments