438 lines
17 KiB
C#
438 lines
17 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using SmallSoftwareContracts.DataModels;
|
|
using SmallSoftwareContracts.Enums;
|
|
using SmallSoftwareContracts.Exceptions;
|
|
using SmallSoftwareDatabase.Implementations;
|
|
using SmallSoftwareDatabase.Models;
|
|
|
|
namespace SmallSoftwareTests.StoragesContracts;
|
|
[TestFixture]
|
|
internal class SoftwareStorageContractTests : BaseStorageContractTest
|
|
{
|
|
private SoftwareStorageContract _softwareStorageContract;
|
|
private Manufacturer _manufacturer;
|
|
[SetUp]
|
|
public void SetUp()
|
|
{
|
|
_softwareStorageContract = new
|
|
SoftwareStorageContract(SmallSoftwareDbContext);
|
|
_manufacturer = InsertManufacturerToDatabaseAndReturn();
|
|
}
|
|
[TearDown]
|
|
public void TearDown()
|
|
{
|
|
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Softwares\" CASCADE; ");
|
|
SmallSoftwareDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Manufacturers\" CASCADE;");
|
|
}
|
|
[Test]
|
|
public void Try_GetList_WhenHaveRecords_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
"name 1");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 2");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 3");
|
|
var list = _softwareStorageContract.GetList();
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.That(list, Has.Count.EqualTo(3));
|
|
AssertElement(list.First(x => x.Id == software.Id), software);
|
|
}
|
|
[Test]
|
|
public void Try_GetList_WhenNoRecords_Test()
|
|
{
|
|
var list = _softwareStorageContract.GetList();
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.That(list, Is.Empty);
|
|
}
|
|
[Test]
|
|
public void Try_GetList_OnlyActual_Test()
|
|
{
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 1", isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 2", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 3", isDeleted: false);
|
|
var list = _softwareStorageContract.GetList(onlyActive: true);
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(list, Has.Count.EqualTo(2));
|
|
Assert.That(!list.Any(x => x.IsDeleted));
|
|
});
|
|
}
|
|
[Test]
|
|
public void Try_GetList_IncludeNoActual_Test()
|
|
{
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 1", isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 2", isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 3", isDeleted: false);
|
|
var list = _softwareStorageContract.GetList(onlyActive: false);
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(list, Has.Count.EqualTo(3));
|
|
Assert.That(list.Count(x => x.IsDeleted), Is.EqualTo(2));
|
|
Assert.That(list.Count(x => !x.IsDeleted), Is.EqualTo(1));
|
|
});
|
|
}
|
|
[Test]
|
|
public void Try_GetList_ByManufacturer_Test()
|
|
{
|
|
var manufacruer = InsertManufacturerToDatabaseAndReturn("name 2");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 1", isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 2", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
manufacruer.Id, "name 3", isDeleted: false);
|
|
var list = _softwareStorageContract.GetList(manufacturerId:
|
|
_manufacturer.Id, onlyActive: false);
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(list, Has.Count.EqualTo(2));
|
|
Assert.That(list.All(x => x.ManufacturerId ==
|
|
_manufacturer.Id));
|
|
});
|
|
}
|
|
[Test]
|
|
public void Try_GetList_ByManufacturerOnlyActual_Test()
|
|
{
|
|
var manufacruer = InsertManufacturerToDatabaseAndReturn("name 2");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 1", isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name 2", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
manufacruer.Id, "name 3", isDeleted: false);
|
|
var list = _softwareStorageContract.GetList(manufacturerId:
|
|
_manufacturer.Id, onlyActive: true);
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(list, Has.Count.EqualTo(1));
|
|
Assert.That(list.All(x => x.ManufacturerId == _manufacturer.Id
|
|
&& !x.IsDeleted));
|
|
});
|
|
}
|
|
[Test]
|
|
public void Try_GetHistoryBySoftwareId_WhenHaveRecords_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
"name 1");
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 20,
|
|
DateTime.UtcNow.AddDays(-1));
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 30,
|
|
DateTime.UtcNow.AddMinutes(-10));
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 40,
|
|
DateTime.UtcNow.AddDays(1));
|
|
var list = _softwareStorageContract.GetHistoryBySoftwareId(software.Id);
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.That(list, Has.Count.EqualTo(3));
|
|
}
|
|
[Test]
|
|
public void Try_GetHistoryBySoftwareId_WhenNoRecords_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
"name 1");
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 20,
|
|
DateTime.UtcNow.AddDays(-1));
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 30,
|
|
DateTime.UtcNow.AddMinutes(-10));
|
|
InsertSoftwareHistoryToDatabaseAndReturn(software.Id, 40,
|
|
DateTime.UtcNow.AddDays(1));
|
|
var list =
|
|
_softwareStorageContract.GetHistoryBySoftwareId(Guid.NewGuid().ToString());
|
|
Assert.That(list, Is.Not.Null);
|
|
Assert.That(list, Has.Count.EqualTo(0));
|
|
}
|
|
[Test]
|
|
public void Try_GetElementById_WhenHaveRecord_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
|
|
AssertElement(_softwareStorageContract.GetElementById(software.Id),
|
|
software);
|
|
}
|
|
[Test]
|
|
public void Try_GetElementById_WhenNoRecord_Test()
|
|
{
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id);
|
|
Assert.That(() =>
|
|
_softwareStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
|
|
}
|
|
[Test]
|
|
public void Try_GetElementById_WhenRecordHasDeleted_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.GetElementById(software.Id),
|
|
Is.Null);
|
|
}
|
|
[Test]
|
|
public void Try_GetElementByName_WhenHaveRecord_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id);
|
|
AssertElement(_softwareStorageContract.GetElementByName(software.SoftwareName)
|
|
, software);
|
|
}
|
|
[Test]
|
|
public void Try_GetElementByName_WhenNoRecord_Test()
|
|
{
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id);
|
|
Assert.That(() => _softwareStorageContract.GetElementByName("name"),
|
|
Is.Null);
|
|
}
|
|
[Test]
|
|
public void Try_GetElementByName_WhenRecordHasDeleted_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
isDeleted: true);
|
|
Assert.That(() =>
|
|
_softwareStorageContract.GetElementById(software.SoftwareName), Is.Null);
|
|
}
|
|
[Test]
|
|
public void Try_AddElement_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, isDeleted: false);
|
|
_softwareStorageContract.AddElement(software);
|
|
AssertElement(GetSoftwareFromDatabaseById(software.Id), software);
|
|
}
|
|
[Test]
|
|
public void Try_AddElement_WhenIsDeletedIsTrue_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.AddElement(software),
|
|
Throws.Nothing);
|
|
AssertElement(GetSoftwareFromDatabaseById(software.Id),
|
|
CreateModel(software.Id, _manufacturer.Id, isDeleted: false));
|
|
}
|
|
[Test]
|
|
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
softwareName: "name unique");
|
|
Assert.That(() => _softwareStorageContract.AddElement(software),
|
|
Throws.TypeOf<ElementExistsException>());
|
|
}
|
|
[Test]
|
|
public void Try_AddElement_WhenHaveRecordWithSameName_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name unique", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: false);
|
|
Assert.That(() => _softwareStorageContract.AddElement(software),
|
|
Throws.TypeOf<ElementExistsException>());
|
|
}
|
|
[Test]
|
|
public void Try_AddElement_WhenHaveRecordWithSameNameButOneWasDeleted_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name unique", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.AddElement(software),
|
|
Throws.Nothing);
|
|
}
|
|
[Test]
|
|
public void Try_UpdElement_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
isDeleted: false);
|
|
_softwareStorageContract.UpdElement(software);
|
|
AssertElement(GetSoftwareFromDatabaseById(software.Id), software);
|
|
}
|
|
[Test]
|
|
public void Try_UpdElement_WhenIsDeletedIsTrue_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, isDeleted: true);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
isDeleted: false);
|
|
_softwareStorageContract.UpdElement(software);
|
|
AssertElement(GetSoftwareFromDatabaseById(software.Id),
|
|
CreateModel(software.Id, _manufacturer.Id, isDeleted: false));
|
|
}
|
|
[Test]
|
|
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
|
|
{
|
|
Assert.That(() =>
|
|
_softwareStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id)), Throws.TypeOf<ElementNotFoundException>());
|
|
}
|
|
[Test]
|
|
public void Try_UpdElement_WhenHaveRecordWithSameName_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name unique", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
softwareName: "name");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, softwareName: software.SoftwareName);
|
|
Assert.That(() => _softwareStorageContract.UpdElement(software),
|
|
Throws.TypeOf<ElementExistsException>());
|
|
}
|
|
[Test]
|
|
public void
|
|
Try_UpdElement_WhenHaveRecordWithSameNameButOneWasDeleted_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, "name unique", isDeleted: false);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
softwareName: "name");
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id, softwareName: software.SoftwareName, isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.UpdElement(software),
|
|
Throws.Nothing);
|
|
}
|
|
[Test]
|
|
public void Try_UpdElement_WhenRecordWasDeleted_Test()
|
|
{
|
|
var software = CreateModel(Guid.NewGuid().ToString(),
|
|
_manufacturer.Id);
|
|
InsertSoftwareToDatabaseAndReturn(software.Id, _manufacturer.Id,
|
|
isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.UpdElement(software),
|
|
Throws.TypeOf<ElementNotFoundException>());
|
|
}
|
|
[Test]
|
|
public void Try_DelElement_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
isDeleted: false);
|
|
_softwareStorageContract.DelElement(software.Id);
|
|
var element = GetSoftwareFromDatabaseById(software.Id);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(element, Is.Not.Null);
|
|
Assert.That(element!.IsDeleted);
|
|
});
|
|
}
|
|
[Test]
|
|
public void Try_DelElement_WhenNoRecordWithThisId_Test()
|
|
{
|
|
Assert.That(() =>
|
|
_softwareStorageContract.DelElement(Guid.NewGuid().ToString()),
|
|
Throws.TypeOf<ElementNotFoundException>());
|
|
}
|
|
[Test]
|
|
public void Try_DelElement_WhenRecordWasDeleted_Test()
|
|
{
|
|
var software =
|
|
InsertSoftwareToDatabaseAndReturn(Guid.NewGuid().ToString(), _manufacturer.Id,
|
|
isDeleted: true);
|
|
Assert.That(() => _softwareStorageContract.DelElement(software.Id),
|
|
Throws.TypeOf<ElementNotFoundException>());
|
|
}
|
|
private Manufacturer InsertManufacturerToDatabaseAndReturn(string
|
|
manufacturerName = "name")
|
|
{
|
|
var manufacrurer = new Manufacturer()
|
|
{
|
|
Id =
|
|
Guid.NewGuid().ToString(),
|
|
ManufacturerName = manufacturerName
|
|
};
|
|
SmallSoftwareDbContext.Manufacturers.Add(manufacrurer);
|
|
SmallSoftwareDbContext.SaveChanges();
|
|
return manufacrurer;
|
|
}
|
|
private Software InsertSoftwareToDatabaseAndReturn(string id, string
|
|
manufacturerId, string softwareName = "test", SoftwareType softwareType =
|
|
SoftwareType.Windows, double price = 1, bool isDeleted = false)
|
|
{
|
|
var software = new Software()
|
|
{
|
|
Id = id,
|
|
ManufacturerId =
|
|
manufacturerId,
|
|
SoftwareName = softwareName,
|
|
SoftwareType = softwareType,
|
|
Price =
|
|
price,
|
|
IsDeleted = isDeleted
|
|
};
|
|
SmallSoftwareDbContext.Softwares.Add(software);
|
|
SmallSoftwareDbContext.SaveChanges();
|
|
return software;
|
|
}
|
|
private SoftwareHistory InsertSoftwareHistoryToDatabaseAndReturn(string
|
|
softwareId, double price, DateTime changeDate)
|
|
{
|
|
var softwareHistory = new SoftwareHistory()
|
|
{
|
|
Id =
|
|
Guid.NewGuid().ToString(),
|
|
SoftwareId = softwareId,
|
|
OldPrice = price,
|
|
ChangeDate =
|
|
changeDate
|
|
};
|
|
SmallSoftwareDbContext.SoftwareHistories.Add(softwareHistory);
|
|
SmallSoftwareDbContext.SaveChanges();
|
|
return softwareHistory;
|
|
}
|
|
private static void AssertElement(SoftwareDataModel? actual, Software
|
|
expected)
|
|
{
|
|
Assert.That(actual, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
|
Assert.That(actual.ManufacturerId,
|
|
Is.EqualTo(expected.ManufacturerId));
|
|
Assert.That(actual.SoftwareName,
|
|
Is.EqualTo(expected.SoftwareName));
|
|
Assert.That(actual.SoftwareType,
|
|
Is.EqualTo(expected.SoftwareType));
|
|
Assert.That(actual.Price, Is.EqualTo(expected.Price));
|
|
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
|
|
});
|
|
}
|
|
private static SoftwareDataModel CreateModel(string id, string
|
|
manufacturerId, string softwareName = "test", SoftwareType softwareType =
|
|
SoftwareType.Windows, double price = 1, bool isDeleted = false)
|
|
=> new(id, softwareName, softwareType, manufacturerId, price,
|
|
isDeleted);
|
|
private Software? GetSoftwareFromDatabaseById(string id) =>
|
|
SmallSoftwareDbContext.Softwares.FirstOrDefault(x => x.Id == id);
|
|
private static void AssertElement(Software? actual, SoftwareDataModel
|
|
expected)
|
|
{
|
|
Assert.That(actual, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
|
Assert.That(actual.ManufacturerId,
|
|
Is.EqualTo(expected.ManufacturerId));
|
|
Assert.That(actual.SoftwareName,
|
|
Is.EqualTo(expected.SoftwareName));
|
|
Assert.That(actual.SoftwareType,
|
|
Is.EqualTo(expected.SoftwareType));
|
|
Assert.That(actual.Price, Is.EqualTo(expected.Price));
|
|
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
|
|
});
|
|
}
|
|
}
|