public async Task ShouldThrowDependencyExceptionOnRemoveWhenDbUpdateConcurrencyExceptionOccursAndLogItAsync() { // given Guid someAssignmentId = Guid.NewGuid(); var databaseUpdateConcurrencyException = new DbUpdateConcurrencyException(); var lockedAssignmentException = new LockedAssignmentException(databaseUpdateConcurrencyException); var expectedAssignmentDependencyException = new AssignmentDependencyException(lockedAssignmentException); this.storageBrokerMock.Setup(broker => broker.SelectAssignmentByIdAsync(It.IsAny <Guid>())) .ThrowsAsync(databaseUpdateConcurrencyException); // when ValueTask <Assignment> deleteAssignmentTask = this.assignmentService.RemoveAssignmentByIdAsync(someAssignmentId); // then await Assert.ThrowsAsync <AssignmentDependencyException>(() => deleteAssignmentTask.AsTask()); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs(expectedAssignmentDependencyException))), Times.Once); this.storageBrokerMock.Verify(broker => broker.SelectAssignmentByIdAsync(It.IsAny <Guid>()), Times.Once); this.dateTimeBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); this.storageBrokerMock.VerifyNoOtherCalls(); }
private async ValueTask <Assignment> TryCatch(ReturningAssignmentFunction returningAssignmentFunction) { try { return(await returningAssignmentFunction()); } catch (NullAssignmentException nullAssignmentException) { throw CreateAndLogValidationException(nullAssignmentException); } catch (InvalidAssignmentException invalidAssignmentInputException) { throw CreateAndLogValidationException(invalidAssignmentInputException); } catch (NotFoundAssignmentException notFoundAssignmentException) { throw CreateAndLogValidationException(notFoundAssignmentException); } catch (DuplicateKeyException duplicateKeyException) { var alreadyExistsAssignmentException = new AlreadyExistsAssignmentException(duplicateKeyException); throw CreateAndLogValidationException(alreadyExistsAssignmentException); } catch (SqlException sqlException) { throw CreateAndLogCriticalDependencyException(sqlException); } catch (DbUpdateConcurrencyException dbUpdateConcurrencyException) { var lockedAssignmentException = new LockedAssignmentException(dbUpdateConcurrencyException); throw CreateAndLogDependencyException(lockedAssignmentException); } catch (DbUpdateException dbUpdateException) { throw CreateAndLogDependencyException(dbUpdateException); } catch (Exception exception) { var failedAssignmentServiceException = new FailedAssignmentServiceException(exception); throw CreateAndLogServiceException(failedAssignmentServiceException); } }
public async Task ShouldThrowDependencyExceptionOnModifyIfDbUpdateConcurrencyExceptionOccursAndLogItAsync() { // given int randomNegativeNumber = GetNegativeRandomNumber(); DateTimeOffset randomDateTime = GetRandomDateTime(); Assignment randomAssignment = CreateRandomAssignment(randomDateTime); Assignment someAssignment = randomAssignment; someAssignment.CreatedDate = randomDateTime.AddMinutes(randomNegativeNumber); var databaseUpdateConcurrencyException = new DbUpdateConcurrencyException(); var lockedAssignmentException = new LockedAssignmentException(databaseUpdateConcurrencyException); var expectedAssignmentDependencyException = new AssignmentDependencyException(lockedAssignmentException); this.storageBrokerMock.Setup(broker => broker.SelectAssignmentByIdAsync(someAssignment.Id)) .ThrowsAsync(databaseUpdateConcurrencyException); this.dateTimeBrokerMock.Setup(broker => broker.GetCurrentDateTime()) .Returns(randomDateTime); // when ValueTask <Assignment> modifyAssignmentTask = this.assignmentService.ModifyAssignmentAsync(someAssignment); // then await Assert.ThrowsAsync <AssignmentDependencyException>(() => modifyAssignmentTask.AsTask()); this.dateTimeBrokerMock.Verify(broker => broker.GetCurrentDateTime(), Times.Once); this.storageBrokerMock.Verify(broker => broker.SelectAssignmentByIdAsync(someAssignment.Id), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs(expectedAssignmentDependencyException))), Times.Once); this.loggingBrokerMock.VerifyNoOtherCalls(); this.storageBrokerMock.VerifyNoOtherCalls(); this.dateTimeBrokerMock.VerifyNoOtherCalls(); }