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.mockRejectedValue('Test Reason') 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'); }); });