From 42f8b51ee1fca0ca8cc4d851eb72895a1643a009 Mon Sep 17 00:00:00 2001 From: Gerardo Sabetta <55319644+gerardosabetta@users.noreply.github.com> Date: Mon, 3 Apr 2023 19:45:27 -0300 Subject: [PATCH] fix: prevents runtime error on undefined `facets` It is not safe to assume that facets is going to be in the response --- .../disjunctive_license_returning_no_facets | 29 +++++++++++++++++++ ..._facet_with_disjuntive_returning_no_facets | 29 +++++++++++++++++++ src/client.js | 17 +++++++---- tests/client.spec.js | 18 ++++++++++++ 4 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 fixtures/host-2376rb.api.swiftype.com-443/disjunctive_license_returning_no_facets create mode 100644 fixtures/host-2376rb.api.swiftype.com-443/search_filter_and_multi_facet_with_disjuntive_returning_no_facets diff --git a/fixtures/host-2376rb.api.swiftype.com-443/disjunctive_license_returning_no_facets b/fixtures/host-2376rb.api.swiftype.com-443/disjunctive_license_returning_no_facets new file mode 100644 index 0000000..d15275f --- /dev/null +++ b/fixtures/host-2376rb.api.swiftype.com-443/disjunctive_license_returning_no_facets @@ -0,0 +1,29 @@ +POST /api/as/v1/engines/node-modules/search.json +authorization: Bearer api-hean6g8dmxnm2shqqiag757a +content-type: application/json +x-swiftype-client: elastic-app-search-javascript +x-swiftype-client-version: 8.7.0 +accept: */* +accept-encoding: gzip,deflate +body: {\"query\":\"dog\",\"page\":{\"size\":0},\"filters\":{},\"facets\":{\"license\":[{\"type\":\"value\",\"size\":3}]},\"record_analytics\":false,\"analytics\":{\"tags\":[\"Facet-Only\"]}} + +HTTP/1.1 200 OK +date: Thu, 27 Sep 2018 20:36:08 GMT +content-type: application/json; charset=utf-8 +transfer-encoding: chunked +connection: close +vary: Accept-Encoding, Origin +status: 200 OK +x-frame-options: SAMEORIGIN +x-xss-protection: 1; mode=block +x-content-type-options: nosniff +etag: W/"d31aa222a68122cb8392577cf4a1a7f1" +cache-control: max-age=0, private, must-revalidate +x-request-id: 91197d45d104a3e2281a60eecec630ff +x-runtime: 0.270027 +x-swiftype-frontend-datacenter: dal05 +x-swiftype-frontend-node: web01.dal05 +x-swiftype-edge-datacenter: dal05 +x-swiftype-edge-node: web01.dal05 + +{"meta":{"warnings":[],"page":{"current":1,"total_pages":0,"total_results":0,"size":1},"request_id":"91197d45d104a3e2281a60eecec630ff"},"results":[]} diff --git a/fixtures/host-2376rb.api.swiftype.com-443/search_filter_and_multi_facet_with_disjuntive_returning_no_facets b/fixtures/host-2376rb.api.swiftype.com-443/search_filter_and_multi_facet_with_disjuntive_returning_no_facets new file mode 100644 index 0000000..1237e6b --- /dev/null +++ b/fixtures/host-2376rb.api.swiftype.com-443/search_filter_and_multi_facet_with_disjuntive_returning_no_facets @@ -0,0 +1,29 @@ +POST /api/as/v1/engines/node-modules/search.json +authorization: Bearer api-hean6g8dmxnm2shqqiag757a +content-type: application/json +x-swiftype-client: elastic-app-search-javascript +x-swiftype-client-version: 8.7.0 +accept: */* +accept-encoding: gzip,deflate +body: {\"query\":\"dog\",\"page\":{\"size\":1},\"filters\":{\"license\":\"BSD\"},\"facets\":{\"license\":[{\"type\":\"value\",\"size\":3}],\"dependencies\":[{\"type\":\"value\",\"size\":3}]}} + +HTTP/1.1 200 OK +date: Thu, 27 Sep 2018 20:53:56 GMT +content-type: application/json; charset=utf-8 +transfer-encoding: chunked +connection: close +vary: Accept-Encoding, Origin +status: 200 OK +x-frame-options: SAMEORIGIN +x-xss-protection: 1; mode=block +x-content-type-options: nosniff +etag: W/"5010d52221547ddec5baceeb9f8a4931" +cache-control: max-age=0, private, must-revalidate +x-request-id: 8369bdda4d5c018ddbd85fc2859fbadb +x-runtime: 0.212519 +x-swiftype-frontend-datacenter: dal05 +x-swiftype-frontend-node: web01.dal05 +x-swiftype-edge-datacenter: dal05 +x-swiftype-edge-node: web01.dal05 + +{"meta":{"warnings":[],"page":{"current":1,"total_pages":0,"total_results":0,"size":10},"request_id":"8369bdda4d5c018ddbd85fc2859fbadb"},"results":[]} diff --git a/src/client.js b/src/client.js index 034221c..4500416 100644 --- a/src/client.js +++ b/src/client.js @@ -189,12 +189,17 @@ export default class Client { return Promise.all([baseQueryPromise, ...disjunctiveQueriesPromises]).then( ([baseQueryResults, ...disjunctiveQueries]) => { - disjunctiveQueries.forEach(disjunctiveQueryResults => { - const [facetName, facetValue] = Object.entries( - disjunctiveQueryResults.facets - )[0]; - baseQueryResults.facets[facetName] = facetValue; - }); + if ( + baseQueryResults.facets && + Object.keys(baseQueryResults.facets).length + ) { + disjunctiveQueries.forEach(disjunctiveQueryResults => { + const [facetName, facetValue] = Object.entries( + disjunctiveQueryResults.facets + )[0]; + baseQueryResults.facets[facetName] = facetValue; + }); + } return baseQueryResults; } ); diff --git a/tests/client.spec.js b/tests/client.spec.js index ab7b6da..bc375e4 100644 --- a/tests/client.spec.js +++ b/tests/client.spec.js @@ -248,6 +248,24 @@ describe("Client", () => { }); }); + // Fixture: disjunctive_license_returning_no_facets + // Fixture: search_filter_and_multi_facet_returning_no_facets + it("will handle not having `facets` in the backend response without throwing", async () => { + const result = await client.search("dog", { + ...config, + filters: { + license: "BSD" + }, + facets: { + license: [{ type: "value", size: 3 }], + dependencies: [{ type: "value", size: 3 }] + }, + disjunctiveFacets: ["license", "dependencies"] + }); + + expect(result.info.facets).toBeUndefined(); + }); + // Fixture: disjunctive_license_with_override_tags // Fixture: Fixture: search_filter_and_multi_facet_with_tags it("will accept an alternative analytics tag for disjunctive queries", async () => {