feat: старт проекта тестов

This commit is contained in:
2025-04-26 17:08:45 +04:00
parent 514eb9ed19
commit 78a053d6c0
8 changed files with 214 additions and 0 deletions

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

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,32 @@
using Microsoft.EntityFrameworkCore;
using BankDatabase.Models;
using BankDatabase;
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 void RemoveClerksFromDatabase(this BankDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Clerks\" CASCADE");
public static Clerk? GetClerkFromDatabase(this BankDbContext dbContext, string id) => dbContext.Clerks.FirstOrDefault(x => x.Id == id);
private static void ExecuteSqlRaw(this BankDbContext dbContext, string command) => dbContext.Database.ExecuteSqlRaw(command);
}

View File

@@ -0,0 +1,8 @@
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,104 @@
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Implementations;
using BankDatabase.Models;
using BankTests.Infrastructure;
using Microsoft.VisualStudio.CodeCoverage;
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_ShouldSucces_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 certificate = BankDbContext.InsertClerkToDatabaseAndReturn();
AssertElement(_storageContract.GetElementById(certificate.Id), certificate);
}
[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>());
}
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

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