mirror of
https://github.com/thelounge/thelounge
synced 2024-11-28 23:10:23 +00:00
5567f07a7c
The client side fetches the user list when needed, we don't send it over from the server. Hence modify the test expectation.
285 lines
6.9 KiB
TypeScript
285 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",
|
|
// 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);
|
|
});
|
|
});
|
|
});
|