feat: тесты, начало проверки многие ко многим

This commit is contained in:
2025-05-01 15:24:28 +04:00
parent d636fb821e
commit f270d36d22
10 changed files with 335 additions and 57 deletions

View File

@@ -27,9 +27,9 @@ public class ClientDataModel(string id, string name, string surname, decimal bal
public string ClerkId { get; private set; } = clerkId;
public List<DepositClientDataModel> Deposits { get; private set; } = depositClients;
public List<DepositClientDataModel> DepositClients { get; private set; } = depositClients;
public List<ClientCreditProgramDataModel> CreditPrograms { get; private set; } = creditProgramClients;
public List<ClientCreditProgramDataModel> CreditProgramClients { get; private set; } = creditProgramClients;
public void Validate()
{
@@ -61,13 +61,13 @@ public class ClientDataModel(string id, string name, string surname, decimal bal
{
throw new ValidationException("The value in the field Clerkid is not a unique identifier");
}
if (Deposits is null)
if (DepositClients is null)
{
throw new ValidationException("Field Deposits is null");
throw new ValidationException("Field DepositClients is null");
}
if (CreditPrograms is null)
if (CreditProgramClients is null)
{
throw new ValidationException("Field CreditPrograms is null");
throw new ValidationException("Field CreditProgramClients is null");
}
}
}

View File

@@ -20,8 +20,34 @@ internal class ClientStorageContract : IClientStorageContract
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Clerk, ClerkDataModel>();
cfg.CreateMap<Client, ClientDataModel>();
cfg.CreateMap<ClientDataModel, Client>();
cfg.CreateMap<Client, ClientDataModel>()
.ForMember(dest => dest.DepositClients, opt => opt.MapFrom(src => src.DepositClients))
.ForMember(dest => dest.CreditProgramClients, opt => opt.MapFrom(src => src.CreditProgramClients));
cfg.CreateMap<ClientDataModel, Client>()
.ForMember(dest => dest.DepositClients, opt => opt.MapFrom(src => src.DepositClients))
.ForMember(dest => dest.CreditProgramClients, opt => opt.MapFrom(src => src.CreditProgramClients));
cfg.CreateMap<DepositClient, DepositClientDataModel>()
.ForMember(dest => dest.DepositId, opt => opt.MapFrom(src => src.DepositId))
.ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId));
cfg.CreateMap<DepositClientDataModel, DepositClient>()
.ForMember(dest => dest.DepositId, opt => opt.MapFrom(src => src.DepositId))
.ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId));
cfg.CreateMap<Deposit, DepositClientDataModel>()
.ForMember(dest => dest.DepositId, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.ClientId, opt => opt.Ignore());
cfg.CreateMap<DepositClientDataModel, Deposit>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.DepositId));
cfg.CreateMap<ClientCreditProgram, ClientCreditProgramDataModel>()
.ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId))
.ForMember(dest => dest.CreditProgramId, opt => opt.MapFrom(src => src.CreditProgramId));
cfg.CreateMap<ClientCreditProgramDataModel, ClientCreditProgram>()
.ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId))
.ForMember(dest => dest.CreditProgramId, opt => opt.MapFrom(src => src.CreditProgramId));
cfg.CreateMap<CreditProgram, ClientCreditProgramDataModel>()
.ForMember(dest => dest.CreditProgramId, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.ClientId, opt => opt.Ignore());
cfg.CreateMap<ClientCreditProgramDataModel, CreditProgram>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.CreditProgramId));
cfg.CreateMap<Replenishment, ReplenishmentDataModel>();
});
_mapper = new Mapper(config);
@@ -122,7 +148,7 @@ internal class ClientStorageContract : IClientStorageContract
{
var element = GetClientById(clientDataModel.Id) ?? throw new ElementNotFoundException(clientDataModel.Id);
//проверь пожалуйста(не уверен)
if (clientDataModel.Deposits != null && clientDataModel.CreditPrograms != null)
if (clientDataModel.DepositClients != null && clientDataModel.CreditProgramClients != null)
{
if (element.DepositClients != null || element.DepositClients?.Count >= 0)
{
@@ -131,11 +157,11 @@ internal class ClientStorageContract : IClientStorageContract
if (element.CreditProgramClients != null || element.CreditProgramClients?.Count >= 0)
{
_dbContext.DepositClients.RemoveRange(element.DepositClients);
_dbContext.CreditProgramClients.RemoveRange(element.CreditProgramClients);
}
element.DepositClients = _mapper.Map<List<DepositClient>>(clientDataModel.Deposits);
element.DepositClients = _mapper.Map<List<DepositClient>>(clientDataModel.CreditPrograms);
element.DepositClients = _mapper.Map<List<DepositClient>>(clientDataModel.DepositClients);
element.CreditProgramClients = _mapper.Map<List<ClientCreditProgram>>(clientDataModel.CreditProgramClients);
}
_mapper.Map(element, clientDataModel);
_dbContext.SaveChanges();
@@ -168,5 +194,5 @@ internal class ClientStorageContract : IClientStorageContract
throw new StorageException(ex.Message);
}
}
private Client? GetClientById(string id) => _dbContext.Clients.FirstOrDefault(x => x.Id == id);
private Client? GetClientById(string id) => _dbContext.Clients.Include(client => client.DepositClients).Include(client => client.CreditProgramClients).FirstOrDefault(x => x.Id == id);
}

