Merge pull request 'Bank_Tests' (#6) from Bank_Tests into Task_4_Storage

Reviewed-on: #6
Первая версия тестов для контрактов бд, ещё не все мапперы настроены, будем фиксить в процессе работы
This commit was merged in pull request #6.
This commit is contained in:
2025-05-01 15:26:49 +04:00
26 changed files with 1967 additions and 41 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

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

@@ -16,4 +16,8 @@
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="BankTests" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
</Project>

View File

@@ -85,6 +85,11 @@ internal class ClerkStorageContract : IClerkStorageContract
_dbContext.Clerks.Add(_mapper.Map<Clerk>(clerkDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Id {clerkDataModel.Id}");
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Clerks_Email" })
{
_dbContext.ChangeTracker.Clear();
@@ -115,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

@@ -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);
@@ -31,7 +57,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);
@@ -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,12 +157,13 @@ 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();
transaction.Commit();
}
@@ -167,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

@@ -111,6 +111,7 @@ internal class DepositStorageContract : IDepositStorageContract
element.DepositCurrencies = _mapper.Map<List<DepositCurrency>>(depositDataModel.Currencies);
}
_mapper.Map(depositDataModel, element);
_dbContext.SaveChanges();
transaction.Commit();
}

View File

@@ -19,7 +19,8 @@ internal class PeriodStorageContract : IPeriodStorageContract
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Period, PeriodDataModel>();
cfg.CreateMap<Period, PeriodDataModel>()
.ConstructUsing(src => new PeriodDataModel(src.Id, src.StartTime, src.EndTime, src.StorekeeperId));
cfg.CreateMap<PeriodDataModel, Period>();
});
_mapper = new Mapper(config);
@@ -42,6 +43,8 @@ internal class PeriodStorageContract : IPeriodStorageContract
{
query = query.Where(x => x.StorekeeperId == storekeeperId);
}
var test0 = query.FirstOrDefault();
var test = _mapper.Map<PeriodDataModel>(test0);
return [..query.Select(x => _mapper.Map<PeriodDataModel>(x))];
}
catch (Exception ex)
@@ -71,6 +74,11 @@ internal class PeriodStorageContract : IPeriodStorageContract
_dbContext.Periods.Add(_mapper.Map<Period>(periodDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Id {periodDataModel.Id}");
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();

View File

@@ -28,7 +28,7 @@ internal class ReplenishmentStorageContract : IReplenishmentStorageContract
{
try
{
var query = _dbContext.Replenishments.Where(x => x.Date >= fromDate && x.Date <= toDate);
var query = _dbContext.Replenishments.AsQueryable();
if (clerkId is not null)
{
query = query.Where(x => x.ClerkId == clerkId);
@@ -37,6 +37,14 @@ internal class ReplenishmentStorageContract : IReplenishmentStorageContract
{
query = query.Where(x => x.DepositId == depositId);
}
if (fromDate is not null)
{
query = query.Where(x => x.Date >= fromDate);
}
if (toDate is not null)
{
query = query.Where(x => x.Date <= toDate);
}
return [.. query.Select(x => _mapper.Map<ReplenishmentDataModel>(x))];
}
catch (Exception ex)

View File

@@ -85,6 +85,11 @@ internal class StorekeeperStorageContract : IStorekeeperStorageContract
_dbContext.Storekeepers.Add(_mapper.Map<Storekeeper>(storekeeperDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Id {storekeeperDataModel.Id}");
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Storekeepers_Email" })
{
_dbContext.ChangeTracker.Clear();
@@ -115,6 +120,11 @@ internal class StorekeeperStorageContract : IStorekeeperStorageContract
_dbContext.Storekeepers.Update(_mapper.Map(storekeeperDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Storekeepers_Email" })
{
_dbContext.ChangeTracker.Clear();

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

@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="EntityFramework" Version="5.0.0" />
<PackageReference Include="EntityFramework.ru" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
<ProjectReference Include="..\BankDatabase\BankDatabase.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="NUnit.Framework" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,298 @@
using System.Xml.Linq;
using BankDatabase;
using BankDatabase.Models;
using Microsoft.EntityFrameworkCore;
namespace BankTests.Infrastructure;
internal static class BankDbContextExtension
{
public static Clerk InsertClerkToDatabaseAndReturn(
this BankDbContext dbContext,
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"
)
{
var clerck = new Clerk()
{
Id = id ?? Guid.NewGuid().ToString(),
Name = name,
Surname = surname,
MiddleName = middlename,
Login = login,
Password = passwd,
Email = email,
PhoneNumber = phone,
};
dbContext.Clerks.Add(clerck);
dbContext.SaveChanges();
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,
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()
{
Id = id ?? Guid.NewGuid().ToString(),
Name = name,
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;
}
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,
List<(string currencyId, string creditProgramId)>? creditProgramCurrency = null // Item1 = ClientId Item2 = CreditProgramId
)
{
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();
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;
}
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 Currency InsertCurrencyToDatabaseAndReturn(
this BankDbContext dbContext,
string? id = null,
string? name = "pop",
string? abbreviation = "rub",
decimal cost = 10,
string? storekeeperId = null
)
{
var currency = new Currency()
{
Id = id ?? Guid.NewGuid().ToString(),
Name = name,
Abbreviation = abbreviation,
Cost = cost,
StorekeeperId = storekeeperId ?? Guid.NewGuid().ToString(),
};
dbContext.Currencies.Add(currency);
dbContext.SaveChanges();
return currency;
}
public static Deposit InsertDepositToDatabaseAndReturn(
this BankDbContext dbContext,
string? id = null,
float interestRate = 1f,
decimal cost = 10,
int period = 1,
string? clerkId = null
)
{
var deposit = new Deposit()
{
Id = id ?? Guid.NewGuid().ToString(),
InterestRate = interestRate,
Cost = cost,
Period = period,
ClerkId = clerkId ?? Guid.NewGuid().ToString(),
};
dbContext.Deposits.Add(deposit);
dbContext.SaveChanges();
return deposit;
}
public static Replenishment InsertReplenishmentToDatabaseAndReturn(
this BankDbContext dbContext,
string? id = null,
decimal amount = 1,
DateTime? date = null,
string? depositId = null,
string? clerkId = null
)
{
var replenishment = new Replenishment()
{
Id = id ?? Guid.NewGuid().ToString(),
Amount = amount,
Date = date ?? DateTime.UtcNow,
DepositId = depositId ?? Guid.NewGuid().ToString(),
ClerkId = clerkId ?? Guid.NewGuid().ToString(),
};
dbContext.Replenishments.Add(replenishment);
dbContext.SaveChanges();
return replenishment;
}
public static void RemoveCurrenciesFromDatabase(this BankDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Currencies\" CASCADE");
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 void RemoveDepositsFromDatabase(this BankDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Deposits\" CASCADE");
public static void RemoveReplenishmentsFromDatabase(this BankDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Replenishments\" CASCADE");
public static Client? GetClientFromDatabase(this BankDbContext dbContext, string 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);
public static CreditProgram? GetCreditProgramFromDatabase(
this BankDbContext dbContext,
string id
) => dbContext.CreditPrograms.FirstOrDefault(x => x.Id == id);
public static Currency? GetCurrencyFromDatabase(this BankDbContext dbContext, string id) =>
dbContext.Currencies.FirstOrDefault(x => x.Id == id);
public static Deposit? GetDepositFromDatabase(this BankDbContext dbContext, string id) =>
dbContext.Deposits.FirstOrDefault(x => x.Id == id);
public static Period? GetPeriodFromDatabase(this BankDbContext dbContext, string id) =>
dbContext.Periods.FirstOrDefault(x => x.Id == id);
public static Replenishment? GetReplenishmentFromDatabase(
this BankDbContext dbContext,
string id
) => dbContext.Replenishments.FirstOrDefault(x => x.Id == id);
public static Storekeeper? GetStorekeeperFromDatabase(
this BankDbContext dbContext,
string id
) => dbContext.Storekeepers.FirstOrDefault(x => x.Id == id);
private static void ExecuteSqlRaw(this BankDbContext dbContext, string command) =>
dbContext.Database.ExecuteSqlRaw(command);
}

View File

@@ -0,0 +1,9 @@
using BankContracts.Infrastructure;
namespace BankTests.Infrastructure;
internal class ConfigurationDatabase : IConfigurationDatabase
{
public string ConnectionString =>
"Host=127.0.0.1;Port=5432;Database=TitanicTest;Username=postgres;Password=admin123;Include Error Detail=true";
}

View File

@@ -0,0 +1,25 @@
using BankDatabase;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
internal class BaseStorageContractTest
{
protected BankDbContext BankDbContext { get; private set; }
[OneTimeSetUp]
public void OneTimeSetUp()
{
BankDbContext = new BankDbContext(new ConfigurationDatabase());
BankDbContext.Database.EnsureDeleted();
BankDbContext.Database.EnsureCreated();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
BankDbContext.Database.EnsureDeleted();
BankDbContext.Dispose();
}
}

View File

@@ -0,0 +1,172 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class ClerkStorageContractTests : BaseStorageContractTest
{
private IClerkStorageContract _storageContract;
[SetUp]
public void SetUp()
{
_storageContract = new ClerkStorageContract(BankDbContext);
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveClerksFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var clerk = BankDbContext.InsertClerkToDatabaseAndReturn();
BankDbContext.InsertClerkToDatabaseAndReturn(
login: "xomyak",
email: "email1@email.com",
phone: "+9-888-888-88-88"
);
BankDbContext.InsertClerkToDatabaseAndReturn(
login: "xomyak3",
email: "email3@email.com",
phone: "+9-888-888-88-78"
);
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 clerk = BankDbContext.InsertClerkToDatabaseAndReturn();
AssertElement(_storageContract.GetElementById(clerk.Id), clerk);
}
[Test]
public void Try_AddElement_Test()
{
var clerk = CreateModel();
_storageContract.AddElement(clerk);
AssertElement(BankDbContext.GetClerkFromDatabase(clerk.Id), clerk);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var clerk = CreateModel();
BankDbContext.InsertClerkToDatabaseAndReturn(id: clerk.Id);
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
);
private static void AssertElement(ClerkDataModel actual, Clerk? 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.MiddleName, Is.EqualTo(expected.MiddleName));
Assert.That(actual.Login, Is.EqualTo(expected.Login));
Assert.That(actual.Password, Is.EqualTo(expected.Password));
Assert.That(actual.Email, Is.EqualTo(expected.Email));
Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
});
}
private static void AssertElement(Clerk actual, ClerkDataModel? 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.MiddleName, Is.EqualTo(expected.MiddleName));
Assert.That(actual.Login, Is.EqualTo(expected.Login));
Assert.That(actual.Password, Is.EqualTo(expected.Password));
Assert.That(actual.Email, Is.EqualTo(expected.Email));
Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
});
}
}

View File

@@ -0,0 +1,301 @@
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 IClientStorageContract _clientStorageContract;
private string _clerkId;
private string _depositId;
private string _creditProgramId;
private string _storekeeperId;
private string _periodId;
[SetUp]
public void SetUp()
{
_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 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 == clientId), 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 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);
}
[Test]
public void Try_UpdElement_Test()
{
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);
BankDbContext.ChangeTracker.Clear();
AssertElement(BankDbContext.GetClientFromDatabase(clientId), 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));
});
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)
{
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));
});
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

