@pinecone-database/pinecone
Version:
This is the official Node.js SDK for [Pinecone](https://www.pinecone.io), written in TypeScript.
112 lines • 5.87 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const retries_1 = require("../retries");
const errors_1 = require("../../errors");
describe('RetryOnServerFailure', () => {
test("Should print 'Max retries' error stmt when response fails to succeed after maxRetries is reached", async () => {
const fakeAsyncFn = jest
.fn()
.mockImplementation(() => Promise.resolve(errors_1.PineconeInternalServerError));
const retryWrapper = new retries_1.RetryOnServerFailure(fakeAsyncFn, 2);
await expect(retryWrapper.execute()).rejects.toThrowError(errors_1.PineconeMaxRetriesExceededError);
});
test('Should act the same as above with PineconeUnavailableError', async () => {
const fakeAsyncFn = jest
.fn()
.mockImplementation(() => Promise.resolve(errors_1.PineconeUnavailableError));
const retryWrapper = new retries_1.RetryOnServerFailure(fakeAsyncFn, 2);
await expect(retryWrapper.execute()).rejects.toThrowError(errors_1.PineconeMaxRetriesExceededError);
});
test('Should return response if successful and status code is not 5xx', async () => {
const fakeAsyncFn = jest
.fn()
.mockImplementation(() => Promise.resolve({}));
const retryWrapper = new retries_1.RetryOnServerFailure(fakeAsyncFn, 2);
const result = await retryWrapper.execute();
expect(result).toEqual({});
});
test('If maxRetries exceeds 10, throw error', async () => {
const fakeAsyncFn = jest
.fn()
.mockImplementation(() => Promise.resolve({}));
const toThrow = async () => {
new retries_1.RetryOnServerFailure(fakeAsyncFn, 11);
};
await expect(toThrow()).rejects.toThrowError('Max retries cannot exceed 10');
});
test('Should retry when first encounter error, then succeed when eventually get good response back', async () => {
// Mock the async function to fail once, then succeed
const fakeAsyncFn = jest
.fn()
.mockImplementationOnce(() => Promise.resolve({ name: 'PineconeInternalServerError', status: 500 })) // 1x failure to trigger a retry
.mockImplementationOnce(() => Promise.resolve({ status: 200 })); // 1x success
const retryWrapper = new retries_1.RetryOnServerFailure(fakeAsyncFn, 2);
const result = await retryWrapper.execute();
expect(result.status).toBe(200);
});
});
describe('calculateRetryDelay', () => {
test('Should return a number < maxDelay', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({ PineconeUnavailableError: errors_1.PineconeUnavailableError }));
const result = retryWrapper.calculateRetryDelay(3);
expect(result).toBeLessThanOrEqual(20000);
});
test('Should never return a negative number', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({ PineconeUnavailableError: errors_1.PineconeUnavailableError }));
const result = retryWrapper.calculateRetryDelay(3);
expect(result).toBeGreaterThan(0);
});
});
describe('isRetryError', () => {
test('Should return true if response is PineconeUnavailableError', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({ name: 'PineconeUnavailableError' }));
const result = retryWrapper.isRetryError({
name: 'PineconeUnavailableError',
});
expect(result).toBe(true);
});
test('Should return false if response is not PineconeUnavailableError or PineconeInternalServerError', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({ name: 'MadeUpName' }));
const result = retryWrapper.isRetryError({ name: 'MadeUpName' });
expect(result).toBe(false);
});
test('Should return true if response.status >= 500', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({ status: 500 }));
const result = retryWrapper.isRetryError({ status: 500 });
expect(result).toBe(true);
});
});
describe('shouldStopRetrying', () => {
test('Should return true for non-retryable status code', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({}));
const result = retryWrapper['shouldStopRetrying']({ status: 400 });
expect(result).toBe(true);
});
test('Should return true for non-retryable error name', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({}));
const result = retryWrapper['shouldStopRetrying']({
name: 'SomeOtherError',
});
expect(result).toBe(true);
});
test('Should return false for retryable error name PineconeUnavailableError', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({}));
const result = retryWrapper['shouldStopRetrying']({
name: 'PineconeUnavailableError',
});
expect(result).toBe(false);
});
test('Should return false for retryable error name PineconeInternalServerError', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({}));
const result = retryWrapper['shouldStopRetrying']({
name: 'PineconeInternalServerError',
});
expect(result).toBe(false);
});
test('Should return false for retryable status code', () => {
const retryWrapper = new retries_1.RetryOnServerFailure(() => Promise.resolve({}));
const result = retryWrapper['shouldStopRetrying']({ status: 500 });
expect(result).toBe(false);
});
});
//# sourceMappingURL=retries.test.js.map
;