Files
Pibd-21_Semin_D.A._SmallSof…/SmallSoftwareProject/SmallSoftwareTests/WebApiControllersApi/RequestControllerTests.cs
2025-05-21 20:37:22 +04:00

369 lines
18 KiB
C#

using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System.Net;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class RequestControllerTests : BaseWebApiControllerTest
{
private string _workerId;
private string _manufacturerId;
private string _softwareId;
[SetUp]
public void SetUp()
{
_workerId = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn().Id;
_manufacturerId = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn().Id;
_softwareId = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturerId).Id;
}
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemoveRequestsFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(_softwareId, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_ByWorkerId_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "Other worker");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getworkerrecords?id={_workerId}&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.WorkerId == _workerId));
});
}
[Test]
public async Task GetList_ByWorkerId_WhenNoRecords_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "Other worker");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getworkerrecords?id={worker.Id}&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
}
[Test]
public async Task GetList_ByWorkerId_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getworkerrecords?id={_workerId}&fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByWorkerId_WhenIdIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getworkerrecords?id=Id&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_BySoftwareId_ShouldSuccess_Test()
{
//Arrange
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturerId, softwareName: "Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(_softwareId, 1, 1.1), (software.Id, 4, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(software.Id, 1, 1.1), (_softwareId, 1, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id={_softwareId}&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(3));
Assert.That(data.All(x => x.Softwares.Any(y => y.SoftwareId == _softwareId)));
});
}
[Test]
public async Task GetList_BySoftwareId_WhenNoRecords_ShouldSuccess_Test()
{
//Arrange
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturerId, softwareName: "Other software");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id={software.Id}&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
}
[Test]
public async Task GetList_BySoftwareId_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id={_softwareId}&fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_BySoftwareId_WhenIdIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id=Id&fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test", sum: 10, true, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecord/{request.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecord/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ById_WhenRecordHasCanceled_ShouldSuccess_Test()
{
//Arrange
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, softwares: [(_softwareId, 1, 1.2)], isCancel: true);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecord/{request.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
}
[Test]
public async Task GetElement_ById_WhenIdIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecord/Id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var requestId = Guid.NewGuid().ToString();
var requestModelWithIdIncorrect = new RequestBindingModel { Id = "Id", WorkerId = _workerId, Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = _softwareId, Count = 10, Price = 1.1 }] };
var requestModelWithWorkerIdIncorrect = new RequestBindingModel { Id = requestId, WorkerId = "Id", Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = _softwareId, Count = 10, Price = 1.1 }] };
var requestModelWithBuyerIdIncorrect = new RequestBindingModel {Id = requestId, WorkerId = _workerId, Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = _softwareId, Count = 10, Price = 1.1 }] };
var requestModelWithSoftwaresIncorrect = new RequestBindingModel { Id = requestId, WorkerId = _workerId, Softwares = null };
var requestModelWithSoftwareIdIncorrect = new RequestBindingModel {Id = requestId, WorkerId = _workerId, Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = "Id", Count = 10, Price = 1.1 }] };
var requestModelWithCountIncorrect = new RequestBindingModel {Id = requestId, WorkerId = _workerId , Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = _softwareId, Count = -10, Price = 1.1 }] };
var requestModelWithPriceIncorrect = new RequestBindingModel {Id = requestId, WorkerId = _workerId, Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = _softwareId, Count = 10, Price = -1.1 }] };
//Act
var responseWithIdIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithIdIncorrect));
var responseWithWorkerIdIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithWorkerIdIncorrect));
var responseWithBuyerIdIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithBuyerIdIncorrect));
var responseWithSoftwaresIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithSoftwaresIncorrect));
var responseWithSoftwareIdIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithSoftwareIdIncorrect));
var responseWithCountIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithCountIncorrect));
var responseWithPriceIncorrect = await HttpClient.PostAsync($"/api/posts", MakeContent(requestModelWithPriceIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "WorkerId is incorrect");
Assert.That(responseWithWorkerIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "WorkerId is incorrect");
Assert.That(responseWithBuyerIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "BuyerId is incorrect");
Assert.That(responseWithSoftwaresIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Softwares is incorrect");
Assert.That(responseWithSoftwareIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "SoftwareId is incorrect");
Assert.That(responseWithCountIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Count is incorrect");
Assert.That(responseWithPriceIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Price is incorrect");
});
}
[Test]
public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/posts", MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_ShouldSuccess_Test()
{
//Arrange
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "email@mail.ru", 10, false, softwares: [(_softwareId, 5, 1.1)]);
//Act
var response = await HttpClient.DeleteAsync($"/api/requests/cancel/{request.Id}");
SmallSoftwareDbContext.ChangeTracker.Clear();
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetRequestFromDatabaseById(request.Id)!.IsCancel);
});
}
[Test]
public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "email@mail.ru", 10, false, softwares: [(_softwareId, 5, 1.1)]);
//Act
var response = await HttpClient.DeleteAsync($"/api/requests/cancel/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenIsCanceled_ShouldBadRequest_Test()
{
//Arrange
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "email@mail.ru", 10, true, softwares: [(_softwareId, 5, 1.1)]);
//Act
var response = await HttpClient.DeleteAsync($"/api/requests/cancel/{request.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.DeleteAsync($"/api/requests/cancel/id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
private static void AssertElement(RequestViewModel? actual, Request expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.WorkerFIO, Is.EqualTo(expected.Worker!.FIO));
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 RequestBindingModel CreateModel(string workerId, string softwareId, string? id = null, int count = 1, double price = 1.1)
{
var requestId = id ?? Guid.NewGuid().ToString();
return new()
{
Id = requestId,
WorkerId = workerId,
Softwares = [new InstallationRequestBindingModel { RequestId = requestId, SoftwareId = softwareId, Count = count, Price = price }]
};
}
}