From 23a5de4e3e5ffaa69533dd72e361b660b3cd001b Mon Sep 17 00:00:00 2001 From: xom9k Date: Tue, 20 May 2025 22:45:18 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D1=8D=D0=B9=D0=BC=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=D0=B0,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Infrastructure/BankDbContextExtension.cs | 4 +- .../ReportContractTests.cs | 129 +++++++++ .../ClientStorageContractTests.cs | 2 +- .../CreditProgramStorageContractTests.cs | 12 +- .../ReportControllerTests.cs | 274 +++++++++++++++++- 5 files changed, 409 insertions(+), 12 deletions(-) create mode 100644 TheBank/BankTests/ReportContractTests/ReportContractTests.cs diff --git a/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs b/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs index 8b857c0..7b5fe36 100644 --- a/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs +++ b/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs @@ -89,7 +89,7 @@ internal static class BankDbContextExtension string? name = "bankrot", decimal cost = 1_000_000, decimal maxCost = 10_000_000, - string? storeleeperId = null, + string? storekeeperId = null, string? periodId = null, List<(string currencyId, string creditProgramId)>? creditProgramCurrency = null // Item1 = ClientId Item2 = CreditProgramId ) @@ -100,7 +100,7 @@ internal static class BankDbContextExtension Name = name, Cost = cost, MaxCost = maxCost, - StorekeeperId = storeleeperId ?? Guid.NewGuid().ToString(), + StorekeeperId = storekeeperId ?? Guid.NewGuid().ToString(), PeriodId = periodId ?? Guid.NewGuid().ToString(), }; dbContext.CreditPrograms.Add(creditProgram); diff --git a/TheBank/BankTests/ReportContractTests/ReportContractTests.cs b/TheBank/BankTests/ReportContractTests/ReportContractTests.cs new file mode 100644 index 0000000..98c495b --- /dev/null +++ b/TheBank/BankTests/ReportContractTests/ReportContractTests.cs @@ -0,0 +1,129 @@ +using BankBusinessLogic.Implementations; +using BankBusinessLogic.OfficePackage; +using BankContracts.BusinessLogicContracts; +using BankContracts.DataModels; +using BankContracts.StorageContracts; +using BankDatabase.Implementations; +using BankTests.Infrastructure; +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using System.Text; + +namespace BankTests.ReportContractTests; + +[TestFixture] +internal class ReportContractTestss +{ + private ReportContract _reportContract; + private Mock _clientStorage; + private Mock _currencyStorage; + private Mock _creditProgramStorage; + private Mock _depositStorage; + private Mock _baseWordBuilder; + private Mock _baseExcelBuilder; + private Mock _basePdfBuilder; + + [OneTimeSetUp] + public void OneTimeSetUp() + { + _clientStorage = new Mock(); + _currencyStorage = new Mock(); + _creditProgramStorage = new Mock(); + _depositStorage = new Mock(); + _baseWordBuilder = new Mock(); + _baseExcelBuilder = new Mock(); + _basePdfBuilder = new Mock(); + _reportContract = new ReportContract(_clientStorage.Object, _currencyStorage.Object, _creditProgramStorage.Object, _depositStorage.Object, + _baseWordBuilder.Object, _baseExcelBuilder.Object, _basePdfBuilder.Object, new Mock().Object); + } + + [SetUp] + public void SetUp() + { + _clientStorage.Reset(); + _currencyStorage.Reset(); + _creditProgramStorage.Reset(); + _depositStorage.Reset(); + } + + [Test] + public async Task GetDataDepositByCreditProgramAsync_ReturnsData() + { + var ct = CancellationToken.None; + _creditProgramStorage.Setup(x => x.GetList(It.IsAny(), It.IsAny())) + .Returns(new List + { + new CreditProgramDataModel("1", " 1", 100, 200, "sk", "p", new List()) + }); + _depositStorage.Setup(x => x.GetList(It.IsAny())) + .Returns(new List + { + new DepositDataModel("d1", 5, 1000, 12, "cl", new List()) + }); + + var result = await _reportContract.GetDataDepositByCreditProgramAsync(ct); + + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.GreaterThanOrEqualTo(0)); + } + + [Test] + public async Task CreateDocumentDepositByCreditProgramAsync_CallsWordBuilder() + { + var ct = CancellationToken.None; + _creditProgramStorage.Setup(x => x.GetList(It.IsAny(), It.IsAny())) + .Returns(new List + { + new CreditProgramDataModel("1", " 1", 100, 200, "sk", "p", new List()) + }); + _depositStorage.Setup(x => x.GetList(It.IsAny())) + .Returns(new List + { + new DepositDataModel("d1", 5, 1000, 12, "cl", new List()) + }); + + _baseWordBuilder.Setup(x => x.AddHeader(It.IsAny())).Returns(_baseWordBuilder.Object); + _baseWordBuilder.Setup(x => x.AddTable(It.IsAny(), It.IsAny>())).Returns(_baseWordBuilder.Object); + _baseWordBuilder.Setup(x => x.Build()).Returns(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var stream = await _reportContract.CreateDocumentDepositByCreditProgramAsync(ct); + + Assert.That(stream, Is.Not.Null); + _baseWordBuilder.Verify(x => x.AddHeader(It.IsAny()), Times.Once); + _baseWordBuilder.Verify(x => x.AddTable(It.IsAny(), It.IsAny>()), Times.Once); + _baseWordBuilder.Verify(x => x.Build(), Times.Once); + } + + [Test] + public async Task CreateDocumentClientsByDepositAsync_CallsPdfBuilder() + { + var ct = CancellationToken.None; + var dateStart = new DateTime(2024, 1, 1); + var dateFinish = new DateTime(2024, 12, 31); + + _clientStorage.Setup(x => x.GetList(It.IsAny())) + .Returns(new List + { + new("1", "", "", 1000, "cl", new(), new()) + }); + _depositStorage.Setup(x => x.GetListAsync(dateStart, dateFinish, ct)) + .ReturnsAsync(new List + { + new("d1", 5, 1000, 12, "cl", new()) + }); + + _basePdfBuilder.Setup(x => x.AddHeader(It.IsAny())).Returns(_basePdfBuilder.Object); + _basePdfBuilder.Setup(x => x.AddParagraph(It.IsAny())).Returns(_basePdfBuilder.Object); + _basePdfBuilder.Setup(x => x.CreateTable(It.IsAny(), It.IsAny>())).Returns(_basePdfBuilder.Object); + _basePdfBuilder.Setup(x => x.Build()).Returns(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var stream = await _reportContract.CreateDocumentClientsByDepositAsync(dateStart, dateFinish, ct); + + Assert.That(stream, Is.Not.Null); + _basePdfBuilder.Verify(x => x.AddHeader(It.IsAny()), Times.Once); + _basePdfBuilder.Verify(x => x.AddParagraph(It.IsAny()), Times.Once); + _basePdfBuilder.Verify(x => x.CreateTable(It.IsAny(), It.IsAny>()), Times.Once); + _basePdfBuilder.Verify(x => x.Build(), Times.Once); + } +} \ No newline at end of file diff --git a/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs b/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs index 09dd5e6..21546e1 100644 --- a/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs +++ b/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs @@ -32,7 +32,7 @@ internal class ClientStorageContractTests : BaseStorageContractTest _periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id; _creditProgramId = BankDbContext .InsertCreditProgramToDatabaseAndReturn( - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, periodId: _periodId ) .Id; diff --git a/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs b/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs index 7bd8e6c..7d59c9c 100644 --- a/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs +++ b/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs @@ -42,18 +42,18 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest { var creditProgramId = Guid.NewGuid().ToString(); var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn( - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, periodId: _periodId, creditProgramCurrency: [( _currenyId, creditProgramId )] ); BankDbContext.InsertCreditProgramToDatabaseAndReturn( name: "bankrot2", - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, periodId: _periodId ); BankDbContext.InsertCreditProgramToDatabaseAndReturn( name: "bankrot3", - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, periodId: _periodId ); @@ -75,7 +75,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest public void Try_GetElementById_WhenHaveRecord_Test() { var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn( - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, periodId: _periodId ); AssertElement(_storageContract.GetElementById(creditProgram.Id), creditProgram); @@ -100,7 +100,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest BankDbContext.InsertCreditProgramToDatabaseAndReturn( name: "1", periodId: _periodId, - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, creditProgramCurrency: [(_currenyId, credit.Id)] ); Assert.That( @@ -120,7 +120,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest BankDbContext.InsertCreditProgramToDatabaseAndReturn( credit.Id, periodId: _periodId, - storeleeperId: _storekeeperId, + storekeeperId: _storekeeperId, creditProgramCurrency: [(_currenyId, credit.Id)] ); _storageContract.UpdElement(credit); diff --git a/TheBank/BankTests/WebApiControllersTests/ReportControllerTests.cs b/TheBank/BankTests/WebApiControllersTests/ReportControllerTests.cs index fd1e0a2..d777257 100644 --- a/TheBank/BankTests/WebApiControllersTests/ReportControllerTests.cs +++ b/TheBank/BankTests/WebApiControllersTests/ReportControllerTests.cs @@ -1,4 +1,6 @@ -using BankTests.Infrastructure; +using BankContracts.ViewModels; +using BankDatabase.Models; +using BankTests.Infrastructure; using System.Net; namespace BankTests.WebApiControllersTests; @@ -16,9 +18,275 @@ internal class ReportControllerTests : BaseWebApiControllerTest } [Test] - public async Task LoadDepositByCreditProgram_WhenHaveRecords_ShouldSuccess_Test() - { + public async Task GetDepositByCreditProgram_WhenHaveRecords_ShouldSuccess_Test() + { + //Arrange + var storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn( + email: $"storekeeper_{Guid.NewGuid()}@email.com", + login: $"storekeeper_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + var period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: storekeeper.Id); + + // Создаем валюты + var currency1 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Рубль", + abbreviation: "RUB", + storekeeperId: storekeeper.Id + ); + var currency2 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Доллар", + abbreviation: "USD", + storekeeperId: storekeeper.Id + ); + + // Создаем кредитные программы и связываем их с валютами + var creditProgram1 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 1", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency1.Id, Guid.NewGuid().ToString())] + ); + var creditProgram2 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 2", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency2.Id, Guid.NewGuid().ToString())] + ); + + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn( + email: $"clerk_{Guid.NewGuid()}@email.com", + login: $"clerk_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + + // Создаем вклады и связываем их с валютами + var deposit1 = BankDbContext.InsertDepositToDatabaseAndReturn( + interestRate: 5.5f, + cost: 10000, + period: 12, + clerkId: clerk.Id + ); + var deposit2 = BankDbContext.InsertDepositToDatabaseAndReturn( + interestRate: 6.5f, + cost: 20000, + period: 24, + clerkId: clerk.Id + ); + + // Связываем вклады с валютами + BankDbContext.DepositCurrencies.Add(new DepositCurrency { DepositId = deposit1.Id, CurrencyId = currency1.Id }); + BankDbContext.DepositCurrencies.Add(new DepositCurrency { DepositId = deposit2.Id, CurrencyId = currency2.Id }); + BankDbContext.SaveChanges(); + + //Act + var response = await HttpClient.GetAsync("/api/report/getdepositbycreditprogram"); + var result = await GetModelFromResponseAsync>(response); + + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + Assert.That(result, Is.Not.Null); + Assert.That(result, Has.Count.EqualTo(2)); + + var firstProgram = result.First(x => x.CreditProgramName == "Credit Program 1"); + Assert.That(firstProgram.DepositRate, Has.Count.EqualTo(1)); + Assert.That(firstProgram.DepositRate[0], Is.EqualTo(5.5f)); + Assert.That(firstProgram.DepositCost[0], Is.EqualTo(10000)); + Assert.That(firstProgram.DepositPeriod[0], Is.EqualTo(12)); + + var secondProgram = result.First(x => x.CreditProgramName == "Credit Program 2"); + Assert.That(secondProgram.DepositRate, Has.Count.EqualTo(1)); + Assert.That(secondProgram.DepositRate[0], Is.EqualTo(6.5f)); + Assert.That(secondProgram.DepositCost[0], Is.EqualTo(20000)); + Assert.That(secondProgram.DepositPeriod[0], Is.EqualTo(24)); } + + [Test] + public async Task LoadDepositByCreditProgram_WhenNoData_ShouldBadRequest_Test() + { + //Arrange + var storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn( + email: $"storekeeper_{Guid.NewGuid()}@email.com", + login: $"storekeeper_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + var period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: storekeeper.Id); + + // Создаем валюты + var currency = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Рубль", + abbreviation: "RUB", + storekeeperId: storekeeper.Id + ); + + // Создаем кредитную программу и связываем её с валютой + var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 1", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency.Id, Guid.NewGuid().ToString())] + ); + + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn( + email: $"clerk_{Guid.NewGuid()}@email.com", + login: $"clerk_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + + // Создаем вклад, но НЕ связываем его с валютой + var deposit = BankDbContext.InsertDepositToDatabaseAndReturn( + interestRate: 5.5f, + cost: 10000, + period: 12, + clerkId: clerk.Id + ); + + BankDbContext.SaveChanges(); + + //Act + var response = await HttpClient.GetAsync("/api/report/loaddepositbycreditprogram"); + + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task LoadDepositByCreditProgram_WhenHaveRecords_ShouldSuccess_Test() + { + //Arrange + var storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn( + email: $"storekeeper_{Guid.NewGuid()}@email.com", + login: $"storekeeper_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + var period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: storekeeper.Id); + + // Создаем валюты + var currency1 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Рубль", + abbreviation: "RUB", + storekeeperId: storekeeper.Id + ); + var currency2 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Доллар", + abbreviation: "USD", + storekeeperId: storekeeper.Id + ); + + // Создаем кредитные программы и связываем их с валютами + var creditProgram1 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 1", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency1.Id, Guid.NewGuid().ToString())] + ); + var creditProgram2 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 2", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency2.Id, Guid.NewGuid().ToString())] + ); + + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn( + email: $"clerk_{Guid.NewGuid()}@email.com", + login: $"clerk_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + + // Создаем вклады и связываем их с валютами + var deposit1 = BankDbContext.InsertDepositToDatabaseAndReturn( + interestRate: 5.5f, + cost: 10000, + period: 12, + clerkId: clerk.Id + ); + var deposit2 = BankDbContext.InsertDepositToDatabaseAndReturn( + interestRate: 6.5f, + cost: 20000, + period: 24, + clerkId: clerk.Id + ); + + // Связываем вклады с валютами + BankDbContext.DepositCurrencies.Add(new DepositCurrency { DepositId = deposit1.Id, CurrencyId = currency1.Id }); + BankDbContext.DepositCurrencies.Add(new DepositCurrency { DepositId = deposit2.Id, CurrencyId = currency2.Id }); + BankDbContext.SaveChanges(); + + //Act + var response = await HttpClient.GetAsync("/api/report/loaddepositbycreditprogram"); + + //Assert + await AssertStreamAsync(response, "deposit_by_credit_program.docx"); + } + + [Test] + public async Task LoadClientsByCreditProgram_WhenHaveRecords_ShouldSuccess_Test() + { + //Arrange + var storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn( + email: $"storekeeper_{Guid.NewGuid()}@email.com", + login: $"storekeeper_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn( + email: $"clerk_{Guid.NewGuid()}@email.com", + login: $"clerk_{Guid.NewGuid()}", + phone: $"+7-{Guid.NewGuid():N}" + ); + var period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: storekeeper.Id); + + // Создаем валюты + var currency1 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Рубль", + abbreviation: "RUB", + storekeeperId: storekeeper.Id + ); + var currency2 = BankDbContext.InsertCurrencyToDatabaseAndReturn( + name: "Доллар", + abbreviation: "USD", + storekeeperId: storekeeper.Id + ); + + // Создаем кредитные программы и связываем их с валютами + var creditProgram1 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 1", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency1.Id, Guid.NewGuid().ToString())] + ); + var creditProgram2 = BankDbContext.InsertCreditProgramToDatabaseAndReturn( + name: "Credit Program 2", + storekeeperId: storekeeper.Id, + periodId: period.Id, + creditProgramCurrency: [(currency2.Id, Guid.NewGuid().ToString())] + ); + + // Создаем клиентов + var client1 = BankDbContext.InsertClientToDatabaseAndReturn( + surname: "Ivanov", + name: "Ivan", + balance: 10000, + clerkId: clerk.Id + ); + var client2 = BankDbContext.InsertClientToDatabaseAndReturn( + surname: "Petrov", + name: "Petr", + balance: 20000, + clerkId: clerk.Id + ); + + // Связываем клиентов с кредитными программами + BankDbContext.CreditProgramClients.Add(new ClientCreditProgram { ClientId = client1.Id, CreditProgramId = creditProgram1.Id }); + BankDbContext.CreditProgramClients.Add(new ClientCreditProgram { ClientId = client2.Id, CreditProgramId = creditProgram2.Id }); + BankDbContext.SaveChanges(); + + //Act + var response = await HttpClient.GetAsync("/api/report/loadclientsbycreditprogram"); + + //Assert + await AssertStreamAsync(response, "clients_by_credit_program.docx"); + } + private static async Task AssertStreamAsync(HttpResponseMessage response, string fileNameForSave = "") { Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));