aboutsummaryrefslogtreecommitdiffstats
path: root/test/tests/TestSkipVote.hx
diff options
context:
space:
mode:
Diffstat (limited to 'test/tests/TestSkipVote.hx')
-rw-r--r--test/tests/TestSkipVote.hx151
1 files changed, 151 insertions, 0 deletions
diff --git a/test/tests/TestSkipVote.hx b/test/tests/TestSkipVote.hx
new file mode 100644
index 0000000..d4e9c8d
--- /dev/null
+++ b/test/tests/TestSkipVote.hx
@@ -0,0 +1,151 @@
+package test.tests;
+
+import Types.Permission;
+import Types.ServerConfig;
+import Types.WsEvent;
+import Types.WsEventType;
+import haxe.Json;
+import server.Main;
+import server.VideoTimer;
+import utest.Assert;
+import utest.Test;
+
+@:access(server.Main)
+class TestSkipVote extends Test {
+ var server:Main;
+ var events:Array<WsEvent>;
+
+ function setup():Void {
+ // Keep voting tests independent of HTTP ports, files and playback timers.
+ server = Type.createEmptyInstance(Main);
+ events = [];
+ final permissions:Array<Permission> = [RemoveVideoPerm];
+ final config:ServerConfig = cast {
+ permissions: {
+ banned: [], guest: permissions, user: permissions,
+ leader: permissions, admin: permissions
+ }
+ };
+ Reflect.setField(server, "config", config);
+ Reflect.setField(server, "clients", []);
+ Reflect.setField(server, "skipVotes", new Map<Int, Bool>());
+ Reflect.setField(server, "videoTimer", new VideoTimer());
+ final list = new VideoList();
+ list.addItem({
+ url: "video", title: "Video", author: "Queuer", duration: 60,
+ isTemp: true, doCache: false, playerType: RawType
+ }, true);
+ Reflect.setField(server, "videoList", list);
+ }
+
+ function addClient(name:String, id:Int):Client {
+ final ws:Dynamic = {
+ send: (text:String, options:Dynamic) -> events.push(Json.parse(text))
+ };
+ final client = new Client(cast ws, null, id, name, 0);
+ server.clients.push(client);
+ return client;
+ }
+
+ function vote(client:Client, url = "video"):Void {
+ server.handleSkipVote(client, {type: SkipVideo, skipVideo: {url: url}});
+ }
+
+ function testGiveupCommand():Void {
+ final parsed = client.Commands.parse("/giveup Guest 2");
+ Assert.equals(client.Commands.CommandId.Giveup, parsed.cmd.name);
+ Assert.equals(1, client.Commands.filterForAutocomplete("/give").length);
+ }
+
+ function testStrictMajorityWithLiveStats():Void {
+ final first = addClient("First", 0);
+ final second = addClient("Second", 1);
+ final third = addClient("Third", 2);
+ addClient("Fourth", 3);
+ vote(first);
+ Assert.equals(1, events[0].skipVideoStats.voted);
+ Assert.equals(4, events[0].skipVideoStats.total);
+ Assert.equals(3, events[0].skipVideoStats.required);
+ vote(second);
+ Assert.equals(1, server.videoList.length);
+ vote(third);
+ Assert.equals(0, server.videoList.length);
+ Assert.equals(SkipVideo, events[events.length - 1].type);
+ Assert.isNull(server.activeSkipVoteUrl);
+ }
+
+ function testDuplicateAndStaleVotes():Void {
+ final first = addClient("First", 0);
+ addClient("Second", 1);
+ vote(first);
+ vote(first);
+ vote(first, "previous-video");
+ server.skipVideo({type: SkipVideo, skipVideo: {url: "previous-video"}});
+ Assert.equals(1, server.getSkipVoteCount());
+ Assert.equals("video", server.activeSkipVoteUrl);
+ Assert.equals(1, server.videoList.length);
+ }
+
+ function testAdminOverride():Void {
+ final admin = addClient("Admin", 0);
+ admin.isAdmin = true;
+ addClient("Second", 1);
+ addClient("Third", 2);
+ vote(admin);
+ Assert.equals(0, server.videoList.length);
+ }
+
+ function testQueuerOverrideDuringVote():Void {
+ final first = addClient("First", 0);
+ final queuer = addClient("Queuer", 1);
+ addClient("Third", 2);
+ vote(first);
+ vote(queuer);
+ Assert.equals(0, server.videoList.length);
+ Assert.equals(0, server.getSkipVoteCount());
+ }
+
+ function testBannedClientsExcluded():Void {
+ final first = addClient("First", 0);
+ addClient("Second", 1);
+ addClient("Banned", 2).isBanned = true;
+ vote(first);
+ Assert.equals(2, events[0].skipVideoStats.total);
+ Assert.equals(2, events[0].skipVideoStats.required);
+ }
+
+ function testDisconnectCanCompleteMajority():Void {
+ final first = addClient("First", 0);
+ final second = addClient("Second", 1);
+ addClient("Third", 2);
+ final departing = addClient("Fourth", 3);
+ vote(first);
+ vote(second);
+ server.clients.remove(departing);
+ server.skipVotes.remove(departing.id);
+ server.updateSkipVote();
+ Assert.equals(0, server.videoList.length);
+ }
+
+ function testDepartingVoterAndReusedId():Void {
+ final first = addClient("First", 0);
+ addClient("Second", 1);
+ addClient("Third", 2);
+ vote(first);
+ server.clients.remove(first);
+ server.skipVotes.remove(first.id);
+ server.updateSkipVote();
+ addClient("Replacement", 0);
+ Assert.equals(0, server.getSkipVoteCount());
+ Assert.equals(1, server.videoList.length);
+ }
+
+ function testRenamingDoesNotDuplicateVote():Void {
+ final first = addClient("First", 0);
+ addClient("Second", 1);
+ vote(first);
+ first.name = "Renamed";
+ vote(first);
+ Assert.equals(1, server.getSkipVoteCount());
+ }
+}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage