SponsorBlockServer/test/cases/getSegmentInfo.ts

342 lines
14 KiB
TypeScript
Raw Normal View History

2021-09-23 00:52:35 +02:00
import { db } from "../../src/databases/databases";
import { partialDeepEquals } from "../utils/partialDeepEquals";
2021-07-12 08:43:46 +02:00
import assert from "assert";
2021-09-22 23:50:06 +02:00
import { client } from "../utils/httpClient";
2021-06-16 06:33:51 +02:00
2021-06-25 21:57:41 +02:00
const ENOENTID = "0".repeat(64);
2021-07-12 08:43:46 +02:00
const upvotedID = `a${"0".repeat(63)}`;
const downvotedID = `b${"0".repeat(63)}`;
const lockedupID = `c${"0".repeat(63)}`;
const infvotesID = `d${"0".repeat(63)}`;
const shadowhiddenID = `e${"0".repeat(63)}`;
const lockeddownID = `f${"0".repeat(63)}`;
const hiddenID = `1${"0".repeat(63)}`;
const fillerID1 = `11${"0".repeat(62)}`;
const fillerID2 = `12${"0".repeat(62)}`;
const fillerID3 = `13${"0".repeat(62)}`;
const fillerID4 = `14${"0".repeat(62)}`;
const fillerID5 = `15${"0".repeat(62)}`;
const oldID = `${"0".repeat(8)}-${"0000-".repeat(3)}${"0".repeat(12)}`;
2021-08-01 21:27:48 +02:00
const userAgents = {
vanced: "Vanced/5.0",
meabot: "Meabot/5.0",
mpv: "mpv_sponsorblock/5.0",
nodesb: "node_sponsorblock/0.2.0",
blank: ""
};
2021-06-16 06:33:51 +02:00
2021-09-22 23:50:06 +02:00
const endpoint = "/api/segmentInfo";
const singleUUIDLookup = (UUID: string) => client.get(endpoint, { params: { UUID } });
2021-07-12 08:43:46 +02:00
describe("getSegmentInfo", () => {
2021-06-16 06:33:51 +02:00
before(async () => {
2021-07-04 07:34:31 +02:00
const insertQuery = `INSERT INTO
2021-06-22 00:59:56 +02:00
"sponsorTimes"("videoID", "startTime", "endTime", "votes", "locked",
2021-09-05 01:23:43 +02:00
"UUID", "userID", "timeSubmitted", "views", "hidden", "shadowHidden", "userAgent")
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
await db.prepare("run", insertQuery, ["segmentInfoUpvoted", 1, 10, 2, 0, upvotedID, "segmentInfoUser", 0, 50, 0, 0, userAgents.vanced]);
await db.prepare("run", insertQuery, ["segmentInfoDownvoted", 1, 10, -2, 0, downvotedID, "segmentInfoUser", 0, 50, 0, 0, userAgents.meabot]);
await db.prepare("run", insertQuery, ["segmentInfoLockedup", 1, 10, 2, 1, lockedupID, "segmentInfoUser", 0, 50, 0, 0, userAgents.mpv]);
await db.prepare("run", insertQuery, ["segmentInfoInfvotes", 1, 10, 100000, 0, infvotesID, "segmentInfoUser", 0, 50, 0, 0, userAgents.nodesb]);
await db.prepare("run", insertQuery, ["segmentInfoHidden", 1, 10, 2, 0, hiddenID, "segmentInfoUser", 0, 50, 1, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoShadowhidden", 1, 10, 2, 0, shadowhiddenID, "segmentInfoUser", 0, 50, 0, 1, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoLockedown", 1, 10, -2, 1, lockeddownID, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoOldID", 1, 10, 1, 0, oldID, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoUpvoted", 1, 2, 1, 0, fillerID1, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoFiller", 2, 3, 1, 0, fillerID2, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoFiller", 3, 4, 1, 0, fillerID3, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoFiller", 4, 5, 1, 0, fillerID4, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
await db.prepare("run", insertQuery, ["segmentInfoFiller", 5, 6, 1, 0, fillerID5, "segmentInfoUser", 0, 50, 0, 0, userAgents.blank]);
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive upvoted segment", (done) => {
singleUUIDLookup(upvotedID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
userAgent: userAgents.vanced,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive downvoted segment", (done) => {
singleUUIDLookup(downvotedID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoDownvoted",
2021-08-03 06:19:37 +02:00
votes: -2,
userAgent: userAgents.meabot,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive locked up segment", (done) => {
singleUUIDLookup(lockedupID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoLockedup",
2021-08-03 06:19:37 +02:00
locked: 1,
votes: 2,
userAgent: userAgents.mpv,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive infinite vote segment", (done) => {
singleUUIDLookup(infvotesID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoInfvotes",
2021-08-03 06:19:37 +02:00
votes: 100000,
userAgent: userAgents.nodesb,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive shadowhidden segment", (done) => {
singleUUIDLookup(shadowhiddenID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoShadowhidden",
2021-08-03 06:19:37 +02:00
shadowHidden: 1,
userAgent: userAgents.blank,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive locked down segment", (done) => {
singleUUIDLookup(lockeddownID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoLockedown",
2021-08-03 06:19:37 +02:00
locked: 1,
votes: -2,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive hidden segment", (done) => {
singleUUIDLookup(hiddenID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoHidden",
2021-08-03 06:19:37 +02:00
hidden: 1,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive segment with old ID", (done) => {
singleUUIDLookup(oldID)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoOldID",
2021-08-03 06:19:37 +02:00
votes: 1,
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive single segment in array", (done) => {
2021-09-23 00:52:35 +02:00
client.get(endpoint, { params: { UUIDs: `["${upvotedID}"]` } })
2021-09-22 23:50:06 +02:00
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
}];
2021-07-12 08:43:46 +02:00
assert.strictEqual(data.length, 1);
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be able to retreive multiple segments in array", (done) => {
2021-09-23 00:52:35 +02:00
client.get(endpoint, { params: { UUIDs: `["${upvotedID}", "${downvotedID}"]` } })
2021-09-22 23:50:06 +02:00
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
}, {
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoDownvoted",
2021-08-03 06:19:37 +02:00
votes: -2,
}];
assert.ok(partialDeepEquals(data, expected));
2021-07-12 08:43:46 +02:00
assert.strictEqual(data.length, 2);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should be possible to send unexpected query parameters", (done) => {
2021-09-23 00:52:35 +02:00
client.get(endpoint, { params: { UUID: upvotedID, fakeparam: "hello", category: "sponsor" } })
2021-09-22 23:50:06 +02:00
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
}];
assert.ok(partialDeepEquals(data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return 400 if array passed to UUID", (done) => {
client.get(`${endpoint}?UUID=["${upvotedID}", "${downvotedID}"]`)
2021-07-12 08:43:46 +02:00
.then(res => {
assert.strictEqual(res.status, 400);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return 400 if bad array passed to UUIDs", (done) => {
client.get(`${endpoint}?UUIDs=[not-quoted,not-quoted]`)
2021-07-12 08:43:46 +02:00
.then(res => {
assert.strictEqual(res.status, 400);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return 400 if bad UUID passed", (done) => {
client.get(`${endpoint}?UUID=notarealuuid`)
2021-07-12 08:43:46 +02:00
.then(res => {
assert.strictEqual(res.status, 400);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return 400 if bad UUIDs passed in array", (done) => {
client.get(`${endpoint}?UUIDs=["notarealuuid", "anotherfakeuuid"]`)
2021-07-12 08:43:46 +02:00
.then(res => {
assert.strictEqual(res.status, 400);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return good UUID when mixed with bad UUIDs", (done) => {
client.get(`${endpoint}?UUIDs=["${upvotedID}", "anotherfakeuuid"]`)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
}];
assert.ok(partialDeepEquals(data, expected));
2021-07-12 08:43:46 +02:00
assert.strictEqual(data.length, 1);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should cut off array at 10", function(done) {
2021-06-22 00:59:56 +02:00
this.timeout(10000);
const filledIDArray = `["${upvotedID}", "${downvotedID}", "${lockedupID}", "${shadowhiddenID}", "${lockeddownID}", "${hiddenID}", "${fillerID1}", "${fillerID2}", "${fillerID3}", "${fillerID4}", "${fillerID5}"]`;
2021-09-23 00:52:35 +02:00
client.get(endpoint, { params: { UUIDs: filledIDArray } })
2021-09-22 23:50:06 +02:00
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-07-12 08:43:46 +02:00
assert.strictEqual(data.length, 10);
2021-09-05 01:23:43 +02:00
assert.strictEqual(data[0].videoID, "segmentInfoUpvoted");
2021-07-12 08:43:46 +02:00
assert.strictEqual(data[0].votes, 2);
2021-09-05 01:23:43 +02:00
assert.strictEqual(data[9].videoID, "segmentInfoFiller");
2021-07-12 08:43:46 +02:00
assert.strictEqual(data[9].UUID, fillerID4);
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should not duplicate reponses", (done) => {
client.get(`${endpoint}?UUIDs=["${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${upvotedID}", "${downvotedID}"]`)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
assert.strictEqual(res.data.length, 2);
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
2021-06-16 06:33:51 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should return 400 if UUID not found", (done) => {
2021-09-23 00:52:35 +02:00
client.get(endpoint, { params: { UUID: ENOENTID } })
2021-07-12 08:43:46 +02:00
.then(res => {
2021-09-05 01:23:43 +02:00
if (res.status !== 400) done(`non 400 response code: ${res.status}`);
2021-07-12 08:43:46 +02:00
else done(); // pass
})
.catch(err => done(err));
});
2021-06-21 06:33:48 +02:00
2021-09-22 23:50:06 +02:00
it("Should be able to retreive multiple segments with multiple parameters", (done) => {
client.get(`${endpoint}?UUID=${upvotedID}&UUID=${downvotedID}`)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-09-22 23:50:06 +02:00
const data = res.data;
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2,
}, {
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoDownvoted",
2021-08-03 06:19:37 +02:00
votes: -2,
}];
assert.ok(partialDeepEquals(data, expected));
2021-07-12 08:43:46 +02:00
assert.strictEqual(data.length, 2);
done();
})
.catch(err => done(err));
2021-06-21 06:33:48 +02:00
});
2021-09-22 23:50:06 +02:00
it("Should not parse repeated UUID if UUIDs present", (done) => {
client.get(`${endpoint}?UUID=${downvotedID}&UUID=${lockedupID}&UUIDs=["${upvotedID}"]`)
.then(res => {
2021-07-12 08:43:46 +02:00
assert.strictEqual(res.status, 200);
2021-08-03 06:19:37 +02:00
const expected = [{
2021-09-05 01:23:43 +02:00
videoID: "segmentInfoUpvoted",
2021-08-03 06:19:37 +02:00
votes: 2
}];
2021-09-22 23:50:06 +02:00
assert.ok(partialDeepEquals(res.data, expected));
2021-07-12 08:43:46 +02:00
done();
})
.catch(err => done(err));
});
2021-06-16 06:33:51 +02:00
});