@internetarchive/collection-browser 2.13.1 → 2.13.2-alpha-webdev7687.1

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.
Files changed (55) hide show
  1. package/dist/src/app-root.d.ts +1 -0
  2. package/dist/src/app-root.js +48 -2
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/collection-browser.d.ts +2 -1
  5. package/dist/src/collection-browser.js +20 -5
  6. package/dist/src/collection-browser.js.map +1 -1
  7. package/dist/src/collection-facets/facet-row.js +7 -1
  8. package/dist/src/collection-facets/facet-row.js.map +1 -1
  9. package/dist/src/collection-facets/more-facets-content.d.ts +1 -0
  10. package/dist/src/collection-facets/more-facets-content.js +19 -4
  11. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  12. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +4 -3
  13. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  14. package/dist/src/collection-facets.d.ts +3 -1
  15. package/dist/src/collection-facets.js +37 -7
  16. package/dist/src/collection-facets.js.map +1 -1
  17. package/dist/src/data-source/collection-browser-data-source.js +28 -11
  18. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  19. package/dist/src/data-source/collection-browser-query-state.d.ts +2 -1
  20. package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
  21. package/dist/src/expanded-date-picker.d.ts +1 -0
  22. package/dist/src/expanded-date-picker.js +7 -1
  23. package/dist/src/expanded-date-picker.js.map +1 -1
  24. package/dist/src/models.d.ts +27 -5
  25. package/dist/src/models.js +65 -3
  26. package/dist/src/models.js.map +1 -1
  27. package/dist/src/restoration-state-handler.d.ts +2 -1
  28. package/dist/src/restoration-state-handler.js +38 -3
  29. package/dist/src/restoration-state-handler.js.map +1 -1
  30. package/dist/src/utils/facet-utils.js +8 -2
  31. package/dist/src/utils/facet-utils.js.map +1 -1
  32. package/dist/test/collection-facets.test.js +27 -0
  33. package/dist/test/collection-facets.test.js.map +1 -1
  34. package/dist/test/restoration-state-handler.test.js +17 -10
  35. package/dist/test/restoration-state-handler.test.js.map +1 -1
  36. package/dist/test/tiles/{mediatype-icon.test.js → tile-mediatype-icon.test.js} +1 -1
  37. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/app-root.ts +49 -2
  40. package/src/collection-browser.ts +21 -3
  41. package/src/collection-facets/facet-row.ts +8 -1
  42. package/src/collection-facets/more-facets-content.ts +21 -5
  43. package/src/collection-facets/smart-facets/smart-facet-bar.ts +2 -2
  44. package/src/collection-facets.ts +37 -8
  45. package/src/data-source/collection-browser-data-source.ts +36 -13
  46. package/src/data-source/collection-browser-query-state.ts +7 -1
  47. package/src/expanded-date-picker.ts +5 -1
  48. package/src/models.ts +88 -10
  49. package/src/restoration-state-handler.ts +39 -1
  50. package/src/utils/facet-utils.ts +5 -3
  51. package/test/collection-facets.test.ts +33 -0
  52. package/test/restoration-state-handler.test.ts +10 -10
  53. package/dist/test/tiles/mediatype-icon.test.js.map +0 -1
  54. /package/dist/test/tiles/{mediatype-icon.test.d.ts → tile-mediatype-icon.test.d.ts} +0 -0
  55. /package/test/tiles/{mediatype-icon.test.ts → tile-mediatype-icon.test.ts} +0 -0
package/src/models.ts CHANGED
@@ -564,18 +564,24 @@ export type FacetOption =
564
564
  | 'language'
565
565
  | 'creator'
566
566
  | 'collection'
567
- | 'year';
567
+ | 'year'
568
+ // TV-specific facet options:
569
+ | 'program'
570
+ | 'person'
571
+ | 'sponsor';
568
572
 
569
573
  export type SelectedFacetState = 'selected' | 'hidden';
570
574
 
571
575
  export type FacetState = SelectedFacetState | 'none';
572
576
 
573
577
  export interface FacetBucket {
574
- // for some facets, we augment the key with a display value
575
- displayText?: string;
576
578
  key: string;
577
579
  count: number;
578
580
  state: FacetState;
581
+ // for some facets, we augment the key with a display value
582
+ displayText?: string;
583
+ // for TV channel facets, we add a parenthesized secondary name
584
+ extraNote?: string;
579
585
  }
580
586
 
