private async ValueTask <Registration> TryCatch(ReturningRegistrationFunction returningRegistrationFunction) { try { return(await returningRegistrationFunction()); } catch (NullRegistrationException nullRegistrationException) { throw CreateAndLogValidationException(nullRegistrationException); } catch (InvalidRegistrationException invalidRegistrationInputException) { throw CreateAndLogValidationException(invalidRegistrationInputException); } catch (NotFoundRegistrationException notFoundRegistrationException) { throw CreateAndLogValidationException(notFoundRegistrationException); } catch (SqlException sqlException) { throw CreateAndLogCriticalDependencyException(sqlException); } catch (DuplicateKeyException duplicateKeyException) { var alreadyExistsRegistrationException = new AlreadyExistsRegistrationException(duplicateKeyException); throw CreateAndLogValidationException(alreadyExistsRegistrationException); } catch (ForeignKeyConstraintConflictException foreignKeyConstraintConflictException) { var invalidRegistrationReferenceException = new InvalidRegistrationReferenceException(foreignKeyConstraintConflictException); throw CreateAndLogValidationException(invalidRegistrationReferenceException); } catch (DbUpdateConcurrencyException dbUpdateConcurrencyException) { var lockedRegistrationException = new LockedRegistrationException(dbUpdateConcurrencyException); throw CreateAndLogDependencyException(lockedRegistrationException); } catch (DbUpdateException dbUpdateException) { throw CreateAndLogDependencyException(dbUpdateException); } catch (Exception exception) { var failedRegistrationServiceException = new FailedRegistrationServiceException(exception); throw CreateAndLogServiceException(failedRegistrationServiceException); } }
public async Task ShouldThrowValidationOnModifyIfForeignKeyConstraintConflictExceptionOccursAndLogItAsync() { // given DateTimeOffset randomDateTime = GetRandomDateTime(); DateTimeOffset dateTime = randomDateTime; Registration randomRegistration = CreateRandomRegistration(dateTime); Registration storageRegistration = randomRegistration; Registration foreignKeyConflictedRegistration = storageRegistration.DeepClone(); storageRegistration.UpdatedDate = dateTime.AddMinutes(GetNegativeRandomNumber()); string randomMessage = GetRandomMessage(); string exceptionMessage = randomMessage; var foreignKeyConstraintConflictException = new ForeignKeyConstraintConflictException(exceptionMessage); var invalidRegistrationReferenceException = new InvalidRegistrationReferenceException(foreignKeyConstraintConflictException); var registrationValidationException = new RegistrationValidationException(invalidRegistrationReferenceException); this.dateTimeBrokerMock.Setup(broker => broker.GetCurrentDateTime()) .Returns(randomDateTime); this.storageBrokerMock.Setup(broker => broker.SelectRegistrationByIdAsync(foreignKeyConflictedRegistration.Id)) .ReturnsAsync(storageRegistration); this.storageBrokerMock.Setup(broker => broker.UpdateRegistrationAsync(foreignKeyConflictedRegistration)) .ThrowsAsync(foreignKeyConstraintConflictException); // when ValueTask <Registration> modifyRegistrationTask = this.registrationService.ModifyRegistrationAsync(foreignKeyConflictedRegistration); // then await Assert.ThrowsAsync <RegistrationValidationException>(() => modifyRegistrationTask.AsTask()); this.dateTimeBrokerMock.Verify(broker => broker.GetCurrentDateTime(), Times.Once); this.storageBrokerMock.Verify(broker => broker.SelectRegistrationByIdAsync(foreignKeyConflictedRegistration.Id), Times.Once); this.storageBrokerMock.Verify(broker => broker.UpdateRegistrationAsync(foreignKeyConflictedRegistration), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs(registrationValidationException))), Times.Once); this.dateTimeBrokerMock.VerifyNoOtherCalls(); this.storageBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); }