diff --git a/src/imageHelper.ts b/src/imageHelper.ts index 793b5ce..3da0fc9 100644 --- a/src/imageHelper.ts +++ b/src/imageHelper.ts @@ -5,7 +5,7 @@ export default class ImageHelper { public static async FetchImageFromRedditGallery(url: string): Promise { const fetched = await fetch(url); - if (!fetched) { + if (!fetched || fetched.errored || fetched.statusCode != 200) { return undefined; } diff --git a/tests/imageHelper.test.ts b/tests/imageHelper.test.ts index 556264c..77227b1 100644 --- a/tests/imageHelper.test.ts +++ b/tests/imageHelper.test.ts @@ -1,9 +1,90 @@ +import ImageHelper from "../src/imageHelper"; +import fetch from "got-cjs"; + +jest.mock('got-cjs'); +const fetchMock = jest.mocked(fetch); + describe("FetchImageFromRedditGallery", () => { - test.todo("EXPECT image url to be returned"); + test("EXPECT image url to be returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: undefined, + statusCode: 200, + }); - test.todo("GIVEN fetch is unable to return data, EXPECT undefined returned"); + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - test.todo("GIVEN image tag is not found, EXPECT undefined returned"); + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(fetchMock).toHaveBeenCalledWith("https://redd.it/gallery/image"); - test.todo("GIVEN image source attribute is not found, EXPECT undefined returned"); + expect(result).toBe("https://preview.redd.it/image.png"); + }); + + test("GIVEN fetch is unable to return data, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue(null); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); + + test("GIVEN fetch is an error, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: "Error", + statusCode: 200, + }); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); + + test("GIVEN fetch is not status code of 200, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: undefined, + statusCode: 500, + }); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); + + test("GIVEN image tag is not found, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: undefined, + statusCode: 200, + }); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); + + test("GIVEN image source attribute is not found, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: undefined, + statusCode: 200, + }); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); + + test("GIVEN image source attribute is not found that is a preview.redd.it url, EXPECT undefined returned", async () => { + fetchMock.mockResolvedValue({ + body: "", + errored: undefined, + statusCode: 200, + }); + + const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); + + expect(result).toBeUndefined(); + }); }); \ No newline at end of file diff --git a/tests/index.test.ts b/tests/index.test.ts index 87efd7a..e495d24 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,3 +1,4 @@ +import ImageHelper from "../src/imageHelper"; import randomBunny from "../src/index"; import fetch from "got-cjs"; @@ -170,9 +171,71 @@ describe('randomBunny', () => { expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); }); - test.todo("GIVEN data fetched is a gallery AND an image is returned from the helper, EXPECT this to be used"); + test("GIVEN data fetched is a gallery AND an image is returned from the helper, EXPECT this to be used", 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/gallery/cr8xudsnkgua1', + }, + }, + ], + } + }), + }); - test.todo("GIVEN data fetched is a gallery AND an image is not returned from the helper, EXPECT error"); + ImageHelper.FetchImageFromRedditGallery = jest.fn().mockResolvedValue("https://i.redd.it/cr8xudsnkgua1.jpg") - test.todo("GIVEN data fetched is not a gallery, EXPECT url to be used directly"); + const result = await randomBunny('rabbits', 'new'); + + expect(result.IsSuccess).toBeTruthy(); + expect(result.Result).toBeDefined(); + + expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + + expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledTimes(1); + expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledWith("https://i.redd.it/gallery/cr8xudsnkgua1") + }); + + test("GIVEN data fetched is a gallery AND an image is not returned from the helper, EXPECT error", 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/gallery/cr8xudsnkgua1', + }, + }, + ], + } + }), + }); + + ImageHelper.FetchImageFromRedditGallery = jest.fn().mockResolvedValue(undefined) + + const result = await randomBunny('rabbits', 'new'); + + expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledTimes(1); + + expect(result.IsSuccess).toBe(false); + }); }); \ No newline at end of file