diff --git a/GitFyle.Core.Api.Tests.Unit/Services/Foundations/Contributors/ContributorServiceTests.Exceptions.Modify.cs b/GitFyle.Core.Api.Tests.Unit/Services/Foundations/Contributors/ContributorServiceTests.Exceptions.Modify.cs index f7b64c34..45de1fed 100644 --- a/GitFyle.Core.Api.Tests.Unit/Services/Foundations/Contributors/ContributorServiceTests.Exceptions.Modify.cs +++ b/GitFyle.Core.Api.Tests.Unit/Services/Foundations/Contributors/ContributorServiceTests.Exceptions.Modify.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; +using EFxceptions.Models.Exceptions; using FluentAssertions; using GitFyle.Core.Api.Models.Foundations.Contributors; using GitFyle.Core.Api.Models.Foundations.Contributors.Exceptions; @@ -70,6 +71,67 @@ await Assert.ThrowsAsync( this.loggingBrokerMock.VerifyNoOtherCalls(); } + [Fact] + public async Task ShouldThrowValidationExceptionOnModifyIfReferenceErrorOccursAndLogItAsync() + { + // given + Contributor foreignKeyConflictedContributor = CreateRandomContributor(); + string randomMessage = GetRandomString(); + string exceptionMessage = randomMessage; + + var foreignKeyConstraintConflictException = + new ForeignKeyConstraintConflictException(message: exceptionMessage); + + var invalidContributorReferenceException = + new InvalidReferenceContributorException( + message: "Invalid contributor reference error occurred.", + innerException: foreignKeyConstraintConflictException, + data: foreignKeyConstraintConflictException.Data); + + var expectedContributorDependencyValidationException = + new ContributorDependencyValidationException( + message: "Contributor dependency validation error occurred, fix errors and try again.", + innerException: invalidContributorReferenceException, + data: invalidContributorReferenceException.Data); + + this.dateTimeBrokerMock.Setup(broker => + broker.GetCurrentDateTimeOffsetAsync()) + .Throws(foreignKeyConstraintConflictException); + + // when + ValueTask modifyContributorTask = + this.contributorService.ModifyContributorAsync(foreignKeyConflictedContributor); + + ContributorDependencyValidationException actualContributorDependencyValidationException = + await Assert.ThrowsAsync( + modifyContributorTask.AsTask); + + // then + actualContributorDependencyValidationException.Should().BeEquivalentTo( + expectedContributorDependencyValidationException); + + this.dateTimeBrokerMock.Verify(broker => + broker.GetCurrentDateTimeOffsetAsync(), + Times.Once); + + this.storageBrokerMock.Verify(broker => + broker.SelectContributorByIdAsync(foreignKeyConflictedContributor.Id), + Times.Never); + + this.loggingBrokerMock.Verify(broker => + broker.LogErrorAsync(It.Is(SameExceptionAs( + expectedContributorDependencyValidationException))), + Times.Once); + + this.storageBrokerMock.Verify(broker => + broker.UpdateContributorAsync(foreignKeyConflictedContributor), + Times.Never); + + this.dateTimeBrokerMock.VerifyNoOtherCalls(); + this.storageBrokerMock.VerifyNoOtherCalls(); + this.loggingBrokerMock.VerifyNoOtherCalls(); + } + [Fact] public async Task ShouldThrowDependencyExceptionOnModifyIfDatabaseUpdateExceptionOccursAndLogItAsync() {