async def test_reaction_on_end_tournament_message(mocker): """Sends a message to react on in order to end the tournament.""" mock_bot = tosurnament_mock.BotMock() cog = tosurnament_mock.mock_cog(guild_owner.get_class(mock_bot)) mock_bot.session.add_stub( Tournament(id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub( Bracket(tournament_id=1, schedules_spreadsheet_id=1, players_spreadsheet_id=1)) mock_bot.session.add_stub(SchedulesSpreadsheet(id=1)) mock_bot.session.add_stub(PlayersSpreadsheet(id=1)) mock_bot.session.add_stub(Bracket(tournament_id=1)) mock_bot.session.add_stub( Bracket(tournament_id=1, schedules_spreadsheet_id=42, players_spreadsheet_id=42)) mock_bot.session.add_stub(SchedulesSpreadsheet(id=42)) mock_bot.session.add_stub(PlayersSpreadsheet(id=42)) mock_bot.session.add_stub( Bracket(tournament_id=1, schedules_spreadsheet_id=43)) mock_bot.session.add_stub(RescheduleMessage(tournament_id=1)) mock_bot.session.add_stub(RescheduleMessage(tournament_id=1)) mock_bot.session.add_stub(StaffRescheduleMessage(tournament_id=1)) mock_bot.session.add_stub(StaffRescheduleMessage(tournament_id=1)) mock_bot.session.add_stub(EndTournamentMessage(message_id=MESSAGE_ID)) mock_bot.session.add_stub(Tournament(id=2)) mock_bot.session.add_stub( Bracket(tournament_id=2, schedules_spreadsheet_id=2, players_spreadsheet_id=2)) mock_bot.session.add_stub(SchedulesSpreadsheet(id=2)) mock_bot.session.add_stub(PlayersSpreadsheet(id=2)) mock_bot.session.add_stub(RescheduleMessage(tournament_id=2)) await cog.reaction_on_end_tournament_message( MESSAGE_ID, tosurnament_mock.EmojiMock("✅"), tosurnament_mock.GuildMock(tosurnament_mock.GUILD_ID), tosurnament_mock.ChannelMock(), tosurnament_mock.UserMock(user_id=tosurnament_mock.GuildMock.OWNER_ID), ) cog.send_reply.assert_called_with(mocker.ANY, mocker.ANY, "success") assert len(mock_bot.session.tables[Tournament.__tablename__]) == 1 assert len(mock_bot.session.tables[Bracket.__tablename__]) == 1 assert len( mock_bot.session.tables[SchedulesSpreadsheet.__tablename__]) == 1 assert len(mock_bot.session.tables[PlayersSpreadsheet.__tablename__]) == 1 assert len(mock_bot.session.tables[RescheduleMessage.__tablename__]) == 1 assert len( mock_bot.session.tables[StaffRescheduleMessage.__tablename__]) == 0 assert len( mock_bot.session.tables[EndTournamentMessage.__tablename__]) == 0
async def test_get_a_bracket(self): """Sets a bracket as current bracket.""" bot_mock = tosurnament_mock.BotMock() bot_mock.session.add_stub(Tournament(current_bracket_id=1)) bot_mock.session.add_stub(Bracket(id=1, name=BRACKET_NAME)) bot_mock.session.add_stub(Bracket(id=2, name=BRACKET_NAME_2)) cog = tosurnament_mock.mock_cog(tournament.get_class(bot_mock)) await cog.get_bracket(cog, tosurnament_mock.CtxMock(bot_mock), number=2) bot_mock.session.update.assert_called_once_with(tosurnament_mock.Matcher(Tournament(current_bracket_id=2))) cog.send_reply.assert_called_once_with(mock.ANY, mock.ANY, "success", BRACKET_NAME_2)
async def test_get_bracket(self): """Shows all brackets.""" bot_mock = tosurnament_mock.BotMock() bot_mock.session.add_stub(Tournament(current_bracket_id=1)) bot_mock.session.add_stub(Bracket(id=1, name=BRACKET_NAME)) bot_mock.session.add_stub(Bracket(id=2, name=BRACKET_NAME_2)) cog = tosurnament_mock.mock_cog(tournament.get_class(bot_mock)) expected_output = "1: `" + BRACKET_NAME + "` (current bracket)\n" expected_output += "2: `" + BRACKET_NAME_2 + "`\n" await cog.get_bracket(cog, tosurnament_mock.CtxMock(bot_mock)) cog.send_reply.assert_called_once_with(mock.ANY, mock.ANY, "default", expected_output)
async def test_set_bracket_values(self): """Puts the input values into the corresponding bracket.""" bot_mock = tosurnament_mock.BotMock() bot_mock.session.add_stub(Tournament()) bot_mock.session.add_stub(Bracket(name=BRACKET_NAME)) cog = tosurnament_mock.mock_cog(bracket.get_class(bot_mock)) await cog.set_bracket_values(tosurnament_mock.CtxMock(bot_mock), {"name": BRACKET_NAME_2}) bot_mock.session.update.assert_called_once_with( tosurnament_mock.Matcher(Bracket(name=BRACKET_NAME_2))) cog.send_reply.assert_called_once_with(mock.ANY, mock.ANY, "success", BRACKET_NAME_2)
async def test_copy_bracket(mocker): """Copies a bracket settings to another one.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, current_bracket_id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub( Bracket(id=1, tournament_id=1, schedules_spreadsheet_id=1, players_spreadsheet_id=1, post_result_channel_id=1)) schedules_spreadsheet = SchedulesSpreadsheet(id=1, sheet_name=SHEET_NAME + " s", range_match_id="B2:B", range_team1="C2:C") mock_bot.session.add_stub(schedules_spreadsheet) mock_bot.session.add_stub( Bracket(id=2, tournament_id=1, schedules_spreadsheet_id=2)) mock_bot.session.add_stub( SchedulesSpreadsheet(id=2, sheet_name=SHEET_NAME, range_match_id="A1:A", range_score_team1="B1:B")) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) mock_ctx = tosurnament_mock.CtxMock(mock_bot) await cog.copy_bracket(cog, mock_ctx, 1, 2) assert len(mock_bot.session.tables[Bracket.__tablename__]) == 2 assert mock_bot.session.tables[ Bracket.__tablename__][1].post_result_channel_id == 1 assert len( mock_bot.session.tables[SchedulesSpreadsheet.__tablename__]) == 2 assert mock_bot.session.tables[SchedulesSpreadsheet.__tablename__][ 1] != tosurnament_mock.Matcher(schedules_spreadsheet) schedules_spreadsheet.sheet_name = SHEET_NAME assert mock_bot.session.tables[SchedulesSpreadsheet.__tablename__][ 1] == tosurnament_mock.Matcher(schedules_spreadsheet) assert PlayersSpreadsheet.__tablename__ not in mock_bot.session.tables players_spreadsheet = PlayersSpreadsheet(id=1, range_team="A1:A") mock_bot.session.add_stub(players_spreadsheet) await cog.copy_bracket(cog, mock_ctx, 1, 2) assert len(mock_bot.session.tables[PlayersSpreadsheet.__tablename__]) == 2 assert mock_bot.session.tables[PlayersSpreadsheet.__tablename__][ 1] == tosurnament_mock.Matcher(players_spreadsheet)
async def test_copy_bracket_wrong_index(mocker): """Copies a bracket settings to another one, but input indexes are wrong.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket(id=1, tournament_id=1)) mock_bot.session.add_stub(Bracket(id=2, tournament_id=1)) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) with pytest.raises(commands.UserInputError): await cog.copy_bracket(cog, tosurnament_mock.CtxMock(mock_bot), 1, 3) with pytest.raises(commands.UserInputError): await cog.copy_bracket(cog, tosurnament_mock.CtxMock(mock_bot), 0, 2)
async def test_set_spreadsheet_values(mocker): """Sets spreadsheet values.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, current_bracket_id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub( Bracket(id=1, tournament_id=1, schedules_spreadsheet_id=1, players_spreadsheet_id=1)) mock_bot.session.add_stub(SchedulesSpreadsheet(id=1)) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) mock_ctx = tosurnament_mock.CtxMock(mock_bot) await cog.set_schedules_spreadsheet_values(mock_ctx, {"sheet_name": SHEET_NAME}) mock_bot.session.update.assert_called_once_with( tosurnament_mock.Matcher(SchedulesSpreadsheet(sheet_name=SHEET_NAME))) with pytest.raises(base.NoSpreadsheet): await cog.set_players_spreadsheet_values(mock_ctx, {"sheet_name": SHEET_NAME}) mock_bot.session.add_stub(PlayersSpreadsheet(id=1)) await cog.set_players_spreadsheet_values(mock_ctx, {"sheet_name": SHEET_NAME})
async def create_bracket(self, ctx, *, name: str): """Creates a bracket and sets it as current bracket (for bracket settings purpose).""" tournament = self.get_tournament(ctx.guild.id) bracket = Bracket(tournament_id=tournament.id, name=name) self.bot.session.add(bracket) tournament.current_bracket_id = bracket.id self.bot.session.update(tournament) await self.send_reply(ctx, ctx.command.name, "success", name)
async def test_get_a_bracket_that_does_not_exist(self): """Sets a bracket as current bracket but it does not exist.""" bot_mock = tosurnament_mock.BotMock() bot_mock.session.add_stub(Tournament()) bot_mock.session.add_stub(Bracket(name=BRACKET_NAME)) cog = tosurnament_mock.mock_cog(tournament.get_class(bot_mock)) with self.assertRaises(discord.ext.commands.UserInputError): await cog.get_bracket(cog, tosurnament_mock.CtxMock(bot_mock), number=0)
async def test_set_challonge(mocker): """Sets the challonge.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, current_bracket_id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket(id=1, tournament_id=1)) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) await cog.set_challonge(cog, tosurnament_mock.CtxMock(mock_bot), challonge_tournament=CHALLONGE_ID_URL) mock_bot.session.update.assert_called_once_with( tosurnament_mock.Matcher( Bracket(tournament_id=1, challonge=CHALLONGE_ID))) cog.send_reply.assert_called_once_with(mocker.ANY, mocker.ANY, "success", CHALLONGE_ID)
async def test_set_bracket_values(mocker): """Puts the input values into the corresponding bracket.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, current_bracket_id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket(id=1, tournament_id=1, name=BRACKET_NAME)) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) await cog.set_bracket_values(tosurnament_mock.CtxMock(mock_bot), {"name": BRACKET_NAME_2}) mock_bot.session.update.assert_called_once_with( tosurnament_mock.Matcher(Bracket(tournament_id=1, name=BRACKET_NAME_2))) cog.send_reply.assert_called_once_with(mocker.ANY, mocker.ANY, "success", BRACKET_NAME_2)
async def test_get_a_bracket(mocker): """Sets a bracket as current bracket.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, guild_id=tosurnament_mock.GUILD_ID, current_bracket_id=1)) mock_bot.session.add_stub(Bracket(id=1, tournament_id=1, name=BRACKET_NAME)) mock_bot.session.add_stub( Bracket(id=2, tournament_id=1, name=BRACKET_NAME_2)) cog = tosurnament_mock.mock_cog(tournament.get_class(mock_bot)) await cog.get_bracket(cog, tosurnament_mock.CtxMock(mock_bot), number=2) mock_bot.session.update.assert_called_once_with( tosurnament_mock.Matcher(Tournament(current_bracket_id=2))) cog.send_reply.assert_called_once_with(mocker.ANY, mocker.ANY, "success", BRACKET_NAME_2)
async def test_set_bracket_spreadsheet(mocker): """Sets bracket spreadsheets.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, current_bracket_id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket(id=1, tournament_id=1)) cog = tosurnament_mock.mock_cog(bracket.get_class(mock_bot)) mock_ctx = tosurnament_mock.CtxMock(mock_bot) await cog.set_bracket_spreadsheet(mock_ctx, "players", SPREADSHEET_ID, "") update_expected = [ mocker.call( tosurnament_mock.Matcher( Bracket(tournament_id=1, players_spreadsheet_id=1))), mocker.call( tosurnament_mock.Matcher( PlayersSpreadsheet(spreadsheet_id=SPREADSHEET_ID))), ] assert mock_bot.session.update.call_args_list == update_expected await cog.set_bracket_spreadsheet(mock_ctx, "players", SPREADSHEET_ID, SHEET_NAME) update_expected = [ mocker.call( tosurnament_mock.Matcher( PlayersSpreadsheet(spreadsheet_id=SPREADSHEET_ID, sheet_name=SHEET_NAME))), ] assert mock_bot.session.update.call_args_list[2:] == update_expected await cog.set_bracket_spreadsheet(mock_ctx, "schedules", SPREADSHEET_ID, "") update_expected = [ mocker.call( tosurnament_mock.Matcher( Bracket(tournament_id=1, players_spreadsheet_id=1, schedules_spreadsheet_id=1))), mocker.call( tosurnament_mock.Matcher( SchedulesSpreadsheet(spreadsheet_id=SPREADSHEET_ID))), ] assert mock_bot.session.update.call_args_list[3:] == update_expected
async def test_get_a_bracket_that_does_not_exist(): """Sets a bracket as current bracket but it does not exist.""" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket(tournament_id=1, name=BRACKET_NAME)) cog = tosurnament_mock.mock_cog(tournament.get_class(mock_bot)) with pytest.raises(discord.ext.commands.UserInputError): await cog.get_bracket(cog, tosurnament_mock.CtxMock(mock_bot), number=0)
def post(handler, parameters, url_parameters, *ids_parameters): """POST method""" tournament_id = ids_parameters if not parameters: handler.logger.debug("Ignoring") handler.send_json("{}") return obj = Bracket() for key, value in parameters.items(): if key in obj.__dict__: setattr(obj, key, value) setattr(obj, "tournament_id", tournament_id) obj = handler.session.add(obj) handler.logger.debug("Created successfully") handler.send_object(obj)
async def test_reaction_on_end_tournament_message_refuse(mocker): """Sends a message to react on in order to end the tournament.""" mock_bot = tosurnament_mock.BotMock() cog = tosurnament_mock.mock_cog(guild_owner.get_class(mock_bot)) mock_bot.session.add_stub(Tournament(guild_id=tosurnament_mock.GUILD_ID)) mock_bot.session.add_stub(Bracket()) mock_bot.session.add_stub(EndTournamentMessage(message_id=MESSAGE_ID)) await cog.reaction_on_end_tournament_message( MESSAGE_ID, tosurnament_mock.EmojiMock("❎"), tosurnament_mock.GuildMock(tosurnament_mock.GUILD_ID), tosurnament_mock.ChannelMock(), tosurnament_mock.UserMock(user_id=tosurnament_mock.GuildMock.OWNER_ID), ) cog.send_reply.assert_called_with(mocker.ANY, mocker.ANY, "refused")
async def test_create_tournament(self): """Creates a tournament.""" bot_mock = tosurnament_mock.BotMock() cog = tosurnament_mock.mock_cog(guild_owner.get_class(bot_mock)) await cog.create_tournament(cog, tosurnament_mock.CtxMock(bot_mock), TOURNAMENT_ACRONYM, TOURNAMENT_NAME) assert bot_mock.session.update.call_count == 1 tournament_matcher = tosurnament_mock.Matcher( Tournament(acronym=TOURNAMENT_ACRONYM, name=TOURNAMENT_NAME, current_bracket_id=1), ) bracket_matcher = tosurnament_mock.Matcher( Bracket(tournament_id=1, name=TOURNAMENT_NAME)) expected = [mock.call(tournament_matcher), mock.call(bracket_matcher)] assert bot_mock.session.add.call_args_list == expected cog.send_reply.assert_called_with(mock.ANY, mock.ANY, "success", TOURNAMENT_ACRONYM, TOURNAMENT_NAME, TOURNAMENT_NAME)
async def test_remove_match_to_ignore(mocker): """Removes a match to ignore.""" MATCH_ID_1 = "T1-1" MATCH_ID_2 = "t1-2" MATCH_ID_3 = "T1-3" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament( id=1, guild_id=tosurnament_mock.GUILD_ID, matches_to_ignore=MATCH_ID_1 + "\n" + MATCH_ID_3, current_bracket_id=1, staff_channel_id=tosurnament_mock.ChannelMock.STAFF_CHANNEL_ID, )) mock_bot.session.add_stub( Bracket(id=1, tournament_id=1, schedules_spreadsheet_id=1)) mock_bot.session.add_stub( SchedulesSpreadsheet(id=1, spreadsheet_id="single", sheet_name="Tier 1")) cog = tosurnament_mock.mock_cog(tournament.get_class(mock_bot)) await cog.remove_match_to_ignore(cog, tosurnament_mock.CtxMock(mock_bot), MATCH_ID_2, MATCH_ID_3) assert mock_bot.session.tables[ Tournament.__tablename__][0].matches_to_ignore == MATCH_ID_1 expected_replies = [ mocker.call(mocker.ANY, mocker.ANY, "success", MATCH_ID_1), mocker.call( tosurnament_mock.ChannelMock( tosurnament_mock.ChannelMock.STAFF_CHANNEL_ID), mocker.ANY, "to_not_ignore", mocker.ANY, MATCH_ID_3, ), ] assert cog.send_reply.call_args_list == expected_replies
async def test_add_match_to_ignore(mocker): """Adds a match to ignore.""" MATCH_ID_1 = "T1-1" MATCH_ID_2 = "t1-2" MATCH_ID_3 = "T1-3" INVALID_MATCH_ID = "Invalid" mock_bot = tosurnament_mock.BotMock() mock_bot.session.add_stub( Tournament(id=1, guild_id=tosurnament_mock.GUILD_ID, matches_to_ignore=MATCH_ID_3, current_bracket_id=1)) mock_bot.session.add_stub( Bracket(id=1, tournament_id=1, schedules_spreadsheet_id=1)) mock_bot.session.add_stub( SchedulesSpreadsheet(id=1, spreadsheet_id="single", sheet_name="Tier 1")) cog = tosurnament_mock.mock_cog(tournament.get_class(mock_bot)) await cog.add_match_to_ignore(cog, tosurnament_mock.CtxMock(mock_bot), MATCH_ID_1, MATCH_ID_2, INVALID_MATCH_ID) assert mock_bot.session.tables[ Tournament.__tablename__][0].matches_to_ignore == "\n".join( [MATCH_ID_1, MATCH_ID_2.upper(), MATCH_ID_3]) expected_replies = [ mocker.call(mocker.ANY, mocker.ANY, "success", " ".join([MATCH_ID_1, MATCH_ID_2.upper(), MATCH_ID_3])), mocker.call(mocker.ANY, mocker.ANY, "not_found", INVALID_MATCH_ID.lower()), mocker.call(mocker.ANY, mocker.ANY, "to_ignore", mocker.ANY, MATCH_ID_1), mocker.call(mocker.ANY, mocker.ANY, "to_ignore", mocker.ANY, MATCH_ID_2.upper()), ] assert cog.send_reply.call_args_list == expected_replies
async def create_tournament(self, ctx, acronym: str, name: str, bracket_name: str = ""): """ Creates a tournament. If a bracket name is not specified, the bracket takes the tournament's name as its name too. """ guild_id = ctx.guild.id tournament = self.bot.session.query(Tournament).where( Tournament.guild_id == guild_id).first() if tournament: raise tosurnament.TournamentAlreadyCreated() tournament = Tournament(guild_id=guild_id, acronym=acronym, name=name) self.bot.session.add(tournament) if not bracket_name: bracket_name = name bracket = Bracket(tournament_id=tournament.id, name=bracket_name) self.bot.session.add(bracket) tournament.current_bracket_id = bracket.id self.bot.session.update(tournament) await self.send_reply(ctx, ctx.command.name, "success", acronym, name, bracket_name)
async def test_create_tournament_with_bracket_name(mocker): """Creates a tournament with a specified bracket name.""" mock_bot = tosurnament_mock.BotMock() cog = tosurnament_mock.mock_cog(guild_owner.get_class(mock_bot)) await cog.create_tournament( cog, tosurnament_mock.CtxMock(mock_bot), TOURNAMENT_ACRONYM, TOURNAMENT_NAME, BRACKET_NAME, ) assert mock_bot.session.update.call_count == 1 tournament_matcher = tosurnament_mock.Matcher( Tournament(acronym=TOURNAMENT_ACRONYM, name=TOURNAMENT_NAME, current_bracket_id=1), ) bracket_matcher = tosurnament_mock.Matcher( Bracket(tournament_id=1, name=BRACKET_NAME)) expected = [mocker.call(tournament_matcher), mocker.call(bracket_matcher)] assert mock_bot.session.add.call_args_list == expected cog.send_reply.assert_called_with(mocker.ANY, mocker.ANY, "success", TOURNAMENT_ACRONYM, TOURNAMENT_NAME, BRACKET_NAME)
async def test_set_bracket_spreadsheet(self): """Sets bracket spreadsheets.""" bot_mock = tosurnament_mock.BotMock() bot_mock.session.add_stub(Tournament()) bot_mock.session.add_stub(Bracket()) cog = tosurnament_mock.mock_cog(bracket.get_class(bot_mock)) await cog.set_bracket_spreadsheet(tosurnament_mock.CtxMock(bot_mock), "players", SPREADSHEET_ID, "") await cog.set_bracket_spreadsheet(tosurnament_mock.CtxMock(bot_mock), "schedules", SPREADSHEET_ID, "") # !To fix, but unittest is pretty crappy with this tbh # add_expected = [ # mock.call(tosurnament_mock.Matcher(PlayersSpreadsheet())), # mock.call(tosurnament_mock.Matcher(SchedulesSpreadsheet())), # ] # bracket_matcher = tosurnament_mock.Matcher(Bracket(players_spreadsheet_id=1)) # players_spreadsheet_matcher = tosurnament_mock.Matcher( # PlayersSpreadsheet(spreadsheet_id=SPREADSHEET_ID) # ) # bracket_matcher_2 = tosurnament_mock.Matcher( # Bracket(players_spreadsheet_id=1, schedules_spreadsheet_id=1) # ) # schedules_spreadsheet_matcher = tosurnament_mock.Matcher( # SchedulesSpreadsheet(spreadsheet_id=SPREADSHEET_ID) # ) # update_expected = [ # mock.call(bracket_matcher), # mock.call(players_spreadsheet_matcher), # mock.call(bracket_matcher_2), # mock.call(schedules_spreadsheet_matcher), # ] # assert bot_mock.session.add.call_args_list == add_expected # assert bot_mock.session.update.call_args_list == update_expected assert bot_mock.session.add.call_count == 2 assert bot_mock.session.update.call_count == 4