Files
PIbd-22_Pyzhov_E.A_TheSquirrel/SquirrelContract/SquirrelTests/WebApiControllersTests/ReportControllerTests.cs
2025-05-17 06:31:17 +04:00

233 lines
11 KiB
C#

using SquirrelContract.DataModels;
using SquirrelContract.Enums;
using SquirrelContract.ViewModels;
using SquirrelTests.Infrastructure;
using System.Net;
namespace SquirrelTests.WebApiControllersTests;
[TestFixture]
internal class ReportControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
SquirrelDbContext.RemoveCocktailsFromDatabase();
SquirrelDbContext.RemoveSalesFromDatabase();
SquirrelDbContext.RemoveEmployeesFromDatabase();
SquirrelDbContext.RemovePostsFromDatabase();
SquirrelDbContext.RemoveSalariesFromDatabase();
SquirrelDbContext.RemoveClientsFromDatabase();
}
[Test]
public async Task GetHistories_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var cocktailId1 = Guid.NewGuid().ToString();
var cocktailId2 = Guid.NewGuid().ToString();
var cocktail1 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailId1, "name1", AlcoholType.Vodka, 10);
var cocktail2 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailId2, "name2", AlcoholType.Vodka, 10);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 22, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId2, 21, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 33, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 32, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId2, 65, DateTime.UtcNow);
//Act
var response = await HttpClient.GetAsync("/api/report/GetHistories");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<CocktailHistoryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(1));
}
[Test]
public async Task LoadHistories_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var cocktailId1 = Guid.NewGuid().ToString();
var cocktailId2 = Guid.NewGuid().ToString();
var cocktail1 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailId1, "name1", AlcoholType.Vodka, 10);
var cocktail2 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailId2, "name2", AlcoholType.Vodka, 10);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 22, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId2, 21, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 33, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId1, 32, DateTime.UtcNow);
SquirrelDbContext.InsertCocktailHistoryToDatabaseAndReturn(cocktailId2, 65, DateTime.UtcNow);
//Act
var response = await HttpClient.GetAsync("/api/report/LoadHistories");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
using var data = await response.Content.ReadAsStreamAsync();
Assert.That(data, Is.Not.Null);
Assert.That(data.Length, Is.GreaterThan(0));
await AssertStreamAsync(response, "file.docx");
}
[Test]
public async Task GetSales_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var employee = SquirrelDbContext.InsertEmployeeToDatabaseAndReturn();
var client = SquirrelDbContext.InsertClientToDatabaseAndReturn();
var cocktail1 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailName: "name 1");
var cocktail2 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailName: "name 2");
SquirrelDbContext.InsertSaleToDatabaseAndReturn(employee.Id, client.Id, cocktails: [(cocktail1.Id, 10, 1.1)]);
SquirrelDbContext.InsertSaleToDatabaseAndReturn(employee.Id, client.Id, cocktails: [(cocktail2.Id, 10, 1.1)]);
//Act
var response = await
HttpClient.GetAsync($"/api/report/getsales?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.OK));
var data = await GetModelFromResponseAsync<List<SaleViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task GetSales_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await
HttpClient.GetAsync($"/api/report/getsales?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 LoadSales_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var employee = SquirrelDbContext.InsertEmployeeToDatabaseAndReturn();
var cocktail1 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailName: "name 1");
var cocktail2 = SquirrelDbContext.InsertCocktailToDatabaseAndReturn(cocktailName: "name 2");
SquirrelDbContext.InsertSaleToDatabaseAndReturn(employee.Id, cocktails: [(cocktail1.Id, 10, 1.1), (cocktail2.Id, 10, 1.1)]);
SquirrelDbContext.InsertSaleToDatabaseAndReturn(employee.Id, cocktails: [(cocktail1.Id, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/report/loadsales?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
await AssertStreamAsync(response, "file.xlsx");
}
[Test]
public async Task LoadSales_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.GetAsync(
$"/api/report/loadsales?" +
$"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 GetSalary_WhenHaveRecords_ShouldSuccess_Test()
{
var post = SquirrelDbContext.InsertPostToDatabaseAndReturn();
var employee1 =
SquirrelDbContext.InsertEmployeeToDatabaseAndReturn(fio: "fio 1", postId:
post.PostId);
var employee2 =
SquirrelDbContext.InsertEmployeeToDatabaseAndReturn(fio: "fio 2", postId:
post.PostId);
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id,
employeeSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id,
employeeSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id,
employeeSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee2.Id,
employeeSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee2.Id,
employeeSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3));
var response = await
HttpClient.GetAsync($"/api/report/getsalary?fromDate={DateTime.UtcNow.AddDays(-7):yyyy-MM-dd}&toDate={DateTime.UtcNow.AddDays(-1):yyyy-MM-dd}");
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<EmployeeSalaryByPeriodViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(2));
}
[Test]
public async Task GetSalary_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.GetAsync(
$"/api/report/getsalary?" +
$"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 LoadSalary_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = SquirrelDbContext.InsertPostToDatabaseAndReturn();
var employee1 = SquirrelDbContext.InsertEmployeeToDatabaseAndReturn(fio: "fio 1", postId: post.PostId).AddPost(post);
var employee2 = SquirrelDbContext.InsertEmployeeToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post);
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id, employeeSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id, employeeSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee1.Id, employeeSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee2.Id, employeeSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5));
SquirrelDbContext.InsertSalaryToDatabaseAndReturn(employee2.Id, employeeSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3));
//Act
var response = await HttpClient.GetAsync($"/api/report/loadsalary?fromDate={DateTime.UtcNow.AddDays(-7):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
await AssertStreamAsync(response, "file.pdf");
}
[Test]
public async Task LoadSalary_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.GetAsync(
$"/api/report/loadsalary?" +
$"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));
}
private static async Task AssertStreamAsync(HttpResponseMessage response, string fileNameForSave = "")
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
using var data = await response.Content.ReadAsStreamAsync();
Assert.That(data, Is.Not.Null);
Assert.That(data.Length, Is.GreaterThan(0));
await SaveStreamAsync(data, fileNameForSave);
}
private static async Task SaveStreamAsync(Stream stream, string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
return;
}
var path = Path.Combine(Directory.GetCurrentDirectory(), fileName);
if (File.Exists(path))
{
File.Delete(path);
}
stream.Position = 0;
using var fileStream = new FileStream(path, FileMode.OpenOrCreate);
await stream.CopyToAsync(fileStream);
}
}