Files
Pibd-21_Semin_D.A._SmallSof…/SmallSoftwareProject/SmallSoftwareTests/StoragesContracts/RequestStorageContractTests.cs
2025-04-10 09:07:45 +04:00

290 lines
14 KiB
C#

using Microsoft.EntityFrameworkCore;
using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Enums;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareDatabase.Implementations;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System.ComponentModel.DataAnnotations;
namespace SmallSoftwareTests.StoragesContracts;
internal class RequestStorageContractTests : BaseStorageContractTest
{
private RequestStorageContract _requesttStorageContract;
private Worker _worker;
private Software _software;
private Manufacturer _manufacturer;
[SetUp]
public void SetUp()
{
_requesttStorageContract = new RequestStorageContract(SmallSoftwareDbContext);
_manufacturer = InsertManufacturerToDatabaseAndReturn();
_worker = InsertWorkerToDatabaseAndReturn();
_software = InsertSoftwareToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemoveRequestsFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
SmallSoftwareDbContext.RemoveSalariesFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 5, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 10, softwares: [(_software.Id, 10, 1.2)]);
var list = _requesttStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == request.Id), request);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _requesttStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetList_ByPeriod_Test()
{
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1));
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(4));
}
[Test]
public void Try_GetList_ByWorkerId_Test()
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares:
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(workerId: _worker.Id);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
Assert.That(list.All(x => x.WorkerId == _worker.Id));
}
[Test]
public void Try_GetList_BySoftwareId_Test()
{
var software = InsertSoftwareToDatabaseAndReturn("Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 5, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2), (software.Id, 4, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
[(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
[(software.Id, 1, 1.2), (_software.Id, 1, 1.2)]);
var list = _requesttStorageContract.GetList(softwareId: _software.Id);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
Assert.That(list.All(x => x.Softwares!.Any(y => y.SoftwareId ==
_software.Id)));
}
[Test]
public void Try_GetList_ByAllParameters_Test()
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
var software = InsertSoftwareToDatabaseAndReturn("Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1), workerId:
_worker.Id, softwareId: _software.Id);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
AssertElement(_requesttStorageContract.GetElementById(request.Id), request);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
Assert.That(() =>
_requesttStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
[Test]
public void Try_GetElementById_WhenRecordHasCanceled_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: true);
AssertElement(_requesttStorageContract.GetElementById(request.Id), request);
}
[Test]
public void Try_AddElement_Test()
{
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id,"", 0, false, [_software.Id], DateTime.UtcNow);
_requesttStorageContract.AddElement(request);
AssertElement(GetRequestFromDatabaseById(request.Id), request);
}
[Test]
public void Try_AddElement_WhenIsDeletedIsTrue_Test()
{
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id, "test@mail.ru", 1, true, [_software.Id], DateTime.UtcNow);
Assert.That(() => _requesttStorageContract.AddElement(request),Throws.Nothing);
AssertElement(GetRequestFromDatabaseById(request.Id), CreateModel(request.Id,
_worker.Id, "test@mail.ru", 1, false, [_software.Id], DateTime.UtcNow));
}
[Test]
public void Try_DelElement_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: false);
_requesttStorageContract.DelElement(request.Id);
var element = GetRequestFromDatabaseById(request.Id);
Assert.Multiple(() =>
{
Assert.That(element, Is.Not.Null);
Assert.That(element!.IsCancel);
});
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() =>
_requesttStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_WhenRecordWasCanceled_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)], isCancel: true);
Assert.That(() => _requesttStorageContract.DelElement(request.Id),
Throws.TypeOf<ElementDeletedException>());
}
private Worker InsertWorkerToDatabaseAndReturn(string fio = "test")
{
var worker = new Worker()
{
Id = Guid.NewGuid().ToString(),
FIO =
fio,
PostId = Guid.NewGuid().ToString()
};
SmallSoftwareDbContext.Workers.Add(worker);
SmallSoftwareDbContext.SaveChanges();
return worker;
}
private Manufacturer InsertManufacturerToDatabaseAndReturn()
{
var manufacrurer = new Manufacturer()
{
Id =
Guid.NewGuid().ToString(),
ManufacturerName = "name"
};
SmallSoftwareDbContext.Manufacturers.Add(manufacrurer);
SmallSoftwareDbContext.SaveChanges();
return manufacrurer;
}
private Software InsertSoftwareToDatabaseAndReturn(string softwareName = "test",
SoftwareType softwareType = SoftwareType.Windows,
double price = 1, bool isDeleted = false)
{
var software = new Software()
{
Id = Guid.NewGuid().ToString(),
ManufacturerId = _manufacturer.Id,
SoftwareName = softwareName,
SoftwareType = softwareType,
Price = price,
IsDeleted = isDeleted
};
SmallSoftwareDbContext.Softwares.Add(software);
SmallSoftwareDbContext.SaveChanges();
return software;
}
private static void AssertElement(RequestDataModel? actual, Request expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.WorkerId, Is.EqualTo(expected.WorkerId));
Assert.That(actual.IsCancel, Is.EqualTo(expected.IsCancel));
});
if (expected.InstallationRequests is not null)
{
Assert.That(actual.Softwares, Is.Not.Null);
Assert.That(actual.Softwares,
Has.Count.EqualTo(expected.InstallationRequests.Count));
for (int i = 0; i < actual.Softwares.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(actual.Softwares[i].SoftwareId,
Is.EqualTo(expected.InstallationRequests[i].SoftwareId));
Assert.That(actual.Softwares[i].Count,
Is.EqualTo(expected.InstallationRequests[i].Count));
});
}
}
else
{
Assert.That(actual.Softwares, Is.Null);
}
}
private static RequestDataModel CreateModel(string id, string workerId, string email, double sum, bool isCancel, List<string> softwareIds, DateTime requestDate)
{
var installationRequests = softwareIds.Select(x => new InstallationRequestDataModel(x, id, 1, 1.1)).ToList();
return new(id, workerId, email, isCancel, installationRequests, requestDate);
}
private Request? GetRequestFromDatabaseById(string id) =>
SmallSoftwareDbContext.Requests.Include(x => x.InstallationRequests).FirstOrDefault(x => x.Id == id);
private static void AssertElement(Request? actual, RequestDataModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.WorkerId, Is.EqualTo(expected.WorkerId));
Assert.That(actual.IsCancel, Is.EqualTo(expected.IsCancel));
});
if (expected.Softwares is not null)
{
Assert.That(actual.InstallationRequests, Is.Not.Null);
Assert.That(actual.InstallationRequests, Has.Count.EqualTo(expected.Softwares.Count));
for (int i = 0; i < actual.InstallationRequests.Count; ++i)
{
Assert.Multiple(() =>
{
Assert.That(actual.InstallationRequests[i].SoftwareId,
Is.EqualTo(expected.Softwares[i].SoftwareId));
Assert.That(actual.InstallationRequests[i].Count,
Is.EqualTo(expected.Softwares[i].Count));
});
}
}
else
{
Assert.That(actual.InstallationRequests, Is.Null);
}
}
}