mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-06 11:36:58 +03:00
796 lines
24 KiB
TypeScript
796 lines
24 KiB
TypeScript
import assert from "assert";
|
|
import { RequestValidatorRule } from "../../src/types/config.model";
|
|
import { ActionType, Category } from "../../src/types/segments.model";
|
|
import {
|
|
CompiledValidityCheck,
|
|
compileRules,
|
|
} from "../../src/utils/requestValidator";
|
|
|
|
describe("Request validator", () => {
|
|
describe("single simple rule", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
// rules are case insensitive by default
|
|
userID: "^[a-z]+$",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
}),
|
|
"Untitled rule 1",
|
|
);
|
|
});
|
|
it("case insensitive match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asDfg",
|
|
}),
|
|
"Untitled rule 1",
|
|
);
|
|
});
|
|
it("simple expected no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "125aaa",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("single case sensitive rule with name", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
// tuple patterns allow setting regex flags
|
|
userID: ["^[a-z]+$", ""],
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("different casing", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asDfg",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("extra field match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("simple expected no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "125aaa",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("2-pattern rule", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
userID: ["^[a-z]+$", ""],
|
|
userAgent: "^Mozilla/5\\.0",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
userAgent: "Mozilla/5.0 Chromeium/213.7",
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("only matching one pattern - fail #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asDfg",
|
|
userAgent: "Mozilla/5.0 Chromeium/213.7",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("only matching one pattern - fail #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
userAgent: "ReVanced/20.07.39",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing one of the fields - fail #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userID: "asdfg",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing one of the fields - fail #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0 Chromeium/213.7",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing all fields - fail", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
videoDuration: 21.37,
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("1-pattern segment rule", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
description: "mini_bomba",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("match on one of multiple segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaaa",
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("match on one of multiple segments with other missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("no match with one segment", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("no match with multiple segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "bbbbb",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("one segment missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("multiple segments missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "filler" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("zero segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("2-pattern segment rule", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
description: "mini_bomba",
|
|
startTime: "\\.\\d",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1.1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("match on one of multiple segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1.1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaaa",
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("match on one of multiple segments with other missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1.1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("no match with one segment #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("no match with one segment #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1.1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("no match with one segment #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("no match with multiple segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "bbbbb",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("no match with multiple segments with partial matches", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1.1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "aaaa",
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "chapter" as Category,
|
|
actionType: "chapter" as ActionType,
|
|
description: "mini_bomba",
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("one segment missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("multiple segments missing field", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "sponsor" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
{
|
|
segment: ["1", "2"],
|
|
category: "filler" as Category,
|
|
actionType: "skip" as ActionType,
|
|
},
|
|
],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("zero segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
segments: [],
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing segments", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("boolean rule", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
dearrowDownvote: true,
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: true,
|
|
},
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("simple expected no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("mixed type rules", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Testing rule",
|
|
titleOriginal: true,
|
|
title: "mini_bomba",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("simple expected match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mini_bomba gaming",
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
"Testing rule",
|
|
);
|
|
});
|
|
it("simple expected no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mschae restaurant",
|
|
original: false,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("partial match #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mini_bomba gaming",
|
|
original: false,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("partial match #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mschae restaurant",
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing field - no match #3", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
thumbnail: {
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("two-rule ruleset", () => {
|
|
const ruleset: RequestValidatorRule[] = [
|
|
{
|
|
ruleName: "Rule one",
|
|
titleOriginal: true,
|
|
},
|
|
{
|
|
title: "mini_bomba",
|
|
},
|
|
];
|
|
let compiledRuleset: CompiledValidityCheck;
|
|
|
|
before(() => {
|
|
compiledRuleset = compileRules(ruleset);
|
|
});
|
|
|
|
it("matches both", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mini_bomba gaming",
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
"Rule one",
|
|
);
|
|
});
|
|
it("matches 1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mschae restaurant",
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
"Rule one",
|
|
);
|
|
});
|
|
it("matches 2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mini_bomba gaming",
|
|
original: false,
|
|
},
|
|
},
|
|
}),
|
|
"Untitled rule 1",
|
|
);
|
|
});
|
|
it("no match", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
title: {
|
|
title: "mschae restaurant",
|
|
original: false,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing both fields #1", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
userAgent: "Mozilla/5.0",
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing both fields #2", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
it("missing both fields #3", () => {
|
|
assert.equal(
|
|
compiledRuleset({
|
|
dearrow: {
|
|
downvote: false,
|
|
thumbnail: {
|
|
original: true,
|
|
},
|
|
},
|
|
}),
|
|
null,
|
|
);
|
|
});
|
|
});
|
|
});
|