using Microsoft.EntityFrameworkCore; using SmallSoftwareContracts.DataModels; using SmallSoftwareContracts.Exceptions; using SmallSoftwareDatabase.Implementations; using SmallSoftwareDatabase.Models; namespace SmallSoftwareTests.StoragesContracts; [TestFixture] internal class ManufacturerStorageContractTests : BaseStorageContractTest { private ManufacturerStorageContract _manufacturerStorageContract; [SetUp] public void SetUp() { _manufacturerStorageContract = new ManufacturerStorageContract(SmallSoftwareDbContext); } [TearDown] public void TearDown() { SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE; "); SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;"); } [Test] public void Try_GetList_WhenHaveRecords_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1"); InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2"); InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3"); var list = _manufacturerStorageContract.GetList(); Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(3)); AssertElement(list.First(x => x.Id == manufacturer.Id), manufacturer); } [Test] public void Try_GetList_WhenNoRecords_Test() { var list = _manufacturerStorageContract.GetList(); Assert.That(list, Is.Not.Null); Assert.That(list, Is.Empty); } [Test] public void Try_GetElementById_WhenHaveRecord_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_manufacturerStorageContract.GetElementById(manufacturer.Id), manufacturer); } [Test] public void Try_GetElementById_WhenNoRecord_Test() { InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _manufacturerStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null); } [Test] public void Try_GetElementByName_WhenHaveRecord_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_manufacturerStorageContract.GetElementByName(manufacturer.ManufacturerName), manufacturer); } [Test] public void Try_GetElementByName_WhenNoRecord_Test() { InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _manufacturerStorageContract.GetElementByName("name"), Is.Null); } [Test] public void Try_GetElementByOldName_WhenHaveRecord_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); AssertElement(_manufacturerStorageContract.GetElementByOldName(manufacturer .PrevManufacturerName!), manufacturer); AssertElement(_manufacturerStorageContract.GetElementByOldName(manufacturer .PrevPrevManufacturerName!), manufacturer); } [Test] public void Try_GetElementByOldName_WhenNoRecord_Test() { InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); Assert.That(() => _manufacturerStorageContract.GetElementByOldName("name"), Is.Null); } [Test] public void Try_AddElement_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString()); _manufacturerStorageContract.AddElement(manufacturer); AssertElement(GetManufacturerFromDatabase(manufacturer.Id), manufacturer); } [Test] public void Try_AddElement_WhenHaveRecordWithSameId_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique"); InsertManufacturerToDatabaseAndReturn(manufacturer.Id); Assert.That(() => _manufacturerStorageContract.AddElement(manufacturer), Throws.TypeOf()); } [Test] public void Try_AddElement_WhenHaveRecordWithSameManufacturerName_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique"); InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), manufacturerName: manufacturer.ManufacturerName); Assert.That(() => _manufacturerStorageContract.AddElement(manufacturer), Throws.TypeOf()); } [Test] public void Try_UpdElement_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name new", "test", "prev"); InsertManufacturerToDatabaseAndReturn(manufacturer.Id, manufacturerName: manufacturer.PrevManufacturerName!, prevManufacturerName: manufacturer.PrevPrevManufacturerName!); _manufacturerStorageContract.UpdElement(CreateModel(manufacturer.Id, "name new", "some name", "some name")); AssertElement(GetManufacturerFromDatabase(manufacturer.Id), manufacturer); } [Test] public void Try_UpdElement_WhenNoChangeManufacturerName_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name new", "test", "prev"); InsertManufacturerToDatabaseAndReturn(manufacturer.Id, manufacturerName: manufacturer.ManufacturerName!, prevManufacturerName: manufacturer.PrevManufacturerName!, prevPrevManufacturerName: manufacturer.PrevPrevManufacturerName!); _manufacturerStorageContract.UpdElement(manufacturer); AssertElement(GetManufacturerFromDatabase(manufacturer.Id), manufacturer); } [Test] public void Try_UpdElement_WhenNoRecordWithThisId_Test() { Assert.That(() => _manufacturerStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())), Throws.TypeOf()); } [Test] public void Try_UpdElement_WhenHaveRecordWithSameManufacturerName_Test() { var manufacturer = CreateModel(Guid.NewGuid().ToString(), "name unique"); InsertManufacturerToDatabaseAndReturn(manufacturer.Id, manufacturerName: "some name"); InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString(), manufacturerName: manufacturer.ManufacturerName); Assert.That(() => _manufacturerStorageContract.UpdElement(manufacturer), Throws.TypeOf()); } [Test] public void Try_DelElement_WhenNoSoftwares_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); _manufacturerStorageContract.DelElement(manufacturer.Id); var element = GetManufacturerFromDatabase(manufacturer.Id); Assert.That(element, Is.Null); } [Test] public void Try_DelElement_WhenHaveSoftwares_Test() { var manufacturer = InsertManufacturerToDatabaseAndReturn(Guid.NewGuid().ToString()); SmallSoftwareDbContext.Softwares.Add(new Software() { Id = Guid.NewGuid().ToString(), SoftwareName = "name", ManufacturerId = manufacturer.Id, Price = 10, IsDeleted = false }); SmallSoftwareDbContext.SaveChanges(); Assert.That(() => _manufacturerStorageContract.DelElement(manufacturer.Id), Throws.TypeOf()); } [Test] public void Try_DelElement_WhenNoRecordWithThisId_Test() { Assert.That(() => _manufacturerStorageContract.DelElement(Guid.NewGuid().ToString()), Throws.TypeOf()); } private Manufacturer InsertManufacturerToDatabaseAndReturn(string id, string manufacturerName = "test", string prevManufacturerName = "prev", string prevPrevManufacturerName = "prevPrev") { var manufacturer = new Manufacturer() { Id = id, ManufacturerName = manufacturerName, PrevManufacturerName = prevManufacturerName, PrevPrevManufacturerName = prevPrevManufacturerName }; SmallSoftwareDbContext.Manufacturers.Add(manufacturer); SmallSoftwareDbContext.SaveChanges(); return manufacturer; } private static void AssertElement(ManufacturerDataModel? actual, Manufacturer expected) { Assert.That(actual, Is.Not.Null); Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); Assert.That(actual.ManufacturerName, Is.EqualTo(expected.ManufacturerName)); Assert.That(actual.PrevManufacturerName, Is.EqualTo(expected.PrevManufacturerName)); Assert.That(actual.PrevPrevManufacturerName, Is.EqualTo(expected.PrevPrevManufacturerName)); }); } private static ManufacturerDataModel CreateModel(string id, string manufacturerName = "test", string prevManufacturerName = "prev", string prevPrevManufacturerName = "prevPrev") => new(id, manufacturerName, prevManufacturerName, prevPrevManufacturerName); private Manufacturer? GetManufacturerFromDatabase(string id) => SmallSoftwareDbContext.Manufacturers.FirstOrDefault(x => x.Id == id); private static void AssertElement(Manufacturer? actual, ManufacturerDataModel expected) { Assert.That(actual, Is.Not.Null); Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); Assert.That(actual.ManufacturerName, Is.EqualTo(expected.ManufacturerName)); Assert.That(actual.PrevManufacturerName, Is.EqualTo(expected.PrevManufacturerName)); Assert.That(actual.PrevPrevManufacturerName, Is.EqualTo(expected.PrevPrevManufacturerName)); }); } }