Exemple #1
0
 private static void CompareQueuedBoosters(QueuedBooster ogBooster, QueuedBooster compareAgainstBooster)
 {
     compareAgainstBooster.Id.Should().Be(ogBooster.Id);
     compareAgainstBooster.Position.Should().Be(ogBooster.Position);
     compareAgainstBooster.GuildId.Should().Be(ogBooster.GuildId);
     compareAgainstBooster.Multiplier.Should().Be(ogBooster.Multiplier);
     compareAgainstBooster.DurationInSeconds.Should().Be(ogBooster.DurationInSeconds);
 }
        public async Task ShouldActivateQueuedBooster_IfSlotBecomesAvailable()
        {
            ulong guildId   = 6;
            ulong channelId = 7;
            var   now       = DateTime.Now.ToUniversalTime();
            var   slot      = new AvailableSlot
            {
                GuildId   = guildId,
                ChannelId = channelId
            };
            var sub = new List <ActiveBooster>
            {
                new()
                {
                    GuildId        = guildId,
                    ExpirationDate = now.Subtract(TimeSpan.FromSeconds(5)),
                    Multiplier     = 6.9f,
                    Slot           = slot
                }
            };
            var queued = new QueuedBooster
            {
                GuildId           = guildId,
                Multiplier        = 5.0f,
                DurationInSeconds = 600
            };

            var activeBoosters = new Dictionary <ulong, List <ActiveBooster> >
            {
                { guildId, sub }
            };
            var queuedBoosters = new Dictionary <ulong, Queue <QueuedBooster> >
            {
                { guildId, new Queue <QueuedBooster>(new[] { queued }) }
            };
            var availableSlots = new Dictionary <ulong, List <AvailableSlot> >
            {
                {
                    guildId, new List <AvailableSlot>
                    {
                        slot
                    }
                }
            };

            _boosterService.ActiveBoosters.Returns(activeBoosters);
            _boosterService.QueuedBoosters.Returns(queuedBoosters);
            _boosterService.AvailableSlots.Returns(availableSlots);

            _dbContext.ConfigureMockDbSet(x => x.XPActiveBoosters);
            _dbContext.ConfigureMockDbSet(x => x.XPQueuedBoosters);
            _dbContext.ConfigureMockDbSet(x => x.XPAvailableSlots);

            ((IQueryable <QueuedBooster>)_dbContext.XPQueuedBoosters).Expression.Returns(new List <QueuedBooster>()
                                                                                         .AsQueryable().Where(x => false).Expression);
            ((IQueryable <ActiveBooster>)_dbContext.XPActiveBoosters).Expression.Returns(new List <ActiveBooster>()
                                                                                         .AsQueryable().Where(x => false).Expression);

            _dateTime.Now.Returns(now);

            await _sussy.Handle(new UpdateBoosterCycleCommand { GuildId = guildId }, CancellationToken.None);

            await _dbContext.XPActiveBoosters.Received().DeleteAsync();

            _boosterService.ActiveBoosters[guildId].Count.Should().Be(0);

            await _mediator.Received().Send(Arg.Is <ActivateBoosterCommand>(c =>
                                                                            c.GuildId == guildId &&
                                                                            Math.Abs(c.Multiplier - queued.Multiplier) < 0.01f &&
                                                                            c.Duration == TimeSpan.FromSeconds(queued.DurationInSeconds)
                                                                            ));

            await _mediator.Received(1).Send(Arg.Is <SaveQueueCommand>(c =>
                                                                       c.GuildId == guildId
                                                                       ));
        }
    }