Add sort option #123
6 changed files with 93 additions and 4 deletions
13
src/cli.ts
13
src/cli.ts
|
@ -1,4 +1,4 @@
|
|||
import { Command } from "commander";
|
||||
import { Command, Option } from "commander";
|
||||
import randomBunny from "./index";
|
||||
import ICliOptions from "./contracts/ICliOptions";
|
||||
import { exit } from "process";
|
||||
|
@ -9,13 +9,15 @@ program
|
|||
.name('random-bunny')
|
||||
.description('Get a random image url from a subreddit of your choosing')
|
||||
.version('2.2')
|
||||
.option('-s, --subreddit <subreddit>', 'The subreddit to search', 'rabbits');
|
||||
.option('-s, --subreddit <subreddit>', 'The subreddit to search', 'rabbits')
|
||||
.option('-q, --query-metadata', 'Include query metadata in result')
|
||||
.addOption(new Option('--sort <sort>', 'Sort by').default('hot').choices(['hot', 'new', 'top']));
|
||||
|
||||
program.parse();
|
||||
|
||||
const options: ICliOptions = program.opts();
|
||||
|
||||
randomBunny(options.subreddit)
|
||||
randomBunny(options.subreddit, options.sort)
|
||||
.then((response) => {
|
||||
if (response.IsSuccess) {
|
||||
const result = response.Result!;
|
||||
|
@ -31,6 +33,11 @@ randomBunny(options.subreddit)
|
|||
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 {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
export default interface ICliOptions {
|
||||
subreddit: string,
|
||||
sort: string,
|
||||
queryMetadata?: boolean,
|
||||
}
|
|
@ -1,8 +1,10 @@
|
|||
import IError from "./IError.js";
|
||||
import IRedditResult from "./IRedditResult.js";
|
||||
import QueryResult from "./QueryResult.js";
|
||||
|
||||
export default interface IReturnResult {
|
||||
IsSuccess: boolean;
|
||||
Query: QueryResult;
|
||||
Result?: IRedditResult;
|
||||
Error?: IError;
|
||||
}
|
4
src/contracts/QueryResult.ts
Normal file
4
src/contracts/QueryResult.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
export default interface QueryResult {
|
||||
subreddit: string,
|
||||
sortBy: string,
|
||||
}
|
16
src/index.ts
16
src/index.ts
|
@ -26,6 +26,10 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h
|
|||
if (!result) {
|
||||
return {
|
||||
IsSuccess: false,
|
||||
Query: {
|
||||
subreddit: subreddit,
|
||||
sortBy: sortBy,
|
||||
},
|
||||
Error: {
|
||||
Code: ErrorCode.FailedToFetchReddit,
|
||||
Message: ErrorMessages.FailedToFetchReddit,
|
||||
|
@ -38,6 +42,10 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h
|
|||
if (!json) {
|
||||
return {
|
||||
IsSuccess: false,
|
||||
Query: {
|
||||
subreddit: subreddit,
|
||||
sortBy: sortBy,
|
||||
},
|
||||
Error: {
|
||||
Code: ErrorCode.UnableToParseJSON,
|
||||
Message: ErrorMessages.UnableToParseJSON,
|
||||
|
@ -56,6 +64,10 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h
|
|||
if (dataWithImages.length == 0) {
|
||||
return {
|
||||
IsSuccess: false,
|
||||
Query: {
|
||||
subreddit: subreddit,
|
||||
sortBy: sortBy,
|
||||
},
|
||||
Error: {
|
||||
Code: ErrorCode.NoImageResultsFound,
|
||||
Message: ErrorMessages.NoImageResultsFound,
|
||||
|
@ -83,6 +95,10 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h
|
|||
|
||||
return {
|
||||
IsSuccess: true,
|
||||
Query: {
|
||||
subreddit: subreddit,
|
||||
sortBy: sortBy,
|
||||
},
|
||||
Result: redditResult
|
||||
};
|
||||
}
|
|
@ -88,7 +88,65 @@ describe('subreddit', () => {
|
|||
|
||||
expect(subreddit).toBe('Horses');
|
||||
}, 5000);
|
||||
})
|
||||
});
|
||||
|
||||
describe('sort', () => {
|
||||
test('GIVEN --sort is not supplird, 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");
|
||||
});
|
||||
});
|
||||
|
||||
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 not supplied, EXPECT no 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 not supplied, EXPECT no 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 => {
|
||||
|
|
Loading…
Reference in a new issue