Files
Pibd-21_Semin_D.A._SmallSof…/SmallSoftwareProject/SmallSoftwareTests/WebApiControllersApi/SalaryControllerTests.cs
2025-04-24 00:06:05 +04:00

253 lines
14 KiB
C#

using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Net;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class SalaryControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemovePostsFromDatabase();
SmallSoftwareDbContext.RemoveRequestsFromDatabase();
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
SmallSoftwareDbContext.RemoveSalariesFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "Иванов И.И.");
var salary = SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, workerSalary: 100);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salaries/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<SalaryViewModel>>(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/salaries/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<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_OnlyInDatePeriod_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salaries/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<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task GetList_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByWorker_ShouldSuccess_Test()
{
//Arrange
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
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<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.WorkerId == worker1.Id));
});
}
[Test]
public async Task GetList_ByWorker_OnlyInDatePeriod_ShouldSuccess_Test()
{
//Arrange
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
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<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.WorkerId == worker1.Id));
});
}
[Test]
public async Task GetList_ByWorker_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&id={worker.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByWorker_WhenIdIsNotGuid_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id=id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Calculate_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id, softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "ntrrvj@mail.ru", sum: 1, false, softwares: [(software.Id, 10, 1.0)]);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker.Id);
Assert.Multiple(() =>
{
Assert.That(salaries, Has.Length.EqualTo(1));
Assert.That(salaries.First().WorkerSalary, Is.EqualTo(100));
Assert.That(salaries.First().SalaryDate.Month, Is.EqualTo(DateTime.UtcNow.Month));
});
}
[Test]
public async Task Calculate_WithoutWorkers_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = SmallSoftwareDbContext.Salaries.ToArray();
Assert.That(salaries, Has.Length.EqualTo(0));
}
[Test]
public async Task Calculate_WithoutRequestsByWorker_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(salary: 111);
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id,
softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker1.Id, email: "neeeeevj@mail.ru",sum: 2, softwares: [(software.Id, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker2.Id, email: "oiuy@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)]);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salary1 = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker1.Id).First().WorkerSalary;
var salary2 = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker2.Id).First().WorkerSalary;
Assert.That(salary1, Is.EqualTo(salary2));
}
[Test]
public async Task Calculate_PostNotFound_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: Guid.NewGuid().ToString());
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id,
softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "nvbvbvj@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "qqq@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
}
private static void AssertElement(SalaryViewModel? actual, Salary expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.WorkerFIO, Is.EqualTo(expected.Worker!.FIO));
Assert.That(actual.Salary, Is.EqualTo(expected.WorkerSalary));
});
}
}