private async ValueTask <CourseAttachment> TryCatch( ReturningCourseAttachmentFunction returningCourseAttachmentFunction) { try { return(await returningCourseAttachmentFunction()); } catch (NullCourseAttachmentException nullCourseAttachmentException) { throw CreateAndLogValidationException(nullCourseAttachmentException); } catch (InvalidCourseAttachmentException invalidCourseAttachmentException) { throw CreateAndLogValidationException(invalidCourseAttachmentException); } catch (NotFoundCourseAttachmentException notFoundCourseAttachmentException) { throw CreateAndLogValidationException(notFoundCourseAttachmentException); } catch (DuplicateKeyException duplicateKeyException) { var alreadyExistsCourseAttachmentException = new AlreadyExistsCourseAttachmentException(duplicateKeyException); throw CreateAndLogValidationException(alreadyExistsCourseAttachmentException); } catch (ForeignKeyConstraintConflictException foreignKeyConstraintConflictException) { var invalidCourseAttachmentReferenceException = new InvalidCourseAttachmentReferenceException(foreignKeyConstraintConflictException); throw CreateAndLogValidationException(invalidCourseAttachmentReferenceException); } catch (DbUpdateConcurrencyException dbUpdateConcurrencyException) { var lockedCourseAttachmentException = new LockedCourseAttachmentException(dbUpdateConcurrencyException); throw CreateAndLogDependencyException(lockedCourseAttachmentException); } catch (SqlException sqlException) { throw CreateAndLogCriticalDependencyException(sqlException); } catch (DbUpdateException dbUpdateException) { throw CreateAndLogDependencyException(dbUpdateException); } catch (Exception exception) { var failedCourseAttachmentServiceException = new FailedCourseAttachmentServiceException(exception); throw CreateAndLogServiceException(failedCourseAttachmentServiceException); } }
public async Task ShouldThrowDependencyExceptionOnRemoveWhenDbUpdateConcurrencyExceptionOccursAndLogItAsync() { // given Guid someAttachmentId = Guid.NewGuid(); Guid someCourseId = Guid.NewGuid(); var databaseUpdateConcurrencyException = new DbUpdateConcurrencyException(); var lockedAttachmentException = new LockedCourseAttachmentException(databaseUpdateConcurrencyException); var expectedCourseAttachmentException = new CourseAttachmentDependencyException(lockedAttachmentException); this.storageBrokerMock.Setup(broker => broker.SelectCourseAttachmentByIdAsync(someCourseId, someAttachmentId)) .ThrowsAsync(databaseUpdateConcurrencyException); // when ValueTask <CourseAttachment> removeCourseAttachmentTask = this.courseAttachmentService.RemoveCourseAttachmentByIdAsync(someCourseId, someAttachmentId); // then await Assert.ThrowsAsync <CourseAttachmentDependencyException>(() => removeCourseAttachmentTask.AsTask()); this.storageBrokerMock.Verify(broker => broker.SelectCourseAttachmentByIdAsync(someCourseId, someAttachmentId), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs( expectedCourseAttachmentException))), Times.Once); this.storageBrokerMock.Verify(broker => broker.DeleteCourseAttachmentAsync(It.IsAny <CourseAttachment>()), Times.Never); this.storageBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); this.dateTimeBrokerMock.VerifyNoOtherCalls(); }