@@ -0,0 +1,240 @@
using System.Xml.Linq;
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class CreditProgramStorageContractTests : BaseStorageContractTest
{
private ICreditProgramStorageContract _storageContract;
private string _storekeeperId;
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]
public void TearDown()
{
BankDbContext.RemoveCreditProgramsFromDatabase();
BankDbContext.RemovePeriodsFromDatabase();
BankDbContext.RemoveCurrenciesFromDatabase();
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSucces_Test()
{
var creditProgramId = Guid.NewGuid().ToString();
var creditProgram = BankDbContext.InsertCreditProgramToDatabaseAndReturn(
storeleeperId: _storekeeperId,
periodId: _periodId,
creditProgramCurrency: [( _currenyId, creditProgramId )]
);
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 == creditProgram.Id), creditProgram);
}
[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);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameName_Test()
{
var credit = CreateModel(name: "1", storekeeperId: _storekeeperId, periodId: _periodId);
BankDbContext.InsertCreditProgramToDatabaseAndReturn(
name: "1",
periodId: _periodId,
storeleeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)]
);
Assert.That(
() => _storageContract.AddElement(credit),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var credit = CreateModel(
name: "unique name",
periodId: _periodId,
storekeeperId: _storekeeperId
);
BankDbContext.InsertCreditProgramToDatabaseAndReturn(
credit.Id,
periodId: _periodId,
storeleeperId: _storekeeperId,
creditProgramCurrency: [(_currenyId, credit.Id)]
);
_storageContract.UpdElement(credit);
AssertElement(BankDbContext.GetCreditProgramFromDatabase(credit.Id), credit);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() =>
_storageContract.UpdElement(
CreateModel(storekeeperId: _storekeeperId, periodId: _periodId)
),
Throws.TypeOf<ElementNotFoundException>()
);
}
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));
});
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)
{
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));
});
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

@@ -0,0 +1,176 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class CurrencyStorageContractTests : BaseStorageContractTest
{
private ICurrencyStorageContract _storageContract;
private string _storekeeperId;
[SetUp]
public void SetUp()
{
_storageContract = new CurrencyStorageContract(BankDbContext);
_storekeeperId = BankDbContext.InsertStorekeeperToDatabaseAndReturn().Id;
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveCurrenciesFromDatabase();
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var currency = BankDbContext.InsertCurrencyToDatabaseAndReturn(
storekeeperId: _storekeeperId
);
BankDbContext.InsertCurrencyToDatabaseAndReturn(
abbreviation: "$",
storekeeperId: _storekeeperId
);
BankDbContext.InsertCurrencyToDatabaseAndReturn(
abbreviation: "eur",
storekeeperId: _storekeeperId
);
var list = _storageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(_storageContract.GetElementById(currency.Id), currency);
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var currency = BankDbContext.InsertCurrencyToDatabaseAndReturn(
storekeeperId: _storekeeperId
);
AssertElement(_storageContract.GetElementById(currency.Id), currency);
}
[Test]
public void Try_GetElementByAbbreviation_WhenHaveRecord_Test()
{
var currency = BankDbContext.InsertCurrencyToDatabaseAndReturn(
abbreviation: "X",
storekeeperId: _storekeeperId
);
AssertElement(_storageContract.GetElementByAbbreviation(currency.Abbreviation), currency);
}
[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_AddElement_Test()
{
var currency = CreateModel(storekeeperId: _storekeeperId);
_storageContract.AddElement(currency);
AssertElement(BankDbContext.GetCurrencyFromDatabase(currency.Id), currency);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var currency = CreateModel(storekeeperId: _storekeeperId);
BankDbContext.InsertCurrencyToDatabaseAndReturn(
id: currency.Id,
storekeeperId: _storekeeperId
);
Assert.That(
() => _storageContract.AddElement(currency),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameAbbreviation_Test()
{
var currency = CreateModel(storekeeperId: _storekeeperId, abbreviation: "хамстер коин");
BankDbContext.InsertCurrencyToDatabaseAndReturn(
storekeeperId: _storekeeperId,
abbreviation: currency.Abbreviation
);
Assert.That(
() => _storageContract.AddElement(currency),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var currency = CreateModel(storekeeperId: _storekeeperId, abbreviation: "хамстер коин");
BankDbContext.InsertCurrencyToDatabaseAndReturn(
id: currency.Id,
storekeeperId: _storekeeperId
);
_storageContract.UpdElement(currency);
AssertElement(BankDbContext.GetCurrencyFromDatabase(currency.Id), currency);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() => _storageContract.UpdElement(CreateModel()),
Throws.TypeOf<ElementNotFoundException>()
);
}
private static CurrencyDataModel CreateModel(
string? id = null,
string? name = "pop",
string? abbreviation = "rub",
decimal cost = 10,
string? storekeeperId = null
) =>
new(
id ?? Guid.NewGuid().ToString(),
name,
abbreviation,
cost,
storekeeperId ?? Guid.NewGuid().ToString()
);
private static void AssertElement(CurrencyDataModel actual, Currency? 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.Abbreviation, Is.EqualTo(expected.Abbreviation));
Assert.That(actual.Cost, Is.EqualTo(expected.Cost));
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
});
}
private static void AssertElement(Currency actual, CurrencyDataModel? 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.Abbreviation, Is.EqualTo(expected.Abbreviation));
Assert.That(actual.Cost, Is.EqualTo(expected.Cost));
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
});
}
}

