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(); }
/// <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); }
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); } }