public async void Handle_SignalMuleHeartbeat_Existing() { var stateManager = new Mock <IStateService>(); stateManager.Setup(s => s.IsRunning()).ReturnsAsync(true); var logger = new Mock <ILogger <SignalMuleHeartbeatHandler> >(); var now = DateTime.UtcNow; var dateTime = new Mock <IDateTime>(); dateTime.Setup(d => d.UtcNow).Returns(now); var account = BogusData.ValidMuleAccounts.Generate(); var mule = new Mule { Account = account, Tag = Guid.NewGuid() }; var bot = BogusData.Bots.Generate(); var muleRequest = new MuleRequest { Mule = mule, Bot = bot }; using (var context = NewContext) { context.MuleRequests.Add(muleRequest); await context.SaveChangesAsync(); } var command = new FORFarm.Application.Mules.Commands.SignalMuleHeartbeat.SignalMuleHeartbeat { Gold = 500 * 1000, Tag = mule.Tag }; var signalMuleHeartbeatHandler = new SignalMuleHeartbeatHandler(NewContext, logger.Object, dateTime.Object, stateManager.Object); var result = await signalMuleHeartbeatHandler.Handle(command, CancellationToken.None); result.Should().NotBeNull(); result.Command.Should().Be(Command.Continue); result.MuleRequests.Should().ContainSingle(bot.DisplayName); var uMule = await NewContext.Mules.FindAsync(mule.ID); uMule.LastUpdate.Should().Be(now); uMule.Gold.Should().Be(command.Gold); }
public async void Handle_FinishMuling_ExistingTag() { var bot = BogusData.Bots.Generate(); var mule = BogusData.Mules.Generate(); var muleRequest = new MuleRequest { Mule = mule, Bot = bot }; await using (var context = NewContext) { context.MuleRequests.Add(muleRequest); await context.SaveChangesAsync(); } const int goldTransferred = 500000; await using (var context = NewContext) { var request = new FORFarm.Application.Bots.Commands.FinishMuling.FinishMuling() { Tag = bot.Tag, GoldTransferred = goldTransferred }; var finishMulingHandler = new FinishMulingHandler(context); await finishMulingHandler.Handle(request, CancellationToken.None); } await using (var context = NewContext) { context.MuleRequests.ToList().Should().BeEmpty(); var uBot = context.Bots.Find(bot.ID); uBot.Should().NotBeNull(); uBot.GoldEarned.Should().Be(bot.GoldEarned + goldTransferred); } }
public async Task <RequestMulingResponse> Handle(RequestMuling request, CancellationToken cancellationToken) { if (!await _stateService.IsRunning()) { return(new RequestMulingResponse()); } var bot = await _context.Bots.FirstOrDefaultAsync(b => b.Tag == request.Tag, cancellationToken); if (bot == null) { _logger.LogWarning($"Bot with tag {request.Tag} was not found"); return(new RequestMulingResponse()); } var mules = await _context.Mules .Include(m => m.Position) .Where(_instanceService.IsConnected()) .Cast <Mule>() .ToListAsync(cancellationToken); if (mules.Count == 0) { return(new RequestMulingResponse()); } var selectedMule = mules[_random.Next(0, mules.Count)]; var muleRequest = new MuleRequest { Mule = selectedMule, Bot = bot }; _context.MuleRequests.Add(muleRequest); await _context.SaveChangesAsync(cancellationToken); return(new RequestMulingResponse(new MuleInfo(selectedMule.DisplayName, selectedMule.Position, selectedMule.World))); }