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; function setup():Void { // Keep voting tests independent of HTTP ports, files and playback timers. server = Type.createEmptyInstance(Main); events = []; final permissions:Array = [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()); 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()); } }