feat: старт проекта тестов
This commit is contained in:
@@ -16,4 +16,8 @@
|
||||
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<InternalsVisibleTo Include="BankTests" />
|
||||
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -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();
|
||||
|
||||
30
TheBank/BankTests/BankTests.csproj
Normal file
30
TheBank/BankTests/BankTests.csproj
Normal 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>
|
||||
32
TheBank/BankTests/Infrastructure/BankDbContextExtension.cs
Normal file
32
TheBank/BankTests/Infrastructure/BankDbContextExtension.cs
Normal 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);
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user