From 46bfedef8df35f8bbeecd29c6513f7a0b21be4ef Mon Sep 17 00:00:00 2001 From: DjonniStorm Date: Mon, 28 Apr 2025 13:10:31 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit добавление двух с половиной классов тестов, пока не проверяет многие ко многим --- .../DepositBusinessLogicContract.cs | 7 +- .../Implementations/ClerkStorageContract.cs | 5 + .../Implementations/ClientStorageContract.cs | 3 +- .../Infrastructure/BankDbContextExtension.cs | 77 +++++++++++ .../ClerkStorageContractTests.cs | 36 ++++- .../ClientStorageContractTests.cs | 125 ++++++++++++++++++ .../CreditProgramStorageContractTests.cs | 101 ++++++++++++++ 7 files changed, 348 insertions(+), 6 deletions(-) create mode 100644 TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs create mode 100644 TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs diff --git a/TheBank/BankBusinessLogic/Implementations/DepositBusinessLogicContract.cs b/TheBank/BankBusinessLogic/Implementations/DepositBusinessLogicContract.cs index af3ee85..cbe5702 100644 --- a/TheBank/BankBusinessLogic/Implementations/DepositBusinessLogicContract.cs +++ b/TheBank/BankBusinessLogic/Implementations/DepositBusinessLogicContract.cs @@ -5,6 +5,7 @@ using BankContracts.Exceptions; using BankContracts.Extensions; using BankContracts.StorageContracts; using Microsoft.Extensions.Logging; +using static System.Single; namespace BankBusinessLogic.Implementations; @@ -57,8 +58,10 @@ internal class DepositBusinessLogicContract( return _depositStorageContract.GetElementById(data) ?? throw new ElementNotFoundException($"element not found: {data}"); } - return _depositStorageContract.GetElementByInterestRate(data) - ?? throw new ElementNotFoundException($"element not found: {data}"); + return TryParse(data, out var result) // пофиксить!!! + ? _depositStorageContract.GetElementByInterestRate(result) ?? + throw new ElementNotFoundException($"element not found: {data}") + : throw new ElementNotFoundException($"element not found: {data}"); } public void InsertDeposit(DepositDataModel depositDataModel) diff --git a/TheBank/BankDatabase/Implementations/ClerkStorageContract.cs b/TheBank/BankDatabase/Implementations/ClerkStorageContract.cs index 3b14be5..73f95ac 100644 --- a/TheBank/BankDatabase/Implementations/ClerkStorageContract.cs +++ b/TheBank/BankDatabase/Implementations/ClerkStorageContract.cs @@ -120,6 +120,11 @@ internal class ClerkStorageContract : IClerkStorageContract _dbContext.Clerks.Update(_mapper.Map(clerkDataModel, element)); _dbContext.SaveChanges(); } + catch (ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Clerks_Email" }) { _dbContext.ChangeTracker.Clear(); diff --git a/TheBank/BankDatabase/Implementations/ClientStorageContract.cs b/TheBank/BankDatabase/Implementations/ClientStorageContract.cs index fd877d4..9e26801 100644 --- a/TheBank/BankDatabase/Implementations/ClientStorageContract.cs +++ b/TheBank/BankDatabase/Implementations/ClientStorageContract.cs @@ -31,7 +31,7 @@ internal class ClientStorageContract : IClientStorageContract { try { - var query = _dbContext.Deposits.Include(x => x.Clerk).AsQueryable(); + var query = _dbContext.Clients.Include(x => x.Clerk).AsQueryable(); if (clerkId is not null) { query = query.Where(x => x.ClerkId == clerkId); @@ -137,6 +137,7 @@ internal class ClientStorageContract : IClientStorageContract element.DepositClients = _mapper.Map>(clientDataModel.Deposits); element.DepositClients = _mapper.Map>(clientDataModel.CreditPrograms); } + _mapper.Map(element, clientDataModel); _dbContext.SaveChanges(); transaction.Commit(); } diff --git a/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs b/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs index 4f42168..6afb5d0 100644 --- a/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs +++ b/TheBank/BankTests/Infrastructure/BankDbContextExtension.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using BankDatabase.Models; using BankDatabase; +using System.Xml.Linq; namespace BankTests.Infrastructure; @@ -24,9 +25,85 @@ internal static class BankDbContextExtension return clerck; } + public static Client InsertClientToDatabaseAndReturn(this BankDbContext dbContext, string? id = null, string? name = "slava", string? surname = "fomichev", decimal balance = 1_000_000, string? clerkId = null) + { + var client = new Client() + { + Id = id ?? Guid.NewGuid().ToString(), + Name = name, + Surname = surname, + Balance = balance, + ClerkId = clerkId ?? Guid.NewGuid().ToString(), + }; + dbContext.Clients.Add( client ); + dbContext.SaveChanges(); + return client; + } + + public static CreditProgram InsertCreditProgramToDatabaseAndReturn(this BankDbContext dbContext, string? id = null, string? name = "bankrot", decimal cost = 1_000_000, decimal maxCost = 10_000_000, string? storeleeperId = null, string? periodId = null) + { + var creditProgram = new CreditProgram() + { + Id = id ?? Guid.NewGuid().ToString(), + Name = name, + Cost = cost, + MaxCost = maxCost, + StorekeeperId = storeleeperId ?? Guid.NewGuid().ToString(), + PeriodId = periodId ?? Guid.NewGuid().ToString(), + }; + dbContext.CreditPrograms.Add(creditProgram); + dbContext.SaveChanges(); + return creditProgram; + } + + public static Storekeeper InsertStorekeeperToDatabaseAndReturn(this BankDbContext dbContext, + string? id = null, string? name = "slava", string? surname = "fomichev", string? middlename = "sergeevich", string? login = "xomyak", string? password = "****", string? email = "email@email.com", string? phone = "+9-888-888-88-88") + { + var storekeeper = new Storekeeper() + { + Id = id ?? Guid.NewGuid().ToString(), + Name = name, + Surname = surname, + MiddleName = middlename, + Login = login, + Password = password, + Email = email, + PhoneNumber = phone, + }; + dbContext.Storekeepers.Add(storekeeper); + dbContext.SaveChanges(); + return storekeeper; + } + + public static Period InsertPeriodToDatabaseAndReturn(this BankDbContext dbContext, string? id = null, DateTime? start = null, DateTime? end = null, string? storekeeperId = null) + { + var period = new Period() + { + Id = id ?? Guid.NewGuid().ToString(), + StartTime = start ?? DateTime.UtcNow, + EndTime = end ?? DateTime.UtcNow, + StorekeeperId = storekeeperId ?? Guid.NewGuid().ToString() + }; + dbContext.Periods.Add(period); + dbContext.SaveChanges(); + return period; + } + + public static void RemoveClientsFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Clients\" CASCADE"); + + public static void RemoveStorekeepersFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Storekeepers\" CASCADE"); + + public static void RemovePeriodsFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Periods\" CASCADE"); + public static void RemoveClerksFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Clerks\" CASCADE"); + public static void RemoveCreditProgramsFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"CreditPrograms\" CASCADE"); + + public static Client? GetClientFromDatabase(this BankDbContext dbContext, string id) => dbContext.Clients.FirstOrDefault(x => x.Id == id); + public static Clerk? GetClerkFromDatabase(this BankDbContext dbContext, string id) => dbContext.Clerks.FirstOrDefault(x => x.Id == id); + public static CreditProgram? GetCreditProgramFromDatabase(this BankDbContext dbContext, string id) => dbContext.CreditPrograms.FirstOrDefault(x => x.Id == id); + private static void ExecuteSqlRaw(this BankDbContext dbContext, string command) => dbContext.Database.ExecuteSqlRaw(command); } diff --git a/TheBank/BankTests/StorageContactsTests/ClerkStorageContractTests.cs b/TheBank/BankTests/StorageContactsTests/ClerkStorageContractTests.cs index c87f18b..428187a 100644 --- a/TheBank/BankTests/StorageContactsTests/ClerkStorageContractTests.cs +++ b/TheBank/BankTests/StorageContactsTests/ClerkStorageContractTests.cs @@ -4,7 +4,6 @@ using BankContracts.StorageContracts; using BankDatabase.Implementations; using BankDatabase.Models; using BankTests.Infrastructure; -using Microsoft.VisualStudio.CodeCoverage; namespace BankTests.StorageContactsTests; @@ -49,8 +48,8 @@ internal class ClerkStorageContractTests : BaseStorageContractTest [Test] public void Try_GetElementById_WhenHaveRecord_Test() { - var certificate = BankDbContext.InsertClerkToDatabaseAndReturn(); - AssertElement(_storageContract.GetElementById(certificate.Id), certificate); + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn(); + AssertElement(_storageContract.GetElementById(clerk.Id), clerk); } [Test] @@ -69,6 +68,37 @@ internal class ClerkStorageContractTests : BaseStorageContractTest Assert.That(() => _storageContract.AddElement(clerk), Throws.TypeOf()); } + [Test] + public void Try_AddElement_WhenHaveRecordWithSameEmail_Test() + { + var clerk = CreateModel(); + BankDbContext.InsertClerkToDatabaseAndReturn(email: clerk.Email); + Assert.That(() => _storageContract.AddElement(clerk), Throws.TypeOf()); + } + + [Test] + public void Try_AddElement_WhenHaveRecordWithSameLogin_Test() + { + var clerk = CreateModel(login: "cheburek"); + BankDbContext.InsertClerkToDatabaseAndReturn(email: "email@email.ru", login: "cheburek"); + Assert.That(() => _storageContract.AddElement(clerk), Throws.TypeOf()); + } + + [Test] + public void Try_UpdElement_Test() + { + var clerk = CreateModel(); + BankDbContext.InsertClerkToDatabaseAndReturn(clerk.Id, name: "Женя"); + _storageContract.UpdElement(clerk); + AssertElement(BankDbContext.GetClerkFromDatabase(clerk.Id), clerk); + } + + [Test] + public void Try_UpdElement_WhenNoRecordWithThisId_Test() + { + Assert.That(() => _storageContract.UpdElement(CreateModel()), Throws.TypeOf()); + } + private static ClerkDataModel CreateModel(string? id = null, string? name = "vasya", string? surname = "petrov", string? middlename = "petrovich", string? login = "vasyapupkin", string? passwd = "*******", string? email = "email@email.com", string? phone = "+7-777-777-77-77") => new (id ?? Guid.NewGuid().ToString(), name, surname, middlename, login, passwd, email, phone); diff --git a/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs b/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs new file mode 100644 index 0000000..1103b19 --- /dev/null +++ b/TheBank/BankTests/StorageContactsTests/ClientStorageContractTests.cs @@ -0,0 +1,125 @@ +using BankContracts.DataModels; +using BankContracts.Exceptions; +using BankContracts.StorageContracts; +using BankDatabase.Implementations; +using BankDatabase.Models; +using BankTests.Infrastructure; + +namespace BankTests.StorageContactsTests; + +[TestFixture] +internal class ClientStorageContractTests : BaseStorageContractTest +{ + private string _clerkId; + + private IClientStorageContract _clientStorageContract; + + [SetUp] + public void SetUp() + { + _clerkId = BankDbContext.InsertClerkToDatabaseAndReturn().Id; + _clientStorageContract = new ClientStorageContract(BankDbContext); + } + + [TearDown] + public void TearDown() + { + BankDbContext.RemoveClientsFromDatabase(); + BankDbContext.RemoveClerksFromDatabase(); + } + + [Test] + public void TryGetListWhenHaveRecords_ShouldSucces_Test() + { + var client = BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId); + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId); + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId); + + var list = _clientStorageContract.GetList(); + Assert.That(list, Is.Not.Null); + Assert.That(list, Has.Count.EqualTo(3)); + AssertElement(list.First(x => x.Id == client.Id), client); + } + + [Test] + public void TryGetList_WhenNoRecords_Test() + { + var list = _clientStorageContract.GetList(); + Assert.That(list, Is.Not.Null); + Assert.That(list, Is.Empty); + } + + [Test] + public void TryGetList_ByClerk_WhenHaveRecords_Test() + { + var clerk = BankDbContext.InsertClerkToDatabaseAndReturn(email: "slava@ilya.com", login: "login",phone: "+7-987-555-55-55"); + + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: clerk.Id); + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: clerk.Id); + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: clerk.Id); + BankDbContext.InsertClientToDatabaseAndReturn(clerkId: clerk.Id); + + var list = _clientStorageContract.GetList(clerkId: clerk.Id); + Assert.That(list, Is.Not.Null); + Assert.That(list, Has.Count.EqualTo(4)); + } + + [Test] + public void Try_GetElementById_WhenHaveRecord_Test() + { + var client = BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId); + AssertElement(_clientStorageContract.GetElementById(client.Id), client); + } + + [Test] + public void Try_AddElement_Test() + { + var client = CreateModel(_clerkId); + _clientStorageContract.AddElement(client); + AssertElement(BankDbContext.GetClientFromDatabase(client.Id), client); + } + + [Test] + public void Try_UpdElement_Test() + { + var client = CreateModel(_clerkId); + BankDbContext.InsertClientToDatabaseAndReturn(id: client.Id, clerkId: _clerkId); + _clientStorageContract.UpdElement(client); + AssertElement(BankDbContext.GetClientFromDatabase(client.Id), client); + } + + [Test] + public void Try_UpdElement_WhenNoRecordWithThisId_Test() + { + Assert.That(() => _clientStorageContract.UpdElement(CreateModel(_clerkId)), Throws.TypeOf()); + } + + private static ClientDataModel CreateModel(string clerkid, string? id = null, string? name = "null", string? surname = "surname", decimal balance = 1, List? depositClients = null, List? clientCredits = null) + => new(id ?? Guid.NewGuid().ToString(), name, surname, balance, clerkid, depositClients ?? [], clientCredits ?? []); + + private static void AssertElement(ClientDataModel actual, Client? expected) + { + Assert.That(expected, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Name, Is.EqualTo(expected.Name)); + Assert.That(actual.Surname, Is.EqualTo(expected.Surname)); + Assert.That(actual.Balance, Is.EqualTo(expected.Balance)); + Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId)); + }); + } + + private static void AssertElement(Client actual, ClientDataModel? expected) + { + Assert.That(expected, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Name, Is.EqualTo(expected.Name)); + Assert.That(actual.Surname, Is.EqualTo(expected.Surname)); + Assert.That(actual.Balance, Is.EqualTo(expected.Balance)); + Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId)); + }); + } +} diff --git a/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs b/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs new file mode 100644 index 0000000..5201dc4 --- /dev/null +++ b/TheBank/BankTests/StorageContactsTests/CreditProgramStorageContractTests.cs @@ -0,0 +1,101 @@ +using BankContracts.DataModels; +using BankContracts.StorageContracts; +using BankDatabase.Implementations; +using BankDatabase.Models; +using BankTests.Infrastructure; +using System.Xml.Linq; + +namespace BankTests.StorageContactsTests; + +[TestFixture] +internal class CreditProgramStorageContractTests : BaseStorageContractTest +{ + private ICreditProgramStorageContract _storageContract; + + private string _storekeeperId; + + private string _periodId; + + [SetUp] + public void SetUp() + { + _storageContract = new CreditProgramStorageContract(BankDbContext); + _storekeeperId = BankDbContext.InsertStorekeeperToDatabaseAndReturn().Id; + _periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id; + } + + [TearDown] + public void TearDown() + { + BankDbContext.RemoveCreditProgramsFromDatabase(); + BankDbContext.RemovePeriodsFromDatabase(); + BankDbContext.RemoveStorekeepersFromDatabase(); + } + + [Test] + public void TryGetListWhenHaveRecords_ShouldSucces_Test() + { + var clerk = BankDbContext.InsertCreditProgramToDatabaseAndReturn(storeleeperId: _storekeeperId, periodId: _periodId); + BankDbContext.InsertCreditProgramToDatabaseAndReturn(name: "bankrot2", storeleeperId: _storekeeperId, periodId: _periodId); + BankDbContext.InsertCreditProgramToDatabaseAndReturn(name: "bankrot3", storeleeperId: _storekeeperId, periodId: _periodId); + + var list = _storageContract.GetList(); + Assert.That(list, Is.Not.Null); + Assert.That(list, Has.Count.EqualTo(3)); + AssertElement(list.First(x => x.Id == clerk.Id), clerk); + } + + [Test] + public void Try_GetList_WhenNoRecords_Test() + { + var list = _storageContract.GetList(); + Assert.That(list, Is.Not.Null); + Assert.That(list, Is.Empty); + } + + [Test] + public void Try_GetElementById_WhenHaveRecord_Test() + { + var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn(storeleeperId: _storekeeperId, periodId: _periodId); + AssertElement(_storageContract.GetElementById(creditProgram.Id), creditProgram); + } + + [Test] + public void Try_AddElement_Test() + { + var credit = CreateModel(name: "unique name", periodId: _periodId, storekeeperId: _storekeeperId); + _storageContract.AddElement(credit); + AssertElement(BankDbContext.GetCreditProgramFromDatabase(credit.Id), credit); + } + + private static CreditProgramDataModel CreateModel(string? id = null, string? name = "name", decimal cost = 1, decimal maxCost = 2, string? storekeeperId = null, string? periodId = null, List? currency = null) + => new(id ?? Guid.NewGuid().ToString(), name, cost, maxCost, storekeeperId ?? Guid.NewGuid().ToString(), periodId ?? Guid.NewGuid().ToString(), currency ?? []); + + private static void AssertElement(CreditProgramDataModel actual, CreditProgram? expected) + { + Assert.That(expected, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Name, Is.EqualTo(expected.Name)); + Assert.That(actual.Cost, Is.EqualTo(expected.Cost)); + Assert.That(actual.MaxCost, Is.EqualTo(expected.MaxCost)); + Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId)); + Assert.That(actual.PeriodId, Is.EqualTo(expected.PeriodId)); + }); + } + + private static void AssertElement(CreditProgram actual, CreditProgramDataModel? expected) + { + Assert.That(expected, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Name, Is.EqualTo(expected.Name)); + Assert.That(actual.Cost, Is.EqualTo(expected.Cost)); + Assert.That(actual.MaxCost, Is.EqualTo(expected.MaxCost)); + Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId)); + Assert.That(actual.PeriodId, Is.EqualTo(expected.PeriodId)); + }); + } +}