public async Task deny_if_betting_not_available()
            {
                var commands = new BettingCommands(() => null);

                CommandResult result = await commands.Bet(new CommandContext(MockMessage(MockUser("me")),
                                                                             ImmutableList.Create("!bet 1 blue"), ArgsParser));

                Assert.That(result.Response, Is.EqualTo("betting not available right now"));
            }
            public async Task only_allow_from_chat()
            {
                User user = MockUser("me");
                Mock <IBettingPeriod <User> > bettingPeriodMock = new();
                var commands = new BettingCommands(() => bettingPeriodMock.Object);

                CommandResult result = await commands.Bet(new CommandContext(
                                                              MockMessage(user, source: MessageSource.Whisper),
                                                              ImmutableList.Create("100", "blue"), ArgsParser));

                Assert.That(result.Response, Is.EqualTo("you may only bet through chat"));
            }
            public async Task deny_if_betting_closed()
            {
                Mock <IBettingPeriod <User> > bettingPeriodMock = new();

                bettingPeriodMock.Setup(b => b.IsBettingOpen).Returns(false);
                var commands = new BettingCommands(() => bettingPeriodMock.Object);

                CommandResult result = await commands.Bet(new CommandContext(MockMessage(MockUser("me")),
                                                                             ImmutableList.Create("!bet 1 blue"), ArgsParser));

                Assert.That(result.Response, Is.EqualTo("betting is already closed"));
            }
 public Matchmode(ILoggerFactory loggerFactory, BaseConfig baseConfig, MatchmodeConfig matchmodeConfig)
 {
     _matchmodeConfig = matchmodeConfig;
     _loggerFactory = loggerFactory;
     _logger = loggerFactory.CreateLogger<Matchmode>();
     _stopToken = new StopToken();
     Setups.Databases repos = Setups.SetUpRepositories(_logger, baseConfig);
     _pokeyenBank = repos.PokeyenBank;
     _userRepo = repos.UserRepo;
     (_broadcastServer, _overlayConnection) = Setups.SetUpOverlayServer(loggerFactory);
     _modeBase = new ModeBase(loggerFactory, repos, baseConfig, _stopToken, _overlayConnection);
     var bettingCommands = new BettingCommands(() => _bettingPeriod);
     foreach (Command command in bettingCommands.Commands)
         _modeBase.InstallAdditionalCommand(command);
 }
            public async Task propagate_failure()
            {
                User user = MockUser("me");
                Mock <IBettingShop <User> >   bettingShopMock   = new();
                Mock <IBettingPeriod <User> > bettingPeriodMock = new();

                bettingPeriodMock.Setup(b => b.IsBettingOpen).Returns(true);
                bettingPeriodMock.Setup(b => b.BettingShop).Returns(bettingShopMock.Object);
                bettingShopMock.Setup(b => b.PlaceBet(user, Side.Blue, 100))
                .Returns(Task.FromResult((PlaceBetFailure?)new PlaceBetFailure.InsufficientFunds(50)));
                var commands = new BettingCommands(() => bettingPeriodMock.Object);

                CommandResult result = await commands.Bet(new CommandContext(MockMessage(user),
                                                                             ImmutableList.Create("100", "blue"), ArgsParser));

                Assert.That(result.Response, Is.EqualTo("insufficient funds, you only have 50 pokeyen available"));
            }
            public async Task announce_in_chat()
            {
                User user = MockUser("me");
                Mock <IBettingPeriod <User> > bettingPeriodMock = new();
                Mock <IBettingShop <User> >   bettingShopMock   = new();

                bettingPeriodMock.Setup(b => b.IsBettingOpen).Returns(true);
                bettingPeriodMock.Setup(b => b.BettingShop).Returns(bettingShopMock.Object);
                bettingShopMock.Setup(b => b.PlaceBet(user, Side.Blue, 100))
                .Returns(Task.FromResult((PlaceBetFailure?)null));
                var commands = new BettingCommands(() => bettingPeriodMock.Object);

                CommandResult result = await commands.Bet(new CommandContext(MockMessage(user),
                                                                             ImmutableList.Create("100", "blue"), ArgsParser));

                Assert.That(result.Response, Is.EqualTo("placed a P100 bet on Blue."));
            }