Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
a723bf9
ShouldModifyReaderAsync -> FAIL
DilmurodDeveloper Jul 21, 2025
703b52a
ShouldModifyReaderAsync -> PASS
DilmurodDeveloper Jul 21, 2025
988ed22
ShouldThrowValidationExceptionOnModifyIfReaderIsNullAndLogItAsync -> …
DilmurodDeveloper Jul 21, 2025
408898c
ShouldThrowValidationExceptionOnModifyIfReaderIsNullAndLogItAsync -> …
DilmurodDeveloper Jul 21, 2025
0c49e31
ShouldThrowValidationExceptionOnModifyIfReaderIsInvalidAndLogItAsync …
DilmurodDeveloper Jul 21, 2025
f69a0f1
ShouldThrowValidationExceptionOnModifyIfReaderIsInvalidAndLogItAsync …
DilmurodDeveloper Jul 21, 2025
1e2c7fa
ShouldThrowValidationExceptionOnModifyIfReaderDoesNotExistAndLogItAsy…
DilmurodDeveloper Jul 21, 2025
3106037
ShouldThrowValidationExceptionOnModifyIfReaderDoesNotExistAndLogItAsy…
DilmurodDeveloper Jul 21, 2025
945bbde
ShouldThrowCriticalDependencyExceptionOnModifyIfSqlErrorOccursAndLogI…
DilmurodDeveloper Jul 21, 2025
5e68cf4
ShouldThrowCriticalDependencyExceptionOnModifyIfSqlErrorOccursAndLogI…
DilmurodDeveloper Jul 21, 2025
f250144
ShouldThrowDependencyExceptionOnModifyIfDatabaseUpdateExceptionOccurs…
DilmurodDeveloper Jul 21, 2025
e9e5a67
ShouldThrowDependencyExceptionOnModifyIfDatabaseUpdateExceptionOccurs…
DilmurodDeveloper Jul 21, 2025
5780055
ShouldThrowDependencyValidationExceptionOnModifyIfDatabaseUpdateConcu…
DilmurodDeveloper Jul 21, 2025
b39b853
ShouldThrowDependencyValidationExceptionOnModifyIfDatabaseUpdateConcu…
DilmurodDeveloper Jul 21, 2025
be7facb
ShouldThrowServiceExceptionOnModifyIfDatabaseUpdateErrorOccursAndLogI…
DilmurodDeveloper Jul 21, 2025
fa17fff
ShouldThrowServiceExceptionOnModifyIfDatabaseUpdateErrorOccursAndLogI…
DilmurodDeveloper Jul 21, 2025
6cd3869
CODE RUB: Implement TryCatch
DilmurodDeveloper Jul 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
//-----------------------------------------------------------
// Copyright (c) Coalition of Good-Hearted Engineers
// Free To Use To Build Reliable Library Management Solutions
//-----------------------------------------------------------

using FluentAssertions;
using LibraryManagement.Api.Models.Foundations.Readers;
using LibraryManagement.Api.Models.Foundations.Readers.Exceptions;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Moq;

namespace LibraryManagement.Api.Tests.Unit.Services.Foundations.Readers
{
public partial class ReaderServiceTests
{
[Fact]
public async Task ShouldThrowCriticalDependencyExceptionOnModifyIfSqlErrorOccursAndLogItAsync()
{
// given
Reader randomReader = CreateRandomReader();
Reader someReader = randomReader;
Guid readerId = someReader.ReaderId;
SqlException sqlException = GetSqlError();

var failedReaderStorageException =
new FailedReaderStorageException(sqlException);

var expectedReaderDependencyException =
new ReaderDependencyException(failedReaderStorageException);

this.storageBrokerMock.Setup(broker =>
broker.SelectReaderByIdAsync(readerId))
.Throws(sqlException);

// when
ValueTask<Reader> modifyReaderTask =
this.readerService.ModifyReaderAsync(someReader);

ReaderDependencyException actualReaderDependencyException =
await Assert.ThrowsAsync<ReaderDependencyException>(() =>
modifyReaderTask.AsTask());

// then
actualReaderDependencyException.Should()
.BeEquivalentTo(expectedReaderDependencyException);

this.loggingBrokerMock.Verify(broker =>
broker.LogCritical(It.Is(SameExceptionAs(
expectedReaderDependencyException))),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.SelectReaderByIdAsync(readerId),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.UpdateReaderAsync(someReader),
Times.Never);

this.loggingBrokerMock.VerifyNoOtherCalls();
this.storageBrokerMock.VerifyNoOtherCalls();
}

[Fact]
public async Task ShouldThrowDependencyExceptionOnModifyIfDatabaseUpdateExceptionOccursAndLogItAsync()
{
// given
Reader randomReader = CreateRandomReader();
Reader someReader = randomReader;
Guid readerId = someReader.ReaderId;
var databaseUpdateException = new DbUpdateException();

var failedReaderStorageException =
new FailedReaderStorageException(databaseUpdateException);

var expectedReaderDependencyException =
new ReaderDependencyException(failedReaderStorageException);

this.storageBrokerMock.Setup(broker =>
broker.SelectReaderByIdAsync(readerId))
.Throws(databaseUpdateException);

// when
ValueTask<Reader> modifyReaderTask =
this.readerService.ModifyReaderAsync(someReader);

ReaderDependencyException actualReaderDependencyException =
await Assert.ThrowsAsync<ReaderDependencyException>(() =>
modifyReaderTask.AsTask());

// then
actualReaderDependencyException.Should()
.BeEquivalentTo(expectedReaderDependencyException);

this.loggingBrokerMock.Verify(broker =>
broker.LogError(It.Is(SameExceptionAs(
expectedReaderDependencyException))),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.SelectReaderByIdAsync(readerId),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.UpdateReaderAsync(someReader),
Times.Never);

this.loggingBrokerMock.VerifyNoOtherCalls();
this.storageBrokerMock.VerifyNoOtherCalls();
}

[Fact]
public async Task ShouldThrowDependencyValidationExceptionOnModifyIfDatabaseUpdateConcurrencyErrorOccursAndLogItAsync()
{
// given
Reader randomReader = CreateRandomReader();
Reader someReader = randomReader;
Guid readerId = someReader.ReaderId;
var dbUpdateConcurrencyException = new DbUpdateConcurrencyException();

var lockedReaderException =
new LockedReaderException(dbUpdateConcurrencyException);

var expectedReaderDependencyValidationException =
new ReaderDependencyValidationException(lockedReaderException);

this.storageBrokerMock.Setup(broker =>
broker.SelectReaderByIdAsync(readerId))
.Throws(dbUpdateConcurrencyException);

// when
ValueTask<Reader> modifyReaderTask =
this.readerService.ModifyReaderAsync(someReader);

ReaderDependencyValidationException actualReaderDependencyValidationException =
await Assert.ThrowsAsync<ReaderDependencyValidationException>(() =>
modifyReaderTask.AsTask());

// then
actualReaderDependencyValidationException.Should()
.BeEquivalentTo(expectedReaderDependencyValidationException);

this.loggingBrokerMock.Verify(broker =>
broker.LogError(It.Is(SameExceptionAs(
expectedReaderDependencyValidationException))),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.SelectReaderByIdAsync(readerId),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.UpdateReaderAsync(someReader),
Times.Never);

this.loggingBrokerMock.VerifyNoOtherCalls();
this.storageBrokerMock.VerifyNoOtherCalls();
}

[Fact]
public async Task ShouldThrowServiceExceptionOnModifyIfDatabaseUpdateErrorOccursAndLogItAsync()
{
// given
Reader randomReader = CreateRandomReader();
Reader someReader = randomReader;
Guid readerId = someReader.ReaderId;
var serviceException = new Exception();

var failedReaderServiceException =
new FailedReaderServiceException(serviceException);

var expectedReaderServiceException =
new ReaderServiceException(failedReaderServiceException);

this.storageBrokerMock.Setup(broker =>
broker.SelectReaderByIdAsync(readerId))
.Throws(serviceException);

// when
ValueTask<Reader> modifyReaderTask =
this.readerService.ModifyReaderAsync(someReader);

ReaderServiceException actualReaderServiceException =
await Assert.ThrowsAsync<ReaderServiceException>(() =>
modifyReaderTask.AsTask());

// then
actualReaderServiceException.Should()
.BeEquivalentTo(expectedReaderServiceException);

this.loggingBrokerMock.Verify(broker =>
broker.LogError(It.Is(SameExceptionAs(
expectedReaderServiceException))),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.SelectReaderByIdAsync(readerId),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.UpdateReaderAsync(someReader),
Times.Never);

this.loggingBrokerMock.VerifyNoOtherCalls();
this.storageBrokerMock.VerifyNoOtherCalls();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//-----------------------------------------------------------
// Copyright (c) Coalition of Good-Hearted Engineers
// Free To Use To Build Reliable Library Management Solutions
//-----------------------------------------------------------

using FluentAssertions;
using Force.DeepCloner;
using LibraryManagement.Api.Models.Foundations.Readers;
using Moq;

namespace LibraryManagement.Api.Tests.Unit.Services.Foundations.Readers
{
public partial class ReaderServiceTests
{
[Fact]
public async Task ShouldModifyReaderAsync()
{
// given
Reader randomReader = CreateRandomReader();
Reader inputReader = randomReader;
Reader persistedReader = inputReader.DeepClone();
Reader updatedReader = inputReader;
Reader expectedReader = updatedReader.DeepClone();
Guid InputReaderId = inputReader.ReaderId;

this.storageBrokerMock.Setup(broker =>
broker.SelectReaderByIdAsync(InputReaderId))
.ReturnsAsync(persistedReader);

this.storageBrokerMock.Setup(broker =>
broker.UpdateReaderAsync(inputReader))
.ReturnsAsync(updatedReader);

// when
Reader actualReader =
await this.readerService
.ModifyReaderAsync(inputReader);

// then
actualReader.Should().BeEquivalentTo(expectedReader);

this.storageBrokerMock.Verify(broker =>
broker.SelectReaderByIdAsync(InputReaderId),
Times.Once);

this.storageBrokerMock.Verify(broker =>
broker.UpdateReaderAsync(inputReader),
Times.Once);

this.storageBrokerMock.VerifyNoOtherCalls();
this.loggingBrokerMock.VerifyNoOtherCalls();
}
}
}
Loading
Loading