using MagicCarpetContracts.DataModels; using MagicCarpetContracts.Enums; using MagicCarpetContracts.Exceptions; using MagicCarpetContracts.StoragesContracts; using MagicCarpetDatabase.Implementations; using MagicCarpetDatabase.Models; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MagicCarpetTests.StoragesContracts; [TestFixture] internal class ClientStorageContractTests : BaseStorageContractTest { private ClientStorageContarct _clientStorageContract; [SetUp] public void SetUp() { _clientStorageContract = new ClientStorageContarct(MagicCarpetDbContext); } [TearDown] public void TearDown() { MagicCarpetDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Sales\" CASCADE;"); MagicCarpetDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Employees\" CASCADE;"); MagicCarpetDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Clients\" CASCADE;"); } [Test] public void Try_GetList_WhenHaveRecords_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString(), phoneNumber: "+5-555-555-55-55"); InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString(), phoneNumber: "+6-666-666-66-66"); InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString(), phoneNumber: "+7-777-777-77-77"); var list = _clientStorageContract.GetList(); Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(3)); AssertElement(list.First(x => x.Id == client.Id), client); } [Test] public void Try_GetList_WhenNoRecords_Test() { var list = _clientStorageContract.GetList(); Assert.That(list, Is.Not.Null); Assert.That(list, Is.Empty); } [Test] public void Try_GetElementById_WhenHaveRecord_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_clientStorageContract.GetElementById(client.Id), client); } [Test] public void Try_GetElementById_WhenNoRecord_Test() { InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _clientStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null); } [Test] public void Try_GetElementByFIO_WhenHaveRecord_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_clientStorageContract.GetElementByFIO(client.FIO), client); } [Test] public void Try_GetElementByFIO_WhenNoRecord_Test() { InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _clientStorageContract.GetElementByFIO("New Fio"), Is.Null); } [Test] public void Try_GetElementByPhoneNumber_WhenHaveRecord_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_clientStorageContract.GetElementByPhoneNumber(client.PhoneNumber), client); } [Test] public void Try_GetElementByPhoneNumber_WhenNoRecord_Test() { InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _clientStorageContract.GetElementByPhoneNumber("+8-888-888-88-88"), Is.Null); } [Test] public void Try_AddElement_Test() { var client = CreateModel(Guid.NewGuid().ToString()); _clientStorageContract.AddElement(client); AssertElement(GetClientFromDatabase(client.Id), client); } [Test] public void Try_AddElement_WhenHaveRecordWithSameId_Test() { var client = CreateModel(Guid.NewGuid().ToString(), "New Fio", "+5-555-555-55-55", 500); InsertClientToDatabaseAndReturn(client.Id); Assert.That(() => _clientStorageContract.AddElement(client), Throws.TypeOf()); } [Test] public void Try_AddElement_WhenHaveRecordWithSamePhoneNumber_Test() { var client = CreateModel(Guid.NewGuid().ToString(), "New Fio", "+5-555-555-55-55", 500); InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString(), phoneNumber: client.PhoneNumber); Assert.That(() => _clientStorageContract.AddElement(client), Throws.TypeOf()); } [Test] public void Try_UpdElement_Test() { var client = CreateModel(Guid.NewGuid().ToString(), "New Fio", "+5-555-555-55-55", 500); InsertClientToDatabaseAndReturn(client.Id); _clientStorageContract.UpdElement(client); AssertElement(GetClientFromDatabase(client.Id), client); } [Test] public void Try_UpdElement_WhenNoRecordWithThisId_Test() { Assert.That(() => _clientStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())), Throws.TypeOf()); } [Test] public void Try_UpdElement_WhenHaveRecordWithSamePhoneNumber_Test() { var client = CreateModel(Guid.NewGuid().ToString(), "New Fio", "+5-555-555-55-55", 500); InsertClientToDatabaseAndReturn(client.Id, phoneNumber: "+7-777-777-77-77"); InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString(), phoneNumber: client.PhoneNumber); Assert.That(() => _clientStorageContract.UpdElement(client), Throws.TypeOf()); } [Test] public void Try_DelElement_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); _clientStorageContract.DelElement(client.Id); var element = GetClientFromDatabase(client.Id); Assert.That(element, Is.Null); } [Test] public void Try_DelElement_WhenHaveSalesByThisBuyer_Test() { var client = InsertClientToDatabaseAndReturn(Guid.NewGuid().ToString()); var employeeId = Guid.NewGuid().ToString(); MagicCarpetDbContext.Employees.Add(new Employee() { Id = employeeId, FIO = "test", PostId = Guid.NewGuid().ToString(), Email = "abc@gmail.com" }); MagicCarpetDbContext.Sales.Add(new Sale() { Id = Guid.NewGuid().ToString(), EmployeeId = employeeId, ClientId = client.Id, Sum = 10, DiscountType = DiscountType.None, Discount = 0 }); MagicCarpetDbContext.Sales.Add(new Sale() { Id = Guid.NewGuid().ToString(), EmployeeId = employeeId, ClientId = client.Id, Sum = 10, DiscountType = DiscountType.None, Discount = 0 }); MagicCarpetDbContext.SaveChanges(); var salesBeforeDelete = MagicCarpetDbContext.Sales.Where(x => x.ClientId == client.Id).ToArray(); _clientStorageContract.DelElement(client.Id); var element = GetClientFromDatabase(client.Id); var salesAfterDelete = MagicCarpetDbContext.Sales.Where(x => x.ClientId == client.Id).ToArray(); Assert.Multiple(() => { Assert.That(element, Is.Null); Assert.That(salesBeforeDelete, Has.Length.EqualTo(2)); Assert.That(salesAfterDelete, Is.Empty); Assert.That(MagicCarpetDbContext.Sales.Count(), Is.EqualTo(2)); }); } [Test] public void Try_DelElement_WhenNoRecordWithThisId_Test() { Assert.That(() => _clientStorageContract.DelElement(Guid.NewGuid().ToString()), Throws.TypeOf()); } private Client InsertClientToDatabaseAndReturn(string id, string fio = "test", string phoneNumber = "+7-777-777-77-77", double discountSize = 10) { var client = new Client() { Id = id, FIO = fio, PhoneNumber = phoneNumber, DiscountSize = discountSize }; MagicCarpetDbContext.Clients.Add(client); MagicCarpetDbContext.SaveChanges(); return client; } private static void AssertElement(ClientDataModel? actual, Client expected) { Assert.That(actual, Is.Not.Null); Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); Assert.That(actual.FIO, Is.EqualTo(expected.FIO)); Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber)); Assert.That(actual.DiscountSize, Is.EqualTo(expected.DiscountSize)); }); } private static ClientDataModel CreateModel(string id, string fio = "test", string phoneNumber = "+7-777-777-77-77", double discountSize = 10) => new(id, fio, phoneNumber, discountSize); private Client? GetClientFromDatabase(string id) => MagicCarpetDbContext.Clients.FirstOrDefault(x => x.Id == id); private static void AssertElement(Client? actual, ClientDataModel expected) { Assert.That(actual, Is.Not.Null); Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); Assert.That(actual.FIO, Is.EqualTo(expected.FIO)); Assert.That(actual.PhoneNumber, Is.EqualTo(expected.PhoneNumber)); Assert.That(actual.DiscountSize, Is.EqualTo(expected.DiscountSize)); }); } }