diff --git a/attack-search/__tests__/search-events.test.js b/attack-search/__tests__/search-events.test.js index f5dc8a6a20d..86af5fc0e19 100644 --- a/attack-search/__tests__/search-events.test.js +++ b/attack-search/__tests__/search-events.test.js @@ -83,6 +83,16 @@ describe('search event bindings', () => { expect(eventsForSelector('[data-search-filter-reset]')).toContain('touchend'); }); + test('search cache key includes the serialized index compatibility version', () => { + const { searchCacheCompatibilityVersion, searchCacheSchemaVersion } = require('../src/settings'); + + require('../src/index'); + + expect(global.localStorage.getItem).toHaveBeenCalledWith( + `saved_uuid_search_schema_${searchCacheSchemaVersion}-${searchCacheCompatibilityVersion}`, + ); + }); + test('dropdown toggles open before the search service is initialized', () => { require('../src/index'); diff --git a/attack-search/__tests__/settings.test.js b/attack-search/__tests__/settings.test.js index 9c64963c4a2..7b5fa3ff867 100644 --- a/attack-search/__tests__/settings.test.js +++ b/attack-search/__tests__/settings.test.js @@ -1,6 +1,16 @@ -const { searchFilePaths } = require('../src/settings'); +const { + searchCacheCompatibilityVersion, + searchFilePaths, +} = require('../src/settings'); +const packageJson = require('../package.json'); describe('search settings', () => { + test('includes the FlexSearch version in the cache compatibility token', () => { + const expectedFlexSearchVersion = packageJson.dependencies.flexsearch.replace(/^[^\d]*/, ''); + + expect(searchCacheCompatibilityVersion).toBe(`flexsearch-${expectedFlexSearchVersion}`); + }); + test('loads the generated sub-technique search index', () => { expect(searchFilePaths).toContain('sub-techniques.json'); }); diff --git a/attack-search/src/index.js b/attack-search/src/index.js index 68447ba36ab..d3aa49f3b30 100644 --- a/attack-search/src/index.js +++ b/attack-search/src/index.js @@ -10,7 +10,12 @@ const $ = require('jquery'); */ // Import required modules with the correct file extension -const { baseURL, searchCacheSchemaVersion, searchFilePaths } = require('./settings.js'); +const { + baseURL, + searchCacheCompatibilityVersion, + searchCacheSchemaVersion, + searchFilePaths, +} = require('./settings.js'); const Debouncer = require('./debouncer.js'); const SearchService = require('./search-service.js'); const { loadSearchDocuments } = require('./search-loader.js'); @@ -26,7 +31,8 @@ const { closeButton, } = require('./components.js'); -const searchCacheKey = `saved_uuid_search_schema_${searchCacheSchemaVersion}`; +const searchCacheVersion = `${searchCacheSchemaVersion}-${searchCacheCompatibilityVersion}`; +const searchCacheKey = `saved_uuid_search_schema_${searchCacheVersion}`; let searchService; let openFilterDropdownKey = null; @@ -89,7 +95,7 @@ async function initializeSearchService() { searchParsingIcon.show(); const saved_uuid = localStorage.getItem(searchCacheKey); - const cachedBuildId = `${build_uuid}-search-${searchCacheSchemaVersion}`; + const cachedBuildId = `${build_uuid}-search-${searchCacheVersion}`; console.debug(`Retrieved the saved_uuid from localStorage: ${saved_uuid}`); // Check if the browser supports IndexedDB. Search service can only work in environments that support IndexedDB. diff --git a/attack-search/src/settings.js b/attack-search/src/settings.js index 1d5067f413e..0fa7fbaf21f 100644 --- a/attack-search/src/settings.js +++ b/attack-search/src/settings.js @@ -1,5 +1,9 @@ const baseURL = ''; // TODO migrate from base_url (generated via Pelican) +const packageJson = require('../package.json'); + const searchCacheSchemaVersion = 2; +const flexSearchVersion = packageJson.dependencies.flexsearch.replace(/^[^\d]*/, ''); +const searchCacheCompatibilityVersion = `flexsearch-${flexSearchVersion}`; const searchFilePaths = [ 'campaigns.json', @@ -19,6 +23,7 @@ const searchFilePaths = [ ]; module.exports = { baseURL, + searchCacheCompatibilityVersion, searchCacheSchemaVersion, searchFilePaths, };