mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2026-01-27 12:50:47 +03:00
add genUser frameworks, start fixing tests
transformative: - getUserID - redisTest - reputation mocha test reconfig: - etag - getIP - userCounter - validateVideoIDs
This commit is contained in:
@@ -1,315 +1,141 @@
|
||||
import { db } from "../../src/databases/databases";
|
||||
import { getHash } from "../../src/utils/getHash";
|
||||
import assert from "assert";
|
||||
import { client } from "../utils/httpClient";
|
||||
import { AxiosResponse } from "axios";
|
||||
import { UsernameUser, genUser, genUsersUsername } from "../utils/genUser";
|
||||
import { insertUsernameBulk } from "../utils/queryGen";
|
||||
|
||||
const endpoint = "/api/userID";
|
||||
const getUserName = (username: string): Promise<AxiosResponse> => client.get(endpoint, { params: { username } });
|
||||
const getUserName = (username: string, exact: any = false): Promise<AxiosResponse> => client.get(endpoint, { params: { username, exact } });
|
||||
|
||||
const validateSearch = (query: string, users: UsernameUser[], exact: number | boolean = false): Promise<void> =>
|
||||
getUserName(query, exact)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = users.map(user => ({
|
||||
userName: user.username,
|
||||
userID: user.pubID
|
||||
}));
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
});
|
||||
|
||||
const validateSearchWithUser = (user: UsernameUser, exact = false) =>
|
||||
validateSearch(user.username, [user], exact);
|
||||
|
||||
const cases = new Map([
|
||||
["fuzzy_1", "fuzzy user 01"],
|
||||
["fuzzy_2", "fuzzy user 02"],
|
||||
["specific_1", "specific user 03"],
|
||||
["repeating_1", "repeating"],
|
||||
["repeating_2", "repeating"],
|
||||
["redos_1", "0redis0"],
|
||||
["redos_2", "%redos%"],
|
||||
["redos_3", "_redos_"],
|
||||
["redos_4", "redos\\%"],
|
||||
["redos_5", "\\\\\\"],
|
||||
["exact_1", "a"],
|
||||
]);
|
||||
|
||||
const userPublicOne = genUser("getUserID", "public_1");
|
||||
const users = genUsersUsername("getUserID", cases);
|
||||
users["public_1"] = { ...userPublicOne, username: userPublicOne.pubID };
|
||||
|
||||
describe("getUserID", () => {
|
||||
before(async () => {
|
||||
const insertUserNameQuery = 'INSERT INTO "userNames" ("userID", "userName") VALUES(?, ?)';
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_01"), "fuzzy user 01"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_02"), "fuzzy user 02"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_03"), "specific user 03"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_04"), "repeating"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_05"), "repeating"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_06"), getHash("getuserid_user_06")]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_07"), "0redos0"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_08"), "%redos%"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_09"), "_redos_"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_10"), "redos\\%"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_11"), "\\\\\\"]);
|
||||
await db.prepare("run", insertUserNameQuery, [getHash("getuserid_user_12"), "a"]);
|
||||
await insertUsernameBulk(db, users);
|
||||
});
|
||||
|
||||
it("Should be able to get a 200", (done) => {
|
||||
// status tests
|
||||
it("Should be able to get a 200", () =>
|
||||
getUserName("fuzzy user 01")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
.then(res => assert.strictEqual(res.status, 200))
|
||||
);
|
||||
|
||||
it("Should be able to get a 200 (username is public id)", () =>
|
||||
getUserName(users["public_1"].username)
|
||||
.then(res => assert.strictEqual(res.status, 200))
|
||||
);
|
||||
|
||||
// individual user tests
|
||||
it("Should be able to get single username", () => validateSearchWithUser(users["fuzzy_1"]));
|
||||
it("Should be able to get with public ID", () => validateSearchWithUser(users["public_1"]));
|
||||
|
||||
// individual user ReDOS
|
||||
it("should avoid ReDOS with _", () => validateSearchWithUser(users["redos_3"]));
|
||||
it("should avoid ReDOS with %", () => validateSearchWithUser(users["redos_2"]));
|
||||
it("should return user if just backslashes", () => validateSearchWithUser(users["redos_5"]));
|
||||
it("should allow exact match", () => validateSearchWithUser(users["exact_1"], true));
|
||||
|
||||
// fuzzy tests
|
||||
it("Should be able to get multiple fuzzy user info from start", () =>
|
||||
validateSearch("fuzzy user",
|
||||
[users["fuzzy_1"], users["fuzzy_2"]]
|
||||
)
|
||||
);
|
||||
|
||||
it("Should be able to get multiple fuzzy user info from middle", () => {
|
||||
validateSearch("user",
|
||||
[users["fuzzy_1"], users["fuzzy_2"], users["specific_1"]]
|
||||
);
|
||||
});
|
||||
|
||||
it("Should be able to get a 400 (No username parameter)", (done) => {
|
||||
client.get(endpoint)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 400);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
it("Should be able to get with fuzzy public ID", () => {
|
||||
const userID = users["public_1"].pubID.substring(0,60);
|
||||
return validateSearch(userID,
|
||||
[users["public_1"]]
|
||||
);
|
||||
});
|
||||
|
||||
it("Should be able to get a 200 (username is public id)", (done) => {
|
||||
client.get(endpoint, { params: { username: getHash("getuserid_user_06") } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
it("Should be able to get repeating username", () =>
|
||||
validateSearch("repeating", [users["repeating_1"], users["repeating_2"]])
|
||||
);
|
||||
|
||||
it("Should be able to get a 400 (username longer than 64 chars)", (done) => {
|
||||
client.get(endpoint, { params: { username: `${getHash("getuserid_user_06")}0` } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 400);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
it("Should be able to get repeating fuzzy username", () =>
|
||||
validateSearch("peat", [users["repeating_1"], users["repeating_2"]])
|
||||
);
|
||||
|
||||
it("Should be able to get single username", (done) => {
|
||||
client.get(endpoint, { params: { username: "fuzzy user 01" } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "fuzzy user 01",
|
||||
userID: getHash("getuserid_user_01")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
it("Should be able to get repeating username with exact username", () =>
|
||||
validateSearch("repeating", [users["repeating_1"], users["repeating_2"]], true)
|
||||
);
|
||||
|
||||
it("Should be able to get multiple fuzzy user info from start", (done) => {
|
||||
getUserName("fuzzy user")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "fuzzy user 01",
|
||||
userID: getHash("getuserid_user_01")
|
||||
}, {
|
||||
userName: "fuzzy user 02",
|
||||
userID: getHash("getuserid_user_02")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get multiple fuzzy user info from middle", (done) => {
|
||||
getUserName("user")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "fuzzy user 01",
|
||||
userID: getHash("getuserid_user_01")
|
||||
}, {
|
||||
userName: "fuzzy user 02",
|
||||
userID: getHash("getuserid_user_02")
|
||||
}, {
|
||||
userName: "specific user 03",
|
||||
userID: getHash("getuserid_user_03")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get with public ID", (done) => {
|
||||
const userID = getHash("getuserid_user_06");
|
||||
getUserName(userID)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: userID,
|
||||
userID
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get with fuzzy public ID", (done) => {
|
||||
const userID = getHash("getuserid_user_06");
|
||||
getUserName(userID.substr(10,60))
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: userID,
|
||||
userID
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get repeating username", (done) => {
|
||||
getUserName("repeating")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_04")
|
||||
}, {
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_05")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get repeating fuzzy username", (done) => {
|
||||
getUserName("peat")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_04")
|
||||
}, {
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_05")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should avoid ReDOS with _", (done) => {
|
||||
getUserName("_redos_")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "_redos_",
|
||||
userID: getHash("getuserid_user_09")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should avoid ReDOS with %", (done) => {
|
||||
getUserName("%redos%")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "%redos%",
|
||||
userID: getHash("getuserid_user_08")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should return 404 if escaped backslashes present", (done) => {
|
||||
getUserName("%redos\\\\_")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 404);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should return 404 if backslashes present", (done) => {
|
||||
getUserName(`\\%redos\\_`)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 404);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should return user if just backslashes", (done) => {
|
||||
getUserName(`\\\\\\`)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "\\\\\\",
|
||||
userID: getHash("getuserid_user_11")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should not allow usernames more than 64 characters", (done) => {
|
||||
getUserName("0".repeat(65))
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 400);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should not allow usernames less than 3 characters", (done) => {
|
||||
getUserName("aa")
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 400);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should allow exact match", (done) => {
|
||||
client.get(endpoint, { params: { username: "a", exact: true } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "a",
|
||||
userID: getHash("getuserid_user_12")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should be able to get repeating username with exact username", (done) => {
|
||||
client.get(endpoint, { params: { username: "repeating", exact: true } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_04")
|
||||
}, {
|
||||
userName: "repeating",
|
||||
userID: getHash("getuserid_user_05")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("Should not get exact unless explicitly set to true", (done) => {
|
||||
client.get(endpoint, { params: { username: "user", exact: 1 } })
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 200);
|
||||
const expected = [{
|
||||
userName: "fuzzy user 01",
|
||||
userID: getHash("getuserid_user_01")
|
||||
}, {
|
||||
userName: "fuzzy user 02",
|
||||
userID: getHash("getuserid_user_02")
|
||||
}, {
|
||||
userName: "specific user 03",
|
||||
userID: getHash("getuserid_user_03")
|
||||
}];
|
||||
assert.deepStrictEqual(res.data, expected);
|
||||
done();
|
||||
})
|
||||
.catch(err => done(err));
|
||||
});
|
||||
|
||||
it("should return 400 if no username parameter specified", (done) => {
|
||||
client.get(endpoint)
|
||||
.then(res => {
|
||||
assert.strictEqual(res.status, 400);
|
||||
done();
|
||||
})
|
||||
.catch(() => ("couldn't call endpoint"));
|
||||
});
|
||||
it("Should not get exact unless explicitly set to true", () =>
|
||||
validateSearch("user", [users["fuzzy_1"], users["fuzzy_2"], users["specific_1"]], 1)
|
||||
);
|
||||
});
|
||||
|
||||
describe("getUserID 400/ 404", () => {
|
||||
it("Should be able to get a 400 (No username parameter)", () =>
|
||||
client.get(endpoint)
|
||||
.then(res => assert.strictEqual(res.status, 400))
|
||||
);
|
||||
|
||||
it("Should return 400 if no username parameter specified", () =>
|
||||
client.get(endpoint)
|
||||
.then(res => assert.strictEqual(res.status, 400))
|
||||
);
|
||||
|
||||
it("Should not allow usernames more than 64 characters", () =>
|
||||
getUserName("0".repeat(65))
|
||||
.then(res => assert.strictEqual(res.status, 400))
|
||||
);
|
||||
|
||||
it("Should not allow usernames less than 3 characters", () =>
|
||||
getUserName("aa")
|
||||
.then(res => assert.strictEqual(res.status, 400))
|
||||
);
|
||||
|
||||
it("Should return 400 (username longer than 64 chars)", () =>
|
||||
getUserName(users["public_1"].username+0)
|
||||
.then(res => assert.strictEqual(res.status, 400))
|
||||
);
|
||||
|
||||
it("Should return 404 if escaped backslashes present", () =>
|
||||
getUserName("%redos\\\\_")
|
||||
.then(res => assert.strictEqual(res.status, 404))
|
||||
);
|
||||
|
||||
it("Should return 404 if backslashes present", () =>
|
||||
getUserName(`\\%redos\\_`)
|
||||
.then(res => assert.strictEqual(res.status, 404))
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user