diff --git a/packages/snap-client/README.md b/packages/snap-client/README.md index ef405aeb4..8b6e67480 100644 --- a/packages/snap-client/README.md +++ b/packages/snap-client/README.md @@ -150,7 +150,7 @@ const clientConfig = { const client = new Client(globals, clientConfig); -const results = await client.search({ +const response = await client.search({ search: { query: { string: 'dress' @@ -163,7 +163,7 @@ const results = await client.search({ ```typescript const client = new Client(globals, clientConfig); -const [meta, results] = await client.search({ +const { meta, results } = await client.search({ search: { query: { string: 'dress' @@ -178,7 +178,7 @@ Makes a request to the Searchspring Search API and returns a promise. ```typescript const client = new Client(globals, clientConfig); -const [meta, results] = await client.search({ +const { meta, results } = await client.search({ search: { query: { string: 'dress' @@ -193,7 +193,7 @@ Makes a request to the Searchspring Autocomplete API and returns a promise. ```typescript const client = new Client(globals, clientConfig); -const [meta, results] = await client.autocomplete({ +const { meta, results } = await client.autocomplete({ suggestions: { count: 5 }, @@ -219,7 +219,7 @@ Makes a request to the Searchspring Trending API and returns a promise. ```typescript const client = new Client(globals, clientConfig); -const results = await client.trending({ +const trending = await client.trending({ siteId: 'abc123', limit: 5 }); @@ -230,7 +230,7 @@ Makes a request to the Searchspring finder API and returns a promise. ```typescript const client = new Client(globals, clientConfig); -const [meta, results] = await client.finder({ +const { meta, results } = await client.finder({ filters: [{ type: "value", field: "color", @@ -245,7 +245,7 @@ Makes a request to the Searchspring Recommend API and returns a promise. ```typescript const client = new Client(globals, clientConfig); -const results = await client.recommend({ +const { profile, meta, recommend } = await client.recommend({ tag: 'similar', siteId: 'abc123', products: ['product123'], diff --git a/packages/snap-client/src/Client/Client.ts b/packages/snap-client/src/Client/Client.ts index be7f5f5a8..23b7096e1 100644 --- a/packages/snap-client/src/Client/Client.ts +++ b/packages/snap-client/src/Client/Client.ts @@ -7,7 +7,8 @@ import type { TrendingRequestModel, TrendingResponseModel, ProfileRequestModel, - RecommendCombinedResponseModel, + ProfileResponseModel, + RecommendResponseModel, RecommendRequestModel, } from '../types'; @@ -143,26 +144,29 @@ export class Client { return this.requesters.meta.getMeta(params); } - async autocomplete(params: AutocompleteRequestModel = {}): Promise<[MetaResponseModel, AutocompleteResponseModel]> { + async autocomplete(params: AutocompleteRequestModel = {}): Promise<{ meta: MetaResponseModel; search: AutocompleteResponseModel }> { if (!params.search?.query?.string) { throw 'query string parameter is required'; } params = deepmerge(this.globals, params); - return Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.autocomplete.getAutocomplete(params)]); + const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.autocomplete.getAutocomplete(params)]); + return { meta, search }; } - async search(params: SearchRequestModel = {}): Promise<[MetaResponseModel, SearchResponseModel]> { + async search(params: SearchRequestModel = {}): Promise<{ meta: MetaResponseModel; search: SearchResponseModel }> { params = deepmerge(this.globals, params); - return Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.search.getSearch(params)]); + const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.search.getSearch(params)]); + return { meta, search }; } - async finder(params: SearchRequestModel = {}): Promise<[MetaResponseModel, SearchResponseModel]> { + async finder(params: SearchRequestModel = {}): Promise<{ meta: MetaResponseModel; search: SearchResponseModel }> { params = deepmerge(this.globals, params); - return Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.finder.getFinder(params)]); + const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.finder.getFinder(params)]); + return { meta, search }; } async trending(params: Partial): Promise { @@ -171,7 +175,9 @@ export class Client { return this.requesters.suggest.getTrending(params as TrendingRequestModel); } - async recommend(params: RecommendRequestModel): Promise { + async recommend( + params: RecommendRequestModel + ): Promise<{ meta: MetaResponseModel; profile: ProfileResponseModel; recommend: RecommendResponseModel }> { const { tag, ...otherParams } = params; if (!tag) { throw 'tag parameter is required'; @@ -193,16 +199,16 @@ export class Client { siteId: params.siteId || this.globals.siteId, }; - const [meta, profile, recommendations] = await Promise.all([ + const [meta, profile, recommend] = await Promise.all([ this.meta(params.siteId ? { siteId: params.siteId } : undefined), this.requesters.recommend.getProfile(profileParams), this.requesters.recommend.batchRecommendations(recommendParams), ]); return { - ...profile, meta, - results: recommendations[0] && recommendations[0].results, + profile, + recommend, }; } } diff --git a/packages/snap-client/src/Client/apis/Abstract.ts b/packages/snap-client/src/Client/apis/Abstract.ts index f4291c1d1..ae1761ad9 100644 --- a/packages/snap-client/src/Client/apis/Abstract.ts +++ b/packages/snap-client/src/Client/apis/Abstract.ts @@ -34,7 +34,7 @@ export class API { return this.configuration.mode; } - protected async request(context: RequestOpts, cacheKey?: string): Promise { + protected async request(context: RequestOpts, cacheKey?: string): Promise { const { url, init } = this.createFetchParams(context); if (cacheKey) { @@ -42,7 +42,7 @@ export class API { if (cachedResponse) { this.retryCount = 0; // reset count and delay incase rate limit occurs again before a page refresh this.retryDelay = 1000; - return cachedResponse; + return cachedResponse as T; } } let response; diff --git a/packages/snap-client/src/Client/apis/Legacy.ts b/packages/snap-client/src/Client/apis/Legacy.ts index dea393a11..575670c03 100644 --- a/packages/snap-client/src/Client/apis/Legacy.ts +++ b/packages/snap-client/src/Client/apis/Legacy.ts @@ -31,7 +31,7 @@ export class LegacyAPI extends API { headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/meta/meta.json', method: 'POST', @@ -41,13 +41,13 @@ export class LegacyAPI extends API { JSON.stringify(requestParameters) ); - return response as MetaResponseModel; + return response; } async getMeta(queryParameters: MetaRequestModel): Promise { const headerParameters: HTTPHeaders = {}; - const response = await this.request( + const response = await this.request( { path: '/api/meta/meta.json', method: 'GET', @@ -57,7 +57,7 @@ export class LegacyAPI extends API { JSON.stringify(queryParameters) ); - return response as MetaResponseModel; + return response; } async getSearch(queryParameters: any): Promise { diff --git a/packages/snap-client/src/Client/apis/Recommend.test.ts b/packages/snap-client/src/Client/apis/Recommend.test.ts index 32bda6af4..738e4d431 100644 --- a/packages/snap-client/src/Client/apis/Recommend.test.ts +++ b/packages/snap-client/src/Client/apis/Recommend.test.ts @@ -537,8 +537,8 @@ describe('Recommend Api', () => { const [response1, response2] = await Promise.all([promise1, promise2]); - expect(response1[0].results.length).toBe(response[1].results.length); - expect(response2[0].results.length).toBe(response[0].results.length); + expect(response1.results.length).toBe(response[1].results.length); + expect(response2.results.length).toBe(response[0].results.length); requestMock.mockReset(); }); diff --git a/packages/snap-client/src/Client/apis/Recommend.ts b/packages/snap-client/src/Client/apis/Recommend.ts index 475e4298b..1f103966d 100644 --- a/packages/snap-client/src/Client/apis/Recommend.ts +++ b/packages/snap-client/src/Client/apis/Recommend.ts @@ -40,7 +40,7 @@ export class RecommendAPI extends API { async getProfile(queryParameters: ProfileRequestModel): Promise { const headerParameters: HTTPHeaders = {}; - const response = await this.request( + const response = await this.request( { path: '/api/personalized-recommendations/profile.json', method: 'GET', @@ -50,7 +50,7 @@ export class RecommendAPI extends API { JSON.stringify(queryParameters) ); - return response as unknown as ProfileResponseModel; + return response; } async batchRecommendations(parameters: RecommendRequestModel): Promise { @@ -149,7 +149,7 @@ export class RecommendAPI extends API { const response = await this.postRecommendations(batch.request as RecommendPostRequestModel); batch.entries?.forEach((entry, index) => { - entry.deferred.resolve([response[index]]); + entry.deferred.resolve(response[index]); }); } catch (err) { batch.entries?.forEach((entry) => { @@ -161,14 +161,14 @@ export class RecommendAPI extends API { return deferred.promise; } - async postRecommendations(requestParameters: RecommendPostRequestModel): Promise { + async postRecommendations(requestParameters: RecommendPostRequestModel): Promise { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'text/plain'; const siteId = requestParameters.siteId; const path = `/boost/${siteId}/recommend`; - const response = await this.request( + const response = await this.request( { path, method: 'POST', @@ -178,7 +178,7 @@ export class RecommendAPI extends API { JSON.stringify(requestParameters) ); - return response as unknown as RecommendResponseModel; + return response; } } diff --git a/packages/snap-client/src/Client/apis/Snap.ts b/packages/snap-client/src/Client/apis/Snap.ts index d24e7534c..d8b018ecb 100644 --- a/packages/snap-client/src/Client/apis/Snap.ts +++ b/packages/snap-client/src/Client/apis/Snap.ts @@ -15,7 +15,7 @@ export class SnapAPI extends API { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/v1/meta', method: 'POST', @@ -25,14 +25,14 @@ export class SnapAPI extends API { JSON.stringify(requestParameters) ); - return response as MetaResponseModel; + return response; } async postSearch(requestParameters: SearchRequestModel): Promise { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/v1/search', method: 'POST', @@ -42,14 +42,14 @@ export class SnapAPI extends API { JSON.stringify(requestParameters) ); - return response as SearchResponseModel; + return response; } async postAutocomplete(requestParameters: AutocompleteRequestModel): Promise { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/v1/autocomplete', method: 'POST', @@ -59,6 +59,6 @@ export class SnapAPI extends API { JSON.stringify(requestParameters) ); - return response as AutocompleteResponseModel; + return response; } } diff --git a/packages/snap-client/src/Client/apis/Suggest.ts b/packages/snap-client/src/Client/apis/Suggest.ts index ddb16da72..02ba9cb2c 100644 --- a/packages/snap-client/src/Client/apis/Suggest.ts +++ b/packages/snap-client/src/Client/apis/Suggest.ts @@ -5,7 +5,7 @@ export class SuggestAPI extends API { async getSuggest(queryParameters: SuggestRequestModel): Promise { const headerParameters: HTTPHeaders = {}; - const response = await this.request( + const response = await this.request( { path: '/api/suggest/query', method: 'GET', @@ -15,14 +15,14 @@ export class SuggestAPI extends API { JSON.stringify(queryParameters) ); - return response as unknown as SuggestResponseModel; + return response; } async postSuggest(requestParameters: SuggestRequestModel): Promise { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/suggest/query', method: 'POST', @@ -32,13 +32,13 @@ export class SuggestAPI extends API { JSON.stringify(requestParameters) ); - return response as unknown as SuggestResponseModel; + return response; } async getTrending(queryParameters: TrendingRequestModel): Promise { const headerParameters: HTTPHeaders = {}; - const response = await this.request( + const response = await this.request( { path: '/api/suggest/trending', method: 'GET', @@ -48,14 +48,14 @@ export class SuggestAPI extends API { JSON.stringify(queryParameters) ); - return response as unknown as TrendingResponseModel; + return response; } async postTrending(requestParameters: TrendingRequestModel): Promise { const headerParameters: HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - const response = await this.request( + const response = await this.request( { path: '/api/suggest/trending', method: 'POST', @@ -65,6 +65,6 @@ export class SuggestAPI extends API { JSON.stringify(requestParameters) ); - return response as unknown as TrendingResponseModel; + return response; } } diff --git a/packages/snap-client/src/index.ts b/packages/snap-client/src/index.ts index 3b0b47d9b..0b220d6ff 100644 --- a/packages/snap-client/src/index.ts +++ b/packages/snap-client/src/index.ts @@ -4,7 +4,9 @@ export { ClientGlobals, ClientConfig, TrendingResponseModel, + RecommendCombinedResponseModel, + ProfileResponseModel, + RecommendResponseModel, RecommendRequestModel, RecommendationRequestFilterModel, - RecommendCombinedResponseModel, } from './types'; diff --git a/packages/snap-client/src/types.ts b/packages/snap-client/src/types.ts index 9f399a223..565c0bd65 100644 --- a/packages/snap-client/src/types.ts +++ b/packages/snap-client/src/types.ts @@ -171,7 +171,7 @@ export type RecommendResponseModel = { tag: string; }; results: SearchResponseModelResult[]; -}[]; +}; export type ProfileRequestModel = { siteId: string; diff --git a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts index fbd145108..791e7a881 100644 --- a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts +++ b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts @@ -88,7 +88,7 @@ export class AutocompleteController extends AbstractController { await next(); // cancel search if no input or query doesn't match current urlState - if (ac.response.autocomplete.query != ac.controller.urlManager.state.query) { + if (ac.response.search.autocomplete.query != ac.controller.urlManager.state.query) { ac.controller.store.loading = false; return false; } @@ -507,11 +507,11 @@ export class AutocompleteController extends AbstractController { } searchTrending = async (): Promise => { - let terms; + let trending; const storedTerms = this.storage.get('terms'); if (storedTerms) { // terms exist in storage, update store - terms = JSON.parse(storedTerms); + trending = JSON.parse(storedTerms); } else { // query for trending terms, save to storage, update store const trendingParams = { @@ -520,16 +520,16 @@ export class AutocompleteController extends AbstractController { const trendingProfile = this.profiler.create({ type: 'event', name: 'trending', context: trendingParams }).start(); - terms = await this.client.trending(trendingParams); + trending = await this.client.trending(trendingParams); trendingProfile.stop(); this.log.profile(trendingProfile); - if (terms?.trending?.queries?.length) { - this.storage.set('terms', JSON.stringify(terms)); + if (trending?.trending.queries?.length) { + this.storage.set('terms', JSON.stringify(trending)); } } - this.store.updateTrendingTerms(terms); + this.store.updateTrendingTerms(trending); }; search = async (): Promise => { @@ -563,12 +563,7 @@ export class AutocompleteController extends AbstractController { const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start(); - const [meta, response] = await this.client.autocomplete(params); - // @ts-ignore : MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - if (!response.meta) { - // @ts-ignore : MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - response.meta = meta; - } + const { meta, search } = await this.client.autocomplete(params); searchProfile.stop(); this.log.profile(searchProfile); @@ -579,7 +574,10 @@ export class AutocompleteController extends AbstractController { await this.eventManager.fire('afterSearch', { controller: this, request: params, - response, + response: { + meta, + search, + }, }); } catch (err: any) { if (err?.message == 'cancelled') { @@ -596,7 +594,7 @@ export class AutocompleteController extends AbstractController { this.log.profile(afterSearchProfile); // update the store - this.store.update(response); + this.store.update({ meta, search }); const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start(); @@ -604,7 +602,10 @@ export class AutocompleteController extends AbstractController { await this.eventManager.fire('afterStore', { controller: this, request: params, - response, + response: { + meta, + search, + }, }); } catch (err: any) { if (err?.message == 'cancelled') { diff --git a/packages/snap-controller/src/Finder/FinderController.ts b/packages/snap-controller/src/Finder/FinderController.ts index 20761b293..c09f93655 100644 --- a/packages/snap-controller/src/Finder/FinderController.ts +++ b/packages/snap-controller/src/Finder/FinderController.ts @@ -157,12 +157,7 @@ export class FinderController extends AbstractController { const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start(); - const [meta, response] = await this.client.finder(params); - // @ts-ignore : MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - if (!response.meta) { - // @ts-ignore : MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - response.meta = meta; - } + const { meta, search } = await this.client.finder(params); searchProfile.stop(); this.log.profile(searchProfile); @@ -173,7 +168,10 @@ export class FinderController extends AbstractController { await this.eventManager.fire('afterSearch', { controller: this, request: params, - response, + response: { + meta, + search, + }, }); } catch (err: any) { if (err?.message == 'cancelled') { @@ -190,8 +188,7 @@ export class FinderController extends AbstractController { this.log.profile(afterSearchProfile); // update the store - // @ts-ignore : MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - this.store.update(response); + this.store.update({ meta, search }); const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start(); @@ -199,7 +196,10 @@ export class FinderController extends AbstractController { await this.eventManager.fire('afterStore', { controller: this, request: params, - response, + response: { + meta, + search, + }, }); } catch (err: any) { if (err?.message == 'cancelled') { diff --git a/packages/snap-controller/src/Recommendation/RecommendationController.ts b/packages/snap-controller/src/Recommendation/RecommendationController.ts index d57449223..2967bea1e 100644 --- a/packages/snap-controller/src/Recommendation/RecommendationController.ts +++ b/packages/snap-controller/src/Recommendation/RecommendationController.ts @@ -448,7 +448,7 @@ export class RecommendationController extends AbstractController { const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start(); - const response = await this.client.recommend(params); + const { meta, profile, recommend } = await this.client.recommend(params); searchProfile.stop(); this.log.profile(searchProfile); @@ -458,7 +458,7 @@ export class RecommendationController extends AbstractController { await this.eventManager.fire('afterSearch', { controller: this, request: params, - response, + response: { meta, profile, recommend }, }); } catch (err: any) { if (err?.message == 'cancelled') { @@ -475,7 +475,7 @@ export class RecommendationController extends AbstractController { this.log.profile(afterSearchProfile); // update the store - this.store.update(response); + this.store.update({ meta, profile, recommend }); const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start(); @@ -483,7 +483,7 @@ export class RecommendationController extends AbstractController { await this.eventManager.fire('afterStore', { controller: this, request: params, - response, + response: { meta, profile, recommend }, }); } catch (err: any) { if (err?.message == 'cancelled') { diff --git a/packages/snap-controller/src/Search/SearchController.ts b/packages/snap-controller/src/Search/SearchController.ts index f23b51cca..99d700785 100644 --- a/packages/snap-controller/src/Search/SearchController.ts +++ b/packages/snap-controller/src/Search/SearchController.ts @@ -92,9 +92,9 @@ export class SearchController extends AbstractController { // add 'afterSearch' middleware this.eventManager.on('afterSearch', async (search: AfterSearchObj, next: Next): Promise => { const config = search.controller.config as SearchControllerConfig; - const redirectURL = search.response?.merchandising?.redirect; + const redirectURL = search.response?.search?.merchandising?.redirect; const searchStore = search.controller.store as SearchStore; - if (redirectURL && config?.settings?.redirects?.merchandising && !search?.response?.filters?.length && !searchStore.loaded) { + if (redirectURL && config?.settings?.redirects?.merchandising && !search?.response?.search?.filters?.length && !searchStore.loaded) { window.location.replace(redirectURL); return false; } @@ -102,13 +102,15 @@ export class SearchController extends AbstractController { const nonBackgroundFilters = search?.request?.filters?.filter((filter) => !filter.background); if ( config?.settings?.redirects?.singleResult && - search?.response?.search?.query && - search?.response?.pagination?.totalResults === 1 && + search?.response?.search?.search?.query && + search?.response?.search?.pagination?.totalResults === 1 && !nonBackgroundFilters?.length && !(search.controller as SearchController).previousResults.length ) { - window.location.replace(search?.response.results[0].mappings.core.url); - return false; + if (search?.response?.search?.results?.[0]?.mappings?.core?.url) { + window.location.replace(search.response.search.results[0].mappings.core.url); + return false; + } } await next(); @@ -357,7 +359,7 @@ export class SearchController extends AbstractController { const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start(); let meta: MetaResponseModel = {}; - let response: SearchResponseModel & { meta?: MetaResponseModel } = {}; + let search: SearchResponseModel = {}; // infinite scroll functionality (after page 1) if (this.config.settings?.infinite && params.pagination?.page && params.pagination.page > 1) { @@ -397,38 +399,37 @@ export class SearchController extends AbstractController { const backfillResponses = await Promise.all(backfillRequests); - // backfillResponses are [meta, searchResponse][] + // backfillResponses are [{ meta: MetaResponseModel, search: SearchResponseModel }] // set the meta and response to the first page of backfillResponses - meta = backfillResponses[0][0]; - response = backfillResponses[0][1]; + meta = backfillResponses[0].meta; + search = backfillResponses[0].search; // accumulate results from all backfill responses const backfillResults: SearchResponseModelResult[] = backfillResponses.reduce((results, response) => { - // response is [meta, searchResponse] - return results.concat(...response[1].results!); + // response is { meta: MetaResponseModel, search: SearchResponseModel } + return results.concat(...response.search.results!); }, [] as SearchResponseModelResult[]); // overwrite pagination params to expected state - response.pagination!.totalPages = Math.ceil(response.pagination!.totalResults! / response.pagination!.pageSize!); - response.pagination!.page = params.pagination?.page; + search.pagination!.totalPages = Math.ceil(search.pagination!.totalResults! / search.pagination!.pageSize!); + search.pagination!.page = params.pagination?.page; // set the response results with results from backfill responses - response.results = backfillResults; + search.results = backfillResults; } else { // infinite with no backfills. - [meta, response] = await this.client.search(params); + const response = await this.client.search(params); + meta = response.meta; + search = response.search; // append new results to previous results - response.results = [...this.previousResults, ...(response.results || [])]; + search.results = [...this.previousResults, ...(search.results || [])]; } } else { // standard request (not using infinite scroll) - [meta, response] = await this.client.search(params); - } - - // MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data - if (!response.meta) { - response.meta = meta; + const res = await this.client.search(params); + meta = res.meta; + search = res.search; } searchProfile.stop(); @@ -440,7 +441,7 @@ export class SearchController extends AbstractController { await this.eventManager.fire('afterSearch', { controller: this, request: params, - response, + response: { meta, search }, }); } catch (err: any) { if (err?.message == 'cancelled') { @@ -458,11 +459,11 @@ export class SearchController extends AbstractController { // store previous results for infinite usage if (this.config.settings?.infinite) { - this.previousResults = JSON.parse(JSON.stringify(response.results)); + this.previousResults = JSON.parse(JSON.stringify(search.results)); } // update the store - this.store.update(response); + this.store.update({ meta, search }); const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start(); @@ -470,7 +471,7 @@ export class SearchController extends AbstractController { await this.eventManager.fire('afterStore', { controller: this, request: params, - response, + response: { meta, search }, }); } catch (err: any) { if (err?.message == 'cancelled') { diff --git a/packages/snap-preact/components/src/components/Atoms/SearchHeader/SearchHeader.test.tsx b/packages/snap-preact/components/src/components/Atoms/SearchHeader/SearchHeader.test.tsx index 42ed22875..1c9fb272c 100644 --- a/packages/snap-preact/components/src/components/Atoms/SearchHeader/SearchHeader.test.tsx +++ b/packages/snap-preact/components/src/components/Atoms/SearchHeader/SearchHeader.test.tsx @@ -1,8 +1,7 @@ import { h } from 'preact'; -import { render, waitFor } from '@testing-library/preact'; +import { render } from '@testing-library/preact'; import { SearchHeader } from './SearchHeader'; -import { Theme, ThemeProvider } from '../../../providers'; -import type { SearchResultStore } from '@searchspring/snap-store-mobx'; +import { ThemeProvider } from '../../../providers'; import { MockData } from '@searchspring/snap-shared'; import { SearchMerchandisingStore, SearchPaginationStore, SearchQueryStore } from '@searchspring/snap-store-mobx'; import { UrlManager, UrlTranslator } from '@searchspring/snap-url-manager'; @@ -22,14 +21,14 @@ describe('Search Header Component', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); const queryStore = new SearchQueryStore({ services, data: { - search: data, + search: data.search, }, }); @@ -270,8 +269,8 @@ describe('Search Header Component', () => { it('custom lang options', async () => { //oq const oqData = new MockData().searchMeta('oq'); - const oqPaginationStore = new SearchPaginationStore({ config: searchConfig, services, data: { search: oqData, meta: oqData.meta } }); - const oqQueryStore = new SearchQueryStore({ services, data: { search: oqData } }); + const oqPaginationStore = new SearchPaginationStore({ config: searchConfig, services, data: { search: oqData.search, meta: oqData.meta } }); + const oqQueryStore = new SearchQueryStore({ services, data: { search: oqData.search } }); const oqValue = 'oq value'; const oqAltText = 'oq alt'; @@ -310,9 +309,9 @@ describe('Search Header Component', () => { const emptyPaginationStore = new SearchPaginationStore({ config: searchConfig, services, - data: { search: noResultsdata, meta: noResultsdata.meta }, + data: { search: noResultsdata.search, meta: noResultsdata.meta }, }); - const emptyQueryStore = new SearchQueryStore({ services, data: { search: noResultsdata } }); + const emptyQueryStore = new SearchQueryStore({ services, data: { search: noResultsdata.search } }); const emptyValue = 'empty value'; const emptyAltText = 'empty alt'; @@ -348,8 +347,8 @@ describe('Search Header Component', () => { //did you mean const dymData = new MockData().searchMeta('dym'); - const dymPaginationStore = new SearchPaginationStore({ config: searchConfig, services, data: { search: dymData, meta: dymData.meta } }); - const dymQueryStore = new SearchQueryStore({ services, data: { search: dymData } }); + const dymPaginationStore = new SearchPaginationStore({ config: searchConfig, services, data: { search: dymData.search, meta: dymData.meta } }); + const dymQueryStore = new SearchQueryStore({ services, data: { search: dymData.search } }); const dymValue = 'dym value'; const dymAltText = 'dym alt'; @@ -391,14 +390,14 @@ describe('Search Header Component', () => { config: searchConfig, services, data: { - search: noResultsdata, + search: noResultsdata.search, meta: noResultsdata.meta, }, }); const emptyQueryStore = new SearchQueryStore({ services, data: { - search: noResultsdata, + search: noResultsdata.search, }, }); @@ -450,14 +449,14 @@ describe('Search Header Component', () => { config: searchConfig, services, data: { - search: oqData, + search: oqData.search, meta: oqData.meta, }, }); const oqQueryStore = new SearchQueryStore({ services, data: { - search: oqData, + search: oqData.search, }, }); @@ -509,14 +508,14 @@ describe('Search Header Component', () => { config: searchConfig, services, data: { - search: dymData, + search: dymData.search, meta: dymData.meta, }, }); const dymQueryStore = new SearchQueryStore({ services, data: { - search: dymData, + search: dymData.search, }, }); @@ -570,19 +569,19 @@ describe('Search Header Component', () => { config: searchConfig, services, data: { - search: landingData, + search: landingData.search, meta: landingData.meta, }, }); const landingQueryStore = new SearchQueryStore({ services, data: { - search: landingData, + search: landingData.search, }, }); const merchandisingStore = new SearchMerchandisingStore({ data: { - search: landingData, + search: landingData.search, }, }); diff --git a/packages/snap-preact/components/src/components/Molecules/Filter/Filter.test.tsx b/packages/snap-preact/components/src/components/Molecules/Filter/Filter.test.tsx index a3547198d..de501c38a 100644 --- a/packages/snap-preact/components/src/components/Molecules/Filter/Filter.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/Filter/Filter.test.tsx @@ -47,7 +47,7 @@ describe('Filter Component', () => { const filters = new SearchFilterStore({ services, data: { - search: mockData, + search: mockData.search, meta: mockData.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Molecules/LoadMore/LoadMore.test.tsx b/packages/snap-preact/components/src/components/Molecules/LoadMore/LoadMore.test.tsx index 95729efcb..9460d5f63 100644 --- a/packages/snap-preact/components/src/components/Molecules/LoadMore/LoadMore.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/LoadMore/LoadMore.test.tsx @@ -25,7 +25,7 @@ describe('LoadMore Component', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx b/packages/snap-preact/components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx index 45b4c9322..ff162c076 100644 --- a/packages/snap-preact/components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx +++ b/packages/snap-preact/components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx @@ -79,6 +79,10 @@ export const OverlayBadge = observer((properties: OverlayBadgeProps): JSX.Elemen } const meta = controller?.store?.meta; + if (!meta) { + controller?.log?.warn('Controller must have a meta store'); + return {children}; + } const group = 'overlay'; const grid = meta?.badges?.groups?.[group]?.grid; const badgeComponentMap = { diff --git a/packages/snap-preact/components/src/components/Molecules/Pagination/Pagination.test.tsx b/packages/snap-preact/components/src/components/Molecules/Pagination/Pagination.test.tsx index baedc3c3c..e213b39a5 100644 --- a/packages/snap-preact/components/src/components/Molecules/Pagination/Pagination.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/Pagination/Pagination.test.tsx @@ -25,7 +25,7 @@ describe('Pagination Component', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); @@ -87,7 +87,7 @@ describe('Lets test the Pagination Component optional props', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); @@ -294,7 +294,7 @@ describe('Pagination theming works', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Molecules/PerPage/PerPage.test.tsx b/packages/snap-preact/components/src/components/Molecules/PerPage/PerPage.test.tsx index e6074ac8d..11a6f97db 100644 --- a/packages/snap-preact/components/src/components/Molecules/PerPage/PerPage.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/PerPage/PerPage.test.tsx @@ -23,7 +23,7 @@ describe('PerPage Component', () => { config: searchConfig, services, data: { - search: data, + search: data.search, meta: data.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Molecules/Result/Result.test.tsx b/packages/snap-preact/components/src/components/Molecules/Result/Result.test.tsx index 37508c45b..fc6a81b43 100644 --- a/packages/snap-preact/components/src/components/Molecules/Result/Result.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/Result/Result.test.tsx @@ -17,7 +17,7 @@ const mockResults = new SearchResultStore({ config: { id: 'test' }, state: { loaded: false }, data: { - search: searchResponse, + search: searchResponse.search, meta: searchResponse.meta, }, }); @@ -38,7 +38,7 @@ describe('Result Component', () => { it('renders title', () => { const rendered = render(); const title = rendered.container.querySelector('.ss__result .ss__result__details .ss__result__details__title'); - expect(title?.textContent).toBe(searchResponse.results![0].mappings?.core?.name); + expect(title?.textContent).toBe(searchResponse.search.results![0].mappings?.core?.name); }); it('renders pricing', () => { diff --git a/packages/snap-preact/components/src/components/Molecules/SortBy/SortBy.test.tsx b/packages/snap-preact/components/src/components/Molecules/SortBy/SortBy.test.tsx index d8cf8f364..871835cc0 100644 --- a/packages/snap-preact/components/src/components/Molecules/SortBy/SortBy.test.tsx +++ b/packages/snap-preact/components/src/components/Molecules/SortBy/SortBy.test.tsx @@ -17,7 +17,7 @@ describe('SortBy Component', () => { const sortingStore = new SearchSortingStore({ services, data: { - search: data, + search: data.search, meta: data.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Organisms/FilterSummary/FilterSummary.test.tsx b/packages/snap-preact/components/src/components/Organisms/FilterSummary/FilterSummary.test.tsx index e22abf7b0..22779e3c5 100644 --- a/packages/snap-preact/components/src/components/Organisms/FilterSummary/FilterSummary.test.tsx +++ b/packages/snap-preact/components/src/components/Organisms/FilterSummary/FilterSummary.test.tsx @@ -17,7 +17,7 @@ const mockData = new MockData().searchMeta('filtered'); const filters = new SearchFilterStore({ services, data: { - search: mockData, + search: mockData.search, meta: mockData.meta, }, }); @@ -253,7 +253,7 @@ describe('FilterSummary theming works', () => { const filters = new SearchFilterStore({ services, data: { - search: mockData, + search: mockData.search, meta: mockData.meta, }, }); diff --git a/packages/snap-preact/components/src/components/Organisms/Results/Results.test.tsx b/packages/snap-preact/components/src/components/Organisms/Results/Results.test.tsx index c37f1f73c..6af8dd0a3 100644 --- a/packages/snap-preact/components/src/components/Organisms/Results/Results.test.tsx +++ b/packages/snap-preact/components/src/components/Organisms/Results/Results.test.tsx @@ -16,7 +16,7 @@ const mockResults = new SearchResultStore({ config: { id: 'test' }, state: { loaded: false }, data: { - search: searchResponse, + search: searchResponse.search, meta: searchResponse.meta, }, }); diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx index 8feb34948..3c8a44c80 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx @@ -362,8 +362,8 @@ async function readyTheController( window.searchspring.controller = window.searchspring.controller || {}; window.searchspring.controller[controller.config.id] = controller; - const profileVars = controller.store.profile.display.templateParameters; - const component = controller.store.profile.display.template?.component; + const profileVars = controller.store.profile.display?.templateParameters; + const component = controller.store.profile.display?.template?.component; if (controller.store.error) { //something went wrong diff --git a/packages/snap-shared/src/MockClient/MockClient.ts b/packages/snap-shared/src/MockClient/MockClient.ts index 7c3088295..b7bcab877 100644 --- a/packages/snap-shared/src/MockClient/MockClient.ts +++ b/packages/snap-shared/src/MockClient/MockClient.ts @@ -36,7 +36,8 @@ export class MockClient extends Client { if (this.mockConfig.delay) await wait(this.mockConfig.delay); - return Promise.all([this.meta() as MetaResponseModel, searchData as SearchResponseModel]); + const [meta, search] = await Promise.all([this.meta() as MetaResponseModel, searchData as SearchResponseModel]); + return { meta, search }; } async finder() { @@ -44,7 +45,8 @@ export class MockClient extends Client { if (this.mockConfig.delay) await wait(this.mockConfig.delay); - return Promise.all([this.meta() as MetaResponseModel, searchData as SearchResponseModel]); + const [meta, search] = await Promise.all([this.meta() as MetaResponseModel, searchData as SearchResponseModel]); + return { meta, search }; } async autocomplete() { @@ -52,7 +54,8 @@ export class MockClient extends Client { if (this.mockConfig.delay) await wait(this.mockConfig.delay); - return Promise.all([this.meta() as MetaResponseModel, autocompleteData as AutocompleteResponseModel]); + const [meta, search] = await Promise.all([this.meta() as MetaResponseModel, autocompleteData as AutocompleteResponseModel]); + return { meta, search }; } async recommend() { diff --git a/packages/snap-shared/src/MockData/MockData.ts b/packages/snap-shared/src/MockData/MockData.ts index 8babba093..cdcb2b6ae 100644 --- a/packages/snap-shared/src/MockData/MockData.ts +++ b/packages/snap-shared/src/MockData/MockData.ts @@ -92,17 +92,17 @@ export class MockData { } } - searchMeta(file?: string) { + searchMeta(file?: string): { meta: MetaResponseModel; search: SearchResponseModel } { try { - return { meta: this.meta(), ...this.search(file) }; + return { meta: this.meta(), search: this.search(file) }; } catch (err) { throw 'Search JSON not found.'; } } - autocompleteMeta(file?: string) { + autocompleteMeta(file?: string): { meta: MetaResponseModel; search: AutocompleteResponseModel } { try { - return { meta: this.meta(), ...this.autocomplete(file) }; + return { meta: this.meta(), search: this.autocomplete(file) }; } catch (err) { throw 'Search JSON not found.'; } @@ -123,8 +123,8 @@ export class MockData { const resultsFile = `${__dirname}/recommend/results/${this.config.siteId}/${files?.resultsFile || this.config.recommend?.results}.json`; return { meta: this.meta(), - profile: getJSON(profileFile).profile, - results: getJSON(resultsFile)[0].results, + profile: getJSON(profileFile), + recommend: getJSON(resultsFile)[0], }; } catch (err) { throw 'Search JSON not found.'; diff --git a/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.test.ts b/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.test.ts index 6daaf303b..0cdeba2d2 100644 --- a/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.test.ts +++ b/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.test.ts @@ -23,12 +23,16 @@ const autocompleteConfig = { }; describe('Autocomplete Store', () => { - let searchData: AutocompleteResponseModel & { + let searchData: { meta: MetaResponseModel; + search: AutocompleteResponseModel; }; beforeEach(() => { - searchData = mockData.autocompleteMeta(); + searchData = { + search: mockData.autocomplete(), + meta: mockData.meta(), + }; }); it('links the controller and controller urlManager to state', () => { @@ -43,7 +47,7 @@ describe('Autocomplete Store', () => { expect(autocompleteStore.loading).toBe(false); expect(autocompleteStore.meta).toBeDefined(); - expect(autocompleteStore.meta.data).toStrictEqual({}); + expect(autocompleteStore.meta?.data).toStrictEqual({}); expect(autocompleteStore.terms).toBeDefined(); expect(autocompleteStore.terms).toStrictEqual([]); @@ -82,23 +86,23 @@ describe('Autocomplete Store', () => { autocompleteStore.update(searchData); expect(autocompleteStore.meta).toBeDefined(); - expect(autocompleteStore.meta.data).toStrictEqual(searchData.meta); + expect(autocompleteStore.meta?.data).toStrictEqual(searchData.meta); expect(autocompleteStore.search).toBeDefined(); expect(autocompleteStore.search?.query).toBeDefined(); - expect(autocompleteStore.search?.query?.string).toEqual(searchData.autocomplete?.query); + expect(autocompleteStore.search?.query?.string).toEqual(searchData.search.autocomplete?.query); expect(autocompleteStore.search?.originalQuery).toBeUndefined(); expect(autocompleteStore.merchandising).toBeDefined(); - expect(autocompleteStore.merchandising).toEqual(searchData.merchandising); + expect(autocompleteStore.merchandising).toEqual(searchData.search.merchandising); - expect(autocompleteStore.facets).toHaveLength(searchData?.facets?.length!); + expect(autocompleteStore.facets).toHaveLength(searchData?.search.facets?.length!); expect(autocompleteStore.filters).toHaveLength(0); - expect(autocompleteStore.results).toHaveLength(searchData?.results?.length!); + expect(autocompleteStore.results).toHaveLength(searchData?.search.results?.length!); - expect(autocompleteStore.pagination?.totalResults).toBe(searchData.pagination?.totalResults); + expect(autocompleteStore.pagination?.totalResults).toBe(searchData.search.pagination?.totalResults); expect(autocompleteStore.sorting?.options).toHaveLength(searchData.meta.sortOptions?.length!); diff --git a/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.ts b/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.ts index 5618f8e54..4a5e8ad9f 100644 --- a/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.ts +++ b/packages/snap-store-mobx/src/Autocomplete/AutocompleteStore.ts @@ -27,7 +27,7 @@ import { MetaStore } from '../Meta/MetaStore'; export class AutocompleteStore extends AbstractStore { public services: StoreServices; - public meta!: MetaStore; + public meta?: MetaStore; public merchandising!: SearchMerchandisingStore; public search!: AutocompleteQueryStore; public terms!: AutocompleteTermStore; @@ -82,7 +82,7 @@ export class AutocompleteStore extends AbstractStore { public reset(): void { this.state.reset(); - this.update(); + this.update({ meta: {}, search: {} }); this.resetTerms(); } @@ -142,7 +142,7 @@ export class AutocompleteStore extends AbstractStore { } } - public updateTrendingTerms(data: TrendingResponseModel): void { + public updateTrendingTerms(trending: TrendingResponseModel): void { this.trending = new AutocompleteTrendingStore({ services: this.services, functions: { @@ -154,23 +154,21 @@ export class AutocompleteStore extends AbstractStore { autocomplete: this.state, }, data: { - trending: data, + trending, }, }); } - public update(data: AutocompleteResponseModel & { meta?: MetaResponseModel } = {}): void { + public update(data: { meta: MetaResponseModel; search: AutocompleteResponseModel }): void { if (!data) return; - this.error = undefined; + const { meta, search } = data || {}; this.meta = new MetaStore({ - data: { - meta: data.meta!, - }, + data: { meta }, }); // set the query to match the actual queried term and not the input query - if (data.search) { - this.state.url = this.services.urlManager = this.services.urlManager.set('query', data.search.query); + if (search.search) { + this.state.url = this.services.urlManager = this.services.urlManager.set('query', search.search.query); } // only run if we want to update the terms (not locked) @@ -187,17 +185,17 @@ export class AutocompleteStore extends AbstractStore { autocomplete: this.state, }, data: { - autocomplete: data, + autocomplete: search, }, }); // only lock if there was data - data.autocomplete && this.state.locks.terms.lock(); + search.autocomplete && this.state.locks.terms.lock(); } this.merchandising = new SearchMerchandisingStore({ data: { - search: data, + search, }, }); @@ -205,7 +203,7 @@ export class AutocompleteStore extends AbstractStore { config: this.config, services: this.services, data: { - autocomplete: data, + autocomplete: search, }, }); @@ -221,7 +219,7 @@ export class AutocompleteStore extends AbstractStore { autocomplete: this.state, }, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -230,7 +228,7 @@ export class AutocompleteStore extends AbstractStore { this.filters = new SearchFilterStore({ services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -241,7 +239,7 @@ export class AutocompleteStore extends AbstractStore { loaded: this.loaded, }, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -255,7 +253,7 @@ export class AutocompleteStore extends AbstractStore { this.pagination = new SearchPaginationStore({ services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -263,11 +261,12 @@ export class AutocompleteStore extends AbstractStore { this.sorting = new SearchSortingStore({ services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); - this.loaded = !!data.pagination; + this.error = undefined; + this.loaded = Boolean(search?.pagination); } } diff --git a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteFacetStore.test.ts b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteFacetStore.test.ts index f7229e7aa..419d4f124 100644 --- a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteFacetStore.test.ts +++ b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteFacetStore.test.ts @@ -40,12 +40,12 @@ describe('Facet store', () => { autocomplete: rootState, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(facetStore).toHaveLength(searchData.facets?.length!); + expect(facetStore).toHaveLength(searchData.search.facets?.length!); }); it('adds a preview function to each facet value', () => { @@ -63,7 +63,7 @@ describe('Facet store', () => { autocomplete: rootState, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); diff --git a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteQueryStore.test.ts b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteQueryStore.test.ts index de12c3bb8..428c285ac 100644 --- a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteQueryStore.test.ts +++ b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteQueryStore.test.ts @@ -25,12 +25,12 @@ describe('AutocompleteQueryStore store', () => { config, services, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); expect(queryStore).toBeDefined(); expect(queryStore.query).toBeDefined(); - expect(queryStore.query?.string).toEqual(searchData.autocomplete?.query); + expect(queryStore.query?.string).toEqual(searchData.search.autocomplete?.query); expect(queryStore.originalQuery).toBeUndefined(); }); @@ -41,14 +41,14 @@ describe('AutocompleteQueryStore store', () => { config, services, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); expect(queryStore).toBeDefined(); expect(queryStore.query).toBeDefined(); - expect(queryStore.query?.string).toStrictEqual(searchData.search?.query); + expect(queryStore.query?.string).toStrictEqual(searchData.search.search?.query); expect(queryStore.correctedQuery).toBeDefined(); - expect(queryStore.correctedQuery?.string).toStrictEqual(searchData.autocomplete?.correctedQuery); + expect(queryStore.correctedQuery?.string).toStrictEqual(searchData.search.autocomplete?.correctedQuery); }); it('contains originalQuery in search when corrected without integratedSpellCorrection', () => { @@ -60,13 +60,13 @@ describe('AutocompleteQueryStore store', () => { config, services, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); expect(queryStore).toBeDefined(); expect(queryStore.query).toBeDefined(); - expect(queryStore.query?.string).toStrictEqual(searchData.search?.query); + expect(queryStore.query?.string).toStrictEqual(searchData.search.search?.query); expect(queryStore.originalQuery).toBeDefined(); - expect(queryStore.originalQuery?.string).toStrictEqual(searchData.autocomplete?.query); + expect(queryStore.originalQuery?.string).toStrictEqual(searchData.search.autocomplete?.query); }); }); diff --git a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteTermStore.test.ts b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteTermStore.test.ts index 0e9cde1ad..0b61b2a14 100644 --- a/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteTermStore.test.ts +++ b/packages/snap-store-mobx/src/Autocomplete/Stores/AutocompleteTermStore.test.ts @@ -64,11 +64,11 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); - const expected = [searchData.autocomplete?.suggested?.text, ...searchData.autocomplete?.alternatives?.map((alt) => alt.text)!]; + const expected = [searchData.search.autocomplete?.suggested?.text, ...searchData.search.autocomplete?.alternatives?.map((alt) => alt.text)!]; expect(termStore.map((term) => term.value)).toStrictEqual(expected); }); @@ -86,7 +86,7 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); @@ -114,7 +114,7 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); @@ -138,7 +138,7 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); @@ -159,11 +159,11 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); - expect(termStore.filter((term) => term.active).map((term) => term.value)).toStrictEqual([searchData.autocomplete?.query]); + expect(termStore.filter((term) => term.active).map((term) => term.value)).toStrictEqual([searchData.search.search?.query]); }); it('has a preview function on terms', () => { @@ -178,7 +178,7 @@ describe('Term Store', () => { autocomplete: rootState, }, data: { - autocomplete: searchData, + autocomplete: searchData.search, }, }); diff --git a/packages/snap-store-mobx/src/Cart/CartStore.test.ts b/packages/snap-store-mobx/src/Cart/CartStore.test.ts index 253184cfe..74a050f25 100644 --- a/packages/snap-store-mobx/src/Cart/CartStore.test.ts +++ b/packages/snap-store-mobx/src/Cart/CartStore.test.ts @@ -1,12 +1,6 @@ import { MockData } from '@searchspring/snap-shared'; import { CartStore } from './CartStore'; -import { UrlManager, UrlTranslator } from '@searchspring/snap-url-manager'; import { Product, SearchResultStore } from '../Search/Stores/SearchResultStore'; -import { waitFor } from '@testing-library/preact'; - -const services = { - urlManager: new UrlManager(new UrlTranslator()), -}; const _mockData = new MockData(); @@ -21,7 +15,9 @@ const results = new SearchResultStore({ loaded: true, }, data: { - search: mockData, + search: { + results: mockData.recommend.results, + }, meta: _mockData.meta(), }, }); diff --git a/packages/snap-store-mobx/src/Finder/FinderStore.test.ts b/packages/snap-store-mobx/src/Finder/FinderStore.test.ts index b0736cf14..851ee8919 100644 --- a/packages/snap-store-mobx/src/Finder/FinderStore.test.ts +++ b/packages/snap-store-mobx/src/Finder/FinderStore.test.ts @@ -47,11 +47,18 @@ const baseNonHierarchyConfig = { const configs = [baseHierarchyConfig, baseNonHierarchyConfig]; describe('Finder Store', () => { - let config: FinderStoreConfig, searchData: SearchResponseModel & { meta: MetaResponseModel }; + let config: FinderStoreConfig; + let searchData: { + meta: MetaResponseModel; + search: SearchResponseModel; + }; beforeEach(() => { config = Object.assign({}, baseHierarchyConfig); - searchData = mockData.searchMeta(); + searchData = { + search: mockData.search(), + meta: mockData.meta(), + }; }); it('throws if invalid services object', () => { @@ -76,7 +83,7 @@ describe('Finder Store', () => { expect(finderStore.loaded).toBe(false); expect(finderStore.meta).toBeDefined(); - expect(finderStore.meta.data).toStrictEqual({}); + expect(finderStore.meta?.data).toStrictEqual({}); expect(finderStore.pagination).toBeDefined(); expect(finderStore.pagination?.totalResults).toBeUndefined(); @@ -92,21 +99,35 @@ describe('Finder Store', () => { expect(finderStore.loaded).toBe(true); expect(finderStore.meta).toBeDefined(); - expect(finderStore.meta.data).toStrictEqual(searchData.meta); + expect(finderStore.meta?.data).toStrictEqual(searchData.meta); - expect(finderStore.pagination?.totalResults).toBe(searchData.pagination?.totalResults); + expect(finderStore.pagination?.totalResults).toBe(searchData.search.pagination?.totalResults); expect(finderStore.selections).toHaveLength(config.fields.reduce((count, field) => (count += field.levels?.length!), 0)); }); configs.forEach((baseConfig) => { const isHierarchy = 'levels' in baseConfig.fields[0]; - let config: FinderStoreConfig, searchData: SearchResponseModel & { meta: MetaResponseModel }; + let config: FinderStoreConfig; + let searchData: { + search: SearchResponseModel; + meta: MetaResponseModel; + }; describe(`Finder Store with ${isHierarchy ? 'Hierarchy' : 'Non-Hierarchy'} Selections`, () => { beforeEach(() => { config = Object.assign({}, baseConfig); - searchData = isHierarchy ? mockData.searchMeta() : mockData.searchMeta('non_hierarchy'); + if (isHierarchy) { + searchData = { + search: mockData.search(), + meta: mockData.meta(), + }; + } else { + searchData = { + search: mockData.search('non_hierarchy'), + meta: mockData.meta(), + }; + } }); it('can persist selections', () => { diff --git a/packages/snap-store-mobx/src/Finder/FinderStore.ts b/packages/snap-store-mobx/src/Finder/FinderStore.ts index 2ec71596c..55c803310 100644 --- a/packages/snap-store-mobx/src/Finder/FinderStore.ts +++ b/packages/snap-store-mobx/src/Finder/FinderStore.ts @@ -11,7 +11,7 @@ import { MetaStore } from '../Meta/MetaStore'; export class FinderStore extends AbstractStore { public services: StoreServices; - public meta!: MetaStore; + public meta?: MetaStore; public storage: StorageStore; public persistedStorage!: StorageStore; public pagination!: SearchPaginationStore; @@ -36,7 +36,7 @@ export class FinderStore extends AbstractStore { this.storage = new StorageStore(); - this.update({ meta: {} }); + this.update({ meta: {}, search: {} }); makeObservable(this, { selections: observable, @@ -92,19 +92,16 @@ export class FinderStore extends AbstractStore { } } - public update(data: SearchResponseModel & { meta?: MetaResponseModel }, selectedSelections?: SelectedSelection[]): void { - this.error = undefined; - this.loaded = !!data.pagination; + public update(data: { meta: MetaResponseModel; search: SearchResponseModel }, selectedSelections?: SelectedSelection[]): void { + const { meta, search } = data || {}; this.meta = new MetaStore({ - data: { - meta: data.meta!, - }, + data: { meta }, }); this.pagination = new SearchPaginationStore({ config: this.config, services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -120,7 +117,7 @@ export class FinderStore extends AbstractStore { loading: this.loading, }, data: { - search: data, + search, meta: this.meta.data, selections: selectedSelections || [], }, @@ -130,7 +127,7 @@ export class FinderStore extends AbstractStore { this.save = () => { if (this.config.persist?.enabled && this.persistedStorage && this?.selections?.filter((selection) => selection.selected).length) { this.persistedStorage.set('config', this.config); - this.persistedStorage.set('data', data); + this.persistedStorage.set('data', search); this.persistedStorage.set('date', Date.now()); this.persistedStorage.set( 'selections', @@ -144,5 +141,8 @@ export class FinderStore extends AbstractStore { ); } }; + + this.error = undefined; + this.loaded = Boolean(search?.pagination); } } diff --git a/packages/snap-store-mobx/src/Finder/Stores/FinderSelectionStore.test.ts b/packages/snap-store-mobx/src/Finder/Stores/FinderSelectionStore.test.ts index c182647fc..f94b35b76 100644 --- a/packages/snap-store-mobx/src/Finder/Stores/FinderSelectionStore.test.ts +++ b/packages/snap-store-mobx/src/Finder/Stores/FinderSelectionStore.test.ts @@ -31,7 +31,7 @@ describe('FinderSelectionStore', () => { const storage = new StorageStore(); - let data: SearchResponseModel & { meta: MetaResponseModel }, store: FinderSelectionStore, selectionValue: string | undefined; + let data, store: FinderSelectionStore, selectionValue: string | undefined; beforeAll(() => { data = mockData.searchMeta(); @@ -46,7 +46,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, @@ -94,7 +94,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, @@ -172,10 +172,7 @@ describe('FinderSelectionStore', () => { ], }; - let data: SearchResponseModel & { meta: MetaResponseModel }, - store: FinderSelectionStore, - storage: StorageStore, - selectionValue: string | undefined; + let data, store: FinderSelectionStore, storage: StorageStore, selectionValue: string | undefined; beforeAll(() => { data = mockData.searchMeta('hierarchy'); @@ -192,7 +189,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, @@ -231,7 +228,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, @@ -246,10 +243,7 @@ describe('FinderSelectionStore', () => { }); describe('Non-hierarchy', () => { - let data: SearchResponseModel & { meta: MetaResponseModel }, - store: FinderSelectionStore, - storage: StorageStore, - selectionValue: string | undefined; + let data, store: FinderSelectionStore, storage: StorageStore, selectionValue: string | undefined; const config = { id: 'finder2', @@ -288,7 +282,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, @@ -340,7 +334,7 @@ describe('FinderSelectionStore', () => { loading: false, }, data: { - search: data, + search: data.search, meta: data.meta, selections: [], }, diff --git a/packages/snap-store-mobx/src/Meta/MetaStore.test.ts b/packages/snap-store-mobx/src/Meta/MetaStore.test.ts index 1be45a0c0..dbdb0ca5f 100644 --- a/packages/snap-store-mobx/src/Meta/MetaStore.test.ts +++ b/packages/snap-store-mobx/src/Meta/MetaStore.test.ts @@ -9,7 +9,7 @@ describe('Meta Store', () => { let metaData: MetaResponseModel; beforeEach(() => { - metaData = mockData.searchMeta().meta; + metaData = mockData.meta(); }); it('can construct without metaData', () => { diff --git a/packages/snap-store-mobx/src/Recommendation/RecommendationStore.test.ts b/packages/snap-store-mobx/src/Recommendation/RecommendationStore.test.ts index 7c2f246fb..90b42a574 100644 --- a/packages/snap-store-mobx/src/Recommendation/RecommendationStore.test.ts +++ b/packages/snap-store-mobx/src/Recommendation/RecommendationStore.test.ts @@ -17,7 +17,7 @@ describe('RecommendationStore store', () => { }; const store = new RecommendationStore(recommendationConfig, services); expect(store.loaded).toBe(false); - expect(store.profile).toEqual({ display: {}, type: 'default' }); + expect(store.profile).toStrictEqual({}); expect(store.results).toStrictEqual([]); }); @@ -34,14 +34,14 @@ describe('RecommendationStore store', () => { expect(store.loaded).toBe(true); - expect(store.profile?.tag).toBe(data.profile.tag); - expect(store.profile?.placement).toBe(data.profile.placement); - expect(store.profile?.display).toStrictEqual(data.profile.display); + expect(store.profile?.tag).toBe(data.profile.profile.tag); + expect(store.profile?.placement).toBe(data.profile.profile.placement); + expect(store.profile?.display).toStrictEqual(data.profile.profile.display); - expect(store.results).toHaveLength(data.results.length); + expect(store.results).toHaveLength(data.recommend.results.length); expect(store.results && store.results[0].type).toBe('product'); - expect(store.results && store.results[0].id).toStrictEqual(data.results[0].id); - expect(store.results && store.results[0].mappings).toStrictEqual(data.results[0].mappings); - expect(store.results && store.results[0].attributes).toStrictEqual(data.results[0].attributes); + expect(store.results && store.results[0].id).toStrictEqual(data.recommend.results[0].id); + expect(store.results && store.results[0].mappings).toStrictEqual(data.recommend.results[0].mappings); + expect(store.results && store.results[0].attributes).toStrictEqual(data.recommend.results[0].attributes); }); }); diff --git a/packages/snap-store-mobx/src/Recommendation/RecommendationStore.ts b/packages/snap-store-mobx/src/Recommendation/RecommendationStore.ts index ca2f973d3..55c04c033 100644 --- a/packages/snap-store-mobx/src/Recommendation/RecommendationStore.ts +++ b/packages/snap-store-mobx/src/Recommendation/RecommendationStore.ts @@ -4,17 +4,17 @@ import { Product, SearchResultStore } from '../Search/Stores'; import { CartStore } from '../Cart/CartStore'; import { RecommendationProfileStore } from './Stores'; import type { RecommendationStoreConfig, StoreServices } from '../types'; -import type { RecommendCombinedResponseModel } from '@searchspring/snap-client'; +import type { ProfileResponseModel, RecommendResponseModel } from '@searchspring/snap-client'; import { MetaResponseModel } from '@searchspring/snapi-types'; import { MetaStore } from '../Meta/MetaStore'; export class RecommendationStore extends AbstractStore { public services: StoreServices; - public meta!: MetaStore; + public meta?: MetaStore; public loaded = false; - public profile!: RecommendationProfileStore; - public results!: Product[]; - public cart!: CartStore; + public profile: RecommendationProfileStore | Record = {}; + public results: Product[] = []; + public cart?: CartStore; constructor(config: RecommendationStoreConfig, services: StoreServices) { super(config); @@ -25,8 +25,6 @@ export class RecommendationStore extends AbstractStore { it('create profile using mock profile data', () => { const data = mockData.recommend(); - const store = new RecommendationProfileStore({ data: { recommend: data } }); - expect(store.tag).toStrictEqual(data.profile.tag); - expect(store.placement).toStrictEqual(data.profile.placement); - expect(store.display).toStrictEqual(data.profile.display); + const store = new RecommendationProfileStore({ data: { profile: data.profile } }); + expect(store.tag).toStrictEqual(data.profile.profile.tag); + expect(store.placement).toStrictEqual(data.profile.profile.placement); + expect(store.display).toStrictEqual(data.profile.profile.display); }); }); diff --git a/packages/snap-store-mobx/src/Recommendation/Stores/RecommendationProfileStore.ts b/packages/snap-store-mobx/src/Recommendation/Stores/RecommendationProfileStore.ts index ca25db368..c88476d4b 100644 --- a/packages/snap-store-mobx/src/Recommendation/Stores/RecommendationProfileStore.ts +++ b/packages/snap-store-mobx/src/Recommendation/Stores/RecommendationProfileStore.ts @@ -1,10 +1,9 @@ import { observable, makeObservable } from 'mobx'; - -import type { RecommendCombinedResponseModel } from '@searchspring/snap-client'; +import type { ProfileResponseModel } from '@searchspring/snap-client'; type RecommendationProfileStoreConfig = { data: { - recommend: RecommendCombinedResponseModel; + profile: ProfileResponseModel; }; }; export class RecommendationProfileStore { @@ -15,12 +14,11 @@ export class RecommendationProfileStore { constructor(params: RecommendationProfileStoreConfig) { const { data } = params || {}; - const { recommend } = data || {}; + const { profile } = data?.profile || {}; - if (!recommend?.profile?.tag) { + if (!profile?.tag) { return; } - const { profile } = recommend; this.tag = profile.tag; this.placement = profile.placement; diff --git a/packages/snap-store-mobx/src/Search/SearchStore.test.ts b/packages/snap-store-mobx/src/Search/SearchStore.test.ts index f11e5d0da..e4745c67c 100644 --- a/packages/snap-store-mobx/src/Search/SearchStore.test.ts +++ b/packages/snap-store-mobx/src/Search/SearchStore.test.ts @@ -15,10 +15,10 @@ const searchConfig = { const mockData = new MockData(); describe('Search Store', () => { - let searchData: SearchResponseModel & { meta: MetaResponseModel }; + let searchData: { search: SearchResponseModel; meta: MetaResponseModel }; beforeEach(() => { - searchData = mockData.searchMeta(); + searchData = { search: mockData.search(), meta: mockData.meta() }; }); it('returns correct initial state', () => { @@ -27,7 +27,7 @@ describe('Search Store', () => { expect(searchStore.loading).toBe(false); expect(searchStore.meta).toBeDefined(); - expect(searchStore.meta.data).toStrictEqual({}); + expect(searchStore.meta?.data).toStrictEqual({}); expect(searchStore.merchandising).toBeDefined(); expect(searchStore.merchandising).toEqual({ redirect: '', content: {}, campaigns: [] }); @@ -53,24 +53,24 @@ describe('Search Store', () => { it('update function updates all of the stores', () => { const searchStore = new SearchStore(searchConfig, services); - searchStore.update(searchData as SearchResponseModel); + searchStore.update(searchData); expect(searchStore.meta).toBeDefined(); - expect(searchStore.meta.data).toStrictEqual(searchData.meta); + expect(searchStore.meta?.data).toStrictEqual(searchData.meta); expect(searchStore.search).toBeDefined(); - expect(searchStore.search?.query).toStrictEqual(searchData.search?.query); + expect(searchStore.search?.query).toStrictEqual(searchData.search.search?.query); expect(searchStore.merchandising).toBeDefined(); - expect(searchStore.merchandising).toEqual(searchData.merchandising); + expect(searchStore.merchandising).toEqual(searchData.search.merchandising); - expect(searchStore.facets).toHaveLength(searchData.facets?.length!); + expect(searchStore.facets).toHaveLength(searchData.search.facets?.length!); expect(searchStore.filters).toHaveLength(0); - expect(searchStore.results).toHaveLength(searchData.results?.length!); + expect(searchStore.results).toHaveLength(searchData.search.results?.length!); - expect(searchStore.pagination?.totalResults).toBe(searchData.pagination?.totalResults); + expect(searchStore.pagination?.totalResults).toBe(searchData.search.pagination?.totalResults); expect(searchStore.sorting?.options).toHaveLength(searchData.meta.sortOptions?.filter((option) => option.type == 'field').length!); }); diff --git a/packages/snap-store-mobx/src/Search/SearchStore.ts b/packages/snap-store-mobx/src/Search/SearchStore.ts index 64fa31a85..971d8c634 100644 --- a/packages/snap-store-mobx/src/Search/SearchStore.ts +++ b/packages/snap-store-mobx/src/Search/SearchStore.ts @@ -18,7 +18,7 @@ import { MetaStore } from '../Meta/MetaStore'; export class SearchStore extends AbstractStore { public services: StoreServices; - public meta!: MetaStore; + public meta?: MetaStore; public merchandising!: SearchMerchandisingStore; public search!: SearchQueryStore; public facets!: SearchFacetStore; @@ -45,7 +45,7 @@ export class SearchStore extends AbstractStore { config: this.config, }); - this.update(); + this.update({ search: {}, meta: {} }); makeObservable(this, { search: observable, @@ -59,26 +59,26 @@ export class SearchStore extends AbstractStore { } public reset(): void { - this.update(); + this.update({ search: {}, meta: {} }); } - public update(data: SearchResponseModel & { meta?: MetaResponseModel } = {}): void { - this.error = undefined; + public update(data: { search: SearchResponseModel; meta: MetaResponseModel }): void { + const { search, meta } = data || {}; this.meta = new MetaStore({ data: { - meta: data.meta!, + meta, }, }); this.merchandising = new SearchMerchandisingStore({ data: { - search: data, + search, }, }); this.search = new SearchQueryStore({ services: this.services, data: { - search: data, + search, }, }); @@ -89,7 +89,7 @@ export class SearchStore extends AbstractStore { storage: this.storage, }, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -97,7 +97,7 @@ export class SearchStore extends AbstractStore { this.filters = new SearchFilterStore({ services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -108,7 +108,7 @@ export class SearchStore extends AbstractStore { loaded: this.loaded, }, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -117,7 +117,7 @@ export class SearchStore extends AbstractStore { config: this.config, services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); @@ -125,11 +125,12 @@ export class SearchStore extends AbstractStore { this.sorting = new SearchSortingStore({ services: this.services, data: { - search: data, + search, meta: this.meta.data, }, }); - this.loaded = !!data.pagination; + this.error = undefined; + this.loaded = Boolean(search?.pagination); } } diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchFacetStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchFacetStore.test.ts index 97b25a6f4..ddcdb2380 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchFacetStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchFacetStore.test.ts @@ -32,9 +32,7 @@ configure({ }); describe('Facet Store', () => { - let searchData: SearchResponseModel & { - meta: MetaResponseModel & MetaResponseModelFacetDefaults; - }; + let searchData: { meta: MetaResponseModel; search: SearchResponseModel }; let storageStore: StorageStore; beforeEach(() => { @@ -57,7 +55,7 @@ describe('Facet Store', () => { }); it('returns an empty array when passed an empty array [] of facets', () => { - searchData.facets = []; + searchData.search.facets = []; const facets = new SearchFacetStore({ config: searchConfig, stores: { @@ -65,7 +63,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -82,12 +80,12 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(facets.length).toBe(searchData.facets?.length); + expect(facets.length).toBe(searchData.search.facets?.length); }); it('adds a reference to services to each facet', () => { @@ -98,7 +96,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -116,7 +114,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -138,13 +136,13 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); facets.forEach((facet, index) => { - const searchDataFacet = searchData.facets && searchData.facets[index]; + const searchDataFacet = searchData.search.facets && searchData.search.facets[index]; expect(facet.field).toBe(searchDataFacet?.field); expect(facet.filtered).toStrictEqual(searchDataFacet?.filtered); expect(facet.type).toStrictEqual(searchDataFacet?.type); @@ -159,7 +157,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -180,7 +178,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -197,7 +195,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -222,7 +220,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -246,7 +244,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -267,7 +265,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -293,7 +291,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -323,7 +321,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -357,7 +355,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -374,7 +372,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -407,7 +405,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -433,11 +431,11 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(facets.length).not.toBe(searchData.facets?.length); + expect(facets.length).not.toBe(searchData.search.facets?.length); expect(facets.length).toBe(1); }); @@ -465,7 +463,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -496,7 +494,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -524,7 +522,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -557,7 +555,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -591,7 +589,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -629,7 +627,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -664,13 +662,13 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(facets.length).toBe(1); - const searchDataFacet = searchData.facets && (searchData.facets[0] as SearchResponseModelFacetRange); + const searchDataFacet = searchData.search.facets && (searchData.search.facets[0] as SearchResponseModelFacetRange); expect(facets[0].range.low).toBe(searchDataFacet?.range?.low); expect(facets[0].range.high).toBe(searchDataFacet?.range?.high); expect(facets[0].active.low).toBe(searchDataFacet?.range?.low); @@ -687,12 +685,12 @@ describe('Facet Store', () => { }, services, data: { - search: filteredSearchData, + search: filteredSearchData.search, meta: filteredSearchData.meta, }, }); - const updatedSearchDataFacet = filteredSearchData.facets && (filteredSearchData.facets[0] as SearchResponseModelFacetRange); + const updatedSearchDataFacet = filteredSearchData.search.facets && (filteredSearchData.search.facets[0] as SearchResponseModelFacetRange); expect(updatedFacets.length).toBe(1); expect(updatedFacets[0].range.low).toBe(searchDataFacet?.range?.low); expect(updatedFacets[0].range.high).toBe(searchDataFacet?.range?.high); @@ -719,12 +717,12 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - const searchDataFacet = searchData.facets && (searchData.facets[0] as SearchResponseModelFacetRange); + const searchDataFacet = searchData.search.facets && (searchData.search.facets[0] as SearchResponseModelFacetRange); expect(facets.length).toBe(1); expect(facets[0].range.low).toBe(searchDataFacet?.range?.low); expect(facets[0].range.high).toBe(searchDataFacet?.range?.high); @@ -742,12 +740,12 @@ describe('Facet Store', () => { }, services, data: { - search: filteredSearchData, + search: filteredSearchData.search, meta: filteredSearchData.meta, }, }); - const filteredSearchDataFacet = filteredSearchData.facets && (filteredSearchData.facets[0] as SearchResponseModelFacetRange); + const filteredSearchDataFacet = filteredSearchData.search.facets && (filteredSearchData.search.facets[0] as SearchResponseModelFacetRange); expect(updatedFacets.length).toBe(1); expect(updatedFacets[0].range.low).toBe(filteredSearchDataFacet?.range?.low); expect(updatedFacets[0].range.high).toBe(filteredSearchDataFacet?.range?.high); @@ -779,12 +777,12 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - const searchDataFacet = searchData.facets && (searchData.facets[0] as SearchResponseModelFacetRange); + const searchDataFacet = searchData.search.facets && (searchData.search.facets[0] as SearchResponseModelFacetRange); expect(facets.length).toBe(1); expect(facets[0].range.low).toBe(searchDataFacet?.range?.low); expect(facets[0].range.high).toBe(searchDataFacet?.range?.high); @@ -802,12 +800,12 @@ describe('Facet Store', () => { }, services, data: { - search: filteredSearchData, + search: filteredSearchData.search, meta: filteredSearchData.meta, }, }); - const filteredSearchDataFacet = filteredSearchData.facets && (filteredSearchData.facets[0] as SearchResponseModelFacetRange); + const filteredSearchDataFacet = filteredSearchData.search.facets && (filteredSearchData.search.facets[0] as SearchResponseModelFacetRange); expect(updatedFacets.length).toBe(1); expect(updatedFacets[0].range.low).toBe(searchDataFacet?.range?.low); expect(updatedFacets[0].range.high).toBe(searchDataFacet?.range?.high); @@ -839,12 +837,12 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - const searchDataFacet = searchData.facets && (searchData.facets[0] as SearchResponseModelFacetRange); + const searchDataFacet = searchData.search.facets && (searchData.search.facets[0] as SearchResponseModelFacetRange); expect(facets.length).toBe(1); expect(facets[0].range.low).toBe(searchDataFacet?.range?.low); expect(facets[0].range.high).toBe(searchDataFacet?.range?.high); @@ -862,12 +860,12 @@ describe('Facet Store', () => { }, services, data: { - search: filteredSearchData, + search: filteredSearchData.search, meta: filteredSearchData.meta, }, }); - const filteredSearchDataFacet = filteredSearchData.facets && (filteredSearchData.facets[0] as SearchResponseModelFacetRange); + const filteredSearchDataFacet = filteredSearchData.search.facets && (filteredSearchData.search.facets[0] as SearchResponseModelFacetRange); expect(updatedFacets.length).toBe(1); expect(updatedFacets[0].range.low).toBe(filteredSearchDataFacet?.range?.low); expect(updatedFacets[0].range.high).toBe(filteredSearchDataFacet?.range?.high); @@ -896,7 +894,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -924,7 +922,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -957,7 +955,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -993,7 +991,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1016,7 +1014,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1035,14 +1033,14 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); facets.forEach((facet, index) => { if (facet.type == 'value') { - expect(facet.values.length).toBe((searchData.facets && (searchData.facets[index] as ValueFacet))?.values.length); + expect(facet.values.length).toBe((searchData.search.facets && (searchData.search.facets[index] as ValueFacet))?.values.length); } }); }); @@ -1057,7 +1055,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1082,7 +1080,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1106,7 +1104,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1128,7 +1126,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1153,7 +1151,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1178,7 +1176,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1186,7 +1184,7 @@ describe('Facet Store', () => { facets.forEach((facet, index) => { if (facet.type == 'range-buckets') { expect(facet.values.length).toBe( - (searchData?.facets && (searchData.facets[index] as SearchResponseModelFacetRangeBuckets))?.values?.length + (searchData?.search.facets && (searchData.search.facets[index] as SearchResponseModelFacetRangeBuckets))?.values?.length ); facet.values.forEach((value: FacetRangeValue) => { expect(value).toHaveProperty('low'); @@ -1206,7 +1204,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1230,7 +1228,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1251,7 +1249,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1284,7 +1282,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1307,14 +1305,14 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); facets.forEach((facet: RangeFacet, index: number) => { if (facet.type == 'range') { - const searchDataFacet = searchData.facets && (searchData.facets[index] as SearchResponseModelFacetRange); + const searchDataFacet = searchData.search.facets && (searchData.search.facets[index] as SearchResponseModelFacetRange); expect(facet.step).toBe(searchDataFacet?.step); expect(facet.range).toStrictEqual(searchDataFacet?.range); expect(facet.active).toStrictEqual(searchDataFacet?.active); @@ -1332,7 +1330,7 @@ describe('Facet Store', () => { }, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchFilterStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchFilterStore.test.ts index 045e667e9..43dc8369b 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchFilterStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchFilterStore.test.ts @@ -19,7 +19,7 @@ const services = { const mockData = new MockData(); describe('Filter Store', () => { - let searchData: SearchResponseModel & { meta: MetaResponseModel }; + let searchData: { meta: MetaResponseModel; search: SearchResponseModel }; beforeEach(() => { expect.hasAssertions(); @@ -50,11 +50,11 @@ describe('Filter Store', () => { }); it('will have filter data that matches what was passed in', () => { - const filtersInput = searchData.filters; + const filtersInput = searchData.search.filters; const filters = new SearchFilterStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -90,7 +90,7 @@ describe('Filter Store', () => { const filters = new SearchFilterStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchMerchandisingStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchMerchandisingStore.test.ts index 8ebc9aa0a..4d8fd9af2 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchMerchandisingStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchMerchandisingStore.test.ts @@ -32,52 +32,52 @@ describe('Merchandising Store', () => { const data = mockData.searchMeta('merchandising'); const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); - expect(merchStore.content).toEqual(data.merchandising?.content!); + expect(merchStore.content).toEqual(data.search.merchandising?.content!); }); it('has more banner content', () => { const data = mockData.updateConfig({ siteId: 'ga9kq2' }).searchMeta('merchandising_page1'); const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); - expect(merchStore.content).toEqual(data.merchandising?.content); + expect(merchStore.content).toEqual(data.search.merchandising?.content); }); it('has redirect', () => { const data = mockData.resetConfig().searchMeta('redirect'); const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); - expect(merchStore.redirect).toEqual(data.merchandising?.redirect); + expect(merchStore.redirect).toEqual(data.search.merchandising?.redirect); }); it('has campaigns', () => { const data = mockData.updateConfig({ siteId: 'ga9kq2' }).searchMeta('merchandising_page1'); const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); - expect(merchStore.campaigns).toEqual(data.merchandising?.campaigns); + expect(merchStore.campaigns).toEqual(data.search.merchandising?.campaigns); }); it('has personalized bool', () => { const data = mockData.updateConfig({ siteId: 'ga9kq2' }).searchMeta('merchandising_page1'); const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); - expect(merchStore.personalized).toEqual(data.merchandising?.personalized); + expect(merchStore.personalized).toEqual(data.search.merchandising?.personalized); }); it('updates landingPage when landing page is found', () => { @@ -85,13 +85,13 @@ describe('Merchandising Store', () => { const merchStore = new SearchMerchandisingStore({ data: { - search: data, + search: data.search, }, }); expect(merchStore.campaigns).toBeDefined(); - expect(merchStore.campaigns).toEqual(data.merchandising?.campaigns); + expect(merchStore.campaigns).toEqual(data.search.merchandising?.campaigns); - expect(merchStore.landingPage).toEqual(data?.merchandising?.campaigns![0]); + expect(merchStore.landingPage).toEqual(data?.search.merchandising?.campaigns![0]); }); }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchPaginationStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchPaginationStore.test.ts index 9cd73e4ea..b069397f5 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchPaginationStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchPaginationStore.test.ts @@ -16,9 +16,7 @@ const searchConfig = { }; describe('Pagination Store', () => { - let searchData: SearchResponseModel & { - meta: MetaResponseModel & MetaResponseModelFacetDefaults; - }; + let searchData: { meta: MetaResponseModel; search: SearchResponseModel }; beforeEach(() => { expect.hasAssertions(); @@ -38,11 +36,11 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(pagination.page).toBe(searchData.pagination?.page); + expect(pagination.page).toBe(searchData.search.pagination?.page); }); it('sets the pageSize', () => { @@ -50,11 +48,11 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(pagination.pageSize).toBe(searchData.pagination?.pageSize); + expect(pagination.pageSize).toBe(searchData.search.pagination?.pageSize); }); it('sets the defaultPageSize', () => { @@ -62,7 +60,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -74,11 +72,11 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(pagination.totalResults).toBe(searchData.pagination?.totalResults); + expect(pagination.totalResults).toBe(searchData.search.pagination?.totalResults); }); it('sets the default pageSizeOptions', () => { @@ -86,7 +84,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -118,7 +116,7 @@ describe('Pagination Store', () => { config: tempConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -156,7 +154,7 @@ describe('Pagination Store', () => { config: tempConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -170,7 +168,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -184,7 +182,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -197,13 +195,13 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.end).toBeDefined; - expect(pagination.end).toEqual(searchData.pagination?.pageSize! * searchData.pagination?.page!); + expect(pagination.end).toEqual(searchData.search.pagination?.pageSize! * searchData.search.pagination?.page!); expect(pagination.end).toEqual(pagination.pageSize * pagination.page); }); @@ -212,7 +210,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -227,7 +225,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -242,12 +240,12 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.totalPages).toBeDefined; - expect(pagination.totalPages).toEqual(Math.ceil(searchData.pagination?.totalResults! / searchData.pagination?.pageSize!)); + expect(pagination.totalPages).toEqual(Math.ceil(searchData.search.pagination?.totalResults! / searchData.search.pagination?.pageSize!)); }); it('can get multiple pages', () => { @@ -255,12 +253,12 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.multiplePages).toBeDefined; - expect(pagination.multiplePages).toEqual(Boolean(searchData.pagination?.pageSize! < searchData.pagination?.totalResults!)); + expect(pagination.multiplePages).toEqual(Boolean(searchData.search.pagination?.pageSize! < searchData.search.pagination?.totalResults!)); }); it('can get current page', () => { @@ -268,7 +266,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -286,13 +284,13 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.first).toBeDefined; expect(pagination.first.number).toEqual(1); - expect(pagination.first.active).toEqual(Boolean(searchData.pagination?.page === 1)); + expect(pagination.first.active).toEqual(Boolean(searchData.search.pagination?.page === 1)); }); it('can get last page', () => { @@ -300,24 +298,24 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.last).toBeDefined; expect(pagination.last.number).toEqual(pagination.totalPages); - expect(pagination.last.active).toEqual(Boolean(pagination.totalPages === searchData.pagination?.page)); + expect(pagination.last.active).toEqual(Boolean(pagination.totalPages === searchData.search.pagination?.page)); }); it('does not get next page when on last page', () => { // @ts-ignore - searchData.pagination.page = Math.floor(searchData.pagination?.totalResults! / searchData.pagination?.pageSize!) + 1; + searchData.search.pagination.page = Math.floor(searchData.search.pagination?.totalResults! / searchData.search.pagination?.pageSize!) + 1; const pagination = new SearchPaginationStore({ config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -329,13 +327,13 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.next).toBeDefined; - expect(pagination.next?.number).toEqual(searchData.pagination?.page! + 1); + expect(pagination.next?.number).toEqual(searchData.search.pagination?.page! + 1); }); it('does not get prev page when on first page', () => { @@ -343,7 +341,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -357,13 +355,13 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(pagination.previous).toBeDefined; - expect(pagination.previous?.number).toEqual(searchData.pagination?.page! - 1); + expect(pagination.previous?.number).toEqual(searchData.search.pagination?.page! - 1); }); it('can get prev page when not on first page', () => { @@ -371,7 +369,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -388,7 +386,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -403,7 +401,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -418,7 +416,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -430,7 +428,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -443,7 +441,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -461,7 +459,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -479,7 +477,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -495,7 +493,7 @@ describe('Pagination Store', () => { config: searchConfig, services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchQueryStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchQueryStore.test.ts index 9783d7010..d36555c1c 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchQueryStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchQueryStore.test.ts @@ -15,7 +15,7 @@ describe('SearchQueryStore store', () => { const queryStore = new SearchQueryStore({ services, data: { - search: searchData, + search: searchData.search, }, }); @@ -29,15 +29,15 @@ describe('SearchQueryStore store', () => { const queryStore = new SearchQueryStore({ services, data: { - search: searchData, + search: searchData.search, }, }); expect(queryStore).toBeDefined(); expect(queryStore.query).toBeDefined(); - expect(queryStore.query?.string).toEqual(searchData.search?.query); + expect(queryStore.query?.string).toEqual(searchData.search.search?.query); expect(queryStore.didYouMean).toBeDefined(); - expect(queryStore.didYouMean?.string).toEqual(searchData.search?.didYouMean); + expect(queryStore.didYouMean?.string).toEqual(searchData.search.search?.didYouMean); expect(queryStore.didYouMean?.url).toBeDefined(); }); @@ -47,11 +47,11 @@ describe('SearchQueryStore store', () => { const queryStore = new SearchQueryStore({ services, data: { - search: searchData, + search: searchData.search, }, }); expect(queryStore).toBeDefined(); - expect(queryStore.matchType).toEqual(searchData.search?.matchType); + expect(queryStore.matchType).toEqual(searchData.search.search?.matchType); }); }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchResultStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchResultStore.test.ts index 64a23c270..7b670f895 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchResultStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchResultStore.test.ts @@ -29,14 +29,14 @@ describe('SearchResultStore', () => { it('returns an empty array when passed an empty array [] of results', () => { const searchData = mockData.searchMeta(); - searchData.results = []; + searchData.search.results = []; const results = new SearchResultStore({ config: searchConfig, state: { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); @@ -53,12 +53,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); - expect(results.length).toBe(searchData.results?.length); + expect(results.length).toBe(searchData.search.results?.length); }); it('has result data that matches what was passed in', () => { @@ -70,25 +70,25 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); results.forEach((result, index) => { // check id - expect(result.id).toBe(searchData.results && searchData.results[index].id); + expect(result.id).toBe(searchData.search.results && searchData.search.results[index].id); // check core mappings Object.keys(result.mappings.core!).forEach((key) => { - const core = searchData.results && searchData.results[index]?.mappings?.core; + const core = searchData.search.results && searchData.search.results[index]?.mappings?.core; const value = core && core[key as keyof SearchResponseModelResultCoreMappings]; expect(result.mappings?.core && result.mappings?.core[key as keyof SearchResponseModelResultCoreMappings]).toBe(value); }); // check attributes Object.keys(result.attributes).forEach((key) => { - const attributes = searchData.results && searchData.results[index] && searchData.results[index].attributes; + const attributes = searchData.search.results && searchData.search.results[index] && searchData.search.results[index].attributes; const value = attributes && attributes[key]; expect(result.attributes[key]).toStrictEqual(value); }); @@ -156,7 +156,7 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -208,7 +208,7 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -242,14 +242,14 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.results?.length); results.forEach((result, index) => { - const productData = searchData.results && searchData.results[index]; + const productData = searchData.search.results && searchData.search.results[index]; const variantData = productData?.attributes?.ss_variants; expect(variantData).toBeDefined(); const parsedVariantData = JSON.parse(variantData as unknown as string); @@ -279,17 +279,17 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const variantDataToUse = results[2].attributes.ss_variants; const parsedVariantDataToUse = JSON.parse(variantDataToUse as unknown as string); results.forEach((result, index) => { - const productData = searchData.results && searchData.results[index]; + const productData = searchData.search.results && searchData.search.results[index]; const variantData = productData?.attributes?.ss_variants; expect(variantData).toBeDefined(); @@ -341,11 +341,11 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -390,18 +390,18 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const variantDataToUse = results[0].attributes.ss_variants as string; const parsedVariantDataToUse = JSON.parse(variantDataToUse); const resultForTest = results[0] as Product; - const productData = searchData.results && searchData.results[0]; + const productData = searchData.search.results && searchData.search.results[0]; const variantData = productData?.attributes?.ss_variants; expect(variantData).toBeDefined(); @@ -468,18 +468,18 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const variantDataToUse = results[0].attributes.ss_variants as string; const parsedVariantDataToUse = JSON.parse(variantDataToUse); const resultForTest = results[0] as Product; - const productData = searchData.results && searchData.results[0]; + const productData = searchData.search.results && searchData.search.results[0]; const variantData = productData?.attributes?.ss_variants; expect(variantData).toBeDefined(); @@ -596,12 +596,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -642,12 +642,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -698,12 +698,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -753,12 +753,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -811,12 +811,12 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -865,11 +865,11 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -914,11 +914,11 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const resultForTest = results[0] as Product; expect(resultForTest).toBeDefined(); @@ -943,7 +943,7 @@ describe('SearchResultStore', () => { it('has specific properties', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; parsedVariantData.forEach((variantData) => { @@ -970,7 +970,7 @@ describe('SearchResultStore', () => { it('requires variants data and a mask to construct', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1002,7 +1002,7 @@ describe('SearchResultStore', () => { it('can set an active variant with `setActive`', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1023,7 +1023,7 @@ describe('SearchResultStore', () => { it('can set an active variant with `setActive`', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1044,7 +1044,7 @@ describe('SearchResultStore', () => { it('can set an active variant with `setActive`', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1065,7 +1065,7 @@ describe('SearchResultStore', () => { it('has selections that it builds and selects from options', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1097,7 +1097,7 @@ describe('SearchResultStore', () => { it('will adjust selections based on availability', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1117,7 +1117,7 @@ describe('SearchResultStore', () => { it('will use previous selections based on availability', () => { const mask = new ProductMask(); const searchData = mockData.updateConfig({ siteId: 'z7h1jh' }).searchMeta('variants'); - const variantData = searchData.results![0].attributes?.ss_variants as unknown as string; + const variantData = searchData.search.results![0].attributes?.ss_variants as unknown as string; const parsedVariantData = JSON.parse(variantData) as VariantData[]; const variants = new Variants({ data: { @@ -1156,13 +1156,15 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); - expect((results[1] as Banner).value).toBe(searchData.merchandising?.content?.inline && searchData.merchandising.content.inline[0].value); + expect(results.length).toBe(searchData.search.pagination?.pageSize); + expect((results[1] as Banner).value).toBe( + searchData.search.merchandising?.content?.inline && searchData.search.merchandising.content.inline[0].value + ); }); it('splices inline banners into the results array', () => { @@ -1174,13 +1176,13 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); - const inlineData = searchData.merchandising?.content?.inline!; + expect(results.length).toBe(searchData.search.pagination?.pageSize); + const inlineData = searchData.search.merchandising?.content?.inline!; expect(results[2].id).toBe(`ss-ib-${inlineData[0].config?.position?.index}`); expect((results[2] as Banner).value).toBe(inlineData[0].value); expect(results[3].id).toBe(`ss-ib-${inlineData[1].config?.position?.index}`); @@ -1196,13 +1198,13 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); expect(results.length).toBe(1); - const inlineData = searchData.merchandising?.content?.inline!; + const inlineData = searchData.search.merchandising?.content?.inline!; expect(results[0].id).toBe(`ss-ib-${inlineData[2].config?.position?.index}`); expect((results[0] as Banner).value).toBe(inlineData[2].value); }); @@ -1216,13 +1218,13 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: {}, }, }); expect(results.length).toBe(11); - const inlineData = searchData.merchandising?.content?.inline!; + const inlineData = searchData.search.merchandising?.content?.inline!; expect(results[0].id).toBe(`ss-ib-${inlineData[0].config?.position?.index}`); expect((results[0] as Banner).value).toBe(inlineData[0].value); @@ -1300,18 +1302,18 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const indexOfOverlayBadge = 0; const result = results[indexOfOverlayBadge] as Product; expect(result.badges?.all).toBeDefined(); - const resultBadges = searchData.results![indexOfOverlayBadge].badges!; + const resultBadges = searchData.search.results![indexOfOverlayBadge].badges!; expect(resultBadges).toBeDefined(); expect(result.badges.all.length).toStrictEqual(resultBadges?.length); @@ -1346,18 +1348,18 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); - expect(results.length).toBe(searchData.pagination?.pageSize); + expect(results.length).toBe(searchData.search.pagination?.pageSize); const indexOfOverlayBadge = 2; const result = results[indexOfOverlayBadge] as Product; expect(result.badges?.all).toBeDefined(); - const resultBadges = searchData.results![indexOfOverlayBadge].badges!; + const resultBadges = searchData.search.results![indexOfOverlayBadge].badges!; expect(resultBadges).toBeDefined(); expect(result.badges.all.length).toStrictEqual(resultBadges?.length); @@ -1394,7 +1396,7 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -1403,7 +1405,7 @@ describe('SearchResultStore', () => { const result = results[indexOfOverlayBadge] as Product; expect(result.badges?.all).toBeDefined(); - const resultBadges = searchData.results![indexOfOverlayBadge].badges!; + const resultBadges = searchData.search.results![indexOfOverlayBadge].badges!; expect(resultBadges).toBeDefined(); expect(result.badges.all.length).toStrictEqual(resultBadges?.length); @@ -1432,7 +1434,7 @@ describe('SearchResultStore', () => { loaded: false, }, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); diff --git a/packages/snap-store-mobx/src/Search/Stores/SearchSortingStore.test.ts b/packages/snap-store-mobx/src/Search/Stores/SearchSortingStore.test.ts index e491293fb..9292bdd25 100644 --- a/packages/snap-store-mobx/src/Search/Stores/SearchSortingStore.test.ts +++ b/packages/snap-store-mobx/src/Search/Stores/SearchSortingStore.test.ts @@ -22,12 +22,14 @@ describe('Sorting Store', () => { it('returns an empty array when nothing is passed as sorting', () => { const searchData = mockData.searchMeta(); + // @ts-ignore - testing empty data searchData.search = undefined; + // @ts-ignore - testing empty data searchData.sorting = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -36,29 +38,31 @@ describe('Sorting Store', () => { it('uses the search response sorting data to set the "current" sort', () => { const searchData = mockData.searchMeta('sorting'); - searchData.search = undefined; + searchData.search.search = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); expect(sort.current).toBeDefined(); - expect(sort.current?.field).toBe(searchData.sorting && searchData.sorting[0].field); - expect(sort.current?.direction).toBe(searchData.sorting && searchData.sorting[0].direction); + expect(sort.current?.field).toBe(searchData.search?.sorting && searchData.search.sorting[0].field); + expect(sort.current?.direction).toBe(searchData.search?.sorting && searchData.search.sorting[0].direction); }); describe('without a search query', () => { it('uses the meta data to construct its options', () => { const searchData = mockData.searchMeta(); + // @ts-ignore - testing empty data searchData.search = undefined; + // @ts-ignore - testing empty data searchData.sorting = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -79,12 +83,14 @@ describe('Sorting Store', () => { it('uses the first sort option to set "current" when the search response sorting data is empty', () => { const searchData = mockData.searchMeta(); + // @ts-ignore - testing empty data searchData.search = undefined; + // @ts-ignore - testing empty data searchData.sorting = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -99,11 +105,11 @@ describe('Sorting Store', () => { it('uses the first sorting option to set "current" when response sorting data is not empty', () => { const searchData = mockData.searchMeta('sorting'); - searchData.search = undefined; + searchData.search.search = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -112,19 +118,19 @@ describe('Sorting Store', () => { expect(sort.options).toHaveLength(sortingData?.length!); expect(sort.current).toBeDefined(); - expect(sort.current?.field).toBe(searchData.sorting && searchData.sorting[0].field); - expect(sort.current?.direction).toBe(searchData.sorting && searchData.sorting[0].direction); + expect(sort.current?.field).toBe(searchData.search?.sorting && searchData.search.sorting[0].field); + expect(sort.current?.direction).toBe(searchData.search?.sorting && searchData.search.sorting[0].direction); }); }); describe('with a search query', () => { it('uses the meta data to construct its options', () => { const searchData = mockData.searchMeta('dress'); - searchData.sorting = undefined; + searchData.search.sorting = undefined; const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -151,7 +157,7 @@ describe('Sorting Store', () => { const sort = new SearchSortingStore({ services, data: { - search: searchData, + search: searchData.search, meta: searchData.meta, }, }); @@ -160,8 +166,8 @@ describe('Sorting Store', () => { expect(sort.options).toHaveLength(sortingData?.length!); expect(sort.current).toBeDefined(); - expect(sort.current?.field).toBe(searchData.sorting && searchData.sorting[0].field); - expect(sort.current?.direction).toBe(searchData.sorting && searchData.sorting[0].direction); + expect(sort.current?.field).toBe(searchData.search?.sorting && searchData.search.sorting[0].field); + expect(sort.current?.direction).toBe(searchData.search?.sorting && searchData.search.sorting[0].direction); }); }); });