diff --git a/src/http_client/base.ts b/src/http_client/base.ts index 4b54641a..3a4d07d6 100644 --- a/src/http_client/base.ts +++ b/src/http_client/base.ts @@ -65,10 +65,18 @@ export class ApiRequest { try { const response = await fetch(target, options); let responseJSON; - if (response.status === 204) { - responseJSON = null; - } else { - responseJSON = await response.json(); + + try { + if (response.status === 204) { + responseJSON = null; + } else { + responseJSON = await response.json(); + } + } catch (error) { + return Promise.reject({ + message: response.statusText, + code: response.status, + }); } if (response.ok) { diff --git a/test/lokalise/lokalise_api.spec.ts b/test/lokalise/lokalise_api.spec.ts index 90dca02b..b11446e0 100644 --- a/test/lokalise/lokalise_api.spec.ts +++ b/test/lokalise/lokalise_api.spec.ts @@ -1,4 +1,5 @@ import { LokaliseApi, expect, it, describe, Stub } from "../setup.js"; +import { MockAgent, setGlobalDispatcher } from "undici"; const project_id = "803826145ba90b42d5d860.46800099"; @@ -16,6 +17,27 @@ describe("LokaliseApi", function () { expect(client.clientData.enableCompression).to.be.false; expect(client.clientData.version).to.eq("api2"); }); + + it("is expected to reject with proper http message and status code if json is not parsable", async function () { + const mockAgent = new MockAgent(); + setGlobalDispatcher(mockAgent); + const mockPool = mockAgent.get("https://api.lokalise.com"); + + mockPool + .intercept({ + path: "/api2/projects/" + project_id, + method: "GET", + }) + .reply(429, "Too many requests"); + + const client = new LokaliseApi({ apiKey: process.env.API_KEY }); + + try { + expect(await client.projects().get(project_id)).to.throw(); + } catch (error) { + expect(error).to.deep.equal({ message: "Too Many Requests", code: 429 }); + } + }); }); describe("LokaliseApi host", function () {