@internetarchive/collection-browser 3.4.1 → 3.5.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.
- package/.editorconfig +29 -29
- package/.github/workflows/ci.yml +27 -27
- package/.github/workflows/gh-pages-main.yml +39 -39
- package/.github/workflows/npm-publish.yml +39 -39
- package/.github/workflows/pr-preview.yml +38 -38
- package/.husky/pre-commit +4 -4
- package/.prettierignore +1 -1
- package/LICENSE +661 -661
- package/README.md +83 -83
- package/dist/src/app-root.js +19 -28
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-browser.d.ts +27 -4
- package/dist/src/collection-browser.js +973 -801
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facet-row.js +143 -143
- package/dist/src/collection-facets/facet-row.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.js +29 -40
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-pagination.js +6 -10
- package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +16 -21
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +7 -10
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js +3 -2
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +9 -11
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +7 -7
- package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -1
- package/dist/src/collection-facets/toggle-switch.js +4 -6
- package/dist/src/collection-facets/toggle-switch.js.map +1 -1
- package/dist/src/collection-facets.js +309 -310
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source-interface.d.ts +10 -1
- package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source.d.ts +19 -1
- package/dist/src/data-source/collection-browser-data-source.js +71 -65
- package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
- package/dist/src/data-source/collection-browser-query-state.d.ts +1 -2
- package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
- package/dist/src/data-source/models.d.ts +11 -0
- package/dist/src/data-source/models.js.map +1 -1
- package/dist/src/empty-placeholder.js +19 -18
- package/dist/src/empty-placeholder.js.map +1 -1
- package/dist/src/expanded-date-picker.js +6 -10
- package/dist/src/expanded-date-picker.js.map +1 -1
- package/dist/src/language-code-handler/language-code-handler.js +2 -2
- package/dist/src/language-code-handler/language-code-handler.js.map +1 -1
- package/dist/src/manage/manage-bar.js +9 -15
- package/dist/src/manage/manage-bar.js.map +1 -1
- package/dist/src/manage/remove-items-modal-content.js +2 -2
- package/dist/src/manage/remove-items-modal-content.js.map +1 -1
- package/dist/src/models.d.ts +2 -6
- package/dist/src/models.js +44 -54
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.d.ts +1 -2
- package/dist/src/restoration-state-handler.js +12 -19
- package/dist/src/restoration-state-handler.js.map +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.js +9 -14
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +14 -24
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/base-tile-component.js +1 -2
- package/dist/src/tiles/base-tile-component.js.map +1 -1
- package/dist/src/tiles/grid/account-tile.js +5 -7
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +3 -6
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +23 -33
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/search-tile.js +1 -2
- package/dist/src/tiles/grid/search-tile.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.js +2 -3
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/src/tiles/hover/hover-pane-controller.js +21 -28
- package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
- package/dist/src/tiles/hover/tile-hover-pane.js +3 -4
- package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -1
- package/dist/src/tiles/image-block.js +5 -8
- package/dist/src/tiles/image-block.js.map +1 -1
- package/dist/src/tiles/item-image.js +12 -19
- package/dist/src/tiles/item-image.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact.js +17 -25
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.js +34 -55
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/overlay/icon-overlay.js +1 -2
- package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
- package/dist/src/tiles/overlay/text-overlay.js +2 -4
- package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
- package/dist/src/tiles/text-snippet-block.js +2 -4
- package/dist/src/tiles/text-snippet-block.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.js +22 -30
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/tiles/tile-display-value-provider.js +5 -9
- package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
- package/dist/src/tiles/tile-mediatype-icon.js +12 -19
- package/dist/src/tiles/tile-mediatype-icon.js.map +1 -1
- package/dist/src/utils/collapse-repeated-quotes.js +1 -1
- package/dist/src/utils/collapse-repeated-quotes.js.map +1 -1
- package/dist/src/utils/facet-utils.js +3 -5
- package/dist/src/utils/facet-utils.js.map +1 -1
- package/dist/src/utils/format-count.js +10 -10
- package/dist/src/utils/format-count.js.map +1 -1
- package/dist/src/utils/resolve-mediatype.js +2 -3
- package/dist/src/utils/resolve-mediatype.js.map +1 -1
- package/dist/test/collection-browser.test.js +336 -380
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facet-row.test.js +37 -52
- package/dist/test/collection-facets/facet-row.test.js.map +1 -1
- package/dist/test/collection-facets/facets-template.test.js +17 -23
- package/dist/test/collection-facets/facets-template.test.js.map +1 -1
- package/dist/test/collection-facets/more-facets-content.test.js +22 -32
- package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
- package/dist/test/collection-facets/more-facets-pagination.test.js +16 -22
- package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -1
- package/dist/test/collection-facets/toggle-switch.test.js +22 -19
- package/dist/test/collection-facets/toggle-switch.test.js.map +1 -1
- package/dist/test/collection-facets.test.js +60 -77
- package/dist/test/collection-facets.test.js.map +1 -1
- package/dist/test/empty-placeholder.test.js +11 -17
- package/dist/test/empty-placeholder.test.js.map +1 -1
- package/dist/test/expanded-date-picker.test.js +8 -14
- package/dist/test/expanded-date-picker.test.js.map +1 -1
- package/dist/test/icon-overlay.test.js +7 -6
- package/dist/test/icon-overlay.test.js.map +1 -1
- package/dist/test/image-block.test.js +16 -26
- package/dist/test/image-block.test.js.map +1 -1
- package/dist/test/item-image.test.js +23 -32
- package/dist/test/item-image.test.js.map +1 -1
- package/dist/test/manage/manage-bar.test.js +21 -33
- package/dist/test/manage/manage-bar.test.js.map +1 -1
- package/dist/test/manage/remove-items-modal-content.test.js +10 -15
- package/dist/test/manage/remove-items-modal-content.test.js.map +1 -1
- package/dist/test/mocks/mock-search-service.js +2 -3
- package/dist/test/mocks/mock-search-service.js.map +1 -1
- package/dist/test/restoration-state-handler.test.js +14 -54
- package/dist/test/restoration-state-handler.test.js.map +1 -1
- package/dist/test/review-block.test.js +16 -18
- package/dist/test/review-block.test.js.map +1 -1
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +2 -3
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.js +18 -24
- package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +178 -180
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/dist/test/text-overlay.test.js +16 -15
- package/dist/test/text-overlay.test.js.map +1 -1
- package/dist/test/text-snippet-block.test.js +14 -19
- package/dist/test/text-snippet-block.test.js.map +1 -1
- package/dist/test/tile-stats.test.js +73 -34
- package/dist/test/tile-stats.test.js.map +1 -1
- package/dist/test/tiles/grid/account-tile.test.js +25 -25
- package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
- package/dist/test/tiles/grid/collection-tile.test.js +13 -19
- package/dist/test/tiles/grid/collection-tile.test.js.map +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +64 -91
- package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
- package/dist/test/tiles/grid/search-tile.test.js +9 -13
- package/dist/test/tiles/grid/search-tile.test.js.map +1 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.js +23 -35
- package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
- package/dist/test/tiles/hover/tile-hover-pane.test.js +12 -16
- package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -1
- package/dist/test/tiles/list/tile-list-compact.test.js +34 -48
- package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
- package/dist/test/tiles/list/tile-list.test.js +76 -105
- package/dist/test/tiles/list/tile-list.test.js.map +1 -1
- package/dist/test/tiles/tile-dispatcher.test.js +17 -30
- package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
- package/dist/test/tiles/tile-mediatype-icon.test.js +12 -24
- package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -1
- package/eslint.config.mjs +53 -53
- package/index.html +24 -24
- package/local.archive.org.cert +86 -86
- package/local.archive.org.key +27 -27
- package/package.json +119 -118
- package/renovate.json +6 -6
- package/src/collection-browser.ts +3071 -2829
- package/src/collection-facets/facet-row.ts +299 -296
- package/src/collection-facets.ts +1010 -995
- package/src/data-source/collection-browser-data-source-interface.ts +345 -333
- package/src/data-source/collection-browser-data-source.ts +1441 -1401
- package/src/data-source/collection-browser-query-state.ts +59 -65
- package/src/data-source/models.ts +56 -43
- package/src/models.ts +864 -870
- package/src/restoration-state-handler.ts +546 -544
- package/test/collection-browser.test.ts +2413 -2403
- package/test/restoration-state-handler.test.ts +480 -510
- package/tsconfig.json +25 -20
- package/vite.config.ts +29 -22
- package/web-dev-server.config.mjs +30 -30
- package/web-test-runner.config.mjs +41 -41
|
@@ -68,13 +68,12 @@ describe('Restoration state handler', () => {
|
|
|
68
68
|
expect(restorationState.currentPage).to.equal(42);
|
|
69
69
|
});
|
|
70
70
|
it('should restore selected year facets from URL', async () => {
|
|
71
|
-
var _a;
|
|
72
71
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
73
72
|
const url = new URL(window.location.href);
|
|
74
73
|
url.search = '?and[]=year:"2018"';
|
|
75
74
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
76
75
|
const restorationState = handler.getRestorationState();
|
|
77
|
-
expect(
|
|
76
|
+
expect(restorationState.selectedFacets.year?.['2018'].state).to.equal('selected');
|
|
78
77
|
});
|
|
79
78
|
it('should ignore unrecognized facet types in URL', async () => {
|
|
80
79
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
@@ -110,62 +109,56 @@ describe('Restoration state handler', () => {
|
|
|
110
109
|
expect(restorationState.selectedTitleFilter).to.equal('F');
|
|
111
110
|
});
|
|
112
111
|
it('should restore other selected facets from URL', async () => {
|
|
113
|
-
var _a;
|
|
114
112
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
115
113
|
const url = new URL(window.location.href);
|
|
116
114
|
url.search = '?and[]=subject:"foo"';
|
|
117
115
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
118
116
|
const restorationState = handler.getRestorationState();
|
|
119
|
-
expect(
|
|
117
|
+
expect(restorationState.selectedFacets.subject?.foo.state).to.equal('selected');
|
|
120
118
|
});
|
|
121
119
|
it('should restore negative facets from URL', async () => {
|
|
122
|
-
var _a;
|
|
123
120
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
124
121
|
const url = new URL(window.location.href);
|
|
125
122
|
url.search = '?not[]=year:2018';
|
|
126
123
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
127
124
|
const restorationState = handler.getRestorationState();
|
|
128
|
-
expect(
|
|
125
|
+
expect(restorationState.selectedFacets.year?.['2018'].state).to.equal('hidden');
|
|
129
126
|
});
|
|
130
127
|
it('should restore multiple selected/negative facets from URL', async () => {
|
|
131
|
-
var _a, _b, _c, _d;
|
|
132
128
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
133
129
|
const url = new URL(window.location.href);
|
|
134
130
|
url.search =
|
|
135
131
|
'?and[]=collection:"foo"&and[]=collection:"bar"¬[]=collection:"baz"¬[]=collection:"boop"';
|
|
136
132
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
137
133
|
const restorationState = handler.getRestorationState();
|
|
138
|
-
expect(
|
|
139
|
-
expect(
|
|
140
|
-
expect(
|
|
141
|
-
expect(
|
|
134
|
+
expect(restorationState.selectedFacets.collection?.foo.state).to.equal('selected');
|
|
135
|
+
expect(restorationState.selectedFacets.collection?.bar.state).to.equal('selected');
|
|
136
|
+
expect(restorationState.selectedFacets.collection?.baz.state).to.equal('hidden');
|
|
137
|
+
expect(restorationState.selectedFacets.collection?.boop.state).to.equal('hidden');
|
|
142
138
|
});
|
|
143
139
|
it('negative facets take precedence if both present in URL', async () => {
|
|
144
|
-
var _a;
|
|
145
140
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
146
141
|
const url = new URL(window.location.href);
|
|
147
142
|
url.search = '?and[]=collection:"foo"¬[]=collection:"foo"';
|
|
148
143
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
149
144
|
const restorationState = handler.getRestorationState();
|
|
150
|
-
expect(
|
|
145
|
+
expect(restorationState.selectedFacets.collection?.foo.state).to.equal('hidden');
|
|
151
146
|
});
|
|
152
147
|
it('should restore selected facets with numbers in the square brackets', async () => {
|
|
153
|
-
var _a;
|
|
154
148
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
155
149
|
const url = new URL(window.location.href);
|
|
156
150
|
url.search = '?and[12]=subject:"foo"';
|
|
157
151
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
158
152
|
const restorationState = handler.getRestorationState();
|
|
159
|
-
expect(
|
|
153
|
+
expect(restorationState.selectedFacets.subject?.foo.state).to.equal('selected');
|
|
160
154
|
});
|
|
161
155
|
it('should restore negative facets with numbers in the square brackets', async () => {
|
|
162
|
-
var _a;
|
|
163
156
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
164
157
|
const url = new URL(window.location.href);
|
|
165
158
|
url.search = '?not[12]=year:2018';
|
|
166
159
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
167
160
|
const restorationState = handler.getRestorationState();
|
|
168
|
-
expect(
|
|
161
|
+
expect(restorationState.selectedFacets.year?.['2018'].state).to.equal('hidden');
|
|
169
162
|
});
|
|
170
163
|
it('should restore any TV clip filters from URL', async () => {
|
|
171
164
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
@@ -174,22 +167,22 @@ describe('Restoration state handler', () => {
|
|
|
174
167
|
url.search = '?only_commercials=1';
|
|
175
168
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
176
169
|
const commercialsRestorationState = handler.getRestorationState();
|
|
177
|
-
expect(commercialsRestorationState.
|
|
170
|
+
expect(commercialsRestorationState.selectedFacets.clip_type?.commercial.state).to.equal('selected');
|
|
178
171
|
// Fact checks
|
|
179
172
|
url.search = '?only_factchecks=1';
|
|
180
173
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
181
174
|
const factchecksRestorationState = handler.getRestorationState();
|
|
182
|
-
expect(factchecksRestorationState.
|
|
175
|
+
expect(factchecksRestorationState.selectedFacets.clip_type?.['fact check'].state).to.equal('selected');
|
|
183
176
|
// Quotes
|
|
184
177
|
url.search = '?only_quotes=1';
|
|
185
178
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
186
179
|
const quotesRestorationState = handler.getRestorationState();
|
|
187
|
-
expect(quotesRestorationState.
|
|
180
|
+
expect(quotesRestorationState.selectedFacets.clip_type?.quote.state).to.equal('selected');
|
|
188
181
|
// No filter param
|
|
189
182
|
url.search = '';
|
|
190
183
|
window.history.replaceState({ path: url.href }, '', url.href);
|
|
191
184
|
const unfilteredRestorationState = handler.getRestorationState();
|
|
192
|
-
expect(unfilteredRestorationState.
|
|
185
|
+
expect(unfilteredRestorationState.selectedFacets.clip_type).to.deep.equal({});
|
|
193
186
|
});
|
|
194
187
|
it('should restore sort from URL (space format)', async () => {
|
|
195
188
|
const handler = new RestorationStateHandler({ context: 'search' });
|
|
@@ -292,39 +285,6 @@ describe('Restoration state handler', () => {
|
|
|
292
285
|
});
|
|
293
286
|
expect(window.location.search).to.equal('?page=2');
|
|
294
287
|
});
|
|
295
|
-
it('should persist TV clip filter types to the URL', async () => {
|
|
296
|
-
const url = new URL(window.location.href);
|
|
297
|
-
url.search = '';
|
|
298
|
-
window.history.replaceState({ path: url.href }, '', url.href);
|
|
299
|
-
// Commercials
|
|
300
|
-
const handler = new RestorationStateHandler({ context: 'search' });
|
|
301
|
-
handler.persistState({
|
|
302
|
-
tvClipFilter: 'commercials',
|
|
303
|
-
selectedFacets: getDefaultSelectedFacets(),
|
|
304
|
-
});
|
|
305
|
-
expect(window.location.search).to.equal('?only_commercials=1');
|
|
306
|
-
// Fact checks
|
|
307
|
-
window.history.replaceState({ path: url.href }, '', url.href);
|
|
308
|
-
handler.persistState({
|
|
309
|
-
tvClipFilter: 'factchecks',
|
|
310
|
-
selectedFacets: getDefaultSelectedFacets(),
|
|
311
|
-
});
|
|
312
|
-
expect(window.location.search).to.equal('?only_factchecks=1');
|
|
313
|
-
// Quotes
|
|
314
|
-
window.history.replaceState({ path: url.href }, '', url.href);
|
|
315
|
-
handler.persistState({
|
|
316
|
-
tvClipFilter: 'quotes',
|
|
317
|
-
selectedFacets: getDefaultSelectedFacets(),
|
|
318
|
-
});
|
|
319
|
-
expect(window.location.search).to.equal('?only_quotes=1');
|
|
320
|
-
// Unfiltered
|
|
321
|
-
window.history.replaceState({ path: url.href }, '', url.href);
|
|
322
|
-
handler.persistState({
|
|
323
|
-
tvClipFilter: 'all',
|
|
324
|
-
selectedFacets: getDefaultSelectedFacets(),
|
|
325
|
-
});
|
|
326
|
-
expect(window.location.search).to.equal('');
|
|
327
|
-
});
|
|
328
288
|
it('should upgrade legacy search params to new ones', async () => {
|
|
329
289
|
const url = new URL(window.location.href);
|
|
330
290
|
url.search = '?q=foo';
|
|
@@ -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 { SortField, 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 default 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.DEFAULT);\n });\n\n it('should restore default 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.DEFAULT);\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 radio 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=RADIO';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.RADIO);\n });\n\n it('should restore TV 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=TV';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.TV);\n });\n\n it('should restore metadata 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=MD';\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 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\"¬[]=collection:\"baz\"¬[]=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\"¬[]=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 selected facets with numbers in the square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[12]=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 with numbers in the square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[12]=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 any TV clip filters from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n const url = new URL(window.location.href);\n\n // Commercials\n url.search = '?only_commercials=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const commercialsRestorationState = handler.getRestorationState();\n expect(commercialsRestorationState.tvClipFilter).to.equal('commercials');\n\n // Fact checks\n url.search = '?only_factchecks=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const factchecksRestorationState = handler.getRestorationState();\n expect(factchecksRestorationState.tvClipFilter).to.equal('factchecks');\n\n // Quotes\n url.search = '?only_quotes=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const quotesRestorationState = handler.getRestorationState();\n expect(quotesRestorationState.tvClipFilter).to.equal('quotes');\n\n // No filter param\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n const unfilteredRestorationState = handler.getRestorationState();\n expect(unfilteredRestorationState.tvClipFilter).not.to.exist;\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 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=foo+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('unrecognized');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore unrecognized sort from URL (prefix format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('unrecognized');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should save direction to URL even for unrecognized sort fields', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n sortDirection: 'desc',\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=-foo');\n });\n\n it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=foo+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=-foo');\n });\n\n it('should just ignore unrecognized sort fields w/ unknown formats', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=+foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=+foo');\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 persist TV clip filter types to the URL', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n // Commercials\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n tvClipFilter: 'commercials',\n selectedFacets: getDefaultSelectedFacets(),\n });\n expect(window.location.search).to.equal('?only_commercials=1');\n\n // Fact checks\n window.history.replaceState({ path: url.href }, '', url.href);\n handler.persistState({\n tvClipFilter: 'factchecks',\n selectedFacets: getDefaultSelectedFacets(),\n });\n expect(window.location.search).to.equal('?only_factchecks=1');\n\n // Quotes\n window.history.replaceState({ path: url.href }, '', url.href);\n handler.persistState({\n tvClipFilter: 'quotes',\n selectedFacets: getDefaultSelectedFacets(),\n });\n expect(window.location.search).to.equal('?only_quotes=1');\n\n // Unfiltered\n window.history.replaceState({ path: url.href }, '', url.href);\n handler.persistState({\n tvClipFilter: 'all',\n selectedFacets: getDefaultSelectedFacets(),\n });\n expect(window.location.search).to.equal('');\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 it('should persist metadata search type only when option is true', 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(\n {\n selectedFacets: getDefaultSelectedFacets(),\n searchType: SearchType.METADATA,\n },\n { persistMetadataSearchType: false },\n );\n expect(window.location.search).to.equal('');\n\n handler.persistState(\n {\n selectedFacets: getDefaultSelectedFacets(),\n searchType: SearchType.METADATA,\n },\n { persistMetadataSearchType: true },\n );\n expect(window.location.search).to.equal('?sin=MD');\n });\n\n it('round trip load/persist should erase numbers in square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[0]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n // Load state from the URL and immediately persist it back to the URL\n const restorationState = handler.getRestorationState();\n handler.persistState(restorationState);\n\n // Ensure the new URL includes the \"normalized\" facet parameter and not the numbered one\n expect(decodeURIComponent(window.location.search)).to.include(\n 'and[]=subject:\"foo\"',\n );\n expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;\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';\r\nimport { expect } from '@open-wc/testing';\r\nimport { SortField, getDefaultSelectedFacets } from '../src/models';\r\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\r\n\r\ndescribe('Restoration state handler', () => {\r\n it('should restore query from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?query=boop';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.baseQuery).to.equal('boop');\r\n });\r\n\r\n it('should restore default search type from URL without valid sin', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\r\n });\r\n\r\n it('should restore default search type if sin explicitly empty in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\r\n });\r\n\r\n it('should restore full text search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=TXT';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\r\n });\r\n\r\n it('should restore radio search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=RADIO';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.RADIO);\r\n });\r\n\r\n it('should restore TV search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=TV';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.TV);\r\n });\r\n\r\n it('should restore metadata search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=MD';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\r\n });\r\n\r\n it('should restore page number from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?page=42';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.currentPage).to.equal(42);\r\n });\r\n\r\n it('should restore selected year facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=year:\"2018\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should ignore unrecognized facet types in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=foo:\"bar\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets).to.deep.equal(\r\n getDefaultSelectedFacets(),\r\n );\r\n });\r\n\r\n it('should restore selected date range facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=year:\"2018+TO+2021\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.minSelectedDate).to.equal('2018');\r\n expect(restorationState.maxSelectedDate).to.equal('2021');\r\n });\r\n\r\n it('should restore creator filter from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=firstCreator:F';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedCreatorFilter).to.equal('F');\r\n });\r\n\r\n it('should restore title filter from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=firstTitle:F';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedTitleFilter).to.equal('F');\r\n });\r\n\r\n it('should restore other selected facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should restore negative facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?not[]=year:2018';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore multiple selected/negative facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search =\r\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"¬[]=collection:\"baz\"¬[]=collection:\"boop\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n\r\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n expect(restorationState.selectedFacets.collection?.bar.state).to.equal(\r\n 'selected',\r\n );\r\n\r\n expect(restorationState.selectedFacets.collection?.baz.state).to.equal(\r\n 'hidden',\r\n );\r\n expect(restorationState.selectedFacets.collection?.boop.state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('negative facets take precedence if both present in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=collection:\"foo\"¬[]=collection:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore selected facets with numbers in the square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[12]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should restore negative facets with numbers in the square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?not[12]=year:2018';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore any TV clip filters from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n const url = new URL(window.location.href);\r\n\r\n // Commercials\r\n url.search = '?only_commercials=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const commercialsRestorationState = handler.getRestorationState();\r\n expect(\r\n commercialsRestorationState.selectedFacets.clip_type?.commercial.state,\r\n ).to.equal('selected');\r\n\r\n // Fact checks\r\n url.search = '?only_factchecks=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const factchecksRestorationState = handler.getRestorationState();\r\n expect(\r\n factchecksRestorationState.selectedFacets.clip_type?.['fact check'].state,\r\n ).to.equal('selected');\r\n\r\n // Quotes\r\n url.search = '?only_quotes=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const quotesRestorationState = handler.getRestorationState();\r\n expect(\r\n quotesRestorationState.selectedFacets.clip_type?.quote.state,\r\n ).to.equal('selected');\r\n\r\n // No filter param\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const unfilteredRestorationState = handler.getRestorationState();\r\n expect(unfilteredRestorationState.selectedFacets.clip_type).to.deep.equal(\r\n {},\r\n );\r\n });\r\n\r\n it('should restore sort from URL (space format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=date+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore sort from URL (prefix format, desc)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=-date';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore sort from URL (prefix format, asc)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=date';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('asc');\r\n });\r\n\r\n it('should restore sort from URL (space format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('unrecognized');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore unrecognized sort from URL (prefix format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=-foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('unrecognized');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should save direction to URL even for unrecognized sort fields', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n sortDirection: 'desc',\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=-foo');\r\n });\r\n\r\n it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=-foo');\r\n });\r\n\r\n it('should just ignore unrecognized sort fields w/ unknown formats', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=+foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=+foo');\r\n });\r\n\r\n it('should not save current page state to the URL for page 1', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n currentPage: 1,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.be.empty;\r\n });\r\n\r\n it('should save current page state to the URL when page > 1', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n currentPage: 2,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?page=2');\r\n });\r\n\r\n it('should upgrade legacy search params to new ones', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?q=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.baseQuery).to.equal('foo');\r\n\r\n handler.persistState(restorationState);\r\n expect(window.location.search).to.equal('?query=foo');\r\n });\r\n\r\n it('should remove empty sin param', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\r\n expect(window.location.search).to.equal('');\r\n });\r\n\r\n it('should persist metadata search type only when option is true', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n handler.persistState(\r\n {\r\n selectedFacets: getDefaultSelectedFacets(),\r\n searchType: SearchType.METADATA,\r\n },\r\n { persistMetadataSearchType: false },\r\n );\r\n expect(window.location.search).to.equal('');\r\n\r\n handler.persistState(\r\n {\r\n selectedFacets: getDefaultSelectedFacets(),\r\n searchType: SearchType.METADATA,\r\n },\r\n { persistMetadataSearchType: true },\r\n );\r\n expect(window.location.search).to.equal('?sin=MD');\r\n });\r\n\r\n it('round trip load/persist should erase numbers in square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[0]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n // Load state from the URL and immediately persist it back to the URL\r\n const restorationState = handler.getRestorationState();\r\n handler.persistState(restorationState);\r\n\r\n // Ensure the new URL includes the \"normalized\" facet parameter and not the numbered one\r\n expect(decodeURIComponent(window.location.search)).to.include(\r\n 'and[]=subject:\"foo\"',\r\n );\r\n expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;\r\n });\r\n});\r\n"]}
|
|
@@ -3,7 +3,6 @@ import { html } from 'lit';
|
|
|
3
3
|
import '../src/tiles/review-block';
|
|
4
4
|
describe('ReviewBlock component', () => {
|
|
5
5
|
it('renders basic component', async () => {
|
|
6
|
-
var _a, _b, _c, _d, _e, _f;
|
|
7
6
|
const el = await fixture(html `<review-block
|
|
8
7
|
title="Foo"
|
|
9
8
|
body="foo bar baz"
|
|
@@ -11,38 +10,37 @@ describe('ReviewBlock component', () => {
|
|
|
11
10
|
></review-block>`);
|
|
12
11
|
el.title = 'Foo';
|
|
13
12
|
await el.updateComplete;
|
|
14
|
-
const container =
|
|
13
|
+
const container = el.shadowRoot?.querySelector('.review-container');
|
|
15
14
|
expect(container).to.exist;
|
|
16
|
-
const title =
|
|
17
|
-
expect(
|
|
18
|
-
const body =
|
|
19
|
-
expect(
|
|
20
|
-
const stars =
|
|
15
|
+
const title = el.shadowRoot?.querySelector('.review-title');
|
|
16
|
+
expect(title?.textContent?.trim()).to.equal('Foo');
|
|
17
|
+
const body = el.shadowRoot?.querySelector('.review-body');
|
|
18
|
+
expect(body?.textContent?.trim()).to.equal('foo bar baz');
|
|
19
|
+
const stars = el.shadowRoot?.querySelector('.star-rating');
|
|
21
20
|
expect(stars).to.exist;
|
|
22
|
-
expect(stars
|
|
23
|
-
expect(stars
|
|
21
|
+
expect(stars?.querySelectorAll('svg').length).to.equal(5);
|
|
22
|
+
expect(stars?.querySelectorAll('.unfilled-star').length).to.equal(2);
|
|
24
23
|
});
|
|
25
24
|
it('renders with any of title/body/stars', async () => {
|
|
26
|
-
var _a, _b, _c, _d, _e, _f;
|
|
27
25
|
const el = await fixture(html `<review-block></review-block>`);
|
|
28
26
|
// No content if no title/body/stars
|
|
29
|
-
expect(
|
|
27
|
+
expect(el.shadowRoot?.children.length).to.equal(0);
|
|
30
28
|
el.title = 'Foo';
|
|
31
29
|
await el.updateComplete;
|
|
32
|
-
const title =
|
|
33
|
-
expect(
|
|
30
|
+
const title = el.shadowRoot?.querySelector('.review-title');
|
|
31
|
+
expect(title?.textContent?.trim()).to.equal('Foo');
|
|
34
32
|
el.title = '';
|
|
35
33
|
el.body = 'foo bar baz';
|
|
36
34
|
await el.updateComplete;
|
|
37
|
-
const body =
|
|
38
|
-
expect(
|
|
35
|
+
const body = el.shadowRoot?.querySelector('.review-body');
|
|
36
|
+
expect(body?.textContent?.trim()).to.equal('foo bar baz');
|
|
39
37
|
el.body = '';
|
|
40
38
|
el.starRating = 4;
|
|
41
39
|
await el.updateComplete;
|
|
42
|
-
const stars =
|
|
40
|
+
const stars = el.shadowRoot?.querySelector('.star-rating');
|
|
43
41
|
expect(stars).to.exist;
|
|
44
|
-
expect(stars
|
|
45
|
-
expect(stars
|
|
42
|
+
expect(stars?.querySelectorAll('svg').length).to.equal(5);
|
|
43
|
+
expect(stars?.querySelectorAll('.unfilled-star').length).to.equal(1);
|
|
46
44
|
});
|
|
47
45
|
});
|
|
48
46
|
//# sourceMappingURL=review-block.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-block.test.js","sourceRoot":"","sources":["../../test/review-block.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,2BAA2B,CAAC;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"review-block.test.js","sourceRoot":"","sources":["../../test/review-block.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { ReviewBlock } from '../src/tiles/review-block';\nimport '../src/tiles/review-block';\n\ndescribe('ReviewBlock component', () => {\n it('renders basic component', async () => {\n const el = await fixture<ReviewBlock>(\n html`<review-block\n title=\"Foo\"\n body=\"foo bar baz\"\n starRating=\"3\"\n ></review-block>`,\n );\n\n el.title = 'Foo';\n await el.updateComplete;\n\n const container = el.shadowRoot?.querySelector('.review-container');\n expect(container).to.exist;\n\n const title = el.shadowRoot?.querySelector('.review-title');\n expect(title?.textContent?.trim()).to.equal('Foo');\n\n const body = el.shadowRoot?.querySelector('.review-body');\n expect(body?.textContent?.trim()).to.equal('foo bar baz');\n\n const stars = el.shadowRoot?.querySelector('.star-rating');\n expect(stars).to.exist;\n expect(stars?.querySelectorAll('svg').length).to.equal(5);\n expect(stars?.querySelectorAll('.unfilled-star').length).to.equal(2);\n });\n\n it('renders with any of title/body/stars', async () => {\n const el = await fixture<ReviewBlock>(html`<review-block></review-block>`);\n\n // No content if no title/body/stars\n expect(el.shadowRoot?.children.length).to.equal(0);\n\n el.title = 'Foo';\n await el.updateComplete;\n\n const title = el.shadowRoot?.querySelector('.review-title');\n expect(title?.textContent?.trim()).to.equal('Foo');\n\n el.title = '';\n el.body = 'foo bar baz';\n await el.updateComplete;\n\n const body = el.shadowRoot?.querySelector('.review-body');\n expect(body?.textContent?.trim()).to.equal('foo bar baz');\n\n el.body = '';\n el.starRating = 4;\n await el.updateComplete;\n\n const stars = el.shadowRoot?.querySelector('.star-rating');\n expect(stars).to.exist;\n expect(stars?.querySelectorAll('svg').length).to.equal(5);\n expect(stars?.querySelectorAll('.unfilled-star').length).to.equal(1);\n });\n});\n"]}
|
|
@@ -3,11 +3,10 @@ import { html } from 'lit';
|
|
|
3
3
|
import '../../src/sort-filter-bar/alpha-bar-tooltip';
|
|
4
4
|
describe('Alphabet Filter Bar Tooltips', () => {
|
|
5
5
|
it('renders component', async () => {
|
|
6
|
-
var _a, _b;
|
|
7
6
|
const el = await fixture(html `<alpha-bar-tooltip .numResults=${42}></alpha-bar-tooltip>`);
|
|
8
7
|
// Should render the number of results
|
|
9
|
-
const tooltipText =
|
|
10
|
-
expect(
|
|
8
|
+
const tooltipText = el.shadowRoot?.querySelector('#tooltip-text');
|
|
9
|
+
expect(tooltipText?.textContent?.trim()).to.equal('42 results');
|
|
11
10
|
});
|
|
12
11
|
});
|
|
13
12
|
//# sourceMappingURL=alpha-bar-tooltip.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha-bar-tooltip.test.js","sourceRoot":"","sources":["../../../test/sort-filter-bar/alpha-bar-tooltip.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,OAAO,6CAA6C,CAAC;AAErD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"alpha-bar-tooltip.test.js","sourceRoot":"","sources":["../../../test/sort-filter-bar/alpha-bar-tooltip.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,OAAO,6CAA6C,CAAC;AAErD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,kCAAkC,EAAE,uBAAuB,CAChE,CAAC;QAEF,sCAAsC;QACtC,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { AlphaBarTooltip } from '../../src/sort-filter-bar/alpha-bar-tooltip';\n\nimport '../../src/sort-filter-bar/alpha-bar-tooltip';\n\ndescribe('Alphabet Filter Bar Tooltips', () => {\n it('renders component', async () => {\n const el = await fixture<AlphaBarTooltip>(\n html`<alpha-bar-tooltip .numResults=${42}></alpha-bar-tooltip>`,\n );\n\n // Should render the number of results\n const tooltipText = el.shadowRoot?.querySelector('#tooltip-text');\n expect(tooltipText?.textContent?.trim()).to.equal('42 results');\n });\n});\n"]}
|
|
@@ -3,68 +3,62 @@ import { html } from 'lit';
|
|
|
3
3
|
import '../../src/sort-filter-bar/alpha-bar';
|
|
4
4
|
describe('Alphabetical Filter Bar', () => {
|
|
5
5
|
it('renders component', async () => {
|
|
6
|
-
var _a;
|
|
7
6
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
8
7
|
// Should have all the letters
|
|
9
|
-
const letters =
|
|
10
|
-
expect(letters
|
|
8
|
+
const letters = el.shadowRoot?.querySelectorAll('li');
|
|
9
|
+
expect(letters?.length).to.equal(26);
|
|
11
10
|
});
|
|
12
11
|
it('renders letters with items as buttons', async () => {
|
|
13
|
-
var _a, _b, _c;
|
|
14
12
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
15
13
|
el.letterCounts = { U: 10, X: 10 };
|
|
16
14
|
await el.updateComplete;
|
|
17
15
|
// Should have exactly two letter buttons
|
|
18
|
-
const letterButtons =
|
|
19
|
-
expect(letterButtons
|
|
20
|
-
expect(
|
|
21
|
-
expect(
|
|
16
|
+
const letterButtons = el.shadowRoot?.querySelectorAll('li > button:not(:disabled)');
|
|
17
|
+
expect(letterButtons?.length).to.equal(2);
|
|
18
|
+
expect(letterButtons?.item(0).textContent?.trim()).to.equal('U');
|
|
19
|
+
expect(letterButtons?.item(1).textContent?.trim()).to.equal('X');
|
|
22
20
|
});
|
|
23
21
|
it('renders letters without items as disabled buttons', async () => {
|
|
24
|
-
var _a, _b, _c;
|
|
25
22
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
26
23
|
el.letterCounts = { U: 10, X: 10 };
|
|
27
24
|
await el.updateComplete;
|
|
28
25
|
// All but the two letters above should be disabled
|
|
29
|
-
const letterButtons =
|
|
30
|
-
expect(letterButtons
|
|
31
|
-
expect(
|
|
32
|
-
expect(
|
|
26
|
+
const letterButtons = el.shadowRoot?.querySelectorAll('li > button:disabled');
|
|
27
|
+
expect(letterButtons?.length).to.equal(24);
|
|
28
|
+
expect(letterButtons?.item(0).textContent?.trim()).to.equal('A');
|
|
29
|
+
expect(letterButtons?.item(23).textContent?.trim()).to.equal('Z');
|
|
33
30
|
});
|
|
34
31
|
it('renders the selected letter with the "selected" class', async () => {
|
|
35
|
-
var _a, _b;
|
|
36
32
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
37
33
|
el.selectedLetter = 'B';
|
|
38
34
|
await el.updateComplete;
|
|
39
|
-
const selectedLetter =
|
|
35
|
+
const selectedLetter = el.shadowRoot?.querySelector('li.selected');
|
|
40
36
|
expect(selectedLetter).to.exist;
|
|
41
|
-
expect(
|
|
37
|
+
expect(selectedLetter?.textContent?.trim()).to.equal('B');
|
|
42
38
|
});
|
|
43
39
|
it('renders a tooltip when hovered and removes it when un-hovered', async () => {
|
|
44
|
-
var _a, _b, _c;
|
|
45
40
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
46
|
-
const firstLetter =
|
|
41
|
+
const firstLetter = el.shadowRoot?.querySelector('li');
|
|
47
42
|
expect(firstLetter).to.exist;
|
|
48
43
|
firstLetter.dispatchEvent(new MouseEvent('mousemove'));
|
|
49
44
|
await el.updateComplete;
|
|
50
|
-
const tooltip =
|
|
45
|
+
const tooltip = el.shadowRoot?.querySelector('alpha-bar-tooltip');
|
|
51
46
|
expect(tooltip).to.exist;
|
|
52
47
|
// Should be positioned after next tick
|
|
53
48
|
await aTimeout(0);
|
|
54
49
|
expect(tooltip.style.left).to.exist;
|
|
55
50
|
firstLetter.dispatchEvent(new MouseEvent('mouseleave'));
|
|
56
51
|
await el.updateComplete;
|
|
57
|
-
expect(
|
|
52
|
+
expect(el.shadowRoot?.querySelector('alpha-bar-tooltip')).not.to.exist;
|
|
58
53
|
});
|
|
59
54
|
it('positions tooltip correctly when it would overflow viewport', async () => {
|
|
60
|
-
var _a, _b;
|
|
61
55
|
const el = await fixture(html `<alpha-bar></alpha-bar>`);
|
|
62
|
-
const letters =
|
|
63
|
-
const lastLetter = letters
|
|
56
|
+
const letters = el.shadowRoot?.querySelectorAll('li');
|
|
57
|
+
const lastLetter = letters?.item(letters.length - 1);
|
|
64
58
|
expect(lastLetter).to.exist;
|
|
65
59
|
lastLetter.dispatchEvent(new MouseEvent('mousemove'));
|
|
66
60
|
await el.updateComplete;
|
|
67
|
-
const tooltip =
|
|
61
|
+
const tooltip = el.shadowRoot?.querySelector('alpha-bar-tooltip');
|
|
68
62
|
expect(tooltip).to.exist;
|
|
69
63
|
// Should be positioned after next tick, but not off-screen
|
|
70
64
|
await aTimeout(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha-bar.test.js","sourceRoot":"","sources":["../../../test/sort-filter-bar/alpha-bar.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,OAAO,qCAAqC,CAAC;AAG7C,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"alpha-bar.test.js","sourceRoot":"","sources":["../../../test/sort-filter-bar/alpha-bar.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { AlphaBar } from '../../src/sort-filter-bar/alpha-bar';\n\nimport '../../src/sort-filter-bar/alpha-bar';\nimport type { AlphaBarTooltip } from '../../src/sort-filter-bar/alpha-bar-tooltip';\n\ndescribe('Alphabetical Filter Bar', () => {\n it('renders component', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n\n // Should have all the letters\n const letters = el.shadowRoot?.querySelectorAll('li');\n expect(letters?.length).to.equal(26);\n });\n\n it('renders letters with items as buttons', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n\n el.letterCounts = { U: 10, X: 10 };\n await el.updateComplete;\n\n // Should have exactly two letter buttons\n const letterButtons = el.shadowRoot?.querySelectorAll(\n 'li > button:not(:disabled)',\n );\n expect(letterButtons?.length).to.equal(2);\n expect(letterButtons?.item(0).textContent?.trim()).to.equal('U');\n expect(letterButtons?.item(1).textContent?.trim()).to.equal('X');\n });\n\n it('renders letters without items as disabled buttons', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n\n el.letterCounts = { U: 10, X: 10 };\n await el.updateComplete;\n\n // All but the two letters above should be disabled\n const letterButtons = el.shadowRoot?.querySelectorAll(\n 'li > button:disabled',\n );\n expect(letterButtons?.length).to.equal(24);\n expect(letterButtons?.item(0).textContent?.trim()).to.equal('A');\n expect(letterButtons?.item(23).textContent?.trim()).to.equal('Z');\n });\n\n it('renders the selected letter with the \"selected\" class', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n\n el.selectedLetter = 'B';\n await el.updateComplete;\n\n const selectedLetter = el.shadowRoot?.querySelector('li.selected');\n expect(selectedLetter).to.exist;\n expect(selectedLetter?.textContent?.trim()).to.equal('B');\n });\n\n it('renders a tooltip when hovered and removes it when un-hovered', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n const firstLetter = el.shadowRoot?.querySelector('li') as HTMLLIElement;\n expect(firstLetter).to.exist;\n\n firstLetter.dispatchEvent(new MouseEvent('mousemove'));\n await el.updateComplete;\n\n const tooltip = el.shadowRoot?.querySelector(\n 'alpha-bar-tooltip',\n ) as AlphaBarTooltip;\n expect(tooltip).to.exist;\n\n // Should be positioned after next tick\n await aTimeout(0);\n expect(tooltip.style.left).to.exist;\n\n firstLetter.dispatchEvent(new MouseEvent('mouseleave'));\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('alpha-bar-tooltip')).not.to.exist;\n });\n\n it('positions tooltip correctly when it would overflow viewport', async () => {\n const el = await fixture<AlphaBar>(html`<alpha-bar></alpha-bar>`);\n const letters = el.shadowRoot?.querySelectorAll('li');\n const lastLetter = letters?.item(letters.length - 1) as HTMLLIElement;\n expect(lastLetter).to.exist;\n\n lastLetter.dispatchEvent(new MouseEvent('mousemove'));\n await el.updateComplete;\n\n const tooltip = el.shadowRoot?.querySelector(\n 'alpha-bar-tooltip',\n ) as AlphaBarTooltip;\n expect(tooltip).to.exist;\n\n // Should be positioned after next tick, but not off-screen\n await aTimeout(0);\n expect(tooltip.getBoundingClientRect().right).to.be.lessThan(\n window.innerWidth,\n );\n });\n});\n"]}
|