From 4aac791c754d7406ef494bb0eebb9ab75b3e3372 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 25 Oct 2024 16:18:37 +0100 Subject: [PATCH 1/2] Update script to include a Gallery option if there is more than 1 of a url --- src/contracts/IRedditResult.ts | 3 ++- src/helpers/imageHelper.ts | 12 +++++++++--- src/helpers/outputHelper.ts | 4 ++++ src/index.ts | 5 ++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/contracts/IRedditResult.ts b/src/contracts/IRedditResult.ts index 13fef75..bf1e242 100644 --- a/src/contracts/IRedditResult.ts +++ b/src/contracts/IRedditResult.ts @@ -8,5 +8,6 @@ export default interface IRedditResult { SubredditSubscribers: number, Title: string, Ups: number, - Url: string + Url: string, + Gallery: string[], } \ No newline at end of file diff --git a/src/helpers/imageHelper.ts b/src/helpers/imageHelper.ts index 3da0fc9..cd69c0b 100644 --- a/src/helpers/imageHelper.ts +++ b/src/helpers/imageHelper.ts @@ -2,7 +2,7 @@ import fetch from "got-cjs"; import * as htmlparser from "htmlparser2"; export default class ImageHelper { - public static async FetchImageFromRedditGallery(url: string): Promise { + public static async FetchImageFromRedditGallery(url: string): Promise { const fetched = await fetch(url); if (!fetched || fetched.errored || fetched.statusCode != 200) { @@ -10,9 +10,15 @@ export default class ImageHelper { } const dom = htmlparser.parseDocument(fetched.body); - const img = htmlparser.DomUtils.findOne((x => x.tagName == "img" && x.attributes.find(y => y.value.includes("https://preview.redd.it")) != null), dom.children, true); + const img = htmlparser.DomUtils.findAll((x => x.tagName == "img" && x.attributes.find(y => y.value.includes("https://preview.redd.it")) != null), dom.children); - const imgSrc = img?.attributes.find(x => x.name == "src")?.value; + if (!img) { + return []; + } + + const imgSrc = img + .flatMap(x => x.attributes.find(x => x.name == "src")?.value) + .filter(x => x != undefined); return imgSrc; } diff --git a/src/helpers/outputHelper.ts b/src/helpers/outputHelper.ts index 808634d..b5009f4 100644 --- a/src/helpers/outputHelper.ts +++ b/src/helpers/outputHelper.ts @@ -22,6 +22,10 @@ export default class OutputHelper { outputLines.push(`Upvotes = ${result.Ups}`); outputLines.push(`Url = ${result.Url}`); + if (result.Gallery.length > 1) { + outputLines.push(`Gallery = ${result.Gallery.join(", ")}`); + } + if (options.queryMetadata != null) { outputLines.push(`Query.Subreddit = ${response.Query.subreddit}`); outputLines.push(`Query.Sort By = ${response.Query.sortBy}`); diff --git a/src/index.ts b/src/index.ts index 056fe1f..0be3d31 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,6 +93,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho const randomData = randomSelect.data; let url: string; + let gallery: string[] = []; if (randomData.url.includes("/gallery")) { const galleryImage = await ImageHelper.FetchImageFromRedditGallery(randomData.url); @@ -112,7 +113,8 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho } } - url = galleryImage; + url = galleryImage[0]; + gallery = galleryImage; } else { url = randomData.url; } @@ -128,6 +130,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho Title: randomData['title'], Ups: randomData['ups'], Url: url, + Gallery: gallery, }; return { From 81437ede419f761eeb389f0bac31ddccb53a796d Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 25 Oct 2024 16:32:52 +0100 Subject: [PATCH 2/2] Update tests --- src/helpers/imageHelper.ts | 4 +-- src/index.ts | 3 ++- .../__snapshots__/outputHelper.test.ts.snap | 2 +- tests/helpers/imageHelper.test.ts | 27 ++++++++++--------- tests/helpers/outputHelper.test.ts | 3 +++ 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/helpers/imageHelper.ts b/src/helpers/imageHelper.ts index cd69c0b..d2ac3b0 100644 --- a/src/helpers/imageHelper.ts +++ b/src/helpers/imageHelper.ts @@ -2,11 +2,11 @@ import fetch from "got-cjs"; import * as htmlparser from "htmlparser2"; export default class ImageHelper { - public static async FetchImageFromRedditGallery(url: string): Promise { + public static async FetchImageFromRedditGallery(url: string): Promise { const fetched = await fetch(url); if (!fetched || fetched.errored || fetched.statusCode != 200) { - return undefined; + return []; } const dom = htmlparser.parseDocument(fetched.body); diff --git a/src/index.ts b/src/index.ts index 0be3d31..b9ed5f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,7 +93,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho const randomData = randomSelect.data; let url: string; - let gallery: string[] = []; + let gallery: string[]; if (randomData.url.includes("/gallery")) { const galleryImage = await ImageHelper.FetchImageFromRedditGallery(randomData.url); @@ -117,6 +117,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho gallery = galleryImage; } else { url = randomData.url; + gallery = [randomData.url]; } const redditResult: IRedditResult = { diff --git a/tests/helpers/__snapshots__/outputHelper.test.ts.snap b/tests/helpers/__snapshots__/outputHelper.test.ts.snap index 39e952e..a3ad0e8 100644 --- a/tests/helpers/__snapshots__/outputHelper.test.ts.snap +++ b/tests/helpers/__snapshots__/outputHelper.test.ts.snap @@ -13,7 +13,7 @@ Upvotes = 17 Url = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d" `; -exports[`GenerateOutput GIVEN options.json is true, EXPECT output to be returned as JSON 1`] = `"{"Archived":false,"Author":"author","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/","Subreddit":"Rabbits","SubredditSubscribers":654751,"Title":"This is my Ms Bear!","Ups":17,"Url":"https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"}"`; +exports[`GenerateOutput GIVEN options.json is true, EXPECT output to be returned as JSON 1`] = `"{"Archived":false,"Author":"author","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/","Subreddit":"Rabbits","SubredditSubscribers":654751,"Title":"This is my Ms Bear!","Ups":17,"Url":"https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d","Gallery":["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"]}"`; exports[`GenerateOutput GIVEN options.queryMetadata is supplied, EXPECT query metadata to be added 1`] = ` "Archived = false diff --git a/tests/helpers/imageHelper.test.ts b/tests/helpers/imageHelper.test.ts index 3c6f44e..3eeb789 100644 --- a/tests/helpers/imageHelper.test.ts +++ b/tests/helpers/imageHelper.test.ts @@ -17,18 +17,19 @@ describe("FetchImageFromRedditGallery", () => { expect(fetchMock).toHaveBeenCalledTimes(1); expect(fetchMock).toHaveBeenCalledWith("https://redd.it/gallery/image"); - expect(result).toBe("https://preview.redd.it/image.png"); + expect(result.length).toBe(1); + expect(result[0]).toBe("https://preview.redd.it/image.png"); }); - test("GIVEN fetch is unable to return data, EXPECT undefined returned", async () => { + test("GIVEN fetch is unable to return data, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue(null); const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN fetch is an error, EXPECT undefined returned", async () => { + test("GIVEN fetch is an error, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: "Error", @@ -37,10 +38,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN fetch is not status code of 200, EXPECT undefined returned", async () => { + test("GIVEN fetch is not status code of 200, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -49,10 +50,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image tag is not found, EXPECT undefined returned", async () => { + test("GIVEN image tag is not found, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -61,10 +62,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image source attribute is not found, EXPECT undefined returned", async () => { + test("GIVEN image source attribute is not found, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -73,10 +74,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image source attribute is not found that is a preview.redd.it url, EXPECT undefined returned", async () => { + test("GIVEN image source attribute is not found that is a preview.redd.it url, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -85,6 +86,6 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); }); \ No newline at end of file diff --git a/tests/helpers/outputHelper.test.ts b/tests/helpers/outputHelper.test.ts index 5e90dc8..790d6e7 100644 --- a/tests/helpers/outputHelper.test.ts +++ b/tests/helpers/outputHelper.test.ts @@ -23,6 +23,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult; @@ -55,6 +56,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult; @@ -89,6 +91,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult;