diff --git a/test/cases/getIsUserVIP.ts b/test/cases/getIsUserVIP.ts index fc0784e..0639066 100644 --- a/test/cases/getIsUserVIP.ts +++ b/test/cases/getIsUserVIP.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {getbaseURL, Done} from "../utils"; +import { Done} from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/getLockCategories.ts b/test/cases/getLockCategories.ts index a70b5e7..f04f89e 100644 --- a/test/cases/getLockCategories.ts +++ b/test/cases/getLockCategories.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {getHash} from "../../src/utils/getHash"; import {db} from "../../src/databases/databases"; import assert from "assert"; diff --git a/test/cases/getLockCategoriesByHash.ts b/test/cases/getLockCategoriesByHash.ts index 7cfeb6a..84dad63 100644 --- a/test/cases/getLockCategoriesByHash.ts +++ b/test/cases/getLockCategoriesByHash.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {getHash} from "../../src/utils/getHash"; import {db} from "../../src/databases/databases"; import assert from "assert"; diff --git a/test/cases/getSavedTimeForUser.ts b/test/cases/getSavedTimeForUser.ts index 6d11409..59ac2fc 100644 --- a/test/cases/getSavedTimeForUser.ts +++ b/test/cases/getSavedTimeForUser.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import {deepStrictEqual} from "assert"; diff --git a/test/cases/getSearchSegments.ts b/test/cases/getSearchSegments.ts index 481fb25..80416c5 100644 --- a/test/cases/getSearchSegments.ts +++ b/test/cases/getSearchSegments.ts @@ -1,6 +1,7 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import assert from "assert"; describe("getSearchSegments", () => { diff --git a/test/cases/getSegmentInfo.ts b/test/cases/getSegmentInfo.ts index 2bc1d57..7a075b7 100644 --- a/test/cases/getSegmentInfo.ts +++ b/test/cases/getSegmentInfo.ts @@ -1,6 +1,8 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL, partialDeepEquals} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import assert from "assert"; const ENOENTID = "0".repeat(64); diff --git a/test/cases/getSkipSegments.ts b/test/cases/getSkipSegments.ts index bcd8b23..4d6afa8 100644 --- a/test/cases/getSkipSegments.ts +++ b/test/cases/getSkipSegments.ts @@ -1,6 +1,8 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL, partialDeepEquals} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import assert from "assert"; describe("getSkipSegments", () => { diff --git a/test/cases/getSkipSegmentsByHash.ts b/test/cases/getSkipSegmentsByHash.ts index b3e1459..d97c888 100644 --- a/test/cases/getSkipSegmentsByHash.ts +++ b/test/cases/getSkipSegmentsByHash.ts @@ -1,6 +1,8 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL, partialDeepEquals, postJSON} from "../utils"; +import { Done, postJSON } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import {getHash} from "../../src/utils/getHash"; import {ImportMock,} from "ts-mock-imports"; import * as YouTubeAPIModule from "../../src/utils/youtubeApi"; diff --git a/test/cases/getStatus.ts b/test/cases/getStatus.ts index 7860e95..a58c0b2 100644 --- a/test/cases/getStatus.ts +++ b/test/cases/getStatus.ts @@ -1,7 +1,7 @@ import assert from "assert"; import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; - +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; let dbVersion: number; diff --git a/test/cases/getUserID.ts b/test/cases/getUserID.ts index a4dfece..2e031c4 100644 --- a/test/cases/getUserID.ts +++ b/test/cases/getUserID.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/getUserInfo.ts b/test/cases/getUserInfo.ts index b87dfd3..d73f880 100644 --- a/test/cases/getUserInfo.ts +++ b/test/cases/getUserInfo.ts @@ -1,5 +1,7 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, partialDeepEquals} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/getUserStats.ts b/test/cases/getUserStats.ts new file mode 100644 index 0000000..64336d1 --- /dev/null +++ b/test/cases/getUserStats.ts @@ -0,0 +1,126 @@ +import fetch from "node-fetch"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; +import { db } from "../../src/databases/databases"; +import { getHash } from "../../src/utils/getHash"; +import assert from "assert"; + +describe("getUserStats", () => { + before(async () => { + const insertUserNameQuery = 'INSERT INTO "userNames" ("userID", "userName") VALUES(?, ?)'; + await db.prepare("run", insertUserNameQuery, [getHash("getuserstats_user_01"), "Username user 01"]); + + const sponsorTimesQuery = 'INSERT INTO "sponsorTimes" ("videoID", "startTime", "endTime", "votes", "UUID", "userID", "timeSubmitted", views, category, "shadowHidden") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid1", getHash("getuserstats_user_01"), 1, 1, "sponsor", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid2", getHash("getuserstats_user_01"), 2, 2, "selfpromo", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid3", getHash("getuserstats_user_01"), 3, 3, "interaction", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid4", getHash("getuserstats_user_01"), 4, 4, "intro", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid5", getHash("getuserstats_user_01"), 5, 5, "outro", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid6", getHash("getuserstats_user_01"), 6, 6, "preview", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, 0, "getuserstatsuuid7", getHash("getuserstats_user_01"), 7, 7, "music_offtopic", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 11, 11, 0, "getuserstatsuuid8", getHash("getuserstats_user_01"), 8, 8, "poi_highlight", 0]); + await db.prepare("run", sponsorTimesQuery, ["getuserstats1", 0, 60, -2, "getuserstatsuuid9", getHash("getuserstats_user_02"), 8, 2, "sponsor", 0]); + + }); + + it("Should be able to get a 400 (No userID parameter)", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats`) + .then(res => { + assert.strictEqual(res.status, 400); + done(); + }) + .catch(err => done(err)); + }); + + it("Should be able to get all user info", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats?userID=getuserstats_user_01&fetchCategoryStats=true&fetchActionTypeStats=true`) + .then(async res => { + assert.strictEqual(res.status, 200); + const expected = { + userName: "Username user 01", + userID: getHash("getuserstats_user_01"), + categoryCount: { + sponsor: 1, + selfpromo: 1, + interaction: 1, + intro: 1, + outro: 1, + preview: 1, + music_offtopic: 1, + poi_highlight: 1, + }, + actionTypeCount: { + mute: 0, + skip: 8 + }, + overallStats: { + minutesSaved: 28, + segmentCount: 8 + } + }; + const data = await res.json(); + assert.ok(partialDeepEquals(data, expected)); + done(); + }) + .catch(err => done(err)); + }); + + it("Should be able to get all zeroes for invalid userid", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats?userID=getuserstats_user_invalid`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + for (const value in data.overallStats) { + if (data[value]) { + done(`returned non-zero for ${value}`); + } + } + done(); + }) + .catch(err => done(err)); + }); + + it("Should be able to get all zeroes for only ignored segments", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats?userID=getuserstats_user_02`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + for (const value in data.overallStats) { + if (data[value]) { + done(`returned non-zero for ${value}`); + } + } + done(); + }) + .catch(err => done(err)); + }); + + it("Should not get extra stats if not requested", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats?userID=getuserstats_user_01`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + // check for categoryCount + if (data.categoryCount || data.actionTypeCount) { + done("returned extra stats"); + } + done(); + }) + .catch(err => done(err)); + }); + + it("Should get parts of extra stats if not requested", (done: Done) => { + fetch(`${getbaseURL()}/api/userStats?userID=getuserstats_user_01&fetchActionTypeStats=true`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + // check for categoryCount + if (data.categoryCount && !data.actionTypeCount) { + done("returned extra stats"); + } + done(); + }) + .catch(err => done(err)); + }); +}); diff --git a/test/cases/lockCategoriesRecords.ts b/test/cases/lockCategoriesRecords.ts index 3bdbf03..e1949f5 100644 --- a/test/cases/lockCategoriesRecords.ts +++ b/test/cases/lockCategoriesRecords.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, postJSON} from "../utils"; +import { Done, postJSON } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {getHash} from "../../src/utils/getHash"; import {db} from "../../src/databases/databases"; import assert from "assert"; diff --git a/test/cases/oldGetSponsorTime.ts b/test/cases/oldGetSponsorTime.ts index 70fca97..756ec0b 100644 --- a/test/cases/oldGetSponsorTime.ts +++ b/test/cases/oldGetSponsorTime.ts @@ -1,6 +1,8 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL, partialDeepEquals} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import assert from "assert"; const endpoint = `${getbaseURL()}/api/getVideoSponsorTimes`; diff --git a/test/cases/oldSubmitSponsorTimes.ts b/test/cases/oldSubmitSponsorTimes.ts index ac1c0a4..2c0ea9e 100644 --- a/test/cases/oldSubmitSponsorTimes.ts +++ b/test/cases/oldSubmitSponsorTimes.ts @@ -1,6 +1,7 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, partialDeepEquals} from "../utils"; -import {db} from "../../src/databases/databases"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals";import {db} from "../../src/databases/databases"; import assert from "assert"; const videoID1 = "dQw4w9WgXcQ"; diff --git a/test/cases/postClearCache.ts b/test/cases/postClearCache.ts index 8fc7516..d1d71d6 100644 --- a/test/cases/postClearCache.ts +++ b/test/cases/postClearCache.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/postPurgeAllSegments.ts b/test/cases/postPurgeAllSegments.ts index f8e68ed..dc34ce3 100644 --- a/test/cases/postPurgeAllSegments.ts +++ b/test/cases/postPurgeAllSegments.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, postJSON} from "../utils"; +import {Done, postJSON} from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import {IDatabase} from "../../src/databases/IDatabase"; diff --git a/test/cases/postSkipSegments.ts b/test/cases/postSkipSegments.ts index b2f4faf..ea77d23 100644 --- a/test/cases/postSkipSegments.ts +++ b/test/cases/postSkipSegments.ts @@ -1,7 +1,9 @@ import fetch from "node-fetch"; import {config} from "../../src/config"; import {getHash} from "../../src/utils/getHash"; -import {Done, getbaseURL, partialDeepEquals, postJSON} from "../utils"; +import { Done, postJSON } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import {db} from "../../src/databases/databases"; import {ImportMock} from "ts-mock-imports"; import * as YouTubeAPIModule from "../../src/utils/youtubeApi"; diff --git a/test/cases/postWarning.ts b/test/cases/postWarning.ts index 02b09d0..2dedef5 100644 --- a/test/cases/postWarning.ts +++ b/test/cases/postWarning.ts @@ -1,5 +1,7 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, partialDeepEquals, postJSON} from "../utils"; +import { Done, postJSON } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/segmentShift.ts b/test/cases/segmentShift.ts index 164fba2..430710b 100644 --- a/test/cases/segmentShift.ts +++ b/test/cases/segmentShift.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import {Done, getbaseURL, postJSON} from "../utils"; +import {Done, postJSON} from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {db} from "../../src/databases/databases"; import {getHash} from "../../src/utils/getHash"; import {IDatabase} from "../../src/databases/IDatabase"; diff --git a/test/cases/setUsername.ts b/test/cases/setUsername.ts index c0927aa..75f87dd 100644 --- a/test/cases/setUsername.ts +++ b/test/cases/setUsername.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import { Done, getbaseURL } from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import { db, privateDB } from "../../src/databases/databases"; import { getHash } from "../../src/utils/getHash"; import assert from "assert"; diff --git a/test/cases/shadowBanUser.ts b/test/cases/shadowBanUser.ts index 0b91206..d167fd8 100644 --- a/test/cases/shadowBanUser.ts +++ b/test/cases/shadowBanUser.ts @@ -1,6 +1,7 @@ import fetch from "node-fetch"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {getHash} from "../../src/utils/getHash"; import assert from "assert"; import { Category } from "../../src/types/segments.model"; diff --git a/test/cases/testUtils.ts b/test/cases/testUtils.ts index 4b3f87a..f60156a 100644 --- a/test/cases/testUtils.ts +++ b/test/cases/testUtils.ts @@ -1,6 +1,5 @@ import assert from "assert"; - -import { partialDeepEquals } from "../utils"; +import { partialDeepEquals } from "../utils/partialDeepEquals"; describe("Test utils ", () => { it("objectContain", async () => { diff --git a/test/cases/unBan.ts b/test/cases/unBan.ts index 3de23dc..cb34d0b 100644 --- a/test/cases/unBan.ts +++ b/test/cases/unBan.ts @@ -1,5 +1,6 @@ import fetch from "node-fetch"; -import { getbaseURL, postJSON } from "../utils"; +import { postJSON } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import { getHash } from "../../src/utils/getHash"; import { db } from "../../src/databases/databases"; import assert from "assert"; diff --git a/test/cases/voteOnSponsorTime.ts b/test/cases/voteOnSponsorTime.ts index 1167605..5929f94 100644 --- a/test/cases/voteOnSponsorTime.ts +++ b/test/cases/voteOnSponsorTime.ts @@ -1,7 +1,8 @@ import fetch from "node-fetch"; import {config} from "../../src/config"; import {db} from "../../src/databases/databases"; -import {Done, getbaseURL} from "../utils"; +import { Done } from "../utils/utils"; +import { getbaseURL } from "../utils/getBaseURL"; import {getHash} from "../../src/utils/getHash"; import {ImportMock} from "ts-mock-imports"; import * as YouTubeAPIModule from "../../src/utils/youtubeApi"; diff --git a/test/utils/getBaseURL.ts b/test/utils/getBaseURL.ts new file mode 100644 index 0000000..3632cb4 --- /dev/null +++ b/test/utils/getBaseURL.ts @@ -0,0 +1,5 @@ +import { config } from "../../src/config"; + +export function getbaseURL(): string { + return `http://localhost:${config.port}`; +} \ No newline at end of file diff --git a/test/utils.ts b/test/utils/partialDeepEquals.ts similarity index 64% rename from test/utils.ts rename to test/utils/partialDeepEquals.ts index 6bebf00..6571794 100644 --- a/test/utils.ts +++ b/test/utils/partialDeepEquals.ts @@ -1,19 +1,10 @@ -import {config} from "../src/config"; -import { Logger } from "../src/utils/logger"; +import { Logger } from "../../src/utils/logger"; -export function getbaseURL(): string { - return `http://localhost:${config.port}`; +function printActualExpected(actual: Record, expected: Record): void { + Logger.error(`Actual: ${JSON.stringify(actual)}`); + Logger.error(`Expected: ${JSON.stringify(expected)}`); } -/** - * Duplicated from Mocha types. TypeScript doesn't infer that type by itself for some reason. - */ -export type Done = (err?: any) => void; - -/** - * - * Check object contains expected properties - */ export const partialDeepEquals = (actual: Record, expected: Record, print = true): boolean => { // loop over key, value of expected for (const [ key, value ] of Object.entries(expected)) { @@ -21,27 +12,13 @@ export const partialDeepEquals = (actual: Record, expected: Record< if (Array.isArray(value) || typeof value === "object") { if (!partialDeepEquals(actual?.[key], value, false)) { if (print) printActualExpected(actual, expected); - return false; } } else if (actual?.[key] !== value) { if (print) printActualExpected(actual, expected); - return false; } } return true; -}; - -function printActualExpected(actual: Record, expected: Record): void { - Logger.error(`Actual: ${JSON.stringify(actual)}`); - Logger.error(`Expected: ${JSON.stringify(expected)}`); -} - -export const postJSON = { - method: "POST", - headers: { - "Content-Type": "application/json", - }, }; \ No newline at end of file diff --git a/test/utils/utils.ts b/test/utils/utils.ts new file mode 100644 index 0000000..4bbb8f4 --- /dev/null +++ b/test/utils/utils.ts @@ -0,0 +1,11 @@ +/** + * Duplicated from Mocha types. TypeScript doesn't infer that type by itself for some reason. + */ +export type Done = (err?: any) => void; + +export const postJSON = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, +}; \ No newline at end of file