feat: создание проекта тестов

добавление двух с половиной классов тестов, пока не проверяет многие ко многим
This commit is contained in:
2025-04-28 13:10:31 +04:00
parent 78a053d6c0
commit 46bfedef8d
7 changed files with 348 additions and 6 deletions

View File

@@ -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)

View File

@@ -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();

View File

@@ -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<List<DepositClient>>(clientDataModel.Deposits);
element.DepositClients = _mapper.Map<List<DepositClient>>(clientDataModel.CreditPrograms);
}
_mapper.Map(element, clientDataModel);
_dbContext.SaveChanges();
transaction.Commit();
}

View File

@@ -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);
}

View File

@@ -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<ElementExistsException>());
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameEmail_Test()
{
var clerk = CreateModel();
BankDbContext.InsertClerkToDatabaseAndReturn(email: clerk.Email);
Assert.That(() => _storageContract.AddElement(clerk), Throws.TypeOf<ElementExistsException>());
}
[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<ElementExistsException>());
}
[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<ElementNotFoundException>());
}
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);

View File

@@ -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<ElementNotFoundException>());
}
private static ClientDataModel CreateModel(string clerkid, string? id = null, string? name = "null", string? surname = "surname", decimal balance = 1, List<DepositClientDataModel>? depositClients = null, List<ClientCreditProgramDataModel>? 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));
});
}
}

View File

@@ -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<CreditProgramCurrencyDataModel>? 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));
});
}
}