Ethan Lane
037608e059
All checks were successful
continuous-integration/drone/push Build is passing
# Description - Added an Error Code (enum) and Error Message (string) to all the failed results #53 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? - This has been tested both manually as well as the unit tests # Checklist - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/RabbitLabs/random-bunny/pulls/89 Co-authored-by: Ethan Lane <ethan@vylpes.com> Co-committed-by: Ethan Lane <ethan@vylpes.com>
193 lines
No EOL
7.3 KiB
TypeScript
193 lines
No EOL
7.3 KiB
TypeScript
import { ErrorCode } from "../src/constants/ErrorCode";
|
||
import ErrorMessages from "../src/constants/ErrorMessages";
|
||
import randomBunny from "../src/index";
|
||
import fetch from "got-cjs";
|
||
|
||
jest.mock('got-cjs');
|
||
const fetchMock = jest.mocked(fetch);
|
||
|
||
describe('randomBunny', () => {
|
||
test('GIVEN subreddit AND sortBy is supplied, EXPECT successful result', async() => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify({
|
||
data: {
|
||
children: [
|
||
{
|
||
data: {
|
||
archived: false,
|
||
downs: 0,
|
||
hidden: false,
|
||
permalink: '/r/Rabbits/comments/12pa5te/someone_told_pickles_its_monday_internal_fury/',
|
||
subreddit: 'Rabbits',
|
||
subreddit_subscribers: 298713,
|
||
title: 'Someone told pickles it’s Monday… *internal fury*',
|
||
ups: 1208,
|
||
url: 'https://i.redd.it/cr8xudsnkgua1.jpg',
|
||
},
|
||
},
|
||
],
|
||
}
|
||
}),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits', 'new');
|
||
|
||
expect(result.IsSuccess).toBeTruthy();
|
||
expect(result.Result).toBeDefined();
|
||
expect(result.Error).toBeUndefined();
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json');
|
||
});
|
||
|
||
test('GIVEN sortBy is NOT supplied, expect it to default to hot', async () => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify({
|
||
data: {
|
||
children: [
|
||
{
|
||
data: {
|
||
archived: false,
|
||
downs: 0,
|
||
hidden: false,
|
||
permalink: '/r/Rabbits/comments/12pa5te/someone_told_pickles_its_monday_internal_fury/',
|
||
subreddit: 'Rabbits',
|
||
subreddit_subscribers: 298713,
|
||
title: 'Someone told pickles it’s Monday… *internal fury*',
|
||
ups: 1208,
|
||
url: 'https://i.redd.it/cr8xudsnkgua1.jpg',
|
||
},
|
||
},
|
||
],
|
||
}
|
||
}),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits');
|
||
|
||
expect(result.IsSuccess).toBeTruthy();
|
||
expect(result.Result).toBeDefined();
|
||
expect(result.Error).toBeUndefined();
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/hot.json');
|
||
});
|
||
|
||
test('GIVEN sortBy is NOT valid, expect it to default to hot', async () => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify({
|
||
data: {
|
||
children: [
|
||
{
|
||
data: {
|
||
archived: false,
|
||
downs: 0,
|
||
hidden: false,
|
||
permalink: '/r/Rabbits/comments/12pa5te/someone_told_pickles_its_monday_internal_fury/',
|
||
subreddit: 'Rabbits',
|
||
subreddit_subscribers: 298713,
|
||
title: 'Someone told pickles it’s Monday… *internal fury*',
|
||
ups: 1208,
|
||
url: 'https://i.redd.it/cr8xudsnkgua1.jpg',
|
||
},
|
||
},
|
||
],
|
||
}
|
||
}),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits', 'invalid');
|
||
|
||
expect(result.IsSuccess).toBeTruthy();
|
||
expect(result.Result).toBeDefined();
|
||
expect(result.Error).toBeUndefined();
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/hot.json');
|
||
});
|
||
|
||
test('GIVEN the fetch fails, EXPECT failure result', async () => {
|
||
fetchMock.mockResolvedValue(null);
|
||
|
||
const result = await randomBunny('rabbits', 'new');
|
||
|
||
expect(result.IsSuccess).toBeFalsy();
|
||
expect(result.Result).toBeUndefined();
|
||
expect(result.Error).toBeDefined();
|
||
|
||
expect(result.Error!.Code).toBe(ErrorCode.FailedToFetchReddit);
|
||
expect(result.Error!.Message).toBe(ErrorMessages.FailedToFetchReddit);
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json');
|
||
});
|
||
|
||
test('GIVEN the result is NOT valid JSON, EXPECT failure result', async () => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify(null),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits', 'new');
|
||
|
||
expect(result.IsSuccess).toBeFalsy();
|
||
expect(result.Result).toBeUndefined();
|
||
expect(result.Error).toBeDefined();
|
||
|
||
expect(result.Error!.Code).toBe(ErrorCode.UnableToParseJSON);
|
||
expect(result.Error!.Message).toBe(ErrorMessages.UnableToParseJSON);
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json');
|
||
});
|
||
|
||
test('GIVEN randomSelect does NOT find a response, EXPECT failure result', async () => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify({
|
||
data: {
|
||
children: [],
|
||
}
|
||
}),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits', 'new');
|
||
|
||
expect(result.IsSuccess).toBeFalsy();
|
||
expect(result.Result).toBeUndefined();
|
||
expect(result.Error).toBeDefined();
|
||
|
||
expect(result.Error!.Code).toBe(ErrorCode.NoImageResultsFound);
|
||
expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound);
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json');
|
||
});
|
||
|
||
test('GIVEN randomSelect does NOT find a valid response, EXPECT failure result', async () => {
|
||
fetchMock.mockResolvedValue({
|
||
body: JSON.stringify({
|
||
data: {
|
||
children: [
|
||
{
|
||
data: {
|
||
archived: false,
|
||
downs: 0,
|
||
hidden: false,
|
||
permalink: '/r/Rabbits/comments/12pa5te/someone_told_pickles_its_monday_internal_fury/',
|
||
subreddit: 'Rabbits',
|
||
subreddit_subscribers: 298713,
|
||
title: 'Someone told pickles it’s Monday… *internal fury*',
|
||
ups: 1208,
|
||
url: 'https://i.redd.it/cr8xudsnkgua1.webp',
|
||
},
|
||
},
|
||
],
|
||
}
|
||
}),
|
||
});
|
||
|
||
const result = await randomBunny('rabbits', 'new');
|
||
|
||
expect(result.IsSuccess).toBeFalsy();
|
||
expect(result.Result).toBeUndefined();
|
||
expect(result.Error).toBeDefined();
|
||
|
||
expect(result.Error!.Code).toBe(ErrorCode.NoImageResultsFound);
|
||
expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound);
|
||
|
||
expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json');
|
||
});
|
||
}); |