@internetarchive/collection-browser 0.4.14 → 0.4.15-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -191,11 +191,10 @@ describe('Collection Browser', () => {
191
191
  it('queries the search service with a metadata search', async () => {
192
192
  var _a, _b, _c;
193
193
  const searchService = new MockSearchService();
194
- const el = await fixture(html ` <collection-browser
195
- .searchService=${searchService}
196
- .searchType=${SearchType.METADATA}
197
- >
194
+ const el = await fixture(html ` <collection-browser .searchService=${searchService}>
198
195
  </collection-browser>`);
196
+ el.searchType = SearchType.METADATA;
197
+ await el.updateComplete;
199
198
  el.baseQuery = 'collection:foo';
200
199
  await el.updateComplete;
201
200
  await nextTick();
@@ -203,14 +202,13 @@ describe('Collection Browser', () => {
203
202
  expect(searchService.searchType).to.equal(SearchType.METADATA);
204
203
  expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
205
204
  });
206
- it('can request a search when changing search type', async () => {
205
+ it('can change search type', async () => {
207
206
  const searchService = new MockSearchService();
208
207
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
209
208
  </collection-browser>`);
210
209
  el.baseQuery = 'collection:foo';
211
210
  await el.updateComplete;
212
211
  el.searchType = SearchType.FULLTEXT;
213
- el.requestSearch();
214
212
  await el.updateComplete;
215
213
  await nextTick();
216
214
  expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
@@ -218,11 +216,10 @@ describe('Collection Browser', () => {
218
216
  it('queries the search service with a fulltext search', async () => {
219
217
  var _a, _b, _c;
220
218
  const searchService = new MockSearchService();
221
- const el = await fixture(html ` <collection-browser
222
- .searchService=${searchService}
223
- .searchType=${SearchType.FULLTEXT}
224
- >
219
+ const el = await fixture(html ` <collection-browser .searchService=${searchService}>
225
220
  </collection-browser>`);
221
+ el.searchType = SearchType.FULLTEXT;
222
+ await el.updateComplete;
226
223
  el.baseQuery = 'collection:foo';
227
224
  await el.updateComplete;
228
225
  await nextTick();
@@ -1 +1 @@
1
- {"version":3,"file":"collection-browser.test.js","sourceRoot":"","sources":["../../test/collection-browser.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport type { InfiniteScroller } from '@internetarchive/infinite-scroller';\nimport { SearchType } from '@internetarchive/search-service';\nimport type { HistogramDateRange } from '@internetarchive/histogram-date-range';\nimport type { CollectionBrowser } from '../src/collection-browser';\nimport '../src/collection-browser';\nimport {\n getDefaultSelectedFacets,\n FacetBucket,\n SelectedFacets,\n SortField,\n} from '../src/models';\nimport { MockSearchService } from './mocks/mock-search-service';\nimport { MockCollectionNameCache } from './mocks/mock-collection-name-cache';\nimport { MockAnalyticsHandler } from './mocks/mock-analytics-handler';\nimport { analyticsCategories } from '../src/utils/analytics-events';\nimport type { TileDispatcher } from '../src/tiles/tile-dispatcher';\nimport type { CollectionFacets } from '../src/collection-facets';\n\n/**\n * Wait for the next tick of the event loop.\n *\n * This is necessary in some of the tests because certain collection browser\n * updates take more than one tick to render (e.g., date picker & query changes).\n * These delays are non-ideal and should eventually be investigated and fixed,\n * but they are minor enough that waiting for the next tick is a reasonable\n * testing solution for now.\n */\nconst nextTick = () => aTimeout(0);\n\ndescribe('Collection Browser', () => {\n beforeEach(async () => {\n // Apparently query params set by one test can bleed into other tests.\n // Since collection browser restores its state from certain query params, we need\n // to clear these before each test to ensure they run in isolation from one another.\n const url = new URL(window.location.href);\n const { searchParams } = url;\n searchParams.delete('sin');\n searchParams.delete('sort');\n searchParams.delete('query');\n searchParams.delete('page');\n searchParams.delete('and[]');\n searchParams.delete('not[]');\n window.history.replaceState({}, '', url);\n });\n\n it('clears selected facets when requested', async () => {\n const selectedFacets = getDefaultSelectedFacets();\n selectedFacets.creator.foo = { count: 1, key: 'foo', state: 'selected' };\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n el.clearFilters(); // By default, sort is not cleared\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n });\n\n it('clears existing filters but not sort by default', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n await el.updateComplete;\n el.clearFilters(); // By default, sort is not cleared\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n expect(el.selectedSort).to.equal('title');\n expect(el.sortDirection).to.equal('asc');\n expect(el.sortParam).to.deep.equal({\n field: 'titleSorter',\n direction: 'asc',\n });\n expect(el.selectedCreatorFilter).to.be.null;\n expect(el.selectedTitleFilter).to.be.null;\n });\n\n it('clears existing filters for facets & sort via option', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedSort = 'title' as SortField;\n await el.updateComplete;\n el.clearFilters({ sort: true }); // Sort is reset too due to the option\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n expect(el.selectedSort).to.equal('relevance');\n expect(el.sortDirection).to.be.null;\n expect(el.sortParam).to.be.null;\n expect(el.selectedCreatorFilter).to.be.null;\n expect(el.selectedTitleFilter).to.be.null;\n });\n\n it('filterBy creator with analytics', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'betaSearchService';\n el.selectedSort = 'creator' as SortField;\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'A';\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');\n expect(mockAnalyticsHandler.callLabel).to.equal('start-A');\n\n el.clearFilters();\n await el.updateComplete;\n\n expect(el.selectedTitleFilter).to.be.null;\n expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');\n expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');\n });\n\n it('filterBy title with analytics', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'beta-search-service';\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n el.selectedTitleFilter = 'A';\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');\n expect(mockAnalyticsHandler.callLabel).to.equal('start-A');\n\n el.clearFilters();\n await el.updateComplete;\n\n expect(el.selectedTitleFilter).to.be.null;\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');\n expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');\n });\n\n it('selected facets with analytics - not negative facets', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;\n const mockedSelectedFacets: SelectedFacets = {\n subject: {},\n lending: {},\n mediatype: { data: mediaTypeBucket },\n language: {},\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'search-service';\n el.selectedFacets = mockedSelectedFacets;\n await el.updateComplete;\n\n el.facetClickHandler('mediatype', true, false);\n expect(mockAnalyticsHandler.callCategory).to.equal('search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n\n el.facetClickHandler('mediatype', false, false);\n expect(el.selectedFacets).to.equal(mockedSelectedFacets);\n expect(mockAnalyticsHandler.callCategory).to.equal('search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n });\n\n it('selected facets with analytics - negative facets', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;\n const mockedSelectedFacets: SelectedFacets = {\n subject: {},\n lending: {},\n mediatype: { data: mediaTypeBucket },\n language: {},\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'beta-search-service';\n el.selectedFacets = mockedSelectedFacets;\n await el.updateComplete;\n\n el.facetClickHandler('mediatype', true, true);\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n\n el.facetClickHandler('mediatype', false, true);\n expect(el.selectedFacets).to.equal(mockedSelectedFacets);\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n });\n\n it('should render with a sort bar, facets, and infinite scroller', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'hello';\n await el.updateComplete;\n\n const facets = el.shadowRoot?.querySelector('collection-facets');\n const sortBar = el.shadowRoot?.querySelector('sort-filter-bar');\n const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');\n expect(facets).to.exist;\n expect(sortBar).to.exist;\n expect(infiniteScroller).to.exist;\n });\n\n it('queries the search service when given a base query', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('queries the search service with a metadata search', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html` <collection-browser\n .searchService=${searchService}\n .searchType=${SearchType.METADATA}\n >\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.METADATA);\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('can request a search when changing search type', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n el.searchType = SearchType.FULLTEXT;\n el.requestSearch();\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('queries the search service with a fulltext search', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html` <collection-browser\n .searchService=${searchService}\n .searchType=${SearchType.FULLTEXT}\n >\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('queries the search service with facets selected/negated', async () => {\n const searchService = new MockSearchService();\n const selectedFacets: SelectedFacets = {\n subject: {\n foo: {\n key: 'foo',\n count: 1,\n state: 'selected',\n },\n bar: {\n key: 'bar',\n count: 2,\n state: 'hidden',\n },\n },\n lending: {},\n mediatype: {},\n language: {\n en: {\n key: 'en',\n count: 1,\n state: 'selected',\n },\n },\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchParams?.filters).to.deep.equal({\n subject: {\n foo: 'inc',\n bar: 'exc',\n },\n language: {\n en: 'inc',\n },\n });\n });\n\n it('fails gracefully if no search service provided', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n // This shouldn't throw an error\n expect(el.fetchPage(2)).to.exist;\n\n // Should continue showing the empty placeholder\n expect(el.shadowRoot?.querySelector('empty-placeholder')).to.exist;\n });\n\n it('restores search type from URL param', async () => {\n // Add a sin=TXT param to the URL\n const url = new URL(window.location.href);\n url.searchParams.append('sin', 'TXT');\n window.history.replaceState({}, '', url);\n\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n expect(el.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('applies loggedin flag to tile models if needed', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'loggedin';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.loginRequired).to.be.true;\n });\n\n it('applies no-preview flag to tile models if needed', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'no-preview';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.contentWarning).to.be.true;\n });\n\n it('both loggedin and no-preview flags can be set simultaneously', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'loggedin-no-preview';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.loginRequired).to.be.true;\n expect(cell.model?.contentWarning).to.be.true;\n });\n\n it('joins full description array into a single string with line breaks', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n // This query receives an array description like ['line1', 'line2']\n el.baseQuery = 'multi-line-description';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n // Actual model description should be joined\n expect(cell.model?.description).to.equal('line1\\nline2');\n });\n\n it('can change search type', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .searchService=${searchService}\n .searchType=${SearchType.METADATA}\n ></collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n el.searchType = SearchType.FULLTEXT;\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('queries for collection names after a fetch', async () => {\n const searchService = new MockSearchService();\n const collectionNameCache = new MockCollectionNameCache();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .searchService=${searchService}\n .collectionNameCache=${collectionNameCache}\n >\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([\n 'foo',\n 'bar',\n 'baz',\n 'boop',\n ]);\n });\n\n it('keeps search results from fetch if no change to query or sort param', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n el.sortParam = { field: 'foo', direction: 'asc' };\n await el.updateComplete;\n\n await el.fetchPage(2);\n\n // If there is no change to the query or sort param during the fetch, the results\n // should be read.\n expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);\n });\n\n it('discards obsolete search results if sort params changed before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n el.sortParam = { field: 'foo', direction: 'asc' };\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = { field: 'foo', direction: 'desc' };\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('discards obsolete search results if sort param added before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'single-result';\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = { field: 'foo', direction: 'asc' };\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('discards obsolete search results if sort param cleared before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = null;\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('sets sort properties when user changes sort', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n expect(el.selectedSort).to.equal(SortField.relevance);\n\n el.baseQuery = 'foo';\n await el.updateComplete;\n\n const sortBar = el.shadowRoot?.querySelector('sort-filter-bar');\n const sortSelector = sortBar?.shadowRoot?.querySelector(\n '#desktop-sort-selector'\n );\n expect(sortSelector).to.exist;\n\n // Click the title sorter\n [...(sortSelector?.children as HTMLCollection & Iterable<any>)] // tsc doesn't know children is iterable\n .find(child => child.textContent?.trim() === 'Title')\n ?.querySelector('button')\n ?.click();\n\n await el.updateComplete;\n\n expect(el.selectedSort).to.equal(SortField.title);\n });\n\n it('sets sort filter properties when user selects title filter', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-title';\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n el.selectedTitleFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-title AND firstTitle:X'\n );\n });\n\n it('sets sort filter properties when user selects creator filter', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-creator';\n el.selectedSort = 'creator' as SortField;\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-creator AND firstCreator:X'\n );\n });\n\n it('sets sort filter properties simultaneous with facets and date range', async () => {\n const searchService = new MockSearchService();\n const selectedFacets: SelectedFacets = {\n collection: { foo: { key: 'foo', state: 'selected', count: 1 } },\n creator: {},\n language: {},\n lending: {},\n mediatype: {},\n subject: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-creator';\n el.selectedSort = 'creator' as SortField;\n el.selectedFacets = selectedFacets;\n el.minSelectedDate = '1950';\n el.maxSelectedDate = '1970';\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-creator AND firstCreator:X'\n );\n expect(searchService.searchParams?.filters).to.deep.equal({\n collection: {\n foo: 'inc',\n },\n year: {\n '1950': 'gte',\n '1970': 'lte',\n },\n });\n });\n\n it('sets date range query when date picker selection changed', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'years'; // Includes year_histogram aggregation in response\n el.showHistogramDatePicker = true;\n await el.updateComplete;\n\n const facets = el.shadowRoot?.querySelector(\n 'collection-facets'\n ) as CollectionFacets;\n await facets?.updateComplete;\n\n // Wait for the date picker to be rendered (which may take until the next tick)\n await nextTick();\n\n const histogram = facets?.shadowRoot?.querySelector(\n 'histogram-date-range'\n ) as HistogramDateRange;\n expect(histogram).to.exist;\n\n // Enter a new min date into the date picker\n const minDateInput = histogram.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n minDateInput.value = '1960';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n // Wait for the histogram's update delay\n await aTimeout(histogram.updateDelay + 50);\n\n // Ensure that the histogram change propagated to the collection browser's\n // date query correctly.\n await el.updateComplete;\n expect(el.minSelectedDate).to.equal('1960');\n expect(el.maxSelectedDate).to.equal('2000');\n });\n\n it('scrolls to page', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n // Infinite scroller won't exist unless there's a base query.\n // First ensure that we don't throw errors when it doesn't exist.\n await el.goToPage(1);\n\n // And make sure it correctly calls scrollToCell when the\n // infinite scroller does exist.\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n const infiniteScroller = el.shadowRoot?.querySelector(\n 'infinite-scroller'\n ) as InfiniteScroller;\n expect(infiniteScroller).to.exist;\n\n const oldScrollToCell = infiniteScroller.scrollToCell;\n const spy = sinon.spy();\n infiniteScroller.scrollToCell = spy;\n\n await el.goToPage(1);\n\n expect(spy.callCount).to.equal(1);\n\n infiniteScroller.scrollToCell = oldScrollToCell;\n });\n\n it('refreshes when certain properties change - with some analytics event sampling', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const searchService = new MockSearchService();\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .analyticsHandler=${mockAnalyticsHandler}\n .searchService=${searchService}\n .collectionNameCache=${collectionNameCache}\n ></collection-browser>`\n );\n const infiniteScrollerRefreshSpy = sinon.spy();\n\n // Infinite scroller won't exist unless there's a base query\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');\n (infiniteScroller as InfiniteScroller).reload = infiniteScrollerRefreshSpy;\n expect(infiniteScrollerRefreshSpy.called).to.be.false;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);\n\n // testing: `loggedIn`\n el.loggedIn = true;\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.called).to.be.true;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);\n\n el.loggedIn = false;\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);\n\n // testing: `displayMode`\n el.displayMode = 'list-compact';\n el.searchContext = 'beta-search';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');\n expect(mockAnalyticsHandler.callAction).to.equal('displayMode');\n expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');\n\n el.displayMode = 'list-detail';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');\n expect(mockAnalyticsHandler.callAction).to.equal('displayMode');\n expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');\n\n // testing: `baseNavigationUrl`\n el.baseNavigationUrl = 'https://funtestsite.com';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);\n\n // testing: `baseImageUrl`\n el.baseImageUrl = 'https://funtestsiteforimages.com';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);\n });\n\n it('query the search service for single result', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'single-result';\n await el.updateComplete;\n await nextTick();\n\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Result');\n });\n\n it('`searchContext` prop helps describe where component is being used', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n expect(el.searchContext).to.equal(analyticsCategories.default);\n\n el.searchContext = 'unicorn-search';\n await el.updateComplete;\n\n expect(el.searchContext).to.equal('unicorn-search');\n\n // property is reflected as attribute\n expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');\n });\n});\n"]}
1
+ {"version":3,"file":"collection-browser.test.js","sourceRoot":"","sources":["../../test/collection-browser.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport type { InfiniteScroller } from '@internetarchive/infinite-scroller';\nimport { SearchType } from '@internetarchive/search-service';\nimport type { HistogramDateRange } from '@internetarchive/histogram-date-range';\nimport type { CollectionBrowser } from '../src/collection-browser';\nimport '../src/collection-browser';\nimport {\n getDefaultSelectedFacets,\n FacetBucket,\n SelectedFacets,\n SortField,\n} from '../src/models';\nimport { MockSearchService } from './mocks/mock-search-service';\nimport { MockCollectionNameCache } from './mocks/mock-collection-name-cache';\nimport { MockAnalyticsHandler } from './mocks/mock-analytics-handler';\nimport { analyticsCategories } from '../src/utils/analytics-events';\nimport type { TileDispatcher } from '../src/tiles/tile-dispatcher';\nimport type { CollectionFacets } from '../src/collection-facets';\n\n/**\n * Wait for the next tick of the event loop.\n *\n * This is necessary in some of the tests because certain collection browser\n * updates take more than one tick to render (e.g., date picker & query changes).\n * These delays are non-ideal and should eventually be investigated and fixed,\n * but they are minor enough that waiting for the next tick is a reasonable\n * testing solution for now.\n */\nconst nextTick = () => aTimeout(0);\n\ndescribe('Collection Browser', () => {\n beforeEach(async () => {\n // Apparently query params set by one test can bleed into other tests.\n // Since collection browser restores its state from certain query params, we need\n // to clear these before each test to ensure they run in isolation from one another.\n const url = new URL(window.location.href);\n const { searchParams } = url;\n searchParams.delete('sin');\n searchParams.delete('sort');\n searchParams.delete('query');\n searchParams.delete('page');\n searchParams.delete('and[]');\n searchParams.delete('not[]');\n window.history.replaceState({}, '', url);\n });\n\n it('clears selected facets when requested', async () => {\n const selectedFacets = getDefaultSelectedFacets();\n selectedFacets.creator.foo = { count: 1, key: 'foo', state: 'selected' };\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n el.clearFilters(); // By default, sort is not cleared\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n });\n\n it('clears existing filters but not sort by default', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n await el.updateComplete;\n el.clearFilters(); // By default, sort is not cleared\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n expect(el.selectedSort).to.equal('title');\n expect(el.sortDirection).to.equal('asc');\n expect(el.sortParam).to.deep.equal({\n field: 'titleSorter',\n direction: 'asc',\n });\n expect(el.selectedCreatorFilter).to.be.null;\n expect(el.selectedTitleFilter).to.be.null;\n });\n\n it('clears existing filters for facets & sort via option', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.selectedSort = 'title' as SortField;\n await el.updateComplete;\n el.clearFilters({ sort: true }); // Sort is reset too due to the option\n\n expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());\n expect(el.selectedSort).to.equal('relevance');\n expect(el.sortDirection).to.be.null;\n expect(el.sortParam).to.be.null;\n expect(el.selectedCreatorFilter).to.be.null;\n expect(el.selectedTitleFilter).to.be.null;\n });\n\n it('filterBy creator with analytics', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'betaSearchService';\n el.selectedSort = 'creator' as SortField;\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'A';\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');\n expect(mockAnalyticsHandler.callLabel).to.equal('start-A');\n\n el.clearFilters();\n await el.updateComplete;\n\n expect(el.selectedTitleFilter).to.be.null;\n expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');\n expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');\n });\n\n it('filterBy title with analytics', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'beta-search-service';\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n el.selectedTitleFilter = 'A';\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');\n expect(mockAnalyticsHandler.callLabel).to.equal('start-A');\n\n el.clearFilters();\n await el.updateComplete;\n\n expect(el.selectedTitleFilter).to.be.null;\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');\n expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');\n });\n\n it('selected facets with analytics - not negative facets', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;\n const mockedSelectedFacets: SelectedFacets = {\n subject: {},\n lending: {},\n mediatype: { data: mediaTypeBucket },\n language: {},\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'search-service';\n el.selectedFacets = mockedSelectedFacets;\n await el.updateComplete;\n\n el.facetClickHandler('mediatype', true, false);\n expect(mockAnalyticsHandler.callCategory).to.equal('search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n\n el.facetClickHandler('mediatype', false, false);\n expect(el.selectedFacets).to.equal(mockedSelectedFacets);\n expect(mockAnalyticsHandler.callCategory).to.equal('search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n });\n\n it('selected facets with analytics - negative facets', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;\n const mockedSelectedFacets: SelectedFacets = {\n subject: {},\n lending: {},\n mediatype: { data: mediaTypeBucket },\n language: {},\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .analyticsHandler=${mockAnalyticsHandler}>\n </collection-browser>`\n );\n\n el.searchContext = 'beta-search-service';\n el.selectedFacets = mockedSelectedFacets;\n await el.updateComplete;\n\n el.facetClickHandler('mediatype', true, true);\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n\n el.facetClickHandler('mediatype', false, true);\n expect(el.selectedFacets).to.equal(mockedSelectedFacets);\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');\n expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');\n expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');\n });\n\n it('should render with a sort bar, facets, and infinite scroller', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'hello';\n await el.updateComplete;\n\n const facets = el.shadowRoot?.querySelector('collection-facets');\n const sortBar = el.shadowRoot?.querySelector('sort-filter-bar');\n const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');\n expect(facets).to.exist;\n expect(sortBar).to.exist;\n expect(infiniteScroller).to.exist;\n });\n\n it('queries the search service when given a base query', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('queries the search service with a metadata search', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html` <collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.searchType = SearchType.METADATA;\n await el.updateComplete;\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.METADATA);\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('can change search type', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n el.searchType = SearchType.FULLTEXT;\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('queries the search service with a fulltext search', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html` <collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.searchType = SearchType.FULLTEXT;\n await el.updateComplete;\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n await nextTick();\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Results');\n });\n\n it('queries the search service with facets selected/negated', async () => {\n const searchService = new MockSearchService();\n const selectedFacets: SelectedFacets = {\n subject: {\n foo: {\n key: 'foo',\n count: 1,\n state: 'selected',\n },\n bar: {\n key: 'bar',\n count: 2,\n state: 'hidden',\n },\n },\n lending: {},\n mediatype: {},\n language: {\n en: {\n key: 'en',\n count: 1,\n state: 'selected',\n },\n },\n creator: {},\n collection: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchParams?.filters).to.deep.equal({\n subject: {\n foo: 'inc',\n bar: 'exc',\n },\n language: {\n en: 'inc',\n },\n });\n });\n\n it('fails gracefully if no search service provided', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n // This shouldn't throw an error\n expect(el.fetchPage(2)).to.exist;\n\n // Should continue showing the empty placeholder\n expect(el.shadowRoot?.querySelector('empty-placeholder')).to.exist;\n });\n\n it('restores search type from URL param', async () => {\n // Add a sin=TXT param to the URL\n const url = new URL(window.location.href);\n url.searchParams.append('sin', 'TXT');\n window.history.replaceState({}, '', url);\n\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n expect(el.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('applies loggedin flag to tile models if needed', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'loggedin';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.loginRequired).to.be.true;\n });\n\n it('applies no-preview flag to tile models if needed', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'no-preview';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.contentWarning).to.be.true;\n });\n\n it('both loggedin and no-preview flags can be set simultaneously', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'loggedin-no-preview';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n expect(cell.model?.loginRequired).to.be.true;\n expect(cell.model?.contentWarning).to.be.true;\n });\n\n it('joins full description array into a single string with line breaks', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n // This query receives an array description like ['line1', 'line2']\n el.baseQuery = 'multi-line-description';\n await el.updateComplete;\n\n const cellTemplate = el.cellForIndex(0);\n expect(cellTemplate).to.exist;\n\n const cell = await fixture<TileDispatcher>(cellTemplate!);\n expect(cell).to.exist;\n\n // Actual model description should be joined\n expect(cell.model?.description).to.equal('line1\\nline2');\n });\n\n it('can change search type', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .searchService=${searchService}\n .searchType=${SearchType.METADATA}\n ></collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n el.searchType = SearchType.FULLTEXT;\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('collection:foo');\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('queries for collection names after a fetch', async () => {\n const searchService = new MockSearchService();\n const collectionNameCache = new MockCollectionNameCache();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .searchService=${searchService}\n .collectionNameCache=${collectionNameCache}\n >\n </collection-browser>`\n );\n\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([\n 'foo',\n 'bar',\n 'baz',\n 'boop',\n ]);\n });\n\n it('keeps search results from fetch if no change to query or sort param', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n el.sortParam = { field: 'foo', direction: 'asc' };\n await el.updateComplete;\n\n await el.fetchPage(2);\n\n // If there is no change to the query or sort param during the fetch, the results\n // should be read.\n expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);\n });\n\n it('discards obsolete search results if sort params changed before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n el.sortParam = { field: 'foo', direction: 'asc' };\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = { field: 'foo', direction: 'desc' };\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('discards obsolete search results if sort param added before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'single-result';\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = { field: 'foo', direction: 'asc' };\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('discards obsolete search results if sort param cleared before arrival', async () => {\n const resultsSpy = sinon.spy();\n const searchService = new MockSearchService({\n asyncResponse: true,\n resultsSpy,\n });\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'with-sort';\n await el.updateComplete;\n\n const fetchPromise = el.fetchPage(2);\n el.sortParam = null;\n await fetchPromise;\n\n // If the different sort param causes the results to be discarded,\n // the results array should never be read.\n expect(resultsSpy.callCount).to.equal(0);\n });\n\n it('sets sort properties when user changes sort', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n expect(el.selectedSort).to.equal(SortField.relevance);\n\n el.baseQuery = 'foo';\n await el.updateComplete;\n\n const sortBar = el.shadowRoot?.querySelector('sort-filter-bar');\n const sortSelector = sortBar?.shadowRoot?.querySelector(\n '#desktop-sort-selector'\n );\n expect(sortSelector).to.exist;\n\n // Click the title sorter\n [...(sortSelector?.children as HTMLCollection & Iterable<any>)] // tsc doesn't know children is iterable\n .find(child => child.textContent?.trim() === 'Title')\n ?.querySelector('button')\n ?.click();\n\n await el.updateComplete;\n\n expect(el.selectedSort).to.equal(SortField.title);\n });\n\n it('sets sort filter properties when user selects title filter', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-title';\n el.selectedSort = 'title' as SortField;\n el.sortDirection = 'asc';\n el.selectedTitleFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-title AND firstTitle:X'\n );\n });\n\n it('sets sort filter properties when user selects creator filter', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-creator';\n el.selectedSort = 'creator' as SortField;\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-creator AND firstCreator:X'\n );\n });\n\n it('sets sort filter properties simultaneous with facets and date range', async () => {\n const searchService = new MockSearchService();\n const selectedFacets: SelectedFacets = {\n collection: { foo: { key: 'foo', state: 'selected', count: 1 } },\n creator: {},\n language: {},\n lending: {},\n mediatype: {},\n subject: {},\n year: {},\n };\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'first-creator';\n el.selectedSort = 'creator' as SortField;\n el.selectedFacets = selectedFacets;\n el.minSelectedDate = '1950';\n el.maxSelectedDate = '1970';\n el.sortDirection = 'asc';\n el.selectedCreatorFilter = 'X';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'first-creator AND firstCreator:X'\n );\n expect(searchService.searchParams?.filters).to.deep.equal({\n collection: {\n foo: 'inc',\n },\n year: {\n '1950': 'gte',\n '1970': 'lte',\n },\n });\n });\n\n it('sets date range query when date picker selection changed', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'years'; // Includes year_histogram aggregation in response\n el.showHistogramDatePicker = true;\n await el.updateComplete;\n\n const facets = el.shadowRoot?.querySelector(\n 'collection-facets'\n ) as CollectionFacets;\n await facets?.updateComplete;\n\n // Wait for the date picker to be rendered (which may take until the next tick)\n await nextTick();\n\n const histogram = facets?.shadowRoot?.querySelector(\n 'histogram-date-range'\n ) as HistogramDateRange;\n expect(histogram).to.exist;\n\n // Enter a new min date into the date picker\n const minDateInput = histogram.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n minDateInput.value = '1960';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n // Wait for the histogram's update delay\n await aTimeout(histogram.updateDelay + 50);\n\n // Ensure that the histogram change propagated to the collection browser's\n // date query correctly.\n await el.updateComplete;\n expect(el.minSelectedDate).to.equal('1960');\n expect(el.maxSelectedDate).to.equal('2000');\n });\n\n it('scrolls to page', async () => {\n const searchService = new MockSearchService();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n // Infinite scroller won't exist unless there's a base query.\n // First ensure that we don't throw errors when it doesn't exist.\n await el.goToPage(1);\n\n // And make sure it correctly calls scrollToCell when the\n // infinite scroller does exist.\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n const infiniteScroller = el.shadowRoot?.querySelector(\n 'infinite-scroller'\n ) as InfiniteScroller;\n expect(infiniteScroller).to.exist;\n\n const oldScrollToCell = infiniteScroller.scrollToCell;\n const spy = sinon.spy();\n infiniteScroller.scrollToCell = spy;\n\n await el.goToPage(1);\n\n expect(spy.callCount).to.equal(1);\n\n infiniteScroller.scrollToCell = oldScrollToCell;\n });\n\n it('refreshes when certain properties change - with some analytics event sampling', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n const searchService = new MockSearchService();\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser\n .analyticsHandler=${mockAnalyticsHandler}\n .searchService=${searchService}\n .collectionNameCache=${collectionNameCache}\n ></collection-browser>`\n );\n const infiniteScrollerRefreshSpy = sinon.spy();\n\n // Infinite scroller won't exist unless there's a base query\n el.baseQuery = 'collection:foo';\n await el.updateComplete;\n\n const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');\n (infiniteScroller as InfiniteScroller).reload = infiniteScrollerRefreshSpy;\n expect(infiniteScrollerRefreshSpy.called).to.be.false;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);\n\n // testing: `loggedIn`\n el.loggedIn = true;\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.called).to.be.true;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);\n\n el.loggedIn = false;\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);\n\n // testing: `displayMode`\n el.displayMode = 'list-compact';\n el.searchContext = 'beta-search';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');\n expect(mockAnalyticsHandler.callAction).to.equal('displayMode');\n expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');\n\n el.displayMode = 'list-detail';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);\n\n expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');\n expect(mockAnalyticsHandler.callAction).to.equal('displayMode');\n expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');\n\n // testing: `baseNavigationUrl`\n el.baseNavigationUrl = 'https://funtestsite.com';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);\n\n // testing: `baseImageUrl`\n el.baseImageUrl = 'https://funtestsiteforimages.com';\n await el.updateComplete;\n expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);\n });\n\n it('query the search service for single result', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser .searchService=${searchService}>\n </collection-browser>`\n );\n\n el.baseQuery = 'single-result';\n await el.updateComplete;\n await nextTick();\n\n expect(\n el.shadowRoot?.querySelector('#big-results-label')?.textContent\n ).to.contains('Result');\n });\n\n it('`searchContext` prop helps describe where component is being used', async () => {\n const el = await fixture<CollectionBrowser>(\n html`<collection-browser></collection-browser>`\n );\n\n expect(el.searchContext).to.equal(analyticsCategories.default);\n\n el.searchContext = 'unicorn-search';\n await el.updateComplete;\n\n expect(el.searchContext).to.equal('unicorn-search');\n\n // property is reflected as attribute\n expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');\n });\n});\n"]}
@@ -19,6 +19,14 @@ describe('Restoration state handler', () => {
19
19
  const restorationState = handler.getRestorationState();
20
20
  expect(restorationState.searchType).to.equal(SearchType.METADATA);
21
21
  });
22
+ it('should restore metadata search type if sin explicitly empty in URL', async () => {
23
+ const handler = new RestorationStateHandler({ context: 'search' });
24
+ const url = new URL(window.location.href);
25
+ url.search = '?sin=';
26
+ window.history.replaceState({ path: url.href }, '', url.href);
27
+ const restorationState = handler.getRestorationState();
28
+ expect(restorationState.searchType).to.equal(SearchType.METADATA);
29
+ });
22
30
  it('should restore full text search type from URL', async () => {
23
31
  const handler = new RestorationStateHandler({ context: 'search' });
24
32
  const url = new URL(window.location.href);
@@ -1 +1 @@
1
- {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\nimport { expect } from '@open-wc/testing';\nimport { getDefaultSelectedFacets } from '../src/models';\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\n\ndescribe('Restoration state handler', () => {\n it('should restore query from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?query=boop';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('boop');\n });\n\n it('should restore metadata search type from URL without valid sin', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore full text search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TXT';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('should restore page number from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?page=42';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.currentPage).to.equal(42);\n });\n\n it('should restore selected year facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'selected'\n );\n });\n\n it('should ignore unrecognized facet types in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=foo:\"bar\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets).to.deep.equal(\n getDefaultSelectedFacets()\n );\n });\n\n it('should restore selected date range facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018+TO+2021\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.minSelectedDate).to.equal('2018');\n expect(restorationState.maxSelectedDate).to.equal('2021');\n });\n\n it('should restore creator filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstCreator:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedCreatorFilter).to.equal('F');\n });\n\n it('should restore title filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstTitle:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedTitleFilter).to.equal('F');\n });\n\n it('should restore other selected facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject.foo.state).to.equal(\n 'selected'\n );\n });\n\n it('should restore negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore multiple selected/negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search =\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'selected'\n );\n expect(restorationState.selectedFacets.collection.bar.state).to.equal(\n 'selected'\n );\n\n expect(restorationState.selectedFacets.collection.baz.state).to.equal(\n 'hidden'\n );\n expect(restorationState.selectedFacets.collection.boop.state).to.equal(\n 'hidden'\n );\n });\n\n it('negative facets take precedence if both present in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, desc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, asc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('asc');\n });\n\n it('should not save current page state to the URL for page 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 1,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.be.empty;\n });\n\n it('should save current page state to the URL when page > 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 2,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?page=2');\n });\n\n it('should upgrade legacy search params to new ones', async () => {\n const url = new URL(window.location.href);\n url.search = '?q=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('foo');\n\n handler.persistState(restorationState);\n expect(window.location.search).to.equal('?query=foo');\n });\n\n it('should remove empty sin param', async () => {\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\n expect(window.location.search).to.equal('');\n });\n});\n"]}
1
+ {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\nimport { expect } from '@open-wc/testing';\nimport { getDefaultSelectedFacets } from '../src/models';\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\n\ndescribe('Restoration state handler', () => {\n it('should restore query from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?query=boop';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('boop');\n });\n\n it('should restore metadata search type from URL without valid sin', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore metadata search type if sin explicitly empty in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore full text search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TXT';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('should restore page number from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?page=42';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.currentPage).to.equal(42);\n });\n\n it('should restore selected year facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'selected'\n );\n });\n\n it('should ignore unrecognized facet types in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=foo:\"bar\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets).to.deep.equal(\n getDefaultSelectedFacets()\n );\n });\n\n it('should restore selected date range facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018+TO+2021\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.minSelectedDate).to.equal('2018');\n expect(restorationState.maxSelectedDate).to.equal('2021');\n });\n\n it('should restore creator filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstCreator:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedCreatorFilter).to.equal('F');\n });\n\n it('should restore title filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstTitle:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedTitleFilter).to.equal('F');\n });\n\n it('should restore other selected facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject.foo.state).to.equal(\n 'selected'\n );\n });\n\n it('should restore negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore multiple selected/negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search =\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'selected'\n );\n expect(restorationState.selectedFacets.collection.bar.state).to.equal(\n 'selected'\n );\n\n expect(restorationState.selectedFacets.collection.baz.state).to.equal(\n 'hidden'\n );\n expect(restorationState.selectedFacets.collection.boop.state).to.equal(\n 'hidden'\n );\n });\n\n it('negative facets take precedence if both present in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, desc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, asc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('asc');\n });\n\n it('should not save current page state to the URL for page 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 1,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.be.empty;\n });\n\n it('should save current page state to the URL when page > 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 2,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?page=2');\n });\n\n it('should upgrade legacy search params to new ones', async () => {\n const url = new URL(window.location.href);\n url.search = '?q=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('foo');\n\n handler.persistState(restorationState);\n expect(window.location.search).to.equal('?query=foo');\n });\n\n it('should remove empty sin param', async () => {\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\n expect(window.location.search).to.equal('');\n });\n});\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.4.14",
6
+ "version": "0.4.15-alpha.10",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
package/src/app-root.ts CHANGED
@@ -90,10 +90,6 @@ export class AppRoot extends LitElement {
90
90
  this.searchQuery = this.baseQueryField.value;
91
91
  this.collectionBrowser.searchType = this.searchType;
92
92
 
93
- // Need to request a search in cases where the search type was previously changed but not the query.
94
- // If the query was changed above, this should be a no-op.
95
- this.collectionBrowser.requestSearch();
96
-
97
93
  if ((this.currentPage ?? 1) > 1) {
98
94
  this.collectionBrowser.goToPage(this.currentPage ?? 1);
99
95
  }
@@ -154,7 +150,7 @@ export class AppRoot extends LitElement {
154
150
  id="metadata-search"
155
151
  name="search-type"
156
152
  value="metadata"
157
- ?checked=${this.searchType === SearchType.METADATA}
153
+ .checked=${this.searchType === SearchType.METADATA}
158
154
  @click=${this.searchTypeSelected}
159
155
  />
160
156
  <label for="metadata-search">Metadata</label>
@@ -165,7 +161,7 @@ export class AppRoot extends LitElement {
165
161
  id="fulltext-search"
166
162
  name="search-type"
167
163
  value="fulltext"
168
- ?checked=${this.searchType === SearchType.FULLTEXT}
164
+ .checked=${this.searchType === SearchType.FULLTEXT}
169
165
  @click=${this.searchTypeSelected}
170
166
  />
171
167
  <label for="fulltext-search">Full text</label>
@@ -321,14 +321,6 @@ export class CollectionBrowser
321
321
  return false;
322
322
  }
323
323
 
324
- /**
325
- * Manually requests to perform a search, which will only be executed if one of
326
- * the query, the search type, or the sort has changed.
327
- */
328
- requestSearch() {
329
- this.handleQueryChange();
330
- }
331
-
332
324
  render() {
333
325
  this.setPlaceholderType();
334
326
  return html`
@@ -687,10 +679,11 @@ export class CollectionBrowser
687
679
  }
688
680
 
689
681
  if (changed.has('baseQuery') || changed.has('searchType')) {
690
- // Unless this query/search type update is the result of hitting the back button,
682
+ // Unless this query/search type update is from the initial page load or the
683
+ // result of hitting the back button,
691
684
  // we need to clear any existing filters since they may no longer be valid for
692
685
  // the new set of search results.
693
- if (!this.historyPopOccurred) {
686
+ if (!this.historyPopOccurred && this.initialQueryChangeHappened) {
694
687
  // Only clear filters that haven't been simultaneously applied in this update
695
688
  this.clearFilters({
696
689
  facets: !changed.has('selectedFacets'),
@@ -233,9 +233,14 @@ export class RestorationStateHandler
233
233
  restorationState.baseQuery = legacySearchQuery;
234
234
  }
235
235
 
236
- if (searchInside) {
237
- restorationState.searchType =
238
- searchInside === 'TXT' ? SearchType.FULLTEXT : SearchType.METADATA;
236
+ switch (searchInside) {
237
+ // Eventually there will be TV/Radio search types here too.
238
+ case 'TXT':
239
+ restorationState.searchType = SearchType.FULLTEXT;
240
+ break;
241
+ default:
242
+ restorationState.searchType = SearchType.METADATA;
243
+ break;
239
244
  }
240
245
 
241
246
  if (pageNumber) {
@@ -260,13 +260,13 @@ describe('Collection Browser', () => {
260
260
  const searchService = new MockSearchService();
261
261
 
262
262
  const el = await fixture<CollectionBrowser>(
263
- html` <collection-browser
264
- .searchService=${searchService}
265
- .searchType=${SearchType.METADATA}
266
- >
263
+ html` <collection-browser .searchService=${searchService}>
267
264
  </collection-browser>`
268
265
  );
269
266
 
267
+ el.searchType = SearchType.METADATA;
268
+ await el.updateComplete;
269
+
270
270
  el.baseQuery = 'collection:foo';
271
271
  await el.updateComplete;
272
272
  await nextTick();
@@ -278,7 +278,7 @@ describe('Collection Browser', () => {
278
278
  ).to.contains('Results');
279
279
  });
280
280
 
281
- it('can request a search when changing search type', async () => {
281
+ it('can change search type', async () => {
282
282
  const searchService = new MockSearchService();
283
283
  const el = await fixture<CollectionBrowser>(
284
284
  html`<collection-browser .searchService=${searchService}>
@@ -289,7 +289,6 @@ describe('Collection Browser', () => {
289
289
  await el.updateComplete;
290
290
 
291
291
  el.searchType = SearchType.FULLTEXT;
292
- el.requestSearch();
293
292
  await el.updateComplete;
294
293
  await nextTick();
295
294
 
@@ -300,13 +299,13 @@ describe('Collection Browser', () => {
300
299
  const searchService = new MockSearchService();
301
300
 
302
301
  const el = await fixture<CollectionBrowser>(
303
- html` <collection-browser
304
- .searchService=${searchService}
305
- .searchType=${SearchType.FULLTEXT}
306
- >
302
+ html` <collection-browser .searchService=${searchService}>
307
303
  </collection-browser>`
308
304
  );
309
305
 
306
+ el.searchType = SearchType.FULLTEXT;
307
+ await el.updateComplete;
308
+
310
309
  el.baseQuery = 'collection:foo';
311
310
  await el.updateComplete;
312
311
  await nextTick();
@@ -26,6 +26,17 @@ describe('Restoration state handler', () => {
26
26
  expect(restorationState.searchType).to.equal(SearchType.METADATA);
27
27
  });
28
28
 
29
+ it('should restore metadata search type if sin explicitly empty in URL', async () => {
30
+ const handler = new RestorationStateHandler({ context: 'search' });
31
+
32
+ const url = new URL(window.location.href);
33
+ url.search = '?sin=';
34
+ window.history.replaceState({ path: url.href }, '', url.href);
35
+
36
+ const restorationState = handler.getRestorationState();
37
+ expect(restorationState.searchType).to.equal(SearchType.METADATA);
38
+ });
39
+
29
40
  it('should restore full text search type from URL', async () => {
30
41
  const handler = new RestorationStateHandler({ context: 'search' });
31
42