diff --git a/src/routes/getTopCategoryUsers.ts b/src/routes/getTopCategoryUsers.ts index 74853b3..c8ce0d0 100644 --- a/src/routes/getTopCategoryUsers.ts +++ b/src/routes/getTopCategoryUsers.ts @@ -2,10 +2,12 @@ import { db } from "../databases/databases"; import { createMemoryCache } from "../utils/createMemoryCache"; import { config } from "../config"; import { Request, Response } from "express"; +import { validateCategories } from "../utils/parseParams"; const MILLISECONDS_IN_MINUTE = 60000; // eslint-disable-next-line @typescript-eslint/no-misused-promises const getTopCategoryUsersWithCache = createMemoryCache(generateTopCategoryUsersStats, config.getTopUsersCacheTimeMinutes * MILLISECONDS_IN_MINUTE); +/* istanbul ignore next */ const maxRewardTimePerSegmentInSeconds = config.maxRewardTimePerSegmentInSeconds ?? 86400; interface DBSegment { @@ -38,7 +40,6 @@ async function generateTopCategoryUsersStats(sortBy: string, category: string) { } } - return { userNames, viewCounts, @@ -51,7 +52,7 @@ export async function getTopCategoryUsers(req: Request, res: Response): Promise< const sortType = parseInt(req.query.sortType as string); const category = req.query.category as string; - if (sortType == undefined || !config.categoryList.includes(category) ) { + if (sortType == undefined || !validateCategories([category]) ) { //invalid request return res.sendStatus(400); } diff --git a/src/routes/getTotalStats.ts b/src/routes/getTotalStats.ts index 44b160f..49699c0 100644 --- a/src/routes/getTotalStats.ts +++ b/src/routes/getTotalStats.ts @@ -67,7 +67,6 @@ function getStats(countContributingUsers: boolean): Promise { } } - function updateExtensionUsers() { if (config.userCounterURL) { axios.get(`${config.userCounterURL}/api/v1/userCount`) @@ -87,12 +86,13 @@ function updateExtensionUsers() { }); getCWSUsers(chromeExtId) .then(res => chromeUsersCache = res) - .catch(() => + .catch(/* istanbul ignore next */ () => getChromeUsers(chromeExtensionUrl) .then(res => chromeUsersCache = res) ); } +/* istanbul ignore next */ function getChromeUsers(chromeExtensionUrl: string): Promise { return axios.get(chromeExtensionUrl) .then(res => { diff --git a/src/utils/parseParams.ts b/src/utils/parseParams.ts index 258b78a..cb0c93d 100644 --- a/src/utils/parseParams.ts +++ b/src/utils/parseParams.ts @@ -73,3 +73,6 @@ export const parseActionTypes = (req: Request, fallback: ActionType[]): ActionTy export const parseRequiredSegments = (req: Request): SegmentUUID[] | undefined => syntaxErrorWrapper(getRequiredSegments, req, []); // never fall back + +export const validateCategories = (categories: string[]): boolean => + categories.every((category: string) => config.categoryList.includes(category)); \ No newline at end of file diff --git a/test/cases/getSkipSegments.ts b/test/cases/getSkipSegments.ts index f89b778..275f231 100644 --- a/test/cases/getSkipSegments.ts +++ b/test/cases/getSkipSegments.ts @@ -486,4 +486,13 @@ describe("getSkipSegments", () => { }) .catch(err => done(err)); }); + + it("Should get 400 for invalid category type", (done) => { + client.get(endpoint, { params: { videoID: "getSkipSegmentID0", category: 1 } }) + .then(res => { + assert.strictEqual(res.status, 400); + done(); + }) + .catch(err => done(err)); + }); }); diff --git a/test/cases/getTopCategoryUsers.ts b/test/cases/getTopCategoryUsers.ts index f321373..bd8adc4 100644 --- a/test/cases/getTopCategoryUsers.ts +++ b/test/cases/getTopCategoryUsers.ts @@ -29,7 +29,7 @@ describe("getTopCategoryUsers", () => { .catch(err => done(err)); }); - it("Should return 400 if invalid sortType provided", (done) => { + it("Should return 400 if invalid type of sortType provided", (done) => { client.get(endpoint, { params: { sortType: "a" } }) .then(res => { assert.strictEqual(res.status, 400); @@ -38,6 +38,15 @@ describe("getTopCategoryUsers", () => { .catch(err => done(err)); }); + it("Should return 400 if invalid sortType number provided", (done) => { + client.get(endpoint, { params: { sortType: 15, category: "sponsor" } }) + .then(res => { + assert.strictEqual(res.status, 400); + done(); + }) + .catch(err => done(err)); + }); + it("Should return 400 if invalid category provided", (done) => { client.get(endpoint, { params: { sortType: 1, category: "never_valid_category" } }) .then(res => { @@ -121,4 +130,16 @@ describe("getTopCategoryUsers", () => { }) .catch(err => done(err)); }); + + it("Should return no time saved for chapters", (done) => { + client.get(endpoint, { params: { sortType: 2, category: "chapter" } }) + .then(res => { + assert.strictEqual(res.status, 200); + for (const timeSaved of res.data.minutesSaved) { + assert.strictEqual(timeSaved, 0, "Time saved should be 0"); + } + done(); + }) + .catch(err => done(err)); + }); });