View File

@@ -22,8 +22,18 @@ internal class CreditProgramStorageContract : ICreditProgramStorageContract
_dbContext = dbContext;
var config = new MapperConfiguration(x =>
{
x.CreateMap<CreditProgram, CreditProgramDataModel>();
x.CreateMap<CreditProgramDataModel, CreditProgram>();
x.CreateMap<CreditProgram, CreditProgramDataModel>()
.ForMember(dest => dest.Currencies, opt => opt.MapFrom(src => src.CurrencyCreditPrograms));
x.CreateMap<CreditProgramDataModel, CreditProgram>()
.ForMember(dest => dest.CurrencyCreditPrograms, opt => opt.MapFrom(src => src.Currencies));
x.CreateMap<CreditProgramCurrency, CreditProgramCurrencyDataModel>()
.ForMember(dest => dest.CreditProgramId, opt => opt.MapFrom(src => src.CreditProgramId))
.ForMember(dest => dest.CurrencyId, opt => opt.MapFrom(src => src.CurrencyId));
x.CreateMap<CreditProgramCurrencyDataModel, CreditProgramCurrency>()
.ForMember(dest => dest.CreditProgramId, opt => opt.MapFrom(src => src.CreditProgramId))
.ForMember(dest => dest.CurrencyId, opt => opt.MapFrom(src => src.CurrencyId))
.ForMember(dest => dest.CreditProgram, opt => opt.Ignore())
.ForMember(dest => dest.Currency, opt => opt.Ignore());
});
_mapper = new Mapper(config);
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankDatabase.Models;
namespace BankDatabase.Models;
class ClientCreditProgram
{

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankDatabase.Models;
namespace BankDatabase.Models;
class CreditProgramCurrency
{

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankDatabase.Models;
namespace BankDatabase.Models;
class DepositClient
{

View File

@@ -41,7 +41,9 @@ internal static class BankDbContextExtension
string? name = "slava",
string? surname = "fomichev",
decimal balance = 1_000_000,
string? clerkId = null
string? clerkId = null,
List<(string clientId, string creditProgramId)>? creditProgramClients = null, // Item1 = ClientId Item2 = CreditProgramId
List<(string depositId, string clientId)>? depositClients = null // Item1 = DepositId Item2 = ClientId
)
{
var client = new Client()
@@ -51,7 +53,31 @@ internal static class BankDbContextExtension
Surname = surname,
Balance = balance,
ClerkId = clerkId ?? Guid.NewGuid().ToString(),
DepositClients = [],
CreditProgramClients = [],
};
if (creditProgramClients is not null)
{
foreach (var (clientId, creditProgramId) in creditProgramClients)
{
dbContext.CreditProgramClients.Add(
new ClientCreditProgram
{
ClientId = clientId,
CreditProgramId = creditProgramId,
}
);
}
}
if (depositClients is not null)
{
foreach (var (depositId, clientId) in depositClients)
{
dbContext.DepositClients.Add(
new DepositClient { ClientId = clientId, DepositId = depositId }
);
}
}
dbContext.Clients.Add(client);
dbContext.SaveChanges();
return client;
@@ -64,7 +90,8 @@ internal static class BankDbContextExtension
decimal cost = 1_000_000,
decimal maxCost = 10_000_000,
string? storeleeperId = null,
string? periodId = null
string? periodId = null,
List<(string currencyId, string creditProgramId)>? creditProgramCurrency = null // Item1 = ClientId Item2 = CreditProgramId
)
{
var creditProgram = new CreditProgram()
@@ -78,6 +105,20 @@ internal static class BankDbContextExtension
};
dbContext.CreditPrograms.Add(creditProgram);
dbContext.SaveChanges();
if (creditProgramCurrency is not null)
{
foreach (var (currencyId, creditProgramId) in creditProgramCurrency)
{
dbContext.CurrencyCreditPrograms.Add(
new CreditProgramCurrency
{
CurrencyId = currencyId,
CreditProgramId = creditProgram.Id,
}
);
}
}
dbContext.SaveChanges();
return creditProgram;
}
@@ -220,7 +261,10 @@ internal static class BankDbContextExtension
dbContext.ExecuteSqlRaw("TRUNCATE \"Replenishments\" CASCADE");
public static Client? GetClientFromDatabase(this BankDbContext dbContext, string id) =>
dbContext.Clients.FirstOrDefault(x => x.Id == id);
dbContext
.Clients.Include(x => x.DepositClients)
.Include(x => x.CreditProgramClients)
.FirstOrDefault(x => x.Id == id);
public static Clerk? GetClerkFromDatabase(this BankDbContext dbContext, string id) =>
dbContext.Clerks.FirstOrDefault(x => x.Id == id);

View File

@@ -10,35 +10,70 @@ namespace BankTests.StorageContactsTests;
[TestFixture]
internal class ClientStorageContractTests : BaseStorageContractTest
{
private IClientStorageContract _clientStorageContract;
private string _clerkId;
private IClientStorageContract _clientStorageContract;
private string _depositId;
private string _creditProgramId;
private string _storekeeperId;
private string _periodId;
[SetUp]
public void SetUp()
{
_clerkId = BankDbContext.InsertClerkToDatabaseAndReturn().Id;
_clientStorageContract = new ClientStorageContract(BankDbContext);
_clerkId = BankDbContext.InsertClerkToDatabaseAndReturn().Id;
_storekeeperId = BankDbContext.InsertStorekeeperToDatabaseAndReturn().Id;
_depositId = BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId).Id;
_periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id;
_creditProgramId = BankDbContext
.InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId,
periodId: _periodId
)
.Id;
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveClientsFromDatabase();
BankDbContext.RemoveDepositsFromDatabase();
BankDbContext.RemovePeriodsFromDatabase();
BankDbContext.RemoveCreditProgramsFromDatabase();
BankDbContext.RemoveClerksFromDatabase();
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSucces_Test()
{
var client = BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId);
BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId);
BankDbContext.InsertClientToDatabaseAndReturn(clerkId: _clerkId);
var clientId = Guid.NewGuid().ToString();
var client = BankDbContext.InsertClientToDatabaseAndReturn(
id: clientId,
clerkId: _clerkId,
depositClients: [(_depositId, clientId)]
);
BankDbContext.InsertClientToDatabaseAndReturn(
clerkId: _clerkId,
depositClients:
[
(BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId).Id, clientId),
]
);
BankDbContext.InsertClientToDatabaseAndReturn(
clerkId: _clerkId,
creditProgramClients: [(clientId, _creditProgramId)]
);
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);
AssertElement(list.First(x => x.Id == clientId), client);
}
[Test]
@@ -78,7 +113,13 @@ internal class ClientStorageContractTests : BaseStorageContractTest
[Test]
public void Try_AddElement_Test()
{
var client = CreateModel(_clerkId);
var clientId = Guid.NewGuid().ToString();
var client = CreateModel(
_clerkId,
clientId,
depositClients: [new DepositClientDataModel(_depositId, clientId)],
clientCredits: [new ClientCreditProgramDataModel(clientId, _creditProgramId)]
);
_clientStorageContract.AddElement(client);
AssertElement(BankDbContext.GetClientFromDatabase(client.Id), client);
}
@@ -86,10 +127,20 @@ internal class ClientStorageContractTests : BaseStorageContractTest
[Test]
public void Try_UpdElement_Test()
{
var client = CreateModel(_clerkId);
BankDbContext.InsertClientToDatabaseAndReturn(id: client.Id, clerkId: _clerkId);
var clientId = Guid.NewGuid().ToString();
var client = CreateModel(
_clerkId,
id: clientId,
depositClients: [new DepositClientDataModel(_depositId, clientId)]
);
BankDbContext.InsertClientToDatabaseAndReturn(
id: clientId,
clerkId: _clerkId,
creditProgramClients: [(clientId, _creditProgramId)]
);
_clientStorageContract.UpdElement(client);
AssertElement(BankDbContext.GetClientFromDatabase(client.Id), client);
BankDbContext.ChangeTracker.Clear();
AssertElement(BankDbContext.GetClientFromDatabase(clientId), client);
}
[Test]
@@ -131,6 +182,57 @@ internal class ClientStorageContractTests : BaseStorageContractTest
Assert.That(actual.Balance, Is.EqualTo(expected.Balance));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
if (expected.DepositClients is not null)
{
Assert.That(actual.DepositClients, Is.Not.Null);
Assert.That(actual.DepositClients, Has.Count.EqualTo(expected.DepositClients.Count));
for (int i = 0; i < actual.DepositClients.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.DepositClients[i].ClientId,
Is.EqualTo(expected.DepositClients[i].ClientId)
);
Assert.That(
actual.DepositClients[i].DepositId,
Is.EqualTo(expected.DepositClients[i].DepositId)
);
});
}
}
else
{
Assert.That(actual.DepositClients, Is.Null);
}
if (expected.CreditProgramClients is not null)
{
Assert.That(actual.CreditProgramClients, Is.Not.Null);
Assert.That(
actual.CreditProgramClients,
Has.Count.EqualTo(expected.CreditProgramClients.Count)
);
for (int i = 0; i < actual.CreditProgramClients.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.CreditProgramClients[i].ClientId,
Is.EqualTo(expected.CreditProgramClients[i].ClientId)
);
Assert.That(
actual.CreditProgramClients[i].CreditProgramId,
Is.EqualTo(expected.CreditProgramClients[i].CreditProgramId)
);
});
}
}
else
{
Assert.That(actual.CreditProgramClients, Is.Null);
}
}
private static void AssertElement(Client actual, ClientDataModel? expected)
@@ -144,5 +246,56 @@ internal class ClientStorageContractTests : BaseStorageContractTest
Assert.That(actual.Balance, Is.EqualTo(expected.Balance));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
if (expected.DepositClients is not null)
{
Assert.That(actual.DepositClients, Is.Not.Null);
Assert.That(actual.DepositClients, Has.Count.EqualTo(expected.DepositClients.Count));
for (int i = 0; i < actual.DepositClients.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.DepositClients[i].ClientId,
Is.EqualTo(expected.DepositClients[i].ClientId)
);
Assert.That(
actual.DepositClients[i].DepositId,
Is.EqualTo(expected.DepositClients[i].DepositId)
);
});
}
}
else
{
Assert.That(actual.DepositClients, Is.Null);
}
if (expected.CreditProgramClients is not null)
{
Assert.That(actual.CreditProgramClients, Is.Not.Null);
Assert.That(
actual.CreditProgramClients,
Has.Count.EqualTo(expected.CreditProgramClients.Count)
);
for (int i = 0; i < actual.CreditProgramClients.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.CreditProgramClients[i].ClientId,
Is.EqualTo(expected.CreditProgramClients[i].ClientId)
);
Assert.That(
actual.CreditProgramClients[i].CreditProgramId,
Is.EqualTo(expected.CreditProgramClients[i].CreditProgramId)
);
});
}
}
else
{
Assert.That(actual.CreditProgramClients, Is.Null);
}
}
}

View File

@@ -17,12 +17,15 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
private string _periodId;
private string _currenyId;
[SetUp]
public void SetUp()
{
_storageContract = new CreditProgramStorageContract(BankDbContext);
_storekeeperId = BankDbContext.InsertStorekeeperToDatabaseAndReturn().Id;
_periodId = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId).Id;
_currenyId = BankDbContext.InsertCurrencyToDatabaseAndReturn(storekeeperId: _storekeeperId).Id;
}
[TearDown]
@@ -30,15 +33,18 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
{
BankDbContext.RemoveCreditProgramsFromDatabase();
BankDbContext.RemovePeriodsFromDatabase();
BankDbContext.RemoveCurrenciesFromDatabase();
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSucces_Test()
{
var clerk = BankDbContext.InsertCreditProgramToDatabaseAndReturn(
var creditProgramId = Guid.NewGuid().ToString();
var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId,
periodId: _periodId
periodId: _periodId,
creditProgramCurrency: [( _currenyId, creditProgramId )]
);
BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "bankrot2",
@@ -54,7 +60,7 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
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);
AssertElement(list.First(x => x.Id == creditProgram.Id), creditProgram);
}
[Test]
@@ -94,7 +100,8 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "1",
periodId: _periodId,
storeleeperId: _storekeeperId
storeleeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)]
);
Assert.That(
() => _storageContract.AddElement(credit),
@@ -113,7 +120,8 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
BankDbContext.InsertCreditProgramToDatabaseAndReturn(
credit.Id,
periodId: _periodId,
storeleeperId: _storekeeperId
storeleeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)]
);
_storageContract.UpdElement(credit);
AssertElement(BankDbContext.GetCreditProgramFromDatabase(credit.Id), credit);
@@ -162,6 +170,32 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
Assert.That(actual.PeriodId, Is.EqualTo(expected.PeriodId));
});
if (actual.Currencies is not null)
{
Assert.That(expected.CurrencyCreditPrograms, Is.Not.Null);
Assert.That(
actual.Currencies,
Has.Count.EqualTo(expected.CurrencyCreditPrograms.Count)
);
for (int i = 0; i < actual.Currencies.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.Currencies[i].CreditProgramId,
Is.EqualTo(expected.CurrencyCreditPrograms[i].CreditProgramId)
);
Assert.That(
actual.Currencies[i].CurrencyId,
Is.EqualTo(expected.CurrencyCreditPrograms[i].CurrencyId)
);
});
}
}
else
{
Assert.That(expected.CurrencyCreditPrograms, Is.Null);
}
}
private static void AssertElement(CreditProgram actual, CreditProgramDataModel? expected)
@@ -176,5 +210,31 @@ internal class CreditProgramStorageContractTests : BaseStorageContractTest
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
Assert.That(actual.PeriodId, Is.EqualTo(expected.PeriodId));
});
if (actual.CurrencyCreditPrograms is not null)
{
Assert.That(expected.Currencies, Is.Not.Null);
Assert.That(
actual.CurrencyCreditPrograms,
Has.Count.EqualTo(expected.Currencies.Count)
);
for (int i = 0;i < actual.CurrencyCreditPrograms.Count;++i)
{
Assert.Multiple(() =>
{
Assert.That(
actual.CurrencyCreditPrograms[i].CreditProgramId,
Is.EqualTo(expected.Currencies[i].CreditProgramId)
);
Assert.That(
actual.CurrencyCreditPrograms[i].CurrencyId,
Is.EqualTo(expected.Currencies[i].CurrencyId)
);
});
}
}
else
{
Assert.That(expected.Currencies, Is.Null);
}
}
}

View File

@@ -11,7 +11,7 @@ namespace BankTests.StorageContactsTests;
internal class StorekeeperStorageContractTests : BaseStorageContractTest
{
private IStorekeeperStorageContract _storageContract;
[SetUp]
public void SetUp()
{
@@ -94,7 +94,10 @@ internal class StorekeeperStorageContractTests : BaseStorageContractTest
public void Try_AddElement_WhenHaveRecordWithSameLogin_Test()
{
var storekeeper = CreateModel(login: "cheburek");
BankDbContext.InsertStorekeeperToDatabaseAndReturn(email: "email@email.ru", login: "cheburek");
BankDbContext.InsertStorekeeperToDatabaseAndReturn(
email: "email@email.ru",
login: "cheburek"
);
Assert.That(
() => _storageContract.AddElement(storekeeper),
Throws.TypeOf<ElementExistsException>()
@@ -169,4 +172,4 @@ internal class StorekeeperStorageContractTests : BaseStorageContractTest
Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
});
}
}
}