Skip to content

Commit

Permalink
Merge pull request #47 from Coaktion/fix/return-zaf-api-error
Browse files Browse the repository at this point in the history
Fix/return zaf api error
  • Loading branch information
JoaoMacedo03 authored Sep 26, 2023
2 parents 812fc83 + 5b725e1 commit 074771f
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,8 @@ export class BaseClient implements BaseClientInterface {
* @throws {InvalidAuthOptions}
*/
retryDelay = (retryCount: number, error: AxiosError | any): number => {
if (retryCount >= this.clientOptions.tries) throw error;
if (retryCount >= this.clientOptions.tries)
throw error.response ? error.response : error;
return error.response.status ===
HttpStatusCodesRetryCondition.TooManyRequests
? parseInt(error.response.headers[this.clientOptions.rateLimitKey])
Expand Down
9 changes: 7 additions & 2 deletions src/exceptions.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ZendeskError } from './types';

/**
* EndpointNotSet Error
* @description
Expand Down Expand Up @@ -34,9 +36,12 @@ export class AuthProviderNotFound extends Error {

export class ZendeskRequestError extends Error {
response: object;
constructor(message: object) {
constructor(message: ZendeskError) {
super(JSON.stringify(message));
this.name = 'ZendeskRequestError';
this.response = message;
this.response = {
status: message.status,
message: message.message
};
}
}
5 changes: 5 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -277,3 +277,8 @@ export type SearchAllStrategyReturn = {
hasMore: boolean;
paramsAux: any;
};

export type ZendeskError = {
status: number;
message: string;
};
8 changes: 7 additions & 1 deletion src/zendesk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,16 @@ export class ZendeskClient
});
} catch (error) {
if (!error.status) throw new Error(String(error));
const instanceError = new ZendeskRequestError(error);
const instanceError = new ZendeskRequestError({
status: error.status,
message: error.responseJSON.message
});

if (this.retryCondition(instanceError)) {
await sleep(this.retryDelay(payload.retryCount, instanceError));
this.makeRequest(payload);
} else {
throw instanceError.response;
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions tests/base.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,4 +231,14 @@ describe('BaseClient', () => {
expect(result.fullFetched).toBe(true);
expect(result.dataFetched).toEqual(['someData', 'someData2']);
});

it('should throw with error response if exists on retryDelay', async () => {
try {
clientBasic.retryDelay(1, {
response: { status: 500, message: 'requestError' }
});
} catch (error) {
expect(error).toEqual({ status: 500, message: 'requestError' });
}
});
});
25 changes: 23 additions & 2 deletions tests/zendesk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -282,14 +282,17 @@ describe('ZendeskClientBase', () => {
zendeskClientBase.retryCondition = jest.fn().mockReturnValueOnce(true);
zendeskClientBase.retryDelay = jest.fn().mockReturnValueOnce(100);
sleep as jest.Mock;
const error = { status: 500 };
const error = { status: 500, message: 'requestError' };
const instanceError = new ZendeskRequestError(error);

const payload: PayloadRequestZendesk = {
url: 'url',
method: 'method'
};
(mockZendeskClient.request as jest.Mock).mockRejectedValueOnce(error);
(mockZendeskClient.request as jest.Mock).mockRejectedValueOnce({
status: 500,
responseJSON: { message: 'requestError' }
});
await zendeskClientBase.makeRequest(payload);

expect(sleep).toHaveBeenCalledWith(100);
Expand Down Expand Up @@ -411,4 +414,22 @@ describe('ZendeskClientBase', () => {
});
expect(mockZendeskClient.request).toHaveBeenCalledTimes(1);
});

it('should throw ZendeskReuqestError when not on retry', async () => {
zendeskClientBase.retryCondition = jest.fn().mockReturnValueOnce(false);
const payload: PayloadRequestZendesk = {
url: 'url',
method: 'method'
};
(mockZendeskClient.request as jest.Mock).mockRejectedValueOnce({
status: 500,
responseJSON: { message: 'requestError' }
});

try {
await zendeskClientBase.makeRequest(payload);
} catch (error) {
expect(error).toEqual({ status: 500, message: 'requestError' });
}
});
});

0 comments on commit 074771f

Please sign in to comment.