@@ -8,36 +8,49 @@ import { Router } from 'react-router';
88import { DEFAULT_DOMAIN } from '../../src/domains/data' ;
99import { SettingsProvider } from '../../src/settings' ;
1010import { ShortUrlsFilteringBarFactory } from '../../src/short-urls/ShortUrlsFilteringBar' ;
11+ import { TagsSearchDropdownFactory } from '../../src/tags/helpers/TagsSearchDropdown' ;
1112import { FeaturesProvider } from '../../src/utils/features' ;
1213import { RoutesPrefixProvider } from '../../src/utils/routesPrefix' ;
1314import { checkAccessibility } from '../__helpers__/accessibility' ;
1415import { renderWithEvents } from '../__helpers__/setUpTest' ;
16+ import { colorGeneratorMock } from '../utils/services/__mocks__/ColorGenerator.mock' ;
1517
1618type SetUpOptions = {
1719 search ?: string ;
1820 routesPrefix ?: string ;
1921 filterByDomainSupported ?: boolean ;
22+ filterByExcludedTagSupported ?: boolean ;
2023} ;
2124
2225describe ( '<ShortUrlsFilteringBar />' , ( ) => {
2326 const ShortUrlsFilteringBar = ShortUrlsFilteringBarFactory ( fromPartial ( {
2427 ExportShortUrlsBtn : ( ) => < > ExportShortUrlsBtn</ > ,
25- TagsSearchDropdown : ( ) => < > TagsSearchDropdown </ > ,
28+ TagsSearchDropdown : TagsSearchDropdownFactory ( fromPartial ( { ColorGenerator : colorGeneratorMock } ) ) ,
2629 } ) ) ;
2730 const handleOrderBy = vi . fn ( ) ;
2831 let history : MemoryHistory ;
2932
30- const setUp = ( { search, routesPrefix = '' , filterByDomainSupported = false } : SetUpOptions = { } ) => {
33+ const setUp = ( {
34+ search,
35+ routesPrefix = '' ,
36+ filterByDomainSupported = false ,
37+ filterByExcludedTagSupported = false ,
38+ } : SetUpOptions = { } ) => {
3139 history = createMemoryHistory ( { initialEntries : search ? [ { search } ] : undefined } ) ;
3240 return renderWithEvents (
3341 < Router location = { history . location } navigator = { history } >
3442 < SettingsProvider value = { fromPartial ( { visits : { } } ) } >
3543 < RoutesPrefixProvider value = { routesPrefix } >
36- < FeaturesProvider value = { fromPartial ( { filterShortUrlsByDomain : filterByDomainSupported } ) } >
44+ < FeaturesProvider
45+ value = { fromPartial ( {
46+ filterShortUrlsByDomain : filterByDomainSupported ,
47+ filterShortUrlsByExcludedTags : filterByExcludedTagSupported ,
48+ } ) }
49+ >
3750 < ShortUrlsFilteringBar
3851 order = { { } }
3952 handleOrderBy = { handleOrderBy }
40- tagsList = { fromPartial ( { tags : [ ] } ) }
53+ tagsList = { fromPartial ( { tags : [ 'foo' , 'bar' , 'baz' ] } ) }
4154 domainsList = { fromPartial ( {
4255 domains : [
4356 { isDefault : true , domain : 'example.com' } ,
@@ -60,9 +73,7 @@ describe('<ShortUrlsFilteringBar />', () => {
6073
6174 it ( 'renders expected children components' , ( ) => {
6275 setUp ( ) ;
63-
6476 expect ( screen . getByText ( 'ExportShortUrlsBtn' ) ) . toBeInTheDocument ( ) ;
65- expect ( screen . getByText ( 'TagsSearchDropdown' ) ) . toBeInTheDocument ( ) ;
6677 } ) ;
6778
6879 it ( 'redirects to first page when search field changes' , async ( ) => {
@@ -152,7 +163,7 @@ describe('<ShortUrlsFilteringBar />', () => {
152163 it . each ( [
153164 { domain : / ^ e x a m p l e .c o m / , expectedQueryDomain : DEFAULT_DOMAIN } ,
154165 { domain : 's.test' , expectedQueryDomain : 's.test' } ,
155- ] ) ( 'redirects to first page when selected domain changes' , async ( { domain, expectedQueryDomain } ) => {
166+ ] ) ( 'updates query params when selected domain changes' , async ( { domain, expectedQueryDomain } ) => {
156167 const { user } = setUp ( { filterByDomainSupported : true } ) ;
157168
158169 await user . click ( screen . getByRole ( 'button' , { name : 'All domains' } ) ) ;
@@ -161,4 +172,62 @@ describe('<ShortUrlsFilteringBar />', () => {
161172 await user . click ( screen . getByRole ( 'menuitem' , { name : domain } ) ) ;
162173 await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'domain' ) ) . toEqual ( expectedQueryDomain ) ) ;
163174 } ) ;
175+
176+ it ( 'updates query params when tags change' , async ( ) => {
177+ const { user } = setUp ( ) ;
178+
179+ await user . click ( screen . getByRole ( 'button' , { name : 'With tags...' } ) ) ;
180+ const menu = await screen . findByRole ( 'menu' ) ;
181+
182+ await user . type ( menu . querySelector ( '[placeholder="Search..."]' ) ! , 'f' ) ;
183+ await user . click ( await screen . findByRole ( 'option' , { name : 'foo' } ) ) ;
184+
185+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'tags' ) ) . toEqual ( 'foo' ) ) ;
186+ } ) ;
187+
188+ it ( 'updates query params when tags mode changes' , async ( ) => {
189+ const { user } = setUp ( ) ;
190+
191+ await user . click ( screen . getByRole ( 'button' , { name : 'With tags...' } ) ) ;
192+
193+ await user . click ( await screen . findByRole ( 'button' , { name : 'Any' } ) ) ;
194+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'tagsMode' ) ) . toEqual ( 'any' ) ) ;
195+
196+ await user . click ( await screen . findByRole ( 'button' , { name : 'All' } ) ) ;
197+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'tagsMode' ) ) . toEqual ( 'all' ) ) ;
198+ } ) ;
199+
200+ it . each ( [ true , false ] ) ( 'shows exclude tags dropdown if supported' , ( filterByExcludedTagSupported ) => {
201+ setUp ( { filterByExcludedTagSupported } ) ;
202+
203+ if ( filterByExcludedTagSupported ) {
204+ expect ( screen . getByRole ( 'button' , { name : 'Without tags...' } ) ) . toBeInTheDocument ( ) ;
205+ } else {
206+ expect ( screen . queryByRole ( 'button' , { name : 'Without tags...' } ) ) . not . toBeInTheDocument ( ) ;
207+ }
208+ } ) ;
209+
210+ it ( 'updates query params when excluded tags change' , async ( ) => {
211+ const { user } = setUp ( { filterByExcludedTagSupported : true } ) ;
212+
213+ await user . click ( screen . getByRole ( 'button' , { name : 'Without tags...' } ) ) ;
214+ const menu = await screen . findByRole ( 'menu' ) ;
215+
216+ await user . type ( menu . querySelector ( '[placeholder="Search..."]' ) ! , 'ba' ) ;
217+ await user . click ( await screen . findByRole ( 'option' , { name : 'bar' } ) ) ;
218+
219+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'excludeTags' ) ) . toEqual ( 'bar' ) ) ;
220+ } ) ;
221+
222+ it ( 'updates query params when excluded tags mode changes' , async ( ) => {
223+ const { user } = setUp ( { filterByExcludedTagSupported : true } ) ;
224+
225+ await user . click ( screen . getByRole ( 'button' , { name : 'Without tags...' } ) ) ;
226+
227+ await user . click ( await screen . findByRole ( 'button' , { name : 'Any' } ) ) ;
228+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'excludeTagsMode' ) ) . toEqual ( 'any' ) ) ;
229+
230+ await user . click ( await screen . findByRole ( 'button' , { name : 'All' } ) ) ;
231+ await waitFor ( ( ) => expect ( paramFromCurrentQuery ( 'excludeTagsMode' ) ) . toEqual ( 'all' ) ) ;
232+ } ) ;
164233} ) ;
0 commit comments