581
587
  export interface FacetGroup {
@@ -605,12 +611,11 @@ export type FacetEventDetails = {
605
611
 
606
612
  export type FacetValue = string;
607
613
 
608
- export type SelectedFacets = Record<
609
- FacetOption,
610
- Record<FacetValue, FacetBucket>
614
+ export type SelectedFacets = Partial<
615
+ Record<FacetOption, Record<FacetValue, FacetBucket>>
611
616
  >;
612
617
 
613
- export const getDefaultSelectedFacets = (): SelectedFacets => ({
618
+ export const getDefaultSelectedFacets = (): Required<SelectedFacets> => ({
614
619
  subject: {},
615
620
  lending: {},
616
621
  mediatype: {},
@@ -618,9 +623,20 @@ export const getDefaultSelectedFacets = (): SelectedFacets => ({
618
623
  creator: {},
619
624
  collection: {},
620
625
  year: {},
626
+ program: {},
627
+ person: {},
628
+ sponsor: {},
621
629
  });
622
630
 
623
- export const facetDisplayOrder: FacetOption[] = [
631
+ /**
632
+ * For TV search results, what types of TV clips to restrict the results to.
633
+ */
634
+ export type TvClipFilterType = 'all' | 'commercials' | 'factchecks' | 'quotes';
635
+
636
+ /**
637
+ * Facet display order when presenting results for all search types *except* TV (see below).
638
+ */
639
+ export const defaultFacetDisplayOrder: FacetOption[] = [
624
640
  'mediatype',
625
641
  // 'lending', Commenting this out removes the lending facet from the sidebar for now
626
642
  'year',
@@ -630,6 +646,23 @@ export const facetDisplayOrder: FacetOption[] = [
630
646
  'language',
631
647
  ];
632
648
 
649
+ /**
650
+ * Specialized facet ordering when displaying TV search results
651
+ */
652
+ export const tvFacetDisplayOrder: FacetOption[] = [
653
+ 'program',
654
+ 'creator',
655
+ 'year',
656
+ 'subject',
657
+ 'collection',
658
+ 'person',
659
+ 'sponsor',
660
+ 'language',
661
+ ];
662
+
663
+ /**
664
+ * Human-readable titles for each facet group.
665
+ */
633
666
  export const facetTitles: Record<FacetOption, string> = {
634
667
  subject: 'Subject',
635
668
  lending: 'Availability',
@@ -638,6 +671,9 @@ export const facetTitles: Record<FacetOption, string> = {
638
671
  creator: 'Creator',
639
672
  collection: 'Collection',
640
673
  year: 'Year',
674
+ program: 'Program',
675
+ person: 'Person',
676
+ sponsor: 'Sponsor',
641
677
  };
642
678
 
643
679
  /**
@@ -650,7 +686,10 @@ export const defaultFacetSort: Record<FacetOption, AggregationSortType> = {
650
686
  language: AggregationSortType.COUNT,
651
687
  creator: AggregationSortType.COUNT,
652
688
  collection: AggregationSortType.COUNT,
653
- year: AggregationSortType.NUMERIC,
689
+ year: AggregationSortType.NUMERIC, // Year facets are ordered by their numeric value by default
690
+ program: AggregationSortType.COUNT,
691
+ person: AggregationSortType.COUNT,
692
+ sponsor: AggregationSortType.COUNT,
654
693
  };
655
694
 
656
695
  /**
@@ -664,9 +703,48 @@ export const valueFacetSort: Record<FacetOption, AggregationSortType> = {
664
703
  language: AggregationSortType.ALPHABETICAL,
665
704
  creator: AggregationSortType.ALPHABETICAL,
666
705
  collection: AggregationSortType.ALPHABETICAL,
667
- year: AggregationSortType.NUMERIC,
706
+ year: AggregationSortType.NUMERIC, // Year facets' values should be compared numerically, not lexicographically (year 2001 > year 3)
707
+ program: AggregationSortType.ALPHABETICAL,
708
+ person: AggregationSortType.ALPHABETICAL,
709
+ sponsor: AggregationSortType.ALPHABETICAL,
668
710
  };
669
711
 
712
+ /**
713
+ * Extra parenthesized labels to show next to certain TV channel facets
714
+ *
715
+ * TODO: This is only needed until we can receive the appropriate mapping via PPS,
716
+ * and can be removed/replaced once that is set up.
717
+ */
718
+ export const tvChannelFacetLabels: Record<string, string> = Object.fromEntries(
719
+ // prettier-ignore
720
+ Object.entries({
721
+ 'Al Jazeera' : ['ALJAZAM', 'ALJAZ'],
722
+ 'Bloomberg' : ['BLOOMBERG'],
723
+ 'BBC' : ['BBC', 'BBC1', 'BBC2'],
724
+ 'BBC America' : ['BBCAMERICA'],
725
+ 'BBC News' : ['BBCNEWS'],
726
+ 'GB News' : ['GBN'],
727
+ 'BET' : ['BETW'],
728
+ 'CNBC' : ['CNBC'],
729
+ 'CNN' : ['CNNW', 'CNN'],
730
+ 'Comedy Central' : ['COM', 'COMW'],
731
+ 'CSPAN' : ['CSPAN', 'CSPAN2', 'CSPAN3'],
732
+ 'Current' : ['CURRENT'],
733
+ 'Deutsche Welle' : ['DW'],
734
+ 'France 24' : ['FRANCE24'],
735
+ 'FOX Business' : ['FBC'],
736
+ 'FOX News' : ['FOXNEWSW', 'FOXNEWS'],
737
+ 'LINKTV' : ['LINKTV'],
738
+ 'MSNBC' : ['MSNBCW', 'MSNBC'],
739
+ 'NHK World' : ['NHK'],
740
+ 'RT' : ['RT'],
741
+ 'Sky News' : ['SKY'],
742
+ }).reduce(
743
+ (acc, [label, channels]) => acc.concat(channels.map(ch => [ch, label])),
744
+ [] as [string, string][],
745
+ ),
746
+ );
747
+
670
748
  export type LendingFacetKey =
671
749
  | 'is_lendable'
672
750
  | 'is_borrowable'
@@ -5,6 +5,7 @@ import {
5
5
  CollectionBrowserContext,
6
6
  CollectionDisplayMode,
7
7
  SelectedFacets,
8
+ TvClipFilterType,
8
9
  SortField,
9
10
  FacetBucket,
10
11
  FacetState,
@@ -28,6 +29,7 @@ export interface RestorationState {
28
29
  maxSelectedDate?: string;
29
30
  selectedTitleFilter?: string;
30
31
  selectedCreatorFilter?: string;
32
+ tvClipFilter?: TvClipFilterType;
31
33
  }
32
34
 
33
35
  export interface RestorationStatePersistOptions {
@@ -185,10 +187,16 @@ export class RestorationStateHandler
185
187
  }
186
188
  }
187
189
 
190
+ const dateField =
191
+ state.minSelectedDate?.includes('-') ||
192
+ state.maxSelectedDate?.includes('-')
193
+ ? 'date'
194
+ : 'year';
195
+
188
196
  if (state.minSelectedDate && state.maxSelectedDate) {
189
197
  newParams.append(
190
198
  'and[]',
191
- `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`,
199
+ `${dateField}:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`,
192
200
  );
193
201
  }
194
202
 
@@ -200,6 +208,21 @@ export class RestorationStateHandler
200
208
  newParams.append('and[]', state.creatorQuery);
201
209
  }
202
210
 
211
+ // TV clip special filters
212
+ switch (state.tvClipFilter) {
213
+ case 'commercials':
214
+ newParams.append('only_commercials', '1');
215
+ break;
216
+ case 'factchecks':
217
+ newParams.append('only_factchecks', '1');
218
+ break;
219
+ case 'quotes':
220
+ newParams.append('only_quotes', '1');
221
+ break;
222
+ default:
223
+ // Don't add anything to the URL
224
+ }
225
+
203
226
  // Ensure we aren't pushing consecutive identical states to the history stack.
204
227
  // - If the state has changed, we push a new history entry.
205
228
  // - If only the page number has changed, we replace the current history entry.
@@ -337,6 +360,7 @@ export class RestorationStateHandler
337
360
  }
338
361
 
339
362
  switch (field) {
363
+ case 'date':
340
364
  case 'year': {
341
365
  const [minDate, maxDate] = value.split(' TO ');
342
366
  // we have two potential ways of filtering by date:
@@ -391,6 +415,20 @@ export class RestorationStateHandler
391
415
  });
392
416
  }
393
417
 
418
+ // TV clip special filters (carryovers from legacy page)
419
+ const commercialsParam = url.searchParams.get('only_commercials');
420
+ const factchecksParam = url.searchParams.get('only_factchecks');
421
+ const quotesParam = url.searchParams.get('only_quotes');
422
+ if (commercialsParam) {
423
+ restorationState.tvClipFilter = 'commercials';
424
+ } else if (factchecksParam) {
425
+ restorationState.tvClipFilter = 'factchecks';
426
+ } else if (quotesParam) {
427
+ restorationState.tvClipFilter = 'quotes';
428
+ } else {
429
+ restorationState.tvClipFilter = 'all';
430
+ }
431
+
394
432
  return restorationState;
395
433
  }
396
434
 
@@ -62,7 +62,7 @@ export function updateSelectedFacetBucket(
62
62
  omitNoneState = false,
63
63
  ): SelectedFacets {
64
64
  const defaultedSelectedFacets = selectedFacets ?? getDefaultSelectedFacets();
65
- const newFacets = {
65
+ const newFacets: SelectedFacets = {
66
66
  ...defaultedSelectedFacets,
67
67
  [facetType]: {
68
68
  ...defaultedSelectedFacets[facetType],
@@ -71,7 +71,7 @@ export function updateSelectedFacetBucket(
71
71
  };
72
72
 
73
73
  if (omitNoneState && bucket.state === 'none') {
74
- delete newFacets[facetType][bucket.key];
74
+ delete newFacets[facetType]?.[bucket.key];
75
75
  }
76
76
 
77
77
  return newFacets;
@@ -93,6 +93,7 @@ export function cloneSelectedFacets(
93
93
  ): SelectedFacets {
94
94
  const cloneResult = getDefaultSelectedFacets();
95
95
  forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {
96
+ if (!cloneResult[facetType]) cloneResult[facetType] = {};
96
97
  cloneResult[facetType][bucketKey] = bucket;
97
98
  });
98
99
  return cloneResult;
@@ -124,13 +125,14 @@ export function mergeSelectedFacets(
124
125
  ): SelectedFacets {
125
126
  const mergeResult = cloneSelectedFacets(destination);
126
127
  forEachFacetBucket(source, (facetType, bucketKey, bucket) => {
128
+ if (!mergeResult[facetType]) mergeResult[facetType] = {};
127
129
  mergeResult[facetType][bucketKey] = bucket;
128
130
  });
129
131
 
130
132
  // Normalize any 'none' states on the result (from either source or destination)
131
133
  forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {
132
134
  if (bucket.state === 'none') {
133
- delete mergeResult[facetType][bucketKey];
135
+ delete mergeResult[facetType]?.[bucketKey];
134
136
  }
135
137
  });
136
138
 
@@ -629,6 +629,39 @@ describe('Collection Facets', () => {
629
629
  expect(facetRows?.[7]?.bucket?.key).to.equal('collection');
630
630
  });
631
631
 
632
+ it('uses specified facet display order', async () => {
633
+ const el = await fixture<CollectionFacets>(
634
+ html`<collection-facets
635
+ .facetDisplayOrder=${['language', 'creator'] as FacetOption[]}
636
+ ></collection-facets>`,
637
+ );
638
+
639
+ const aggs: Record<string, Aggregation> = {
640
+ mediatype: new Aggregation({
641
+ buckets: [{ key: 'texts', doc_count: 5 }],
642
+ }),
643
+ collection: new Aggregation({
644
+ buckets: [{ key: 'foo', doc_count: 10 }],
645
+ }),
646
+ creator: new Aggregation({
647
+ buckets: [{ key: 'bar', doc_count: 15 }],
648
+ }),
649
+ language: new Aggregation({
650
+ buckets: [{ key: 'baz', doc_count: 20 }],
651
+ }),
652
+ };
653
+
654
+ el.aggregations = aggs;
655
+ await el.updateComplete;
656
+
657
+ const facetHeaders = el.shadowRoot?.querySelectorAll('.facet-group-header');
658
+
659
+ // The only two facet groups should be Language and Creator (in that order)
660
+ expect(facetHeaders?.length).to.equal(2);
661
+ expect(facetHeaders?.[0].textContent).to.contain('Language');
662
+ expect(facetHeaders?.[1].textContent).to.contain('Creator');
663
+ });
664
+
632
665
  describe('More Facets', () => {
633
666
  it('Does not render < allowedFacetCount', async () => {
634
667
  const el = await fixture<CollectionFacets>(
@@ -100,7 +100,7 @@ describe('Restoration state handler', () => {
100
100
  window.history.replaceState({ path: url.href }, '', url.href);
101
101
 
102
102
  const restorationState = handler.getRestorationState();
103
- expect(restorationState.selectedFacets.year['2018'].state).to.equal(
103
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
104
104
  'selected',
105
105
  );
106
106
  });
@@ -160,7 +160,7 @@ describe('Restoration state handler', () => {
160
160
  window.history.replaceState({ path: url.href }, '', url.href);
161
161
 
162
162
  const restorationState = handler.getRestorationState();
163
- expect(restorationState.selectedFacets.subject.foo.state).to.equal(
163
+ expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
164
164
  'selected',
165
165
  );
166
166
  });
@@ -173,7 +173,7 @@ describe('Restoration state handler', () => {
173
173
  window.history.replaceState({ path: url.href }, '', url.href);
174
174
 
175
175
  const restorationState = handler.getRestorationState();
176
- expect(restorationState.selectedFacets.year['2018'].state).to.equal(
176
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
177
177
  'hidden',
178
178
  );
179
179
  });
@@ -188,17 +188,17 @@ describe('Restoration state handler', () => {
188
188
 
189
189
  const restorationState = handler.getRestorationState();
190
190
 
191
- expect(restorationState.selectedFacets.collection.foo.state).to.equal(
191
+ expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
192
192
  'selected',
193
193
  );
194
- expect(restorationState.selectedFacets.collection.bar.state).to.equal(
194
+ expect(restorationState.selectedFacets.collection?.bar.state).to.equal(
195
195
  'selected',
196
196
  );
197
197
 
198
- expect(restorationState.selectedFacets.collection.baz.state).to.equal(
198
+ expect(restorationState.selectedFacets.collection?.baz.state).to.equal(
199
199
  'hidden',
200
200
  );
201
- expect(restorationState.selectedFacets.collection.boop.state).to.equal(
201
+ expect(restorationState.selectedFacets.collection?.boop.state).to.equal(
202
202
  'hidden',
203
203
  );
204
204
  });
@@ -211,7 +211,7 @@ describe('Restoration state handler', () => {
211
211
  window.history.replaceState({ path: url.href }, '', url.href);
212
212
 
213
213
  const restorationState = handler.getRestorationState();
214
- expect(restorationState.selectedFacets.collection.foo.state).to.equal(
214
+ expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
215
215
  'hidden',
216
216
  );
217
217
  });
@@ -224,7 +224,7 @@ describe('Restoration state handler', () => {
224
224
  window.history.replaceState({ path: url.href }, '', url.href);
225
225
 
226
226
  const restorationState = handler.getRestorationState();
227
- expect(restorationState.selectedFacets.subject.foo.state).to.equal(
227
+ expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
228
228
  'selected',
229
229
  );
230
230
  });
@@ -237,7 +237,7 @@ describe('Restoration state handler', () => {
237
237
  window.history.replaceState({ path: url.href }, '', url.href);
238
238
 
239
239
  const restorationState = handler.getRestorationState();
240
- expect(restorationState.selectedFacets.year['2018'].state).to.equal(
240
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
241
241
  'hidden',
242
242
  );
243
243
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"mediatype-icon.test.js","sourceRoot":"","sources":["../../../test/tiles/mediatype-icon.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileMediatypeIcon } from '../../src/tiles/tile-mediatype-icon';\n\nimport '../../src/tiles/tile-mediatype-icon';\n\ndescribe('Mediatype Icon', () => {\n it('renders component', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon mediatype=\"texts\"></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon');\n expect(iconDiv).to.exist;\n });\n\n it('renders basic mediatype correctly', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon mediatype=\"movies\"></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('Movie');\n expect(iconDiv.getAttribute('style')).to.include('#f1644b');\n expect(iconDiv.children[0]).to.be.instanceOf(SVGElement);\n });\n\n it('renders TV mediatype', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon\n mediatype=\"movies\"\n .collections=${['tvnews']}\n ></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('TV');\n });\n\n it('renders TV Commercial mediatype', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon\n mediatype=\"movies\"\n .collections=${['tvnews', 'tv_ads']}\n ></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('TV Commercial');\n });\n\n it('renders TV Fact Check mediatype for search results', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon\n isTvSearchResult\n mediatype=\"movies\"\n .collections=${['tvnews', 'factchecked']}\n ></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('TV Fact Check');\n });\n\n it('does not use TV Fact Check mediatype for non-search results', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon\n mediatype=\"movies\"\n .collections=${['tvnews', 'factchecked']}\n ></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('TV');\n });\n\n it('renders radio mediatype', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon\n mediatype=\"audio\"\n .collections=${['radio']}\n ></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon') as HTMLDivElement;\n expect(iconDiv.title).to.equal('Radio');\n });\n\n it('renders no icon if mediatype is unrecognized', async () => {\n const el = await fixture<TileMediatypeIcon>(html`\n <tile-mediatype-icon mediatype=\"foobar\"></tile-mediatype-icon>\n `);\n\n const iconDiv = el.shadowRoot?.querySelector('#icon');\n expect(iconDiv).not.to.exist;\n });\n});\n"]}