fix: изменение нэйминга, добавление тестов для отчетов

This commit is contained in:
2025-05-20 22:45:18 +04:00
parent 109639617e
commit 23a5de4e3e
5 changed files with 409 additions and 12 deletions

View File

@@ -89,7 +89,7 @@ internal static class BankDbContextExtension
string? name = "bankrot", string? name = "bankrot",
decimal cost = 1_000_000, decimal cost = 1_000_000,
decimal maxCost = 10_000_000, decimal maxCost = 10_000_000,
string? storeleeperId = null, string? storekeeperId = null,
string? periodId = null, string? periodId = null,
List<(string currencyId, string creditProgramId)>? creditProgramCurrency = null // Item1 = ClientId Item2 = CreditProgramId List<(string currencyId, string creditProgramId)>? creditProgramCurrency = null // Item1 = ClientId Item2 = CreditProgramId
) )
@@ -100,7 +100,7 @@ internal static class BankDbContextExtension
Name = name, Name = name,
Cost = cost, Cost = cost,
MaxCost = maxCost, MaxCost = maxCost,
StorekeeperId = storeleeperId ?? Guid.NewGuid().ToString(), StorekeeperId = storekeeperId ?? Guid.NewGuid().ToString(),
PeriodId = periodId ?? Guid.NewGuid().ToString(), PeriodId = periodId ?? Guid.NewGuid().ToString(),
}; };
dbContext.CreditPrograms.Add(creditProgram); dbContext.CreditPrograms.Add(creditProgram);

View File

@@ -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<IClientStorageContract> _clientStorage;
private Mock<ICurrencyStorageContract> _currencyStorage;
private Mock<ICreditProgramStorageContract> _creditProgramStorage;
private Mock<IDepositStorageContract> _depositStorage;
private Mock<BaseWordBuilder> _baseWordBuilder;
private Mock<BaseExcelBuilder> _baseExcelBuilder;
private Mock<BasePdfBuilder> _basePdfBuilder;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_clientStorage = new Mock<IClientStorageContract>();
_currencyStorage = new Mock<ICurrencyStorageContract>();
_creditProgramStorage = new Mock<ICreditProgramStorageContract>();
_depositStorage = new Mock<IDepositStorageContract>();
_baseWordBuilder = new Mock<BaseWordBuilder>();
_baseExcelBuilder = new Mock<BaseExcelBuilder>();
_basePdfBuilder = new Mock<BasePdfBuilder>();
_reportContract = new ReportContract(_clientStorage.Object, _currencyStorage.Object, _creditProgramStorage.Object, _depositStorage.Object,
_baseWordBuilder.Object, _baseExcelBuilder.Object, _basePdfBuilder.Object, new Mock<ILogger>().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<string>(), It.IsAny<string>()))
.Returns(new List<CreditProgramDataModel>
{
new CreditProgramDataModel("1", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1", 100, 200, "sk", "p", new List<CreditProgramCurrencyDataModel>())
});
_depositStorage.Setup(x => x.GetList(It.IsAny<string>()))
.Returns(new List<DepositDataModel>
{
new DepositDataModel("d1", 5, 1000, 12, "cl", new List<DepositCurrencyDataModel>())
});
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<string>(), It.IsAny<string>()))
.Returns(new List<CreditProgramDataModel>
{
new CreditProgramDataModel("1", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1", 100, 200, "sk", "p", new List<CreditProgramCurrencyDataModel>())
});
_depositStorage.Setup(x => x.GetList(It.IsAny<string>()))
.Returns(new List<DepositDataModel>
{
new DepositDataModel("d1", 5, 1000, 12, "cl", new List<DepositCurrencyDataModel>())
});
_baseWordBuilder.Setup(x => x.AddHeader(It.IsAny<string>())).Returns(_baseWordBuilder.Object);
_baseWordBuilder.Setup(x => x.AddTable(It.IsAny<int[]>(), It.IsAny<List<string[]>>())).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<string>()), Times.Once);
_baseWordBuilder.Verify(x => x.AddTable(It.IsAny<int[]>(), It.IsAny<List<string[]>>()), 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<string>()))
.Returns(new List<ClientDataModel>
{
new("1", "<22><><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 1000, "cl", new(), new())
});
_depositStorage.Setup(x => x.GetListAsync(dateStart, dateFinish, ct))
.ReturnsAsync(new List<DepositDataModel>
{
new("d1", 5, 1000, 12, "cl", new())
});
_basePdfBuilder.Setup(x => x.AddHeader(It.IsAny<string>())).Returns(_basePdfBuilder.Object);
_basePdfBuilder.Setup(x => x.AddParagraph(It.IsAny<string>())).Returns(_basePdfBuilder.Object);
_basePdfBuilder.Setup(x => x.CreateTable(It.IsAny<int[]>(), It.IsAny<List<string[]>>())).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<string>()), Times.Once);
_basePdfBuilder.Verify(x => x.AddParagraph(It.IsAny<string>()), Times.Once);
_basePdfBuilder.Verify(x => x.CreateTable(It.IsAny<int[]>(), It.IsAny<List<string[]>>()), Times.Once);
_basePdfBuilder.Verify(x => x.Build(), Times.Once);
}
}

View File

@@ -32,7 +32,7 @@ internal class ClientStorageContractTests : BaseStorageContractTest
_periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id; _periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id;
_creditProgramId = BankDbContext _creditProgramId = BankDbContext
.InsertCreditProgramToDatabaseAndReturn( .InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
periodId: _periodId periodId: _periodId
) )
.Id; .Id;

View File

@@ -42,18 +42,18 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
{ {
var creditProgramId = Guid.NewGuid().ToString(); var creditProgramId = Guid.NewGuid().ToString();
var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn( var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
periodId: _periodId, periodId: _periodId,
creditProgramCurrency: [( _currenyId, creditProgramId )] creditProgramCurrency: [( _currenyId, creditProgramId )]
); );
BankDbContext.InsertCreditProgramToDatabaseAndReturn( BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "bankrot2", name: "bankrot2",
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
periodId: _periodId periodId: _periodId
); );
BankDbContext.InsertCreditProgramToDatabaseAndReturn( BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "bankrot3", name: "bankrot3",
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
periodId: _periodId periodId: _periodId
); );
@@ -75,7 +75,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
public void Try_GetElementById_WhenHaveRecord_Test() public void Try_GetElementById_WhenHaveRecord_Test()
{ {
var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn( var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
periodId: _periodId periodId: _periodId
); );
AssertElement(_storageContract.GetElementById(creditProgram.Id), creditProgram); AssertElement(_storageContract.GetElementById(creditProgram.Id), creditProgram);
@@ -100,7 +100,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
BankDbContext.InsertCreditProgramToDatabaseAndReturn( BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "1", name: "1",
periodId: _periodId, periodId: _periodId,
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)] creditProgramCurrency: [(_currenyId, credit.Id)]
); );
Assert.That( Assert.That(
@@ -120,7 +120,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
BankDbContext.InsertCreditProgramToDatabaseAndReturn( BankDbContext.InsertCreditProgramToDatabaseAndReturn(
credit.Id, credit.Id,
periodId: _periodId, periodId: _periodId,
storeleeperId: _storekeeperId, storekeeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)] creditProgramCurrency: [(_currenyId, credit.Id)]
); );
_storageContract.UpdElement(credit); _storageContract.UpdElement(credit);

View File

@@ -1,4 +1,6 @@
using BankTests.Infrastructure; using BankContracts.ViewModels;
using BankDatabase.Models;
using BankTests.Infrastructure;
using System.Net; using System.Net;
namespace BankTests.WebApiControllersTests; namespace BankTests.WebApiControllersTests;
@@ -15,10 +17,276 @@ internal class ReportControllerTests : BaseWebApiControllerTest
BankDbContext.RemoveCurrenciesFromDatabase(); BankDbContext.RemoveCurrenciesFromDatabase();
} }
[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<List<DepositByCreditProgramViewModel>>(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] [Test]
public async Task LoadDepositByCreditProgram_WhenHaveRecords_ShouldSuccess_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 = "") private static async Task AssertStreamAsync(HttpResponseMessage response, string fileNameForSave = "")
{ {
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));