Пример #1
0
        public async Task TryUpdateAsync_GuildChannelExists_UpdatesGuildChannelAndReturnsTrue(ulong channelId)
        {
            (var modixContext, var uut) = BuildTestContext();

            var guildChannel = modixContext.GuildChannels.Single(x => x.ChannelId == channelId);

            var mutatedData = new GuildChannelMutationData()
            {
                Name = "UpdatedChannel"
            };

            var result = await uut.TryUpdateAsync(channelId, data =>
            {
                data.Name.ShouldBe(guildChannel.Name);

                data.Name = mutatedData.Name;
            });

            result.ShouldBeTrue();

            guildChannel.Name.ShouldBe(mutatedData.Name);

            modixContext.GuildChannels
            .Select(x => x.ChannelId)
            .ShouldBe(GuildChannels.Entities
                      .Select(x => x.ChannelId));

            modixContext.GuildChannels
            .Where(x => x.ChannelId != channelId)
            .EachShould(x => x.ShouldNotHaveChanged());

            await modixContext.ShouldHaveReceived(1)
            .SaveChangesAsync();
        }
Пример #2
0
        /// <inheritdoc />
        public async Task <bool> TryUpdateAsync(ulong channelId, Action <GuildChannelMutationData> updateAction)
        {
            if (updateAction == null)
            {
                throw new ArgumentNullException(nameof(updateAction));
            }

            var entity = await ModixContext.GuildChannels
                         .Where(x => x.ChannelId == channelId)
                         .FirstOrDefaultAsync();

            if (entity == null)
            {
                return(false);
            }

            var data = GuildChannelMutationData.FromEntity(entity);

            updateAction.Invoke(data);
            data.ApplyTo(entity);

            ModixContext.UpdateProperty(entity, x => x.Name);

            await ModixContext.SaveChangesAsync();

            return(true);
        }
Пример #3
0
        public async Task TrackChannelAsync_TryUpdateSucceeds_DoesNotCreateChannel(ulong channelId, string channelName)
        {
            var autoMocker = new AutoMocker();

            var mockCreateTransaction      = new Mock <IRepositoryTransaction>();
            var mockGuildChannelRepository = autoMocker.GetMock <IGuildChannelRepository>();

            var sequence = new MockSequence();

            mockGuildChannelRepository
            .InSequence(sequence)
            .Setup(x => x.BeginCreateTransactionAsync(It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockCreateTransaction.Object);

            mockGuildChannelRepository
            .InSequence(sequence)
            .Setup(x => x.TryUpdateAsync(It.IsAny <ulong>(), It.IsAny <Action <GuildChannelMutationData> >(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(true);

            mockCreateTransaction
            .InSequence(sequence)
            .Setup(x => x.Commit());

            using (var cancellationTokenSource = new CancellationTokenSource())
            {
                var uut = autoMocker.CreateInstance <ChannelService>();

                var mockChannel = new Mock <IGuildChannel>();
                mockChannel
                .Setup(x => x.Id)
                .Returns(channelId);
                mockChannel
                .Setup(x => x.Name)
                .Returns(channelName);

                await uut.TrackChannelAsync(mockChannel.Object.Name, mockChannel.Object.Id, mockChannel.Object.GuildId, cancellationTokenSource.Token);

                mockGuildChannelRepository
                .ShouldHaveReceived(x => x.BeginCreateTransactionAsync(cancellationTokenSource.Token), Times.Once());

                mockGuildChannelRepository
                .ShouldHaveReceived(x => x.TryUpdateAsync(channelId, It.IsNotNull <Action <GuildChannelMutationData> >(), cancellationTokenSource.Token), Times.Once());

                mockGuildChannelRepository
                .ShouldNotHaveReceived(x => x.CreateAsync(It.IsAny <GuildChannelCreationData>(), cancellationTokenSource.Token));

                mockCreateTransaction
                .ShouldHaveReceived(x => x.Commit(), Times.Once());

                var updateAction = mockGuildChannelRepository
                                   .Invocations
                                   .First(x => x.Method.Name == nameof(IGuildChannelRepository.TryUpdateAsync))
                                   .Arguments[1] as Action <GuildChannelMutationData>;

                var mutationData = new GuildChannelMutationData();
                updateAction.Invoke(mutationData);

                mutationData.Name.ShouldBe(channelName);
            }
        }