Add subreddit CLI option #118
4 changed files with 101 additions and 20 deletions
35
src/cli.ts
35
src/cli.ts
|
@ -1,9 +1,42 @@
|
|||
import { Command } from "commander";
|
||||
import randomBunny from "./index";
|
||||
import ICliOptions from "./contracts/ICliOptions";
|
||||
import { exit } from "process";
|
||||
|
||||
const program = new Command();
|
||||
|
||||
program
|
||||
.name('random-bunny')
|
||||
.description('Get a random image url from a subreddit of your choosing')
|
||||
.version('2.2');
|
||||
.version('2.2')
|
||||
.option('-s, --subreddit <subreddit>', 'The subreddit to search', 'rabbits');
|
||||
|
||||
program.parse();
|
||||
|
||||
const options: ICliOptions = program.opts();
|
||||
|
||||
randomBunny(options.subreddit)
|
||||
.then((response) => {
|
||||
if (response.IsSuccess) {
|
||||
const result = response.Result!;
|
||||
|
||||
const outputLines: string[] = [];
|
||||
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}`);
|
||||
|
||||
console.log(outputLines.join("\n"));
|
||||
exit(0);
|
||||
} else {
|
||||
const error = response.Error!;
|
||||
|
||||
console.error(error.Message, error.Code);
|
||||
exit(1);
|
||||
}
|
||||
});
|
3
src/contracts/ICliOptions.ts
Normal file
3
src/contracts/ICliOptions.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export default interface ICliOptions {
|
||||
subreddit: string,
|
||||
}
|
|
@ -1,6 +1,31 @@
|
|||
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'], '.');
|
||||
|
@ -31,6 +56,38 @@ describe('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', 'horses'], '.');
|
||||
|
||||
const subreddit = result.stdout.split('\n')
|
||||
.find(x => x && x.length > 0 && x.split(' = ')[0] == 'Subreddit')!
|
||||
.split(' = ')[1];
|
||||
|
||||
expect(subreddit).toBe('Horses');
|
||||
}, 5000);
|
||||
|
||||
test('GIVEN --subreddit is supplied, EXPECT subreddit to be changed', async () => {
|
||||
const result = await cli(['--subreddit', 'horses'], '.');
|
||||
|
||||
const subreddit = result.stdout.split('\n')
|
||||
.find(x => x && x.length > 0 && x.split(' = ')[0] == 'Subreddit')!
|
||||
.split(' = ')[1];
|
||||
|
||||
expect(subreddit).toBe('Horses');
|
||||
}, 5000);
|
||||
})
|
||||
|
||||
function cli(args: string[], cwd: string): Promise<cliResult> {
|
||||
|
|
24
yarn.lock
24
yarn.lock
|
@ -488,7 +488,7 @@
|
|||
"@types/node" "*"
|
||||
jest-mock "^29.7.0"
|
||||
|
||||
"@jest/expect-utils@^29.5.0", "@jest/expect-utils@^29.7.0":
|
||||
"@jest/expect-utils@^29.7.0":
|
||||
version "29.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
|
||||
integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==
|
||||
|
@ -904,14 +904,7 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
|
||||
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
|
||||
|
||||
"@types/node@*":
|
||||
version "20.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617"
|
||||
integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
"@types/node@^20.0.0":
|
||||
"@types/node@*", "@types/node@^20.0.0":
|
||||
version "20.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617"
|
||||
integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==
|
||||
|
@ -3011,7 +3004,7 @@ jest-environment-node@^29.7.0:
|
|||
jest-mock "^29.7.0"
|
||||
jest-util "^29.7.0"
|
||||
|
||||
jest-get-type@^29.4.3, jest-get-type@^29.6.3:
|
||||
jest-get-type@^29.6.3:
|
||||
version "29.6.3"
|
||||
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
|
||||
integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
|
||||
|
@ -3043,7 +3036,7 @@ jest-leak-detector@^29.7.0:
|
|||
jest-get-type "^29.6.3"
|
||||
pretty-format "^29.7.0"
|
||||
|
||||
jest-matcher-utils@^29.5.0, jest-matcher-utils@^29.7.0:
|
||||
jest-matcher-utils@^29.7.0:
|
||||
version "29.7.0"
|
||||
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
|
||||
integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==
|
||||
|
@ -3053,7 +3046,7 @@ jest-matcher-utils@^29.5.0, jest-matcher-utils@^29.7.0:
|
|||
jest-get-type "^29.6.3"
|
||||
pretty-format "^29.7.0"
|
||||
|
||||
jest-message-util@^29.5.0, jest-message-util@^29.7.0:
|
||||
jest-message-util@^29.7.0:
|
||||
version "29.7.0"
|
||||
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
|
||||
integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==
|
||||
|
@ -3198,7 +3191,7 @@ jest-snapshot@^29.7.0:
|
|||
pretty-format "^29.7.0"
|
||||
semver "^7.5.3"
|
||||
|
||||
jest-util@^29.0.0, jest-util@^29.5.0, jest-util@^29.7.0:
|
||||
jest-util@^29.0.0, jest-util@^29.7.0:
|
||||
version "29.7.0"
|
||||
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
|
||||
integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
|
||||
|
@ -4777,11 +4770,6 @@ undici-types@~5.26.4:
|
|||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
unique-string@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a"
|
||||
|
|
Loading…
Reference in a new issue