private async ValueTask <User> TryCatch(ReturningUserFunction returningUserFunction) { try { return(await returningUserFunction()); } catch (NullUserException nullUserException) { throw CreateAndLogValidationException(nullUserException); } catch (InvalidUserException invalidUserException) { throw CreateAndLogValidationException(invalidUserException); } catch (NotFoundUserException nullUserException) { throw CreateAndLogValidationException(nullUserException); } catch (DuplicateKeyException duplicateKeyException) { var alreadyExistsUserException = new AlreadyExistsUserException(duplicateKeyException); throw CreateAndLogValidationException(alreadyExistsUserException); } catch (SqlException sqlException) { var failedUserStorageException = new FailedUserStorageException(sqlException); throw CreateAndLogCriticalDependencyException(failedUserStorageException); } catch (DbUpdateConcurrencyException dbUpdateConcurrencyException) { var lockedUserException = new LockedUserException(dbUpdateConcurrencyException); throw CreateAndLogDependencyException(lockedUserException); } catch (DbUpdateException dbUpdateException) { var failedUserStorageException = new FailedUserStorageException(dbUpdateException); throw CreateAndLogDependencyException(failedUserStorageException); } catch (Exception exception) { var failedUserServiceException = new FailedUserServiceException(exception); throw CreateAndLogServiceException(failedUserServiceException); } }
public async void ShouldThrowValidationExceptionOnCreateWhenUserAlreadyExistsAndLogItAsync() { // given DateTimeOffset randomDateTime = GetRandomDateTime(); DateTimeOffset dateTime = randomDateTime; User randomUser = CreateRandomUser(dateTime); User alreadyExistsUser = randomUser; string randomMessage = GetRandomMessage(); string exceptionMessage = randomMessage; var duplicateKeyException = new DuplicateKeyException(exceptionMessage); string password = GetRandomPassword(); var alreadyExistsUserException = new AlreadyExistsUserException(duplicateKeyException); var expectedUserValidationException = new UserValidationException(alreadyExistsUserException); this.dateTimeBrokerMock.Setup(broker => broker.GetCurrentDateTime()) .Returns(dateTime); this.userManagementBrokerMock.Setup(broker => broker.InsertUserAsync(alreadyExistsUser, password)) .ThrowsAsync(duplicateKeyException); // when ValueTask <User> registerUserTask = this.userService.RegisterUserAsync(alreadyExistsUser, password); // then await Assert.ThrowsAsync <UserValidationException>(() => registerUserTask.AsTask()); this.dateTimeBrokerMock.Verify(broker => broker.GetCurrentDateTime(), Times.Once); this.userManagementBrokerMock.Verify(broker => broker.InsertUserAsync(alreadyExistsUser, password), Times.Once); this.loggingBrokerMock.Verify(broker => broker.LogError(It.Is(SameExceptionAs( expectedUserValidationException))), Times.Once); this.dateTimeBrokerMock.VerifyNoOtherCalls(); this.userManagementBrokerMock.VerifyNoOtherCalls(); this.loggingBrokerMock.VerifyNoOtherCalls(); }