private async ValueTask <Student> TryCatch(ReturningStudentFunction returningStudentFunction) { try { return(await returningStudentFunction()); } catch (NullStudentException nullStudentException) { throw CreateAndLogValidationException(nullStudentException); } catch (InvalidStudentException invalidStudentException) { throw CreateAndLogValidationException(invalidStudentException); } catch (NotFoundStudentException nullStudentException) { throw CreateAndLogValidationException(nullStudentException); } catch (SqlException sqlException) { var failedStudentStorageException = new FailedStudentStorageException(sqlException); throw CreateAndLogCriticalDependencyException(failedStudentStorageException); } catch (DuplicateKeyException duplicateKeyException) { var alreadyExistsStudentException = new AlreadyExistsStudentException(duplicateKeyException); throw CreateAndLogDependencyValidationException(alreadyExistsStudentException); } catch (DbUpdateConcurrencyException dbUpdateConcurrencyException) { var lockedStudentException = new LockedStudentException(dbUpdateConcurrencyException); throw CreateAndLogDependencyException(lockedStudentException); } catch (DbUpdateException dbUpdateException) { var failedStudentStorageException = new FailedStudentStorageException(dbUpdateException); throw CreateAndLogDependencyException(failedStudentStorageException); } catch (Exception exception) { var failedStudentServiceException = new FailedStudentServiceException(exception); throw CreateAndLogServiceException(failedStudentServiceException); } }
public async Task ShouldThrowDependencyExceptionOnModifyIfDbUpdateConcurrencyExceptionOccursAndLogItAsync() { // given Student someStudent = CreateRandomStudent(); int randomDays = GetRandomNumber(); someStudent.UpdatedDate = someStudent.CreatedDate.AddDays(randomDays); var databaseUpdateConcurrencyException = new DbUpdateConcurrencyException(); var lockedStudentException = new LockedStudentException(databaseUpdateConcurrencyException); var expectedStudentDependencyException = new StudentDependencyException(lockedStudentException); this.dateTimeBrokerMock.Setup(broker => broker.GetCurrentDateTime()) .Throws(databaseUpdateConcurrencyException); // when ValueTask <Student> modifyStudentTask = this.studentService.ModifyStudentAsync(someStudent); // then await Assert.ThrowsAsync <StudentDependencyException>(() => modifyStudentTask.AsTask()); this.dateTimeBrokerMock.Verify(broker => broker.GetCurrentDateTime(), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs( expectedStudentDependencyException))), Times.Once); this.storageBrokerMock.Verify(broker => broker.UpdateStudentAsync(It.IsAny <Student>()), Times.Never); this.dateTimeBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); this.storageBrokerMock.VerifyNoOtherCalls(); }
public async Task ShouldThrowDependencyExceptionOnDeleteIfDatabaseUpdateConcurrencyErrorOccursAndLogItAsync() { // given Guid someStudentId = Guid.NewGuid(); var databaseUpdateConcurrencyException = new DbUpdateConcurrencyException(); var lockedStudentException = new LockedStudentException(databaseUpdateConcurrencyException); var expectedStudentDependencyException = new StudentDependencyException(lockedStudentException); this.storageBrokerMock.Setup(broker => broker.SelectStudentByIdAsync(It.IsAny <Guid>())) .ThrowsAsync(databaseUpdateConcurrencyException); // when ValueTask <Student> deleteStudentTask = this.studentService.RemoveStudentByIdAsync(someStudentId); // then await Assert.ThrowsAsync <StudentDependencyException>(() => deleteStudentTask.AsTask()); this.storageBrokerMock.Verify(broker => broker.SelectStudentByIdAsync(It.IsAny <Guid>()), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs( expectedStudentDependencyException))), Times.Once); this.storageBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); this.dateTimeBrokerMock.VerifyNoOtherCalls(); }