View File

@@ -0,0 +1,138 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class DepositStorageContractTests : BaseStorageContractTest
{
private IDepositStorageContract _storageContract;
private string _clerkId;
[SetUp]
public void SetUp()
{
_storageContract = new DepositStorageContract(BankDbContext);
_clerkId = BankDbContext.InsertClerkToDatabaseAndReturn().Id;
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveDepositsFromDatabase();
BankDbContext.RemoveClerksFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var deposit = BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId);
BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId);
BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId);
var list = _storageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == deposit.Id), deposit);
}
[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 deposit = BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId);
AssertElement(_storageContract.GetElementById(deposit.Id), deposit);
}
[Test]
public void Try_AddElement_Test()
{
var deposit = CreateModel(clerkId: _clerkId);
_storageContract.AddElement(deposit);
AssertElement(BankDbContext.GetDepositFromDatabase(deposit.Id), deposit);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var deposit = CreateModel(clerkId: _clerkId);
BankDbContext.InsertDepositToDatabaseAndReturn(id: deposit.Id, clerkId: _clerkId);
Assert.That(
() => _storageContract.AddElement(deposit),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var deposit = CreateModel(clerkId: _clerkId);
BankDbContext.InsertDepositToDatabaseAndReturn(id: deposit.Id, clerkId: _clerkId);
_storageContract.UpdElement(deposit);
AssertElement(BankDbContext.GetDepositFromDatabase(deposit.Id), deposit);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() => _storageContract.UpdElement(CreateModel(clerkId: _clerkId)),
Throws.TypeOf<ElementNotFoundException>()
);
}
private static DepositDataModel CreateModel(
string? id = null,
float interestRate = 10,
decimal cost = 10,
int period = 10,
string? clerkId = null,
List<DepositCurrencyDataModel>? deposits = null
) =>
new(
id ?? Guid.NewGuid().ToString(),
interestRate,
cost,
period,
clerkId ?? Guid.NewGuid().ToString(),
deposits ?? []
);
private static void AssertElement(DepositDataModel actual, Deposit? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.InterestRate, Is.EqualTo(expected.InterestRate));
Assert.That(actual.Cost, Is.EqualTo(expected.Cost));
Assert.That(actual.Period, Is.EqualTo(expected.Period));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
}
private static void AssertElement(Deposit actual, DepositDataModel? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.InterestRate, Is.EqualTo(expected.InterestRate));
Assert.That(actual.Cost, Is.EqualTo(expected.Cost));
Assert.That(actual.Period, Is.EqualTo(expected.Period));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
}
}

View File

@@ -0,0 +1,132 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class PeriodStorageContractTests : BaseStorageContractTest
{
private IPeriodStorageContract _storageContract;
private string _storekeeperId;
[SetUp]
public void SetUp()
{
_storageContract = new PeriodStorageContract(BankDbContext);
_storekeeperId = BankDbContext.InsertStorekeeperToDatabaseAndReturn().Id;
}
[TearDown]
public void TearDown()
{
BankDbContext.RemovePeriodsFromDatabase();
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId);
BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId);
BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId);
var list = _storageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == period.Id), period);
}
[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 period = BankDbContext.InsertPeriodToDatabaseAndReturn(storekeeperId: _storekeeperId);
AssertElement(_storageContract.GetElementById(period.Id), period);
}
[Test]
public void Try_AddElement_Test()
{
var period = CreateModel(storekeeperId: _storekeeperId);
_storageContract.AddElement(period);
AssertElement(BankDbContext.GetPeriodFromDatabase(period.Id), period);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var period = CreateModel(storekeeperId: _storekeeperId);
BankDbContext.InsertPeriodToDatabaseAndReturn(id: period.Id, storekeeperId: _storekeeperId);
Assert.That(
() => _storageContract.AddElement(period),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var period = CreateModel(storekeeperId: _storekeeperId);
BankDbContext.InsertPeriodToDatabaseAndReturn(id: period.Id, storekeeperId: _storekeeperId);
_storageContract.UpdElement(period);
AssertElement(BankDbContext.GetPeriodFromDatabase(period.Id), period);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() => _storageContract.UpdElement(CreateModel(storekeeperId: _storekeeperId)),
Throws.TypeOf<ElementNotFoundException>()
);
}
private static PeriodDataModel CreateModel(
string? id = null,
DateTime? startTime = null,
DateTime? endTime = null,
string? storekeeperId = null
) =>
new(
id ?? Guid.NewGuid().ToString(),
startTime ?? DateTime.UtcNow.AddDays(-1),
endTime ?? DateTime.UtcNow,
storekeeperId ?? Guid.NewGuid().ToString()
);
private static void AssertElement(PeriodDataModel actual, Period? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.StartTime, Is.EqualTo(expected.StartTime));
Assert.That(actual.EndTime, Is.EqualTo(expected.EndTime));
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
});
}
private static void AssertElement(Period actual, PeriodDataModel? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.StartTime, Is.EqualTo(expected.StartTime));
Assert.That(actual.EndTime, Is.EqualTo(expected.EndTime));
Assert.That(actual.StorekeeperId, Is.EqualTo(expected.StorekeeperId));
});
}
}

View File

@@ -0,0 +1,161 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class ReplenishmentStorageContractTests : BaseStorageContractTest
{
private IReplenishmentStorageContract _storageContract;
private string _depositId;
private string _clerkId;
[SetUp]
public void SetUp()
{
_storageContract = new ReplenishmentStorageContract(BankDbContext);
_clerkId = BankDbContext.InsertClerkToDatabaseAndReturn().Id;
_depositId = BankDbContext.InsertDepositToDatabaseAndReturn(clerkId: _clerkId).Id;
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveReplenishmentsFromDatabase();
BankDbContext.RemoveDepositsFromDatabase();
BankDbContext.RemoveClerksFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var replenishment = BankDbContext.InsertReplenishmentToDatabaseAndReturn(
clerkId: _clerkId,
depositId: _depositId
);
BankDbContext.InsertReplenishmentToDatabaseAndReturn(
clerkId: _clerkId,
depositId: _depositId
);
BankDbContext.InsertReplenishmentToDatabaseAndReturn(
clerkId: _clerkId,
depositId: _depositId
);
var list = _storageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == replenishment.Id), replenishment);
}
[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 replenishment = BankDbContext.InsertReplenishmentToDatabaseAndReturn(
clerkId: _clerkId,
depositId: _depositId
);
AssertElement(_storageContract.GetElementById(replenishment.Id), replenishment);
}
[Test]
public void Try_AddElement_Test()
{
var replenishment = CreateModel(clerkId: _clerkId, depositId: _depositId);
_storageContract.AddElement(replenishment);
AssertElement(BankDbContext.GetReplenishmentFromDatabase(replenishment.Id), replenishment);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var replenishment = CreateModel(clerkId: _clerkId, depositId: _depositId);
BankDbContext.InsertReplenishmentToDatabaseAndReturn(
id: replenishment.Id,
clerkId: _clerkId,
depositId: _depositId
);
Assert.That(
() => _storageContract.AddElement(replenishment),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var replenishment = CreateModel(clerkId: _clerkId, depositId: _depositId);
BankDbContext.InsertReplenishmentToDatabaseAndReturn(
id: replenishment.Id,
clerkId: _clerkId,
depositId: _depositId
);
_storageContract.UpdElement(replenishment);
AssertElement(BankDbContext.GetReplenishmentFromDatabase(replenishment.Id), replenishment);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() =>
_storageContract.UpdElement(CreateModel(clerkId: _clerkId, depositId: _depositId)),
Throws.TypeOf<ElementNotFoundException>()
);
}
private static ReplenishmentDataModel CreateModel(
string? id = null,
decimal amount = 1,
DateTime? date = null,
string? depositId = null,
string? clerkId = null
) =>
new(
id ?? Guid.NewGuid().ToString(),
amount,
date ?? DateTime.UtcNow,
depositId ?? Guid.NewGuid().ToString(),
clerkId ?? Guid.NewGuid().ToString()
);
private static void AssertElement(ReplenishmentDataModel actual, Replenishment? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.Amount, Is.EqualTo(expected.Amount));
Assert.That(actual.Date, Is.EqualTo(expected.Date));
Assert.That(actual.DepositId, Is.EqualTo(expected.DepositId));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
}
private static void AssertElement(Replenishment actual, ReplenishmentDataModel? expected)
{
Assert.That(expected, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.Amount, Is.EqualTo(expected.Amount));
Assert.That(actual.Date, Is.EqualTo(expected.Date));
Assert.That(actual.DepositId, Is.EqualTo(expected.DepositId));
Assert.That(actual.ClerkId, Is.EqualTo(expected.ClerkId));
});
}
}

View File

@@ -0,0 +1,175 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
namespace BankTests.StorageContactsTests;
[TestFixture]
internal class StorekeeperStorageContractTests : BaseStorageContractTest
{
private IStorekeeperStorageContract _storageContract;
[SetUp]
public void SetUp()
{
_storageContract = new StorekeeperStorageContract(BankDbContext);
}
[TearDown]
public void TearDown()
{
BankDbContext.RemoveStorekeepersFromDatabase();
}
[Test]
public void TryGetListWhenHaveRecords_ShouldSuccess_Test()
{
var storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn();
BankDbContext.InsertStorekeeperToDatabaseAndReturn(
login: "xomyak2",
email: "email1@email.com",
phone: "+9-888-888-88-68"
);
BankDbContext.InsertStorekeeperToDatabaseAndReturn(
login: "xomyak3",
email: "email3@email.com",
phone: "+9-888-888-88-78"
);
var list = _storageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == storekeeper.Id), storekeeper);
}
[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 storekeeper = BankDbContext.InsertStorekeeperToDatabaseAndReturn();
AssertElement(_storageContract.GetElementById(storekeeper.Id), storekeeper);
}
[Test]
public void Try_AddElement_Test()
{
var storekeeper = CreateModel();
_storageContract.AddElement(storekeeper);
AssertElement(BankDbContext.GetStorekeeperFromDatabase(storekeeper.Id), storekeeper);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var storekeeper = CreateModel();
BankDbContext.InsertStorekeeperToDatabaseAndReturn(id: storekeeper.Id);
Assert.That(
() => _storageContract.AddElement(storekeeper),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameEmail_Test()
{
var storekeeper = CreateModel();
BankDbContext.InsertStorekeeperToDatabaseAndReturn(email: storekeeper.Email);
Assert.That(
() => _storageContract.AddElement(storekeeper),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameLogin_Test()
{
var storekeeper = CreateModel(login: "cheburek");
BankDbContext.InsertStorekeeperToDatabaseAndReturn(
email: "email@email.ru",
login: "cheburek"
);
Assert.That(
() => _storageContract.AddElement(storekeeper),
Throws.TypeOf<ElementExistsException>()
);
}
[Test]
public void Try_UpdElement_Test()
{
var storekeeper = CreateModel();
BankDbContext.InsertStorekeeperToDatabaseAndReturn(storekeeper.Id, name: "Женя");
_storageContract.UpdElement(storekeeper);
AssertElement(BankDbContext.GetStorekeeperFromDatabase(storekeeper.Id), storekeeper);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(
() => _storageContract.UpdElement(CreateModel()),
Throws.TypeOf<ElementNotFoundException>()
);
}
private static StorekeeperDataModel 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
);
private static void AssertElement(StorekeeperDataModel actual, Storekeeper? 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.MiddleName, Is.EqualTo(expected.MiddleName));
Assert.That(actual.Login, Is.EqualTo(expected.Login));
Assert.That(actual.Password, Is.EqualTo(expected.Password));
Assert.That(actual.Email, Is.EqualTo(expected.Email));
Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
});
}
private static void AssertElement(Storekeeper actual, StorekeeperDataModel? 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.MiddleName, Is.EqualTo(expected.MiddleName));
Assert.That(actual.Login, Is.EqualTo(expected.Login));
Assert.That(actual.Password, Is.EqualTo(expected.Password));
Assert.That(actual.Email, Is.EqualTo(expected.Email));
Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
});
}
}

View File

@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BankBusinessLogic", "BankBu
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BankDatabase", "BankDatabase\BankDatabase.csproj", "{72F2568B-F5A8-4244-A777-BCABEF98F67A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BankTests", "BankTests\BankTests.csproj", "{7C898FC8-6BC2-41E8-9538-D42ACC263A97}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,10 @@ Global
{72F2568B-F5A8-4244-A777-BCABEF98F67A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{72F2568B-F5A8-4244-A777-BCABEF98F67A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{72F2568B-F5A8-4244-A777-BCABEF98F67A}.Release|Any CPU.Build.0 = Release|Any CPU
{7C898FC8-6BC2-41E8-9538-D42ACC263A97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C898FC8-6BC2-41E8-9538-D42ACC263A97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C898FC8-6BC2-41E8-9538-D42ACC263A97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C898FC8-6BC2-41E8-9538-D42ACC263A97}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE