From 69c0a9e96a82dc8096f68ee3d11d5ea52fdac0ac Mon Sep 17 00:00:00 2001 From: Jeremy Sabat Date: Wed, 29 Jan 2025 10:22:50 -0800 Subject: [PATCH] =?UTF-8?q?fix(hub-common):=20adjust=20discussions=20apiRe?= =?UTF-8?q?quest=20response=20for=20text=20from=E2=80=A6=20(#1786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/discussions/api/utils/request.ts | 2 +- .../api/discussions-api-request.test.ts | 55 ++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/packages/common/src/discussions/api/utils/request.ts b/packages/common/src/discussions/api/utils/request.ts index a4130ff1a58..386afe85ab3 100644 --- a/packages/common/src/discussions/api/utils/request.ts +++ b/packages/common/src/discussions/api/utils/request.ts @@ -86,7 +86,7 @@ export function apiRequest( // this currently only applies to the search post route. we should rework things in the future such that we don't need // to do this sort of evaluation in common logic. const isCSV = - route === "/posts" && + ["/posts", "/posts/search"].includes(route) && (options.data?.f === SearchPostsFormat.CSV || headers.get("Accept") === "text/csv"); diff --git a/packages/common/test/discussions/api/discussions-api-request.test.ts b/packages/common/test/discussions/api/discussions-api-request.test.ts index 9fdedc985cf..200b49cc956 100644 --- a/packages/common/test/discussions/api/discussions-api-request.test.ts +++ b/packages/common/test/discussions/api/discussions-api-request.test.ts @@ -196,7 +196,7 @@ describe("apiRequest", () => { expect(calledOpts).toEqual(expectedOpts); }); - it(`cleans up baseUrl and enpoint`, async () => { + it(`cleans up baseUrl and endpoint`, async () => { const options = { ...opts, hubApiUrl: `${hubApiUrl}/` }; const result = await utils.apiRequest( `/${url}`, @@ -224,7 +224,7 @@ describe("apiRequest", () => { expect(calledOpts).toEqual(expectedOpts); }); - it("resolves plain-text when f=csv for search posts route", async () => { + it("resolves plain-text when f=csv for GET search posts route", async () => { url = "/posts"; const options = { data: { @@ -243,7 +243,30 @@ describe("apiRequest", () => { expect(calledOpts).toEqual(expectedOpts); }); - it('resolves plain-text when HTTP "Accept" header has a value of "text/csv" for search posts route', async () => { + it("resolves plain-text when f=csv for POST search posts route", async () => { + url = "/posts/search"; + const options = { + data: { + f: SearchPostsFormat.CSV, + }, + httpMethod: "POST", + } as IDiscussionsRequestOptions; + expectedOpts.method = "POST"; + expectedOpts.body = JSON.stringify({ + f: SearchPostsFormat.CSV, + }); + const result = await utils.apiRequest(url, options); + + expect(result).toEqual(JSON.stringify(response)); + + const [calledUrl, calledOpts] = fetchMock.calls()[0]; + expect(calledUrl).toEqual( + "https://hub.arcgis.com/api/discussions/v1/posts/search" + ); + expect(calledOpts).toEqual(expectedOpts); + }); + + it('resolves plain-text when HTTP "Accept" header has a value of "text/csv" for GET search posts route', async () => { url = "/posts"; const options = { headers: { @@ -267,4 +290,30 @@ describe("apiRequest", () => { ); expect(calledOpts).toEqual(expectedOpts); }); + + it('resolves plain-text when HTTP "Accept" header has a value of "text/csv" for POST search posts route', async () => { + url = "/posts/search"; + const options = { + headers: { + Accept: "text/csv", + }, + httpMethod: "POST", + } as IDiscussionsRequestOptions; + expectedOpts.method = "POST"; + const result = await utils.apiRequest(url, options); + const expectedHeaders = new Headers(expectedOpts.headers); + expectedHeaders.set("accept", "text/csv"); + expectedOpts = { + ...expectedOpts, + headers: expectedHeaders, + }; + + expect(result).toEqual(JSON.stringify(response)); + + const [calledUrl, calledOpts] = fetchMock.calls()[0]; + expect(calledUrl).toEqual( + "https://hub.arcgis.com/api/discussions/v1/posts/search" + ); + expect(calledOpts).toEqual(expectedOpts); + }); });