Skip to content

Commit

Permalink
test: added unit tests for new forceRefreshToken method
Browse files Browse the repository at this point in the history
- new typescript version works but is not supported by `ts-jest`
  • Loading branch information
atifcppprogrammer committed Feb 23, 2024
1 parent c4c8e20 commit 252fe2b
Showing 1 changed file with 121 additions and 0 deletions.
121 changes: 121 additions & 0 deletions __tests__/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1065,4 +1065,125 @@ describe('KindeSDK', () => {
);
});
});

describe('forceTokenRefresh', () => {
test(`[RNStorage] Throws an error if no refresh token found in storage`, async () => {
RNStorage.prototype.getItem = jest.fn().mockReturnValue({
password: JSON.stringify({ refresh_token: undefined })
});
await expect(globalClient.forceTokenRefresh()).rejects.toThrow(
'No refresh token available to perform token refresh.'
);
});

test(`[ExpoStorage] Throws an error if no refresh token found in storage`, async () => {
Constants.executionEnvironment = 'storeClient';
ExpoStorage.prototype.getItem = jest
.fn()
.mockReturnValue(JSON.stringify({ refresh_token: undefined }));

await expect(globalClient.forceTokenRefresh()).rejects.toThrow(
'No refresh token available to perform token refresh.'
);
});

test('[RNStorage] Stores newly fetched tokens in storage', async () => {
let storage = {
username: 'kinde',
password: JSON.stringify(fakeTokenResponse)
};
RNStorage.prototype.getItem = jest.fn(() => storage);
RNStorage.prototype.setItem = jest.fn((value: unknown) => {
storage.password = JSON.stringify(value);
});

const formData = new FormData();
const { refresh_token } = JSON.parse(storage.password);
formData.append('client_id', configuration.clientId);
formData.append('grant_type', 'refresh_token');
formData.append('refresh_token', refresh_token);

const newTokensResponse = {
...fakeTokenResponse,
access_token: 'this_is_new_access_token',
refresh_token: 'this_is_new_refresh_token',
id_token: 'this_is_new_id_token'
};
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve(newTokensResponse)
})
);

await globalClient.forceTokenRefresh();
expect(global.fetch).toHaveBeenCalled();
expect(global.fetch.mock.calls[0][1].body).toEqual(formData);
expect(storage.password).toBe(JSON.stringify(newTokensResponse));
});

test('[ExpoStorage] Stores newly fetched tokens in storage', async () => {
let storage = { ...fakeTokenResponse };
Constants.executionEnvironment = 'storeClient';
ExpoStorage.prototype.getItem = jest.fn(() =>
JSON.stringify(storage)
);
ExpoStorage.prototype.setItem = jest.fn((value: unknown) => {
storage = { ...value };
});

const formData = new FormData();
const { refresh_token } = storage;
formData.append('client_id', configuration.clientId);
formData.append('grant_type', 'refresh_token');
formData.append('refresh_token', refresh_token);

const newTokensResponse = {
...fakeTokenResponse,
access_token: 'this_is_new_access_token',
refresh_token: 'this_is_new_refresh_token',
id_token: 'this_is_new_id_token'
};
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve(newTokensResponse)
})
);

await globalClient.forceTokenRefresh();
expect(global.fetch).toHaveBeenCalled();
expect(global.fetch.mock.calls[0][1].body).toEqual(formData);
expect(storage).toEqual(newTokensResponse);
});

test(`[RNStorage] returns "null" in the event network call rejects`, async () => {
RNStorage.prototype.getItem = jest.fn().mockReturnValue({
password: JSON.stringify(fakeTokenResponse)
});
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve({ error: 'error' })
})
);

const response = await globalClient.forceTokenRefresh();
expect(response).toBe(null);
expect(global.fetch).toHaveBeenCalled();
});

test(`[ExpoStorage] returns "null" in the event network call rejects`, async () => {
Constants.executionEnvironment = 'storeClient';
ExpoStorage.prototype.getItem = jest
.fn()
.mockReturnValue(JSON.stringify(fakeTokenResponse));
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve({ error: 'error' })
})
);

const response = await globalClient.forceTokenRefresh();
expect(response).toBe(null);
expect(global.fetch).toHaveBeenCalled();
});
});
});

0 comments on commit 252fe2b

Please sign in to comment.