thelounge/test/models/chan.ts
Reto Brunner a200bab8bd test/chan: getFilteredClone has more fields than the test thinks
The codebase shoves various things into channel objects to transmit them
for things like channel lists etc.

This however means that the type does contains the fields and needs
to export them.

We should clean up the events so that we can get rid of all that.
But for now, we adapt the test expectation to reality.
2024-04-21 15:11:52 +02:00

287 lines
6.9 KiB
TypeScript

import {expect} from "chai";
import Chan from "../../server/models/chan";
import Msg from "../../server/models/msg";
import Network from "../../server/models/network";
import Prefix from "../../server/models/prefix";
import User from "../../server/models/user";
describe("Chan", function () {
const network = {
network: {
options: {
PREFIX: [
{symbol: "~", mode: "q"},
{symbol: "&", mode: "a"},
{symbol: "@", mode: "o"},
{symbol: "%", mode: "h"},
{symbol: "+", mode: "v"},
],
},
},
};
const prefixLookup = {modeToSymbol: {}} as Prefix;
network.network.options.PREFIX.forEach((mode) => {
prefixLookup.modeToSymbol[mode.mode] = mode.symbol;
});
describe("#findMessage(id)", function () {
const chan = new Chan({
messages: [
new Msg({id: 1}),
new Msg({
id: 2,
text: "Message to be found",
}),
new Msg(),
],
});
it("should find a message in the list of messages", function () {
expect(chan.findMessage(2)?.text).to.equal("Message to be found");
});
it("should not find a message that does not exist", function () {
expect(chan.findMessage(42)).to.be.undefined;
});
});
describe("#setUser(user)", function () {
it("should make key lowercase", function () {
const chan = new Chan();
chan.setUser(new User({nick: "TestUser"}));
expect(chan.users.has("testuser")).to.be.true;
});
it("should update user object", function () {
const chan = new Chan();
chan.setUser(new User({nick: "TestUser"}, prefixLookup));
chan.setUser(new User({nick: "TestUseR", modes: ["o"]}, prefixLookup));
const user = chan.getUser("TestUSER");
expect(user.mode).to.equal("@");
});
});
describe("#getUser(nick)", function () {
it("should returning existing object", function () {
const chan = new Chan();
chan.setUser(new User({nick: "TestUseR", modes: ["o"]}, prefixLookup));
const user = chan.getUser("TestUSER");
expect(user.mode).to.equal("@");
});
it("should make new User object if not found", function () {
const chan = new Chan();
const user = chan.getUser("very-testy-user");
expect(user.nick).to.equal("very-testy-user");
});
});
describe("#getSortedUsers(irc)", function () {
const getUserNames = function (chan: Chan) {
return chan.getSortedUsers(network as Network["irc"]).map((u) => u.nick);
};
it("returns unsorted list on null irc object", function () {
const chan = new Chan();
["JocelynD", "YaManicKill", "astorije", "xPaw", "Max-P"].forEach((nick) =>
chan.setUser(new User({nick}))
);
expect(chan.getSortedUsers().map((u) => u.nick)).to.deep.equal([
"JocelynD",
"YaManicKill",
"astorije",
"xPaw",
"Max-P",
]);
});
it("should sort a simple user list", function () {
const chan = new Chan();
["JocelynD", "YaManicKill", "astorije", "xPaw", "Max-P"].forEach((nick) =>
chan.setUser(new User({nick}, prefixLookup))
);
expect(getUserNames(chan)).to.deep.equal([
"astorije",
"JocelynD",
"Max-P",
"xPaw",
"YaManicKill",
]);
});
it("should group users by modes", function () {
const chan = new Chan();
chan.setUser(new User({nick: "JocelynD", modes: ["a", "o"]}, prefixLookup));
chan.setUser(new User({nick: "YaManicKill", modes: ["v"]}, prefixLookup));
chan.setUser(new User({nick: "astorije", modes: ["h"]}, prefixLookup));
chan.setUser(new User({nick: "xPaw", modes: ["q"]}, prefixLookup));
chan.setUser(new User({nick: "Max-P", modes: ["o"]}, prefixLookup));
expect(getUserNames(chan)).to.deep.equal([
"xPaw",
"JocelynD",
"Max-P",
"astorije",
"YaManicKill",
]);
});
it("should sort a mix of users and modes", function () {
const chan = new Chan();
chan.setUser(new User({nick: "JocelynD"}, prefixLookup));
chan.setUser(new User({nick: "YaManicKill", modes: ["o"]}, prefixLookup));
chan.setUser(new User({nick: "astorije"}, prefixLookup));
chan.setUser(new User({nick: "xPaw"}, prefixLookup));
chan.setUser(new User({nick: "Max-P", modes: ["o"]}, prefixLookup));
expect(getUserNames(chan)).to.deep.equal([
"Max-P",
"YaManicKill",
"astorije",
"JocelynD",
"xPaw",
]);
});
it("should be case-insensitive", function () {
const chan = new Chan();
["aB", "Ad", "AA", "ac"].forEach((nick) =>
chan.setUser(new User({nick}, prefixLookup))
);
expect(getUserNames(chan)).to.deep.equal(["AA", "aB", "ac", "Ad"]);
});
it("should parse special characters successfully", function () {
const chan = new Chan();
[
"[foo",
"]foo",
"(foo)",
"{foo}",
"<foo>",
"_foo",
"@foo",
"^foo",
"&foo",
"!foo",
"+foo",
"Foo",
].forEach((nick) => chan.setUser(new User({nick}, prefixLookup)));
expect(getUserNames(chan)).to.deep.equal([
"!foo",
"&foo",
"(foo)",
"+foo",
"<foo>",
"@foo",
"[foo",
"]foo",
"^foo",
"_foo",
"Foo",
"{foo}",
]);
});
});
describe("#getFilteredClone(lastActiveChannel, lastMessage)", function () {
it("should keep necessary properties", function () {
const chan = new Chan();
expect(chan.getFilteredClone()).to.be.an("object").that.has.all.keys(
"firstUnread",
"highlight",
"id",
"key",
"messages",
"muted",
"totalMessages",
"name",
"state",
"topic",
"type",
"unread",
"users",
// the following are there in special cases, need to fix the types
"num_users",
"special",
"closed",
"data"
);
});
it("should send only last message for non active channel", function () {
const chan = new Chan({
id: 1337,
messages: [
new Msg({id: 10}),
new Msg({id: 11}),
new Msg({id: 12}),
new Msg({id: 13}),
],
});
expect(chan.id).to.equal(1337);
const messages = chan.getFilteredClone(999).messages;
expect(messages).to.have.lengthOf(1);
expect(messages[0].id).to.equal(13);
});
it("should send more messages for active channel", function () {
const chan = new Chan({
id: 1337,
messages: [
new Msg({id: 10}),
new Msg({id: 11}),
new Msg({id: 12}),
new Msg({id: 13}),
],
});
expect(chan.id).to.equal(1337);
const messages = chan.getFilteredClone(1337).messages;
expect(messages).to.have.lengthOf(4);
expect(messages[0].id).to.equal(10);
expect(messages[3].id).to.equal(13);
expect(chan.getFilteredClone(true).messages).to.have.lengthOf(4);
});
it("should only send new messages", function () {
const chan = new Chan({
id: 1337,
messages: [
new Msg({id: 10}),
new Msg({id: 11}),
new Msg({id: 12}),
new Msg({id: 13}),
new Msg({id: 14}),
new Msg({id: 15}),
],
});
expect(chan.id).to.equal(1337);
const messages = chan.getFilteredClone(1337, 12).messages;
expect(messages).to.have.lengthOf(3);
expect(messages[0].id).to.equal(13);
expect(messages[2].id).to.equal(15);
});
});
});