@internetarchive/collection-browser 2.13.1 → 2.13.2-alpha-webdev5427.0

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 (50) 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.js +13 -4
  5. package/dist/src/collection-browser.js.map +1 -1
  6. package/dist/src/collection-facets/facet-row.js +7 -1
  7. package/dist/src/collection-facets/facet-row.js.map +1 -1
  8. package/dist/src/collection-facets/more-facets-content.d.ts +1 -0
  9. package/dist/src/collection-facets/more-facets-content.js +19 -4
  10. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  11. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +4 -3
  12. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  13. package/dist/src/collection-facets.d.ts +3 -1
  14. package/dist/src/collection-facets.js +37 -7
  15. package/dist/src/collection-facets.js.map +1 -1
  16. package/dist/src/data-source/collection-browser-data-source.js +11 -11
  17. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  18. package/dist/src/expanded-date-picker.d.ts +1 -0
  19. package/dist/src/expanded-date-picker.js +7 -1
  20. package/dist/src/expanded-date-picker.js.map +1 -1
  21. package/dist/src/models.d.ts +23 -5
  22. package/dist/src/models.js +65 -3
  23. package/dist/src/models.js.map +1 -1
  24. package/dist/src/restoration-state-handler.js +8 -3
  25. package/dist/src/restoration-state-handler.js.map +1 -1
  26. package/dist/src/utils/facet-utils.js +8 -2
  27. package/dist/src/utils/facet-utils.js.map +1 -1
  28. package/dist/test/collection-facets.test.js +27 -0
  29. package/dist/test/collection-facets.test.js.map +1 -1
  30. package/dist/test/restoration-state-handler.test.js +17 -10
  31. package/dist/test/restoration-state-handler.test.js.map +1 -1
  32. package/dist/test/tiles/{mediatype-icon.test.js → tile-mediatype-icon.test.js} +1 -1
  33. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  34. package/package.json +1 -1
  35. package/src/app-root.ts +49 -2
  36. package/src/collection-browser.ts +16 -3
  37. package/src/collection-facets/facet-row.ts +8 -1
  38. package/src/collection-facets/more-facets-content.ts +21 -5
  39. package/src/collection-facets/smart-facets/smart-facet-bar.ts +2 -2
  40. package/src/collection-facets.ts +37 -8
  41. package/src/data-source/collection-browser-data-source.ts +18 -13
  42. package/src/expanded-date-picker.ts +5 -1
  43. package/src/models.ts +83 -10
  44. package/src/restoration-state-handler.ts +8 -1
  45. package/src/utils/facet-utils.ts +5 -3
  46. package/test/collection-facets.test.ts +33 -0
  47. package/test/restoration-state-handler.test.ts +10 -10
  48. package/dist/test/tiles/mediatype-icon.test.js.map +0 -1
  49. /package/dist/test/tiles/{mediatype-icon.test.d.ts → tile-mediatype-icon.test.d.ts} +0 -0
  50. /package/test/tiles/{mediatype-icon.test.ts → tile-mediatype-icon.test.ts} +0 -0
@@ -690,27 +690,32 @@ export class CollectionBrowserDataSource
690
690
  get filterMap(): FilterMap {
691
691
  const builder = new FilterMapBuilder();
692
692
 
693
- // Add the date range, if applicable
694
- if (this.host.minSelectedDate) {
693
+ const {
694
+ minSelectedDate,
695
+ maxSelectedDate,
696
+ selectedFacets,
697
+ selectedTitleFilter,
698
+ selectedCreatorFilter,
699
+ } = this.host;
700
+
701
+ if (minSelectedDate) {
695
702
  builder.addFilter(
696
703
  'year',
697
- this.host.minSelectedDate,
704
+ minSelectedDate,
698
705
  FilterConstraint.GREATER_OR_EQUAL,
699
706
  );
700
707
  }
701
- if (this.host.maxSelectedDate) {
708
+ if (maxSelectedDate) {
702
709
  builder.addFilter(
703
710
  'year',
704
- this.host.maxSelectedDate,
711
+ maxSelectedDate,
705
712
  FilterConstraint.LESS_OR_EQUAL,
706
713
  );
707
714
  }
708
715
 
709
716
  // Add any selected facets
710
- if (this.host.selectedFacets) {
711
- for (const [facetName, facetValues] of Object.entries(
712
- this.host.selectedFacets,
713
- )) {
717
+ if (selectedFacets) {
718
+ for (const [facetName, facetValues] of Object.entries(selectedFacets)) {
714
719
  const { name, values } = this.prepareFacetForFetch(
715
720
  facetName,
716
721
  facetValues,
@@ -731,17 +736,17 @@ export class CollectionBrowserDataSource
731
736
  }
732
737
 
733
738
  // Add any letter filters
734
- if (this.host.selectedTitleFilter) {
739
+ if (selectedTitleFilter) {
735
740
  builder.addFilter(
736
741
  'firstTitle',
737
- this.host.selectedTitleFilter,
742
+ selectedTitleFilter,
738
743
  FilterConstraint.INCLUDE,
739
744
  );
740
745
  }
741
- if (this.host.selectedCreatorFilter) {
746
+ if (selectedCreatorFilter) {
742
747
  builder.addFilter(
743
748
  'firstCreator',
744
- this.host.selectedCreatorFilter,
749
+ selectedCreatorFilter,
745
750
  FilterConstraint.INCLUDE,
746
751
  );
747
752
  }
@@ -1,5 +1,6 @@
1
1
  import { css, html, LitElement, CSSResultGroup, TemplateResult } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
+ import { msg } from '@lit/localize';
3
4
  import type { ModalManagerInterface } from '@internetarchive/modal-manager';
4
5
  import type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';
5
6
  import {
@@ -19,6 +20,8 @@ export class ExpandedDatePicker extends LitElement {
19
20
 
20
21
  @property({ type: Array }) buckets?: number[];
21
22
 
23
+ @property({ type: String }) dateFormat: string = 'YYYY';
24
+
22
25
  @property({ type: Object, attribute: false })
23
26
  modalManager?: ModalManagerInterface;
24
27
 
@@ -34,6 +37,7 @@ export class ExpandedDatePicker extends LitElement {
34
37
  .maxDate=${this.maxDate}
35
38
  .minSelectedDate=${this.minSelectedDate ?? this.minDate}
36
39
  .maxSelectedDate=${this.maxSelectedDate ?? this.maxDate}
40
+ .dateFormat=${this.dateFormat}
37
41
  .updateDelay=${0}
38
42
  updateWhileFocused
39
43
  missingDataMessage="..."
@@ -47,7 +51,7 @@ export class ExpandedDatePicker extends LitElement {
47
51
  slot="inputs-right-side"
48
52
  @click=${this.applyBtnClicked}
49
53
  >
50
- Apply date range
54
+ ${msg('Apply date range')}
51
55
  </button>
52
56
  </histogram-date-range>
53
57
  </div>
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,15 @@ 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
+ * Facet display order when presenting results for all search types *except* TV (see below).
633
+ */
634
+ export const defaultFacetDisplayOrder: FacetOption[] = [
624
635
  'mediatype',
625
636
  // 'lending', Commenting this out removes the lending facet from the sidebar for now
626
637
  'year',
@@ -630,6 +641,23 @@ export const facetDisplayOrder: FacetOption[] = [
630
641
  'language',
631
642
  ];
632
643
 
644
+ /**
645
+ * Specialized facet ordering when displaying TV search results
646
+ */
647
+ export const tvFacetDisplayOrder: FacetOption[] = [
648
+ 'program',
649
+ 'creator',
650
+ 'year',
651
+ 'subject',
652
+ 'collection',
653
+ 'person',
654
+ 'sponsor',
655
+ 'language',
656
+ ];
657
+
658
+ /**
659
+ * Human-readable titles for each facet group.
660
+ */
633
661
  export const facetTitles: Record<FacetOption, string> = {
634
662
  subject: 'Subject',
635
663
  lending: 'Availability',
@@ -638,6 +666,9 @@ export const facetTitles: Record<FacetOption, string> = {
638
666
  creator: 'Creator',
639
667
  collection: 'Collection',
640
668
  year: 'Year',
669
+ program: 'Program',
670
+ person: 'Person',
671
+ sponsor: 'Sponsor',
641
672
  };
642
673
 
643
674
  /**
@@ -650,7 +681,10 @@ export const defaultFacetSort: Record<FacetOption, AggregationSortType> = {
650
681
  language: AggregationSortType.COUNT,
651
682
  creator: AggregationSortType.COUNT,
652
683
  collection: AggregationSortType.COUNT,
653
- year: AggregationSortType.NUMERIC,
684
+ year: AggregationSortType.NUMERIC, // Year facets are ordered by their numeric value by default
685
+ program: AggregationSortType.COUNT,
686
+ person: AggregationSortType.COUNT,
687
+ sponsor: AggregationSortType.COUNT,
654
688
  };
655
689
 
656
690
  /**
@@ -664,9 +698,48 @@ export const valueFacetSort: Record<FacetOption, AggregationSortType> = {
664
698
  language: AggregationSortType.ALPHABETICAL,
665
699
  creator: AggregationSortType.ALPHABETICAL,
666
700
  collection: AggregationSortType.ALPHABETICAL,
667
- year: AggregationSortType.NUMERIC,
701
+ year: AggregationSortType.NUMERIC, // Year facets' values should be compared numerically, not lexicographically (year 2001 > year 3)
702
+ program: AggregationSortType.ALPHABETICAL,
703
+ person: AggregationSortType.ALPHABETICAL,
704
+ sponsor: AggregationSortType.ALPHABETICAL,
668
705
  };
669
706
 
707
+ /**
708
+ * Extra parenthesized labels to show next to certain TV channel facets
709
+ *
710
+ * TODO: This is only needed until we can receive the appropriate mapping via PPS,
711
+ * and can be removed/replaced once that is set up.
712
+ */
713
+ export const tvChannelFacetLabels: Record<string, string> = Object.fromEntries(
714
+ // prettier-ignore
715
+ Object.entries({
716
+ 'Al Jazeera' : ['ALJAZAM', 'ALJAZ'],
717
+ 'Bloomberg' : ['BLOOMBERG'],
718
+ 'BBC' : ['BBC', 'BBC1', 'BBC2'],
719
+ 'BBC America' : ['BBCAMERICA'],
720
+ 'BBC News' : ['BBCNEWS'],
721
+ 'GB News' : ['GBN'],
722
+ 'BET' : ['BETW'],
723
+ 'CNBC' : ['CNBC'],
724
+ 'CNN' : ['CNNW', 'CNN'],
725
+ 'Comedy Central' : ['COM', 'COMW'],
726
+ 'CSPAN' : ['CSPAN', 'CSPAN2', 'CSPAN3'],
727
+ 'Current' : ['CURRENT'],
728
+ 'Deutsche Welle' : ['DW'],
729
+ 'France 24' : ['FRANCE24'],
730
+ 'FOX Business' : ['FBC'],
731
+ 'FOX News' : ['FOXNEWSW', 'FOXNEWS'],
732
+ 'LINKTV' : ['LINKTV'],
733
+ 'MSNBC' : ['MSNBCW', 'MSNBC'],
734
+ 'NHK World' : ['NHK'],
735
+ 'RT' : ['RT'],
736
+ 'Sky News' : ['SKY'],
737
+ }).reduce(
738
+ (acc, [label, channels]) => acc.concat(channels.map(ch => [ch, label])),
739
+ [] as [string, string][],
740
+ ),
741
+ );
742
+
670
743
  export type LendingFacetKey =
671
744
  | 'is_lendable'
672
745
  | 'is_borrowable'
@@ -185,10 +185,16 @@ export class RestorationStateHandler
185
185
  }
186
186
  }
187
187
 
188
+ const dateField =
189
+ state.minSelectedDate?.includes('-') ||
190
+ state.maxSelectedDate?.includes('-')
191
+ ? 'date'
192
+ : 'year';
193
+
188
194
  if (state.minSelectedDate && state.maxSelectedDate) {
189
195
  newParams.append(
190
196
  'and[]',
191
- `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`,
197
+ `${dateField}:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`,
192
198
  );
193
199
  }
194
200
 
@@ -337,6 +343,7 @@ export class RestorationStateHandler
337
343
  }
338
344
 
339
345
  switch (field) {
346
+ case 'date':
340
347
  case 'year': {
341
348
  const [minDate, maxDate] = value.split(' TO ');
342
349
  // we have two potential ways of filtering by date:
@@ -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"]}