From 037608e059fc4bcb7559c2e895574129ddb1f98d Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 15 Sep 2023 15:18:57 +0100 Subject: [PATCH] Add error codes and error messages to failed results (#89) # Description - Added an Error Code (enum) and Error Message (string) to all the failed results #53 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? - This has been tested both manually as well as the unit tests # 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://gitea.vylpes.xyz/RabbitLabs/random-bunny/pulls/89 Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .gitignore | 1 + src/constants/ErrorCode.ts | 6 ++++++ src/constants/ErrorMessages.ts | 5 +++++ src/contracts/IError.ts | 6 ++++++ src/contracts/IReturnResult.ts | 2 ++ src/index.ts | 24 +++++++++++++++++++----- tests/index.test.ts | 21 +++++++++++++++++++++ 7 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 src/constants/ErrorCode.ts create mode 100644 src/constants/ErrorMessages.ts create mode 100644 src/contracts/IError.ts diff --git a/.gitignore b/.gitignore index 4915027..7025d5c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ dist/ coverage/ yarn-error.log +.DS_Store \ No newline at end of file diff --git a/src/constants/ErrorCode.ts b/src/constants/ErrorCode.ts new file mode 100644 index 0000000..bbf3fef --- /dev/null +++ b/src/constants/ErrorCode.ts @@ -0,0 +1,6 @@ +export enum ErrorCode { + Unknown, + FailedToFetchReddit, + UnableToParseJSON, + NoImageResultsFound, +} \ No newline at end of file diff --git a/src/constants/ErrorMessages.ts b/src/constants/ErrorMessages.ts new file mode 100644 index 0000000..4c5e24a --- /dev/null +++ b/src/constants/ErrorMessages.ts @@ -0,0 +1,5 @@ +export default class ErrorMessages { + public static readonly FailedToFetchReddit = "Failed to fetch result from Reddit"; + public static readonly UnableToParseJSON = "Unable to parse the JSON result"; + public static readonly NoImageResultsFound = "No image results found in response from Reddit"; +} \ No newline at end of file diff --git a/src/contracts/IError.ts b/src/contracts/IError.ts new file mode 100644 index 0000000..5565b93 --- /dev/null +++ b/src/contracts/IError.ts @@ -0,0 +1,6 @@ +import { ErrorCode } from "../constants/ErrorCode"; + +export default interface IError { + Code: ErrorCode; + Message: string; +} \ No newline at end of file diff --git a/src/contracts/IReturnResult.ts b/src/contracts/IReturnResult.ts index 8045c8e..780069d 100644 --- a/src/contracts/IReturnResult.ts +++ b/src/contracts/IReturnResult.ts @@ -1,6 +1,8 @@ +import IError from "./IError.js"; import IRedditResult from "./IRedditResult.js"; export default interface IReturnResult { IsSuccess: boolean; Result?: IRedditResult; + Error?: IError; } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f6e7b3c..4c2b31c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,10 @@ -import IReturnResult from "./contracts/IReturnResult.js"; -import IRedditResult from "./contracts/IRedditResult.js"; +import IReturnResult from "./contracts/IReturnResult"; +import IRedditResult from "./contracts/IRedditResult"; import fetch from "got-cjs"; import { List } from 'linqts'; -import IFetchResult from "./contracts/IFetchResult.js"; +import IFetchResult from "./contracts/IFetchResult"; +import { ErrorCode } from "./constants/ErrorCode"; +import ErrorMessages from "./constants/ErrorMessages"; const sortable = [ 'new', @@ -17,7 +19,11 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h if (!result) { return { - IsSuccess: false + IsSuccess: false, + Error: { + Code: ErrorCode.FailedToFetchReddit, + Message: ErrorMessages.FailedToFetchReddit, + }, } } @@ -25,7 +31,11 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h if (!json) { return { - IsSuccess: false + IsSuccess: false, + Error: { + Code: ErrorCode.UnableToParseJSON, + Message: ErrorMessages.UnableToParseJSON, + }, } } @@ -40,6 +50,10 @@ export default async function randomBunny(subreddit: string, sortBy: string = 'h if (dataWithImages.length == 0) { return { IsSuccess: false, + Error: { + Code: ErrorCode.NoImageResultsFound, + Message: ErrorMessages.NoImageResultsFound, + }, }; } else { random = Math.floor((Math.random() * (dataWithImages.length - 1)) + 0); // Between 0 and (size - 1) diff --git a/tests/index.test.ts b/tests/index.test.ts index 6eafc35..107e7ff 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,3 +1,5 @@ +import { ErrorCode } from "../src/constants/ErrorCode"; +import ErrorMessages from "../src/constants/ErrorMessages"; import randomBunny from "../src/index"; import fetch from "got-cjs"; @@ -32,6 +34,7 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeTruthy(); expect(result.Result).toBeDefined(); + expect(result.Error).toBeUndefined(); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json'); }); @@ -63,6 +66,7 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeTruthy(); expect(result.Result).toBeDefined(); + expect(result.Error).toBeUndefined(); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/hot.json'); }); @@ -94,6 +98,7 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeTruthy(); expect(result.Result).toBeDefined(); + expect(result.Error).toBeUndefined(); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/hot.json'); }); @@ -105,6 +110,10 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeFalsy(); expect(result.Result).toBeUndefined(); + expect(result.Error).toBeDefined(); + + expect(result.Error!.Code).toBe(ErrorCode.FailedToFetchReddit); + expect(result.Error!.Message).toBe(ErrorMessages.FailedToFetchReddit); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json'); }); @@ -118,6 +127,10 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeFalsy(); expect(result.Result).toBeUndefined(); + expect(result.Error).toBeDefined(); + + expect(result.Error!.Code).toBe(ErrorCode.UnableToParseJSON); + expect(result.Error!.Message).toBe(ErrorMessages.UnableToParseJSON); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json'); }); @@ -135,6 +148,10 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeFalsy(); expect(result.Result).toBeUndefined(); + expect(result.Error).toBeDefined(); + + expect(result.Error!.Code).toBe(ErrorCode.NoImageResultsFound); + expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json'); }); @@ -166,6 +183,10 @@ describe('randomBunny', () => { expect(result.IsSuccess).toBeFalsy(); expect(result.Result).toBeUndefined(); + expect(result.Error).toBeDefined(); + + expect(result.Error!.Code).toBe(ErrorCode.NoImageResultsFound); + expect(result.Error!.Message).toBe(ErrorMessages.NoImageResultsFound); expect(fetchMock).toBeCalledWith('https://reddit.com/r/rabbits/new.json'); });