@internetarchive/collection-browser 0.3.2-alpha.4 → 0.3.2

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 (218) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +43 -43
  12. package/dist/src/app-root.js +233 -233
  13. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  14. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  15. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  17. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  18. package/dist/src/assets/img/icons/chevron.js +2 -2
  19. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  20. package/dist/src/assets/img/icons/empty-query.js +2 -2
  21. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  23. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  24. package/dist/src/assets/img/icons/eye.js +2 -2
  25. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  26. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  27. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  28. package/dist/src/assets/img/icons/login-required.js +2 -2
  29. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  30. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  31. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  55. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  56. package/dist/src/assets/img/icons/null-result.js +2 -2
  57. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  58. package/dist/src/assets/img/icons/restricted.js +2 -2
  59. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  60. package/dist/src/assets/img/icons/reviews.js +2 -2
  61. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  62. package/dist/src/assets/img/icons/upload.js +2 -2
  63. package/dist/src/assets/img/icons/views.d.ts +1 -1
  64. package/dist/src/assets/img/icons/views.js +2 -2
  65. package/dist/src/circular-activity-indicator.d.ts +5 -5
  66. package/dist/src/circular-activity-indicator.js +17 -17
  67. package/dist/src/collection-browser.d.ts +247 -247
  68. package/dist/src/collection-browser.js +1419 -1418
  69. package/dist/src/collection-browser.js.map +1 -1
  70. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  71. package/dist/src/collection-facets/facets-template.js +125 -125
  72. package/dist/src/collection-facets/more-facets-content.d.ts +74 -74
  73. package/dist/src/collection-facets/more-facets-content.js +330 -330
  74. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  75. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  76. package/dist/src/collection-facets.d.ts +73 -73
  77. package/dist/src/collection-facets.js +507 -507
  78. package/dist/src/collection-facets.js.map +1 -1
  79. package/dist/src/empty-placeholder.d.ts +11 -11
  80. package/dist/src/empty-placeholder.js +42 -42
  81. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  82. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  83. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  84. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  85. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  86. package/dist/src/mediatype/mediatype-config.js +85 -85
  87. package/dist/src/models.d.ts +97 -97
  88. package/dist/src/models.js +100 -100
  89. package/dist/src/restoration-state-handler.d.ts +45 -45
  90. package/dist/src/restoration-state-handler.js +220 -220
  91. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -9
  92. package/dist/src/sort-filter-bar/alpha-bar.js +41 -41
  93. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  94. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  95. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  96. package/dist/src/sort-filter-bar/img/list.js +2 -2
  97. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  98. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  99. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  100. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  101. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -107
  102. package/dist/src/sort-filter-bar/sort-filter-bar.js +423 -423
  103. package/dist/src/styles/item-image-styles.d.ts +8 -8
  104. package/dist/src/styles/item-image-styles.js +9 -9
  105. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  106. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  107. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  108. package/dist/src/tiles/grid/account-tile.js +20 -20
  109. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  110. package/dist/src/tiles/grid/collection-tile.js +23 -23
  111. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  112. package/dist/src/tiles/grid/item-tile.js +87 -87
  113. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  114. package/dist/src/tiles/grid/tile-stats.js +35 -35
  115. package/dist/src/tiles/image-block.d.ts +17 -17
  116. package/dist/src/tiles/image-block.js +69 -73
  117. package/dist/src/tiles/image-block.js.map +1 -1
  118. package/dist/src/tiles/item-image.d.ts +31 -31
  119. package/dist/src/tiles/item-image.js +103 -103
  120. package/dist/src/tiles/list/account-label.d.ts +1 -1
  121. package/dist/src/tiles/list/account-label.js +6 -6
  122. package/dist/src/tiles/list/date-label.d.ts +1 -1
  123. package/dist/src/tiles/list/date-label.js +12 -12
  124. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  125. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  126. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -20
  127. package/dist/src/tiles/list/tile-list-compact.js +88 -87
  128. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  129. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  130. package/dist/src/tiles/list/tile-list.js +265 -264
  131. package/dist/src/tiles/list/tile-list.js.map +1 -1
  132. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  133. package/dist/src/tiles/mediatype-icon.js +47 -47
  134. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -7
  135. package/dist/src/tiles/overlay/icon-overlay.js +30 -31
  136. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  137. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -8
  138. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  139. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  140. package/dist/src/tiles/text-snippet-block.js +81 -81
  141. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  142. package/dist/src/tiles/tile-dispatcher.js +128 -128
  143. package/dist/src/utils/analytics-events.d.ts +18 -18
  144. package/dist/src/utils/analytics-events.js +20 -20
  145. package/dist/src/utils/format-count.d.ts +7 -7
  146. package/dist/src/utils/format-count.js +76 -76
  147. package/dist/src/utils/format-date.d.ts +2 -2
  148. package/dist/src/utils/format-date.js +23 -23
  149. package/dist/test/collection-browser.test.d.ts +1 -1
  150. package/dist/test/collection-browser.test.js +333 -318
  151. package/dist/test/collection-browser.test.js.map +1 -1
  152. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  153. package/dist/test/collection-facets/facets-template.test.js +62 -62
  154. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  155. package/dist/test/collection-facets/more-facets-content.test.js +91 -91
  156. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  157. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  158. package/dist/test/collection-facets.test.d.ts +2 -2
  159. package/dist/test/collection-facets.test.js +423 -423
  160. package/dist/test/collection-facets.test.js.map +1 -1
  161. package/dist/test/empty-placeholder.test.d.ts +1 -1
  162. package/dist/test/empty-placeholder.test.js +33 -33
  163. package/dist/test/icon-overlay.test.d.ts +1 -1
  164. package/dist/test/icon-overlay.test.js +24 -24
  165. package/dist/test/image-block.test.d.ts +1 -0
  166. package/dist/test/image-block.test.js +79 -0
  167. package/dist/test/image-block.test.js.map +1 -0
  168. package/dist/test/item-image.test.d.ts +1 -1
  169. package/dist/test/item-image.test.js +56 -56
  170. package/dist/test/mediatype-config.test.d.ts +1 -1
  171. package/dist/test/mediatype-config.test.js +16 -16
  172. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  173. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  174. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  175. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  176. package/dist/test/mocks/mock-search-responses.d.ts +5 -5
  177. package/dist/test/mocks/mock-search-responses.js +103 -103
  178. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  179. package/dist/test/mocks/mock-search-service.js +25 -25
  180. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  181. package/dist/test/restoration-state-handler.test.js +117 -117
  182. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  183. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +113 -113
  184. package/dist/test/text-overlay.test.d.ts +1 -1
  185. package/dist/test/text-overlay.test.js +41 -41
  186. package/dist/test/text-snippet-block.test.d.ts +1 -1
  187. package/dist/test/text-snippet-block.test.js +57 -57
  188. package/dist/test/tile-stats.test.d.ts +1 -1
  189. package/dist/test/tile-stats.test.js +33 -33
  190. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  191. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  192. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -0
  193. package/dist/test/tiles/list/tile-list-compact.test.js +31 -0
  194. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -0
  195. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  196. package/dist/test/tiles/list/tile-list.test.js +36 -36
  197. package/dist/test/utils/format-count.test.d.ts +1 -1
  198. package/dist/test/utils/format-count.test.js +23 -23
  199. package/dist/test/utils/format-date.test.d.ts +1 -1
  200. package/dist/test/utils/format-date.test.js +17 -17
  201. package/index.html +24 -24
  202. package/local.archive.org.cert +86 -86
  203. package/local.archive.org.key +27 -27
  204. package/package.json +115 -115
  205. package/renovate.json +6 -6
  206. package/src/collection-browser.ts +1547 -1547
  207. package/src/collection-facets.ts +582 -582
  208. package/src/tiles/image-block.ts +7 -10
  209. package/src/tiles/list/tile-list-compact.ts +1 -0
  210. package/src/tiles/list/tile-list.ts +1 -0
  211. package/src/tiles/overlay/icon-overlay.ts +3 -4
  212. package/test/collection-browser.test.ts +24 -1
  213. package/test/collection-facets.test.ts +556 -556
  214. package/test/image-block.test.ts +86 -0
  215. package/test/tiles/list/tile-list-compact.test.ts +38 -0
  216. package/tsconfig.json +21 -21
  217. package/web-dev-server.config.mjs +30 -30
  218. package/web-test-runner.config.mjs +41 -41
@@ -1,556 +1,556 @@
1
- /* eslint-disable import/no-duplicates */
2
- import { expect, fixture } from '@open-wc/testing';
3
- import sinon from 'sinon';
4
- import { html } from 'lit';
5
- import { Aggregation } from '@internetarchive/search-service';
6
- import {
7
- ModalManager,
8
- ModalManagerInterface,
9
- } from '@internetarchive/modal-manager';
10
- import type { CollectionFacets } from '../src/collection-facets';
11
- import '@internetarchive/modal-manager';
12
- import '../src/collection-facets';
13
- import type { FacetOption, SelectedFacets } from '../src/models';
14
- import {
15
- LanguageCodeHandler,
16
- LanguageCodeHandlerInterface,
17
- } from '../src/language-code-handler/language-code-handler';
18
-
19
- describe('Collection Facets', () => {
20
- it('has loader', async () => {
21
- const el = await fixture<CollectionFacets>(
22
- html`<collection-facets ?facetsLoading=${true}></collection-facets>`
23
- );
24
-
25
- expect(
26
- el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
27
- ).to.be.true;
28
-
29
- el.facetsLoading = false;
30
- await el.updateComplete;
31
-
32
- expect(
33
- el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
34
- ).to.be.false;
35
- });
36
- it('renders aggregations as facets', async () => {
37
- const el = await fixture<CollectionFacets>(
38
- html`<collection-facets></collection-facets>`
39
- );
40
-
41
- const aggs: Record<string, Aggregation> = {
42
- subject: new Aggregation({
43
- buckets: [
44
- {
45
- key: 'foo',
46
- doc_count: 5,
47
- },
48
- ],
49
- }),
50
- };
51
-
52
- el.aggregations = aggs;
53
- await el.updateComplete;
54
- const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
55
- expect(facetGroups?.length).to.equal(1);
56
-
57
- const titleFacetGroup = facetGroups?.[0];
58
- const facetGroupHeader = titleFacetGroup?.querySelector('h1');
59
- expect(facetGroupHeader?.textContent?.trim()).to.equal('Subject');
60
- const titleFacetRow = titleFacetGroup
61
- ?.querySelector('facets-template')
62
- ?.shadowRoot?.querySelector('.facet-row');
63
- console.log(titleFacetGroup?.querySelector('facets-template'));
64
- expect(titleFacetRow?.textContent?.trim()).to.satisfy((text: string) =>
65
- /^foo\s*5$/.test(text)
66
- );
67
- });
68
-
69
- it('renders multiple aggregation types', async () => {
70
- const el = await fixture<CollectionFacets>(
71
- html`<collection-facets></collection-facets>`
72
- );
73
-
74
- const aggs: Record<string, Aggregation> = {
75
- subject: new Aggregation({
76
- buckets: [
77
- {
78
- key: 'foo',
79
- doc_count: 5,
80
- },
81
- ],
82
- }),
83
- mediatype: new Aggregation({
84
- buckets: [
85
- {
86
- key: 'bar',
87
- doc_count: 10,
88
- },
89
- ],
90
- }),
91
- };
92
-
93
- el.aggregations = aggs;
94
- await el.updateComplete;
95
-
96
- const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
97
- expect(facetGroups?.length).to.equal(2);
98
- });
99
-
100
- it('renders collection facets as links', async () => {
101
- const el = await fixture<CollectionFacets>(
102
- html`<collection-facets></collection-facets>`
103
- );
104
-
105
- const aggs: Record<string, Aggregation> = {
106
- collection: new Aggregation({
107
- buckets: [
108
- {
109
- key: 'foo',
110
- doc_count: 5,
111
- },
112
- ],
113
- }),
114
- };
115
-
116
- el.aggregations = aggs;
117
- await el.updateComplete;
118
-
119
- const collectionName = el.shadowRoot
120
- ?.querySelector('facets-template')
121
- ?.shadowRoot?.querySelector('async-collection-name');
122
- expect(collectionName?.parentElement).to.be.instanceOf(HTMLAnchorElement);
123
- expect(collectionName?.parentElement?.getAttribute('href')).to.equal(
124
- '/details/foo'
125
- );
126
- });
127
-
128
- it('renders non-collection facets without links', async () => {
129
- const el = await fixture<CollectionFacets>(
130
- html`<collection-facets></collection-facets>`
131
- );
132
-
133
- const aggs: Record<string, Aggregation> = {
134
- subject: new Aggregation({
135
- buckets: [
136
- {
137
- key: 'foo',
138
- doc_count: 5,
139
- },
140
- ],
141
- }),
142
- };
143
-
144
- el.aggregations = aggs;
145
- await el.updateComplete;
146
-
147
- const collectionName = el.shadowRoot
148
- ?.querySelector('facets-template')
149
- ?.shadowRoot?.querySelector('async-collection-name');
150
- expect(collectionName?.parentElement).to.not.be.instanceOf(
151
- HTMLAnchorElement
152
- );
153
- });
154
-
155
- it('renders language facets with their human-readable names', async () => {
156
- const el = await fixture<CollectionFacets>(
157
- html`<collection-facets></collection-facets>`
158
- );
159
-
160
- const languageCodeHandler: LanguageCodeHandlerInterface =
161
- new LanguageCodeHandler();
162
-
163
- const aggs: Record<string, Aggregation> = {
164
- language: new Aggregation({
165
- buckets: [
166
- {
167
- key: 'English',
168
- doc_count: 3,
169
- },
170
- ],
171
- }),
172
- };
173
-
174
- el.languageCodeHandler = languageCodeHandler;
175
- el.aggregations = aggs;
176
- await el.updateComplete;
177
-
178
- const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
179
- const languageTitle =
180
- facetsTemplate?.shadowRoot?.querySelector('.facet-title');
181
- expect(languageTitle?.textContent?.trim()).to.equal('English');
182
- });
183
-
184
- it('renders selected/negative language facets with human-readable names', async () => {
185
- const el = await fixture<CollectionFacets>(
186
- html`<collection-facets></collection-facets>`
187
- );
188
-
189
- const languageCodeHandler: LanguageCodeHandlerInterface =
190
- new LanguageCodeHandler();
191
-
192
- const selectedFacets: SelectedFacets = {
193
- subject: {},
194
- lending: {},
195
- mediatype: {},
196
- language: {
197
- en: {
198
- key: 'en',
199
- count: 5,
200
- state: 'selected',
201
- },
202
- },
203
- creator: {},
204
- collection: {},
205
- year: {},
206
- };
207
-
208
- el.languageCodeHandler = languageCodeHandler;
209
- el.selectedFacets = selectedFacets;
210
- await el.updateComplete;
211
-
212
- const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
213
- const languageTitle =
214
- facetsTemplate?.shadowRoot?.querySelector('.facet-title');
215
- expect(languageTitle?.textContent?.trim()).to.equal('English');
216
- });
217
-
218
- it('renders lending facets with human-readable names', async () => {
219
- const el = await fixture<CollectionFacets>(
220
- html`<collection-facets></collection-facets>`
221
- );
222
-
223
- const aggs: Record<string, Aggregation> = {
224
- lending: new Aggregation({
225
- buckets: [
226
- {
227
- key: 'is_lendable',
228
- doc_count: 3,
229
- },
230
- {
231
- key: 'available_to_borrow',
232
- doc_count: 2,
233
- },
234
- {
235
- key: 'is_readable',
236
- doc_count: 1,
237
- },
238
- ],
239
- }),
240
- };
241
-
242
- el.aggregations = aggs;
243
- await el.updateComplete;
244
-
245
- const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
246
- const lendingTitles =
247
- facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
248
- expect(lendingTitles?.length).to.equal(3);
249
- expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
250
- 'Lending Library'
251
- );
252
- expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
253
- 'Borrow 14 Days'
254
- );
255
- expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
256
- 'Always Available'
257
- );
258
- });
259
-
260
- it('renders selected/negative lending facets with human-readable names', async () => {
261
- const el = await fixture<CollectionFacets>(
262
- html`<collection-facets></collection-facets>`
263
- );
264
-
265
- const selectedFacets: SelectedFacets = {
266
- subject: {},
267
- lending: {
268
- is_lendable: {
269
- key: 'is_lendable',
270
- count: 5,
271
- state: 'selected',
272
- },
273
- available_to_borrow: {
274
- key: 'available_to_borrow',
275
- count: 4,
276
- state: 'selected',
277
- },
278
- is_readable: {
279
- key: 'is_readable',
280
- count: 3,
281
- state: 'hidden',
282
- },
283
- },
284
- mediatype: {},
285
- language: {},
286
- creator: {},
287
- collection: {},
288
- year: {},
289
- };
290
-
291
- el.selectedFacets = selectedFacets;
292
- await el.updateComplete;
293
-
294
- const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
295
- const lendingTitles =
296
- facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
297
- expect(lendingTitles?.length).to.equal(3);
298
- expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
299
- 'Lending Library'
300
- );
301
- expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
302
- 'Borrow 14 Days'
303
- );
304
- expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
305
- 'Always Available'
306
- );
307
- });
308
-
309
- it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {
310
- const el = await fixture<CollectionFacets>(
311
- html`<collection-facets></collection-facets>`
312
- );
313
-
314
- const aggs: Record<string, Aggregation> = {
315
- lending: new Aggregation({
316
- buckets: [
317
- {
318
- key: 'is_lendable',
319
- doc_count: 5,
320
- },
321
- {
322
- key: 'is_borrowable',
323
- doc_count: 4,
324
- },
325
- {
326
- key: 'available_to_borrow',
327
- doc_count: 5,
328
- },
329
- {
330
- key: 'is_browsable',
331
- doc_count: 4,
332
- },
333
- {
334
- key: 'available_to_browse',
335
- doc_count: 5,
336
- },
337
- {
338
- key: 'is_readable',
339
- doc_count: 4,
340
- },
341
- {
342
- key: 'available_to_waitlist',
343
- doc_count: 5,
344
- },
345
- ],
346
- }),
347
- };
348
-
349
- el.aggregations = aggs;
350
- await el.updateComplete;
351
-
352
- const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
353
- const lendingTitles =
354
- facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
355
- expect(lendingTitles?.length).to.equal(3);
356
- expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
357
- 'Lending Library'
358
- );
359
- expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
360
- 'Borrow 14 Days'
361
- );
362
- expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
363
- 'Always Available'
364
- );
365
- });
366
-
367
- it('does not render a More... link for lending facets', async () => {
368
- const el = await fixture<CollectionFacets>(
369
- html`<collection-facets></collection-facets>`
370
- );
371
-
372
- const aggs: Record<string, Aggregation> = {
373
- lending: new Aggregation({
374
- buckets: [
375
- {
376
- key: 'is_lendable',
377
- doc_count: 5,
378
- },
379
- {
380
- key: 'is_borrowable',
381
- doc_count: 4,
382
- },
383
- {
384
- key: 'available_to_borrow',
385
- doc_count: 5,
386
- },
387
- {
388
- key: 'is_browsable',
389
- doc_count: 4,
390
- },
391
- {
392
- key: 'available_to_browse',
393
- doc_count: 5,
394
- },
395
- {
396
- key: 'is_readable',
397
- doc_count: 4,
398
- },
399
- {
400
- key: 'available_to_waitlist',
401
- doc_count: 5,
402
- },
403
- ],
404
- }),
405
- };
406
-
407
- el.aggregations = aggs;
408
- await el.updateComplete;
409
-
410
- const moreLink = el.shadowRoot?.querySelector('.more-link');
411
- expect(moreLink).not.to.exist;
412
- });
413
-
414
- describe('More Facets', () => {
415
- it('Does not render < allowedFacetCount', async () => {
416
- const el = await fixture<CollectionFacets>(
417
- html`<collection-facets></collection-facets>`
418
- );
419
-
420
- const aggs: Record<string, Aggregation> = {
421
- subject: new Aggregation({
422
- buckets: [
423
- {
424
- key: 'foo',
425
- doc_count: 5,
426
- },
427
- ],
428
- }),
429
- };
430
-
431
- el.aggregations = aggs;
432
- await el.updateComplete;
433
-
434
- const moreLink = el.shadowRoot?.querySelector('.more-link');
435
- expect(moreLink).to.be.null;
436
- });
437
-
438
- it('renders sorting icons', async () => {
439
- const el = await fixture<CollectionFacets>(
440
- html`<collection-facets></collection-facets>`
441
- );
442
-
443
- const aggs: Record<string, Aggregation> = {
444
- subject: new Aggregation({
445
- buckets: [
446
- {
447
- key: 'foo',
448
- doc_count: 5,
449
- },
450
- ],
451
- }),
452
- };
453
-
454
- el.aggregations = aggs;
455
- await el.updateComplete;
456
-
457
- const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
458
- expect(sortingIcon).to.exist;
459
- });
460
-
461
- it('does not render sorting icon for lending facets', async () => {
462
- const el = await fixture<CollectionFacets>(
463
- html`<collection-facets></collection-facets>`
464
- );
465
-
466
- const aggs: Record<string, Aggregation> = {
467
- lending: new Aggregation({
468
- buckets: [
469
- {
470
- key: 'is_readable',
471
- doc_count: 5,
472
- },
473
- ],
474
- }),
475
- };
476
-
477
- el.aggregations = aggs;
478
- await el.updateComplete;
479
-
480
- const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
481
- expect(sortingIcon).not.to.exist;
482
- });
483
-
484
- it('Render More Facets', async () => {
485
- const el = await fixture<CollectionFacets>(
486
- html`<collection-facets
487
- .modalManager=${new ModalManager()}
488
- ></collection-facets>`
489
- );
490
-
491
- const aggs: Record<string, Aggregation> = {
492
- subject: new Aggregation({
493
- buckets: [
494
- {
495
- key: 'foo',
496
- doc_count: 5,
497
- },
498
- {
499
- key: 'fi',
500
- doc_count: 5,
501
- },
502
- {
503
- key: 'fum',
504
- doc_count: 5,
505
- },
506
- {
507
- key: 'flee',
508
- doc_count: 5,
509
- },
510
- {
511
- key: 'wheee',
512
- doc_count: 5,
513
- },
514
- {
515
- key: 'whooo',
516
- doc_count: 5,
517
- },
518
- {
519
- key: 'boop',
520
- doc_count: 5,
521
- },
522
- ],
523
- }),
524
- };
525
-
526
- el.aggregations = aggs;
527
- await el.updateComplete;
528
-
529
- let eventCaught = false;
530
- let eventFacet = '';
531
- el.addEventListener('showMoreFacets', e => {
532
- eventFacet = (e as CustomEvent).detail;
533
- eventCaught = true;
534
- });
535
-
536
- const moreLink = el.shadowRoot?.querySelector(
537
- '.more-link'
538
- ) as HTMLButtonElement;
539
- expect(moreLink).to.exist; // has link
540
-
541
- const showModalSpy = sinon.spy(
542
- el.modalManager as ModalManagerInterface,
543
- 'showModal'
544
- );
545
- // let's pop up modal
546
- moreLink?.click();
547
- await el.updateComplete;
548
-
549
- expect(showModalSpy.callCount).to.equal(1);
550
- expect(el.modalManager?.classList.contains('more-search-facets')).to.be
551
- .true;
552
- expect(eventCaught).to.be.true;
553
- expect(eventFacet).to.equal('subject' as FacetOption);
554
- });
555
- });
556
- });
1
+ /* eslint-disable import/no-duplicates */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import sinon from 'sinon';
4
+ import { html } from 'lit';
5
+ import { Aggregation } from '@internetarchive/search-service';
6
+ import {
7
+ ModalManager,
8
+ ModalManagerInterface,
9
+ } from '@internetarchive/modal-manager';
10
+ import type { CollectionFacets } from '../src/collection-facets';
11
+ import '@internetarchive/modal-manager';
12
+ import '../src/collection-facets';
13
+ import type { FacetOption, SelectedFacets } from '../src/models';
14
+ import {
15
+ LanguageCodeHandler,
16
+ LanguageCodeHandlerInterface,
17
+ } from '../src/language-code-handler/language-code-handler';
18
+
19
+ describe('Collection Facets', () => {
20
+ it('has loader', async () => {
21
+ const el = await fixture<CollectionFacets>(
22
+ html`<collection-facets ?facetsLoading=${true}></collection-facets>`
23
+ );
24
+
25
+ expect(
26
+ el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
27
+ ).to.be.true;
28
+
29
+ el.facetsLoading = false;
30
+ await el.updateComplete;
31
+
32
+ expect(
33
+ el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
34
+ ).to.be.false;
35
+ });
36
+ it('renders aggregations as facets', async () => {
37
+ const el = await fixture<CollectionFacets>(
38
+ html`<collection-facets></collection-facets>`
39
+ );
40
+
41
+ const aggs: Record<string, Aggregation> = {
42
+ subject: new Aggregation({
43
+ buckets: [
44
+ {
45
+ key: 'foo',
46
+ doc_count: 5,
47
+ },
48
+ ],
49
+ }),
50
+ };
51
+
52
+ el.aggregations = aggs;
53
+ await el.updateComplete;
54
+ const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
55
+ expect(facetGroups?.length).to.equal(1);
56
+
57
+ const titleFacetGroup = facetGroups?.[0];
58
+ const facetGroupHeader = titleFacetGroup?.querySelector('h1');
59
+ expect(facetGroupHeader?.textContent?.trim()).to.equal('Subject');
60
+ const titleFacetRow = titleFacetGroup
61
+ ?.querySelector('facets-template')
62
+ ?.shadowRoot?.querySelector('.facet-row');
63
+ console.log(titleFacetGroup?.querySelector('facets-template'));
64
+ expect(titleFacetRow?.textContent?.trim()).to.satisfy((text: string) =>
65
+ /^foo\s*5$/.test(text)
66
+ );
67
+ });
68
+
69
+ it('renders multiple aggregation types', async () => {
70
+ const el = await fixture<CollectionFacets>(
71
+ html`<collection-facets></collection-facets>`
72
+ );
73
+
74
+ const aggs: Record<string, Aggregation> = {
75
+ subject: new Aggregation({
76
+ buckets: [
77
+ {
78
+ key: 'foo',
79
+ doc_count: 5,
80
+ },
81
+ ],
82
+ }),
83
+ mediatype: new Aggregation({
84
+ buckets: [
85
+ {
86
+ key: 'bar',
87
+ doc_count: 10,
88
+ },
89
+ ],
90
+ }),
91
+ };
92
+
93
+ el.aggregations = aggs;
94
+ await el.updateComplete;
95
+
96
+ const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
97
+ expect(facetGroups?.length).to.equal(2);
98
+ });
99
+
100
+ it('renders collection facets as links', async () => {
101
+ const el = await fixture<CollectionFacets>(
102
+ html`<collection-facets></collection-facets>`
103
+ );
104
+
105
+ const aggs: Record<string, Aggregation> = {
106
+ collection: new Aggregation({
107
+ buckets: [
108
+ {
109
+ key: 'foo',
110
+ doc_count: 5,
111
+ },
112
+ ],
113
+ }),
114
+ };
115
+
116
+ el.aggregations = aggs;
117
+ await el.updateComplete;
118
+
119
+ const collectionName = el.shadowRoot
120
+ ?.querySelector('facets-template')
121
+ ?.shadowRoot?.querySelector('async-collection-name');
122
+ expect(collectionName?.parentElement).to.be.instanceOf(HTMLAnchorElement);
123
+ expect(collectionName?.parentElement?.getAttribute('href')).to.equal(
124
+ '/details/foo'
125
+ );
126
+ });
127
+
128
+ it('renders non-collection facets without links', async () => {
129
+ const el = await fixture<CollectionFacets>(
130
+ html`<collection-facets></collection-facets>`
131
+ );
132
+
133
+ const aggs: Record<string, Aggregation> = {
134
+ subject: new Aggregation({
135
+ buckets: [
136
+ {
137
+ key: 'foo',
138
+ doc_count: 5,
139
+ },
140
+ ],
141
+ }),
142
+ };
143
+
144
+ el.aggregations = aggs;
145
+ await el.updateComplete;
146
+
147
+ const collectionName = el.shadowRoot
148
+ ?.querySelector('facets-template')
149
+ ?.shadowRoot?.querySelector('async-collection-name');
150
+ expect(collectionName?.parentElement).to.not.be.instanceOf(
151
+ HTMLAnchorElement
152
+ );
153
+ });
154
+
155
+ it('renders language facets with their human-readable names', async () => {
156
+ const el = await fixture<CollectionFacets>(
157
+ html`<collection-facets></collection-facets>`
158
+ );
159
+
160
+ const languageCodeHandler: LanguageCodeHandlerInterface =
161
+ new LanguageCodeHandler();
162
+
163
+ const aggs: Record<string, Aggregation> = {
164
+ language: new Aggregation({
165
+ buckets: [
166
+ {
167
+ key: 'English',
168
+ doc_count: 3,
169
+ },
170
+ ],
171
+ }),
172
+ };
173
+
174
+ el.languageCodeHandler = languageCodeHandler;
175
+ el.aggregations = aggs;
176
+ await el.updateComplete;
177
+
178
+ const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
179
+ const languageTitle =
180
+ facetsTemplate?.shadowRoot?.querySelector('.facet-title');
181
+ expect(languageTitle?.textContent?.trim()).to.equal('English');
182
+ });
183
+
184
+ it('renders selected/negative language facets with human-readable names', async () => {
185
+ const el = await fixture<CollectionFacets>(
186
+ html`<collection-facets></collection-facets>`
187
+ );
188
+
189
+ const languageCodeHandler: LanguageCodeHandlerInterface =
190
+ new LanguageCodeHandler();
191
+
192
+ const selectedFacets: SelectedFacets = {
193
+ subject: {},
194
+ lending: {},
195
+ mediatype: {},
196
+ language: {
197
+ en: {
198
+ key: 'en',
199
+ count: 5,
200
+ state: 'selected',
201
+ },
202
+ },
203
+ creator: {},
204
+ collection: {},
205
+ year: {},
206
+ };
207
+
208
+ el.languageCodeHandler = languageCodeHandler;
209
+ el.selectedFacets = selectedFacets;
210
+ await el.updateComplete;
211
+
212
+ const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
213
+ const languageTitle =
214
+ facetsTemplate?.shadowRoot?.querySelector('.facet-title');
215
+ expect(languageTitle?.textContent?.trim()).to.equal('English');
216
+ });
217
+
218
+ it('renders lending facets with human-readable names', async () => {
219
+ const el = await fixture<CollectionFacets>(
220
+ html`<collection-facets></collection-facets>`
221
+ );
222
+
223
+ const aggs: Record<string, Aggregation> = {
224
+ lending: new Aggregation({
225
+ buckets: [
226
+ {
227
+ key: 'is_lendable',
228
+ doc_count: 3,
229
+ },
230
+ {
231
+ key: 'available_to_borrow',
232
+ doc_count: 2,
233
+ },
234
+ {
235
+ key: 'is_readable',
236
+ doc_count: 1,
237
+ },
238
+ ],
239
+ }),
240
+ };
241
+
242
+ el.aggregations = aggs;
243
+ await el.updateComplete;
244
+
245
+ const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
246
+ const lendingTitles =
247
+ facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
248
+ expect(lendingTitles?.length).to.equal(3);
249
+ expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
250
+ 'Lending Library'
251
+ );
252
+ expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
253
+ 'Borrow 14 Days'
254
+ );
255
+ expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
256
+ 'Always Available'
257
+ );
258
+ });
259
+
260
+ it('renders selected/negative lending facets with human-readable names', async () => {
261
+ const el = await fixture<CollectionFacets>(
262
+ html`<collection-facets></collection-facets>`
263
+ );
264
+
265
+ const selectedFacets: SelectedFacets = {
266
+ subject: {},
267
+ lending: {
268
+ is_lendable: {
269
+ key: 'is_lendable',
270
+ count: 5,
271
+ state: 'selected',
272
+ },
273
+ available_to_borrow: {
274
+ key: 'available_to_borrow',
275
+ count: 4,
276
+ state: 'selected',
277
+ },
278
+ is_readable: {
279
+ key: 'is_readable',
280
+ count: 3,
281
+ state: 'hidden',
282
+ },
283
+ },
284
+ mediatype: {},
285
+ language: {},
286
+ creator: {},
287
+ collection: {},
288
+ year: {},
289
+ };
290
+
291
+ el.selectedFacets = selectedFacets;
292
+ await el.updateComplete;
293
+
294
+ const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
295
+ const lendingTitles =
296
+ facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
297
+ expect(lendingTitles?.length).to.equal(3);
298
+ expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
299
+ 'Lending Library'
300
+ );
301
+ expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
302
+ 'Borrow 14 Days'
303
+ );
304
+ expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
305
+ 'Always Available'
306
+ );
307
+ });
308
+
309
+ it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {
310
+ const el = await fixture<CollectionFacets>(
311
+ html`<collection-facets></collection-facets>`
312
+ );
313
+
314
+ const aggs: Record<string, Aggregation> = {
315
+ lending: new Aggregation({
316
+ buckets: [
317
+ {
318
+ key: 'is_lendable',
319
+ doc_count: 5,
320
+ },
321
+ {
322
+ key: 'is_borrowable',
323
+ doc_count: 4,
324
+ },
325
+ {
326
+ key: 'available_to_borrow',
327
+ doc_count: 5,
328
+ },
329
+ {
330
+ key: 'is_browsable',
331
+ doc_count: 4,
332
+ },
333
+ {
334
+ key: 'available_to_browse',
335
+ doc_count: 5,
336
+ },
337
+ {
338
+ key: 'is_readable',
339
+ doc_count: 4,
340
+ },
341
+ {
342
+ key: 'available_to_waitlist',
343
+ doc_count: 5,
344
+ },
345
+ ],
346
+ }),
347
+ };
348
+
349
+ el.aggregations = aggs;
350
+ await el.updateComplete;
351
+
352
+ const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
353
+ const lendingTitles =
354
+ facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
355
+ expect(lendingTitles?.length).to.equal(3);
356
+ expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
357
+ 'Lending Library'
358
+ );
359
+ expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
360
+ 'Borrow 14 Days'
361
+ );
362
+ expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
363
+ 'Always Available'
364
+ );
365
+ });
366
+
367
+ it('does not render a More... link for lending facets', async () => {
368
+ const el = await fixture<CollectionFacets>(
369
+ html`<collection-facets></collection-facets>`
370
+ );
371
+
372
+ const aggs: Record<string, Aggregation> = {
373
+ lending: new Aggregation({
374
+ buckets: [
375
+ {
376
+ key: 'is_lendable',
377
+ doc_count: 5,
378
+ },
379
+ {
380
+ key: 'is_borrowable',
381
+ doc_count: 4,
382
+ },
383
+ {
384
+ key: 'available_to_borrow',
385
+ doc_count: 5,
386
+ },
387
+ {
388
+ key: 'is_browsable',
389
+ doc_count: 4,
390
+ },
391
+ {
392
+ key: 'available_to_browse',
393
+ doc_count: 5,
394
+ },
395
+ {
396
+ key: 'is_readable',
397
+ doc_count: 4,
398
+ },
399
+ {
400
+ key: 'available_to_waitlist',
401
+ doc_count: 5,
402
+ },
403
+ ],
404
+ }),
405
+ };
406
+
407
+ el.aggregations = aggs;
408
+ await el.updateComplete;
409
+
410
+ const moreLink = el.shadowRoot?.querySelector('.more-link');
411
+ expect(moreLink).not.to.exist;
412
+ });
413
+
414
+ describe('More Facets', () => {
415
+ it('Does not render < allowedFacetCount', async () => {
416
+ const el = await fixture<CollectionFacets>(
417
+ html`<collection-facets></collection-facets>`
418
+ );
419
+
420
+ const aggs: Record<string, Aggregation> = {
421
+ subject: new Aggregation({
422
+ buckets: [
423
+ {
424
+ key: 'foo',
425
+ doc_count: 5,
426
+ },
427
+ ],
428
+ }),
429
+ };
430
+
431
+ el.aggregations = aggs;
432
+ await el.updateComplete;
433
+
434
+ const moreLink = el.shadowRoot?.querySelector('.more-link');
435
+ expect(moreLink).to.be.null;
436
+ });
437
+
438
+ it('renders sorting icons', async () => {
439
+ const el = await fixture<CollectionFacets>(
440
+ html`<collection-facets></collection-facets>`
441
+ );
442
+
443
+ const aggs: Record<string, Aggregation> = {
444
+ subject: new Aggregation({
445
+ buckets: [
446
+ {
447
+ key: 'foo',
448
+ doc_count: 5,
449
+ },
450
+ ],
451
+ }),
452
+ };
453
+
454
+ el.aggregations = aggs;
455
+ await el.updateComplete;
456
+
457
+ const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
458
+ expect(sortingIcon).to.exist;
459
+ });
460
+
461
+ it('does not render sorting icon for lending facets', async () => {
462
+ const el = await fixture<CollectionFacets>(
463
+ html`<collection-facets></collection-facets>`
464
+ );
465
+
466
+ const aggs: Record<string, Aggregation> = {
467
+ lending: new Aggregation({
468
+ buckets: [
469
+ {
470
+ key: 'is_readable',
471
+ doc_count: 5,
472
+ },
473
+ ],
474
+ }),
475
+ };
476
+
477
+ el.aggregations = aggs;
478
+ await el.updateComplete;
479
+
480
+ const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
481
+ expect(sortingIcon).not.to.exist;
482
+ });
483
+
484
+ it('Render More Facets', async () => {
485
+ const el = await fixture<CollectionFacets>(
486
+ html`<collection-facets
487
+ .modalManager=${new ModalManager()}
488
+ ></collection-facets>`
489
+ );
490
+
491
+ const aggs: Record<string, Aggregation> = {
492
+ subject: new Aggregation({
493
+ buckets: [
494
+ {
495
+ key: 'foo',
496
+ doc_count: 5,
497
+ },
498
+ {
499
+ key: 'fi',
500
+ doc_count: 5,
501
+ },
502
+ {
503
+ key: 'fum',
504
+ doc_count: 5,
505
+ },
506
+ {
507
+ key: 'flee',
508
+ doc_count: 5,
509
+ },
510
+ {
511
+ key: 'wheee',
512
+ doc_count: 5,
513
+ },
514
+ {
515
+ key: 'whooo',
516
+ doc_count: 5,
517
+ },
518
+ {
519
+ key: 'boop',
520
+ doc_count: 5,
521
+ },
522
+ ],
523
+ }),
524
+ };
525
+
526
+ el.aggregations = aggs;
527
+ await el.updateComplete;
528
+
529
+ let eventCaught = false;
530
+ let eventFacet = '';
531
+ el.addEventListener('showMoreFacets', e => {
532
+ eventFacet = (e as CustomEvent).detail;
533
+ eventCaught = true;
534
+ });
535
+
536
+ const moreLink = el.shadowRoot?.querySelector(
537
+ '.more-link'
538
+ ) as HTMLButtonElement;
539
+ expect(moreLink).to.exist; // has link
540
+
541
+ const showModalSpy = sinon.spy(
542
+ el.modalManager as ModalManagerInterface,
543
+ 'showModal'
544
+ );
545
+ // let's pop up modal
546
+ moreLink?.click();
547
+ await el.updateComplete;
548
+
549
+ expect(showModalSpy.callCount).to.equal(1);
550
+ expect(el.modalManager?.classList.contains('more-search-facets')).to.be
551
+ .true;
552
+ expect(eventCaught).to.be.true;
553
+ expect(eventFacet).to.equal('subject' as FacetOption);
554
+ });
555
+ });
556
+ });