From 2e5f8c363340e77c87893b21f6823df7b5e424c4 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 22 Jun 2024 10:09:55 +0100 Subject: [PATCH] Fix the unit test toBeCalledWith deprecated warnings (#182) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Fix the unit tests "toBeCalledWith" assert being deprecated - Update the "sortBy" variable to be a string literal - Add an output to file option to the CLI - Reorganise the code so there's less repeated code - Update the tests so the CLI logic is tested quicker #138, #76, #80 ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [x] This change requires a documentation update # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. # 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://git.vylpes.xyz/RabbitLabs/random-bunny/pulls/182 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- docs/cli.md | 10 +- src/cli.ts | 38 +--- src/contracts/ICliOptions.ts | 3 +- src/helpers/cliHelper.ts | 25 +++ src/{ => helpers}/imageHelper.ts | 0 src/helpers/outputHelper.ts | 31 +++ src/index.ts | 12 +- tests/cli.test.ts | 187 ------------------ .../__snapshots__/outputHelper.test.ts.snap | 29 +++ tests/helpers/cliHelper.test.ts | 118 +++++++++++ tests/{ => helpers}/imageHelper.test.ts | 2 +- tests/helpers/outputHelper.test.ts | 99 ++++++++++ tests/index.test.ts | 48 +---- 13 files changed, 327 insertions(+), 275 deletions(-) create mode 100644 src/helpers/cliHelper.ts rename src/{ => helpers}/imageHelper.ts (100%) create mode 100644 src/helpers/outputHelper.ts delete mode 100644 tests/cli.test.ts create mode 100644 tests/helpers/__snapshots__/outputHelper.test.ts.snap create mode 100644 tests/helpers/cliHelper.test.ts rename tests/{ => helpers}/imageHelper.test.ts (98%) create mode 100644 tests/helpers/outputHelper.test.ts diff --git a/docs/cli.md b/docs/cli.md index dbe1f20..f4906bd 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -53,9 +53,9 @@ Options: -s, --subreddit The subreddit to search (default: "rabbits") -j, --json Output as JSON -q, --query-metadata Include query metadata in result + -o Output to file --sort Sort by (choices: "hot", "new", "top", default: "hot") -h, --help display help for command -✨ Done in 0.32s. ``` ## JSON output @@ -95,3 +95,11 @@ This defaults to "rabbits" $ randombunny --subreddit rabbits $ randombunny -s horses ``` + +## Output to file + +If you'd rather send the output to a file, you can supply the `-o` flag. + +``` +$ randombunny -o ~/Desktop/output.txt +``` diff --git a/src/cli.ts b/src/cli.ts index d103e86..0d739e2 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -2,6 +2,7 @@ import { Command, Option } from "commander"; import randomBunny from "./index"; import ICliOptions from "./contracts/ICliOptions"; import { exit } from "process"; +import CliHelper from "./helpers/cliHelper"; const program = new Command(); @@ -12,6 +13,7 @@ program .option('-s, --subreddit ', 'The subreddit to search', 'rabbits') .option('-j, --json', 'Output as JSON') .option('-q, --query-metadata', 'Include query metadata in result') + .option('-o ', 'Output to file') .addOption(new Option('--sort ', 'Sort by').default('hot').choices(['hot', 'new', 'top'])); program.parse(); @@ -19,38 +21,4 @@ program.parse(); const options: ICliOptions = program.opts(); randomBunny(options.subreddit, options.sort) - .then((response) => { - if (response.IsSuccess) { - const result = response.Result!; - - const outputLines: string[] = []; - - if (options.json) { - console.log(JSON.stringify(result)); - return; - } - - outputLines.push(`Archived = ${result.Archived}`); - outputLines.push(`Downvotes = ${result.Downs}`); - outputLines.push(`Hidden = ${result.Hidden}`); - outputLines.push(`Permalink = ${result.Permalink}`); - outputLines.push(`Subreddit = ${result.Subreddit}`); - outputLines.push(`Subreddit Subscribers = ${result.SubredditSubscribers}`); - outputLines.push(`Title = ${result.Title}`); - outputLines.push(`Upvotes = ${result.Ups}`); - outputLines.push(`Url = ${result.Url}`); - - if (options.queryMetadata != null) { - outputLines.push(`Query.Subreddit = ${response.Query.subreddit}`); - outputLines.push(`Query.Sort By = ${response.Query.sortBy}`); - } - - console.log(outputLines.join("\n")); - exit(0); - } else { - const error = response.Error!; - - console.error(error.Message, error.Code); - exit(1); - } - }); \ No newline at end of file + .then((response) => exit(CliHelper.Endpoint(response, options))); \ No newline at end of file diff --git a/src/contracts/ICliOptions.ts b/src/contracts/ICliOptions.ts index cc3af03..355c92f 100644 --- a/src/contracts/ICliOptions.ts +++ b/src/contracts/ICliOptions.ts @@ -1,6 +1,7 @@ export default interface ICliOptions { subreddit: string, json?: boolean, - sort: string, + sort: "new" | "hot" | "top", + o?: string, queryMetadata?: boolean, } \ No newline at end of file diff --git a/src/helpers/cliHelper.ts b/src/helpers/cliHelper.ts new file mode 100644 index 0000000..2776f2e --- /dev/null +++ b/src/helpers/cliHelper.ts @@ -0,0 +1,25 @@ +import { writeFileSync } from "fs"; +import ICliOptions from "../contracts/ICliOptions"; +import IReturnResult from "../contracts/IReturnResult"; +import OutputHelper from "./outputHelper"; + +export default class CliHelper { + public static Endpoint(response: IReturnResult, options: ICliOptions): number { + if (response.IsSuccess) { + const output = OutputHelper.GenerateOutput(response, options); + + if (options.o) { + writeFileSync(options.o, output); + } else { + console.log(output); + } + + return 0; + } else { + const error = response.Error!; + + console.error(error.Message, error.Code); + return 1; + } + } +} \ No newline at end of file diff --git a/src/imageHelper.ts b/src/helpers/imageHelper.ts similarity index 100% rename from src/imageHelper.ts rename to src/helpers/imageHelper.ts diff --git a/src/helpers/outputHelper.ts b/src/helpers/outputHelper.ts new file mode 100644 index 0000000..40a2927 --- /dev/null +++ b/src/helpers/outputHelper.ts @@ -0,0 +1,31 @@ +import ICliOptions from "../contracts/ICliOptions"; +import IReturnResult from "../contracts/IReturnResult"; + +export default class OutputHelper { + public static GenerateOutput(response: IReturnResult, options: ICliOptions): string { + const result = response.Result!; + + const outputLines: string[] = []; + + if (options.json) { + return JSON.stringify(result); + } + + outputLines.push(`Archived = ${result.Archived}`); + outputLines.push(`Downvotes = ${result.Downs}`); + outputLines.push(`Hidden = ${result.Hidden}`); + outputLines.push(`Permalink = ${result.Permalink}`); + outputLines.push(`Subreddit = ${result.Subreddit}`); + outputLines.push(`Subreddit Subscribers = ${result.SubredditSubscribers}`); + outputLines.push(`Title = ${result.Title}`); + outputLines.push(`Upvotes = ${result.Ups}`); + outputLines.push(`Url = ${result.Url}`); + + if (options.queryMetadata != null) { + outputLines.push(`Query.Subreddit = ${response.Query.subreddit}`); + outputLines.push(`Query.Sort By = ${response.Query.sortBy}`); + } + + return outputLines.join("\n"); + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 75ad628..b1ecc5d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,17 +5,9 @@ import { List } from 'linqts'; import IFetchResult from "./contracts/IFetchResult"; import { ErrorCode } from "./constants/ErrorCode"; import ErrorMessages from "./constants/ErrorMessages"; -import ImageHelper from "./imageHelper"; - -const sortable = [ - 'new', - 'hot', - 'top' -]; - -export default async function randomBunny(subreddit: string, sortBy: string = 'hot'): Promise { - if (!sortable.includes(sortBy)) sortBy = 'hot'; +import ImageHelper from "./helpers/imageHelper"; +export default async function randomBunny(subreddit: string, sortBy: "new" | "hot" | "top" = 'hot'): Promise { const result = await fetch(`https://reddit.com/r/${subreddit}/${sortBy}.json?limit=100`) .then((res) => { return res; diff --git a/tests/cli.test.ts b/tests/cli.test.ts deleted file mode 100644 index 66fecbe..0000000 --- a/tests/cli.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { exec } from "child_process"; -import path from "path"; - -describe('default', () => { - test('GIVEN no options are supplied, EXPECT standard output', async () => { - const result = await cli([], '.'); - - const keys = result.stdout.split('\n') - .flatMap(x => x.split(' = ')[0]) - .filter(x => x && x.length > 0); - const values = result.stdout.split('\n') - .flatMap(x => x.split(' = ')[1]) - .filter(x => x && x.length > 0); - - - expect(result.code).toBe(0); - expect(keys).toStrictEqual(['Archived', 'Downvotes', 'Hidden', 'Permalink', 'Subreddit', 'Subreddit Subscribers', 'Title', 'Upvotes', 'Url']); - expect(values.length).toBe(9); - }, 5000); - - test('GIVEN an error occurs, EXPECT error output', async () => { - const result = await cli(['-s', 'textonly'], '.'); - - expect(result.code).toBe(1); - expect(result.stderr).toBeDefined(); - }, 5000); -}); - -describe('version', () => { - test('GIVEN -V flag is supplied, EXPECT version returned', async () => { - const result = await cli(['-V'], '.'); - - expect(result.code).toBe(0); - expect(result.stdout).toBe('2.2\n'); - }); - - test('GIVEN --version is supplied, EXPECT version returned', async () => { - const result = await cli(['--version'], '.'); - - expect(result.code).toBe(0); - expect(result.stdout).toBe('2.2\n'); - }); -}); - -describe('help', () => { - test('GIVEN -h is supplied, EXPECT help returned', async () => { - const result = await cli(['-h'], '.'); - - expect(result.code).toBe(0); - expect(result.stdout.split('\n')[0]).toBe('Usage: random-bunny [options]'); - }); - - test('GIVEN --help is supplied, EXPECT help returned', async () => { - const result = await cli(['--help'], '.'); - - expect(result.code).toBe(0); - expect(result.stdout.split('\n')[0]).toBe('Usage: random-bunny [options]'); - }); -}); - -describe('subreddit', () => { - test('GIVEN -s is not supplied, EXPECT subreddit to be defaulted', async () => { - const result = await cli([], '.'); - - const subreddit = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0] == 'Subreddit')! - .split(' = ')[1]; - - expect(subreddit).toBe('Rabbits'); - }, 5000); - - test('GIVEN -s is supplied, EXPECT subreddit to be changed', async () => { - const result = await cli(['-s', 'pics'], '.'); - - const subreddit = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0] == 'Subreddit')! - .split(' = ')[1]; - - expect(subreddit).toBe('pics'); - }, 5000); - - test('GIVEN --subreddit is supplied, EXPECT subreddit to be changed', async () => { - const result = await cli(['--subreddit', 'pics'], '.'); - - const subreddit = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0] == 'Subreddit')! - .split(' = ')[1]; - - expect(subreddit).toBe('pics'); - }, 5000); -}); - -describe('json', () => { - test('GIVEN -j is supplied, EXPECT output to be valid JSON', async () => { - const result = await cli(['-j'], '.'); - - const json = JSON.parse(result.stdout); - - expect(json).toBeDefined(); - }, 5000); - - test('GIVEN --json is supplied, EXPECT output to be valid JSON', async () => { - const result = await cli(['--json'], '.'); - - const json = JSON.parse(result.stdout); - - expect(json).toBeDefined(); - }, 5000); -}); - -describe('sort', () => { - test('GIVEN --sort is not supplied, EXPECT sort to be defaulted', async () => { - const result = await cli(['-q'], '.'); - - const sortBy = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0] == 'Query.Sort By')! - .split(' = ')[1]; - - expect(sortBy).toBe('hot'); - }, 5000); - - test('GIVEN --sort is supplied WITH a valid input, EXPECT sort to be used', async () => { - const result = await cli(['-q', '--sort', 'new'], '.'); - - const sortBy = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0] == 'Query.Sort By')! - .split(' = ')[1]; - - expect(sortBy).toBe('new'); - }, 5000); - - test('GIVEN --sort is supplied WITH an invalid input, EXPECT error', async () => { - const result = await cli(['-q', '--sort', 'invalid'], '.'); - - expect(result.code).toBe(1); - expect(result.stderr).toBe("error: option '--sort ' argument 'invalid' is invalid. Allowed choices are hot, new, top.\n"); - }, 5000); -}); - -describe('query-metadata', () => { - test('GIVEN --query-metadata is not supplied, EXPECT no query metadata returned', async () => { - const result = await cli([], '.'); - - const query = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0].startsWith('Query')); - - expect(query).toBeUndefined(); - }, 5000); - - test('GIVEN --query-metadata is supplied, EXPECT query metadata returned', async () => { - const result = await cli(['--query-metadata'], '.'); - - const query = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0].startsWith('Query')); - - expect(query).toBeDefined(); - }, 5000); - - test('GIVEN -q is supplied, EXPECT query metadata returned', async () => { - const result = await cli(['-q'], '.'); - - const query = result.stdout.split('\n') - .find(x => x && x.length > 0 && x.split(' = ')[0].startsWith('Query')); - - expect(query).toBeDefined(); - }, 5000); -}); - -function cli(args: string[], cwd: string): Promise { - return new Promise(resolve => { - exec(`node ${path.resolve('./dist/cli.js')} ${args.join(' ')}`, - { cwd }, - (error, stdout, stderr) => { resolve({ - code: error && error.code ? error.code : 0, - error, - stdout, - stderr }); - }); - }); -} - -interface cliResult { - code: number, - error: any, - stdout: string, - stderr: string, -} \ No newline at end of file diff --git a/tests/helpers/__snapshots__/outputHelper.test.ts.snap b/tests/helpers/__snapshots__/outputHelper.test.ts.snap new file mode 100644 index 0000000..0aa5dcc --- /dev/null +++ b/tests/helpers/__snapshots__/outputHelper.test.ts.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateOutput EXPECT standout output to be returned 1`] = ` +"Archived = false +Downvotes = 0 +Hidden = false +Permalink = /r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/ +Subreddit = Rabbits +Subreddit Subscribers = 654751 +Title = This is my Ms Bear! +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,"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.queryMetadata is supplied, EXPECT query metadata to be added 1`] = ` +"Archived = false +Downvotes = 0 +Hidden = false +Permalink = /r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/ +Subreddit = Rabbits +Subreddit Subscribers = 654751 +Title = This is my Ms Bear! +Upvotes = 17 +Url = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d +Query.Subreddit = rabbits +Query.Sort By = hot" +`; diff --git a/tests/helpers/cliHelper.test.ts b/tests/helpers/cliHelper.test.ts new file mode 100644 index 0000000..3ea6687 --- /dev/null +++ b/tests/helpers/cliHelper.test.ts @@ -0,0 +1,118 @@ +import fs from "fs"; +import CliHelper from "../../src/helpers/cliHelper"; +import ICliOptions from "../../src/contracts/ICliOptions"; +import IReturnResult from "../../src/contracts/IReturnResult"; +import OutputHelper from "../../src/helpers/outputHelper"; +import { ErrorCode } from "../../src/constants/ErrorCode"; + +describe("Endpoint", () => { + describe("GIVEN response is successful", () => { + test("GIVEN options.o is defined, EXPECT output written to file", () => { + // Arrange + const response = { + IsSuccess: true, + } as IReturnResult; + + const options = { + o: "file.txt", + } as ICliOptions; + + OutputHelper.GenerateOutput = jest.fn().mockReturnValue("test output"); + + fs.writeFileSync = jest.fn(); + + console.log = jest.fn(); + + console.error = jest.fn(); + + // Act + const result = CliHelper.Endpoint(response, options); + + // Assert + expect(result).toBe(0); + + expect(OutputHelper.GenerateOutput).toHaveBeenCalledTimes(1); + expect(OutputHelper.GenerateOutput).toHaveBeenCalledWith(response, options); + + expect(fs.writeFileSync).toHaveBeenCalledTimes(1); + expect(fs.writeFileSync).toHaveBeenCalledWith("file.txt", "test output"); + + expect(console.log).not.toHaveBeenCalled(); + + expect(console.error).not.toHaveBeenCalled(); + }); + + test("GIVEN options.o is undefined, EXPECT output logged to console", () => { + // Arrange + const response = { + IsSuccess: true, + } as IReturnResult; + + const options = { + o: undefined, + } as ICliOptions; + + OutputHelper.GenerateOutput = jest.fn().mockReturnValue("test output"); + + fs.writeFileSync = jest.fn(); + + console.log = jest.fn(); + + console.error = jest.fn(); + + // Act + const result = CliHelper.Endpoint(response, options); + + // Assert + expect(result).toBe(0); + + expect(OutputHelper.GenerateOutput).toHaveBeenCalledTimes(1); + expect(OutputHelper.GenerateOutput).toHaveBeenCalledWith(response, options); + + expect(fs.writeFileSync).not.toHaveBeenCalled(); + + expect(console.log).toHaveBeenCalledTimes(1); + expect(console.log).toHaveBeenCalledWith("test output"); + + expect(console.error).not.toHaveBeenCalled(); + }); + }); + + test("GIVEN response is failure, EXPECT error logged to console", () => { + // Arrange + const response = { + IsSuccess: false, + Error: { + Message: "error message", + Code: ErrorCode.FailedToFetchReddit, + }, + } as IReturnResult; + + const options = { + o: "file.txt", + } as ICliOptions; + + OutputHelper.GenerateOutput = jest.fn().mockReturnValue("test output"); + + fs.writeFileSync = jest.fn(); + + console.log = jest.fn(); + + console.error = jest.fn(); + + // Act + const result = CliHelper.Endpoint(response, options); + + // Assert + expect(result).toBe(1); + + expect(OutputHelper.GenerateOutput).not.toHaveBeenCalled(); + + expect(fs.writeFileSync).not.toHaveBeenCalled(); + + expect(console.log).not.toHaveBeenCalled(); + + expect(console.error).toHaveBeenCalledTimes(1); + expect(console.error).toHaveBeenCalledWith("error message", ErrorCode.FailedToFetchReddit); + }); +}); \ No newline at end of file diff --git a/tests/imageHelper.test.ts b/tests/helpers/imageHelper.test.ts similarity index 98% rename from tests/imageHelper.test.ts rename to tests/helpers/imageHelper.test.ts index 77227b1..3c6f44e 100644 --- a/tests/imageHelper.test.ts +++ b/tests/helpers/imageHelper.test.ts @@ -1,4 +1,4 @@ -import ImageHelper from "../src/imageHelper"; +import ImageHelper from "../../src/helpers/imageHelper"; import fetch from "got-cjs"; jest.mock('got-cjs'); diff --git a/tests/helpers/outputHelper.test.ts b/tests/helpers/outputHelper.test.ts new file mode 100644 index 0000000..8c9893d --- /dev/null +++ b/tests/helpers/outputHelper.test.ts @@ -0,0 +1,99 @@ +import ICliOptions from "../../src/contracts/ICliOptions"; +import IReturnResult from "../../src/contracts/IReturnResult"; +import OutputHelper from "../../src/helpers/outputHelper"; + +describe("GenerateOutput", () => { + test("EXPECT standout output to be returned", () => { + // Arrange + const response = { + IsSuccess: true, + Query: { + subreddit: "rabbits", + sortBy: "hot", + }, + Result: { + Archived: false, + 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", + }, + } as IReturnResult; + + const options = {} as ICliOptions; + + // Act + const result = OutputHelper.GenerateOutput(response, options); + + // Assert + expect(result).toMatchSnapshot(); + }); + + test("GIVEN options.json is true, EXPECT output to be returned as JSON", () => { + // Arrange + const response = { + IsSuccess: true, + Query: { + subreddit: "rabbits", + sortBy: "hot", + }, + Result: { + Archived: false, + 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", + }, + } as IReturnResult; + + const options = { + json: true, + } as ICliOptions; + + // Act + const result = OutputHelper.GenerateOutput(response, options); + + // Assert + expect(result).toMatchSnapshot(); + }); + + test("GIVEN options.queryMetadata is supplied, EXPECT query metadata to be added", () => { + // Arrange + const response = { + IsSuccess: true, + Query: { + subreddit: "rabbits", + sortBy: "hot", + }, + Result: { + Archived: false, + 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", + }, + } as IReturnResult; + + const options = { + queryMetadata: true, + } as ICliOptions; + + // Act + const result = OutputHelper.GenerateOutput(response, options); + + // Assert + expect(result).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/tests/index.test.ts b/tests/index.test.ts index 053f347..ffa9015 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,6 +1,6 @@ import { ErrorCode } from "../src/constants/ErrorCode"; import ErrorMessages from "../src/constants/ErrorMessages"; -import ImageHelper from "../src/imageHelper"; +import ImageHelper from "../src/helpers/imageHelper"; import randomBunny from "../src/index"; import fetch from "got-cjs"; @@ -37,7 +37,7 @@ describe('randomBunny', () => { expect(result.Result).toBeDefined(); expect(result.Error).toBeUndefined(); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); }); test('GIVEN sortBy is NOT supplied, expect it to default to hot', async () => { @@ -69,39 +69,7 @@ describe('randomBunny', () => { expect(result.Result).toBeDefined(); expect(result.Error).toBeUndefined(); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/hot.json?limit=100'); - }); - - 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?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/hot.json?limit=100'); }); test('GIVEN the fetch fails, EXPECT failure result', async () => { @@ -116,7 +84,7 @@ describe('randomBunny', () => { expect(result.Error!.Code).toBe(ErrorCode.FailedToFetchReddit); expect(result.Error!.Message).toBe(ErrorMessages.FailedToFetchReddit); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); }); test('GIVEN the result is NOT valid JSON, EXPECT failure result', async () => { @@ -133,7 +101,7 @@ describe('randomBunny', () => { expect(result.Error!.Code).toBe(ErrorCode.UnableToParseJSON); expect(result.Error!.Message).toBe(ErrorMessages.UnableToParseJSON); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); }); test('GIVEN randomSelect does NOT find a response, EXPECT failure result', async () => { @@ -189,8 +157,8 @@ describe('randomBunny', () => { expect(result.Error!.Code).toBe(ErrorCode.NoImageResultsFound); expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); }); test("GIVEN data fetched is a gallery AND an image is returned from the helper, EXPECT this to be used", async () => { @@ -223,7 +191,7 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeTruthy(); expect(result.Result).toBeDefined(); - expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); + expect(fetchMock).toHaveBeenCalledWith('https://reddit.com/r/rabbits/new.json?limit=100'); expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledTimes(1); expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledWith("https://i.redd.it/gallery/cr8xudsnkgua1");