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: #182 Reviewed-by: VylpesTester <tester@vylpes.com> Co-authored-by: Ethan Lane <ethan@vylpes.com> Co-committed-by: Ethan Lane <ethan@vylpes.com>
This commit is contained in:
parent
f53650d573
commit
2e5f8c3633
13 changed files with 327 additions and 275 deletions
10
docs/cli.md
10
docs/cli.md
|
@ -53,9 +53,9 @@ Options:
|
||||||
-s, --subreddit <subreddit> The subreddit to search (default: "rabbits")
|
-s, --subreddit <subreddit> The subreddit to search (default: "rabbits")
|
||||||
-j, --json Output as JSON
|
-j, --json Output as JSON
|
||||||
-q, --query-metadata Include query metadata in result
|
-q, --query-metadata Include query metadata in result
|
||||||
|
-o <file> Output to file
|
||||||
--sort <sort> Sort by (choices: "hot", "new", "top", default: "hot")
|
--sort <sort> Sort by (choices: "hot", "new", "top", default: "hot")
|
||||||
-h, --help display help for command
|
-h, --help display help for command
|
||||||
✨ Done in 0.32s.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## JSON output
|
## JSON output
|
||||||
|
@ -95,3 +95,11 @@ This defaults to "rabbits"
|
||||||
$ randombunny --subreddit rabbits
|
$ randombunny --subreddit rabbits
|
||||||
$ randombunny -s horses
|
$ 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
|
||||||
|
```
|
||||||
|
|
38
src/cli.ts
38
src/cli.ts
|
@ -2,6 +2,7 @@ import { Command, Option } from "commander";
|
||||||
import randomBunny from "./index";
|
import randomBunny from "./index";
|
||||||
import ICliOptions from "./contracts/ICliOptions";
|
import ICliOptions from "./contracts/ICliOptions";
|
||||||
import { exit } from "process";
|
import { exit } from "process";
|
||||||
|
import CliHelper from "./helpers/cliHelper";
|
||||||
|
|
||||||
const program = new Command();
|
const program = new Command();
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@ program
|
||||||
.option('-s, --subreddit <subreddit>', 'The subreddit to search', 'rabbits')
|
.option('-s, --subreddit <subreddit>', 'The subreddit to search', 'rabbits')
|
||||||
.option('-j, --json', 'Output as JSON')
|
.option('-j, --json', 'Output as JSON')
|
||||||
.option('-q, --query-metadata', 'Include query metadata in result')
|
.option('-q, --query-metadata', 'Include query metadata in result')
|
||||||
|
.option('-o <file>', 'Output to file')
|
||||||
.addOption(new Option('--sort <sort>', 'Sort by').default('hot').choices(['hot', 'new', 'top']));
|
.addOption(new Option('--sort <sort>', 'Sort by').default('hot').choices(['hot', 'new', 'top']));
|
||||||
|
|
||||||
program.parse();
|
program.parse();
|
||||||
|
@ -19,38 +21,4 @@ program.parse();
|
||||||
const options: ICliOptions = program.opts();
|
const options: ICliOptions = program.opts();
|
||||||
|
|
||||||
randomBunny(options.subreddit, options.sort)
|
randomBunny(options.subreddit, options.sort)
|
||||||
.then((response) => {
|
.then((response) => exit(CliHelper.Endpoint(response, options)));
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,6 +1,7 @@
|
||||||
export default interface ICliOptions {
|
export default interface ICliOptions {
|
||||||
subreddit: string,
|
subreddit: string,
|
||||||
json?: boolean,
|
json?: boolean,
|
||||||
sort: string,
|
sort: "new" | "hot" | "top",
|
||||||
|
o?: string,
|
||||||
queryMetadata?: boolean,
|
queryMetadata?: boolean,
|
||||||
}
|
}
|
25
src/helpers/cliHelper.ts
Normal file
25
src/helpers/cliHelper.ts
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
src/helpers/outputHelper.ts
Normal file
31
src/helpers/outputHelper.ts
Normal file
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
12
src/index.ts
12
src/index.ts
|
@ -5,17 +5,9 @@ import { List } from 'linqts';
|
||||||
import IFetchResult from "./contracts/IFetchResult";
|
import IFetchResult from "./contracts/IFetchResult";
|
||||||
import { ErrorCode } from "./constants/ErrorCode";
|
import { ErrorCode } from "./constants/ErrorCode";
|
||||||
import ErrorMessages from "./constants/ErrorMessages";
|
import ErrorMessages from "./constants/ErrorMessages";
|
||||||
import ImageHelper from "./imageHelper";
|
import ImageHelper from "./helpers/imageHelper";
|
||||||
|
|
||||||
const sortable = [
|
|
||||||
'new',
|
|
||||||
'hot',
|
|
||||||
'top'
|
|
||||||
];
|
|
||||||
|
|
||||||
export default async function randomBunny(subreddit: string, sortBy: string = 'hot'): Promise<IReturnResult> {
|
|
||||||
if (!sortable.includes(sortBy)) sortBy = 'hot';
|
|
||||||
|
|
||||||
|
export default async function randomBunny(subreddit: string, sortBy: "new" | "hot" | "top" = 'hot'): Promise<IReturnResult> {
|
||||||
const result = await fetch(`https://reddit.com/r/${subreddit}/${sortBy}.json?limit=100`)
|
const result = await fetch(`https://reddit.com/r/${subreddit}/${sortBy}.json?limit=100`)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -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 <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<cliResult> {
|
|
||||||
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,
|
|
||||||
}
|
|
29
tests/helpers/__snapshots__/outputHelper.test.ts.snap
Normal file
29
tests/helpers/__snapshots__/outputHelper.test.ts.snap
Normal file
|
@ -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"
|
||||||
|
`;
|
118
tests/helpers/cliHelper.test.ts
Normal file
118
tests/helpers/cliHelper.test.ts
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,4 +1,4 @@
|
||||||
import ImageHelper from "../src/imageHelper";
|
import ImageHelper from "../../src/helpers/imageHelper";
|
||||||
import fetch from "got-cjs";
|
import fetch from "got-cjs";
|
||||||
|
|
||||||
jest.mock('got-cjs');
|
jest.mock('got-cjs');
|
99
tests/helpers/outputHelper.test.ts
Normal file
99
tests/helpers/outputHelper.test.ts
Normal file
|
@ -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();
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,6 +1,6 @@
|
||||||
import { ErrorCode } from "../src/constants/ErrorCode";
|
import { ErrorCode } from "../src/constants/ErrorCode";
|
||||||
import ErrorMessages from "../src/constants/ErrorMessages";
|
import ErrorMessages from "../src/constants/ErrorMessages";
|
||||||
import ImageHelper from "../src/imageHelper";
|
import ImageHelper from "../src/helpers/imageHelper";
|
||||||
import randomBunny from "../src/index";
|
import randomBunny from "../src/index";
|
||||||
import fetch from "got-cjs";
|
import fetch from "got-cjs";
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ describe('randomBunny', () => {
|
||||||
expect(result.Result).toBeDefined();
|
expect(result.Result).toBeDefined();
|
||||||
expect(result.Error).toBeUndefined();
|
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 () => {
|
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.Result).toBeDefined();
|
||||||
expect(result.Error).toBeUndefined();
|
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 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');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('GIVEN the fetch fails, EXPECT failure result', async () => {
|
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!.Code).toBe(ErrorCode.FailedToFetchReddit);
|
||||||
expect(result.Error!.Message).toBe(ErrorMessages.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 () => {
|
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!.Code).toBe(ErrorCode.UnableToParseJSON);
|
||||||
expect(result.Error!.Message).toBe(ErrorMessages.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 () => {
|
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!.Code).toBe(ErrorCode.NoImageResultsFound);
|
||||||
expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound);
|
expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound);
|
||||||
|
|
||||||
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).toBeCalledWith('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 () => {
|
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.IsSuccess).toBeTruthy();
|
||||||
expect(result.Result).toBeDefined();
|
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).toHaveBeenCalledTimes(1);
|
||||||
expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledWith("https://i.redd.it/gallery/cr8xudsnkgua1");
|
expect(ImageHelper.FetchImageFromRedditGallery).toHaveBeenCalledWith("https://i.redd.it/gallery/cr8xudsnkgua1");
|
||||||
|
|
Loading…
Reference in a new issue