mirror of https://github.com/iconify/api.git
153 lines
4.1 KiB
TypeScript
153 lines
4.1 KiB
TypeScript
import { DirectoryDownloader } from '../../lib/downloaders/directory';
|
|
import { createHardcodedCollectionsListImporter } from '../../lib/importers/collections/list';
|
|
import { createJSONIconSetImporter } from '../../lib/importers/icon-set/json';
|
|
import { updateSearchIndex } from '../../lib/data/search';
|
|
import { search } from '../../lib/data/search/index';
|
|
import type { IconSetImportedData } from '../../lib/types/importers/common';
|
|
import type { IconSetEntry } from '../../lib/types/importers';
|
|
|
|
describe('Searching icons', () => {
|
|
test('Multiple icon sets', async () => {
|
|
// Create importer
|
|
const importer = createHardcodedCollectionsListImporter(
|
|
['mdi-light', 'mdi-test-prefix', 'emojione-v1'],
|
|
(prefix) => {
|
|
let filename: string;
|
|
switch (prefix) {
|
|
case 'mdi-test-prefix':
|
|
filename = '/json/mdi.json';
|
|
break;
|
|
|
|
case 'mdi':
|
|
case 'mdi-light':
|
|
filename = `/json/${prefix}.json`;
|
|
break;
|
|
|
|
default:
|
|
filename = `/${prefix}.json`;
|
|
}
|
|
return createJSONIconSetImporter(new DirectoryDownloader<IconSetImportedData>(`tests/fixtures`), {
|
|
prefix,
|
|
filename,
|
|
ignoreInvalidPrefix: true,
|
|
});
|
|
}
|
|
);
|
|
await importer.init();
|
|
const data = importer.data!;
|
|
|
|
// Get keywords
|
|
const mdiData = data.iconSets['mdi-test-prefix']!;
|
|
const mdiKeywords = mdiData.icons.keywords!;
|
|
expect(mdiKeywords).toBeTruthy();
|
|
|
|
const mdiLightData = data.iconSets['mdi-light']!;
|
|
const mdiLightKeywords = mdiLightData.icons.keywords!;
|
|
expect(mdiLightKeywords).toBeTruthy();
|
|
|
|
// Create search index
|
|
const prefixes = data.prefixes;
|
|
expect(prefixes).toEqual(['mdi-light', 'mdi-test-prefix', 'emojione-v1']);
|
|
|
|
const iconSets: Record<string, IconSetEntry> = {};
|
|
prefixes.forEach((prefix) => {
|
|
iconSets[prefix] = {
|
|
importer,
|
|
item: data.iconSets[prefix]!,
|
|
};
|
|
});
|
|
const searchIndex = updateSearchIndex(prefixes, iconSets)!;
|
|
|
|
// Check index
|
|
expect(searchIndex).toBeTruthy();
|
|
expect(searchIndex!.sortedPrefixes).toEqual(['mdi-light', 'mdi-test-prefix', 'emojione-v1']);
|
|
|
|
// Search
|
|
expect(
|
|
search(
|
|
{
|
|
keyword: 'cycle',
|
|
limit: 999,
|
|
},
|
|
searchIndex,
|
|
iconSets
|
|
)
|
|
).toEqual({
|
|
prefixes: ['mdi-test-prefix', 'emojione-v1'],
|
|
names: [
|
|
'mdi-test-prefix:cash-cycle',
|
|
'mdi-test-prefix:hand-cycle',
|
|
'mdi-test-prefix:power-cycle',
|
|
'mdi-test-prefix:bicycle',
|
|
'mdi-test-prefix:bicycle-basket',
|
|
'mdi-test-prefix:bicycle-cargo',
|
|
'mdi-test-prefix:bicycle-electric',
|
|
'mdi-test-prefix:bicycle-penny-farthing',
|
|
'emojione-v1:bicycle',
|
|
'mdi-test-prefix:battery-recycle',
|
|
'mdi-test-prefix:battery-recycle-outline',
|
|
'mdi-test-prefix:recycle',
|
|
'mdi-test-prefix:recycle-variant',
|
|
'mdi-test-prefix:water-recycle',
|
|
'mdi-test-prefix:unicycle',
|
|
'mdi-test-prefix:motorcycle',
|
|
'mdi-test-prefix:motorcycle-electric',
|
|
'mdi-test-prefix:motorcycle-off',
|
|
'emojione-v1:motorcycle',
|
|
],
|
|
hasMore: false,
|
|
});
|
|
|
|
// Search with category filter
|
|
expect(
|
|
search(
|
|
{
|
|
keyword: 'cycle',
|
|
limit: 999,
|
|
category: 'General',
|
|
},
|
|
searchIndex,
|
|
iconSets
|
|
)
|
|
).toEqual({
|
|
prefixes: ['mdi-test-prefix'],
|
|
names: [
|
|
'mdi-test-prefix:cash-cycle',
|
|
'mdi-test-prefix:hand-cycle',
|
|
'mdi-test-prefix:power-cycle',
|
|
'mdi-test-prefix:bicycle',
|
|
'mdi-test-prefix:bicycle-basket',
|
|
'mdi-test-prefix:bicycle-cargo',
|
|
'mdi-test-prefix:bicycle-electric',
|
|
'mdi-test-prefix:bicycle-penny-farthing',
|
|
'mdi-test-prefix:battery-recycle',
|
|
'mdi-test-prefix:battery-recycle-outline',
|
|
'mdi-test-prefix:recycle',
|
|
'mdi-test-prefix:recycle-variant',
|
|
'mdi-test-prefix:water-recycle',
|
|
'mdi-test-prefix:unicycle',
|
|
'mdi-test-prefix:motorcycle',
|
|
'mdi-test-prefix:motorcycle-electric',
|
|
'mdi-test-prefix:motorcycle-off',
|
|
],
|
|
hasMore: false,
|
|
});
|
|
|
|
// Search with style and palette
|
|
expect(
|
|
search(
|
|
{
|
|
keyword: 'bookmark style:fill palette:true',
|
|
limit: 999,
|
|
},
|
|
searchIndex,
|
|
iconSets
|
|
)
|
|
).toEqual({
|
|
prefixes: ['emojione-v1'],
|
|
names: ['emojione-v1:bookmark', 'emojione-v1:bookmark-tabs'],
|
|
hasMore: false,
|
|
});
|
|
}, 5000);
|
|
});
|