Files
ProektstuZhenechka/TheCatHasPawsProject/CatHasPawsTests/WebApiControllersTests/ReportControllerTests.cs
2025-04-10 17:47:46 +04:00

207 lines
10 KiB
C#

using CatHasPawsContratcs.ViewModels;
using CatHasPawsTests.Infrastructure;
using System.Net;
namespace CatHasPawsTests.WebApiControllersTests;
[TestFixture]
internal class ReportControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
CatHasPawsDbContext.RemoveSalariesFromDatabase();
CatHasPawsDbContext.RemoveSalesFromDatabase();
CatHasPawsDbContext.RemoveWorkersFromDatabase();
CatHasPawsDbContext.RemovePostsFromDatabase();
CatHasPawsDbContext.RemoveBuyersFromDatabase();
CatHasPawsDbContext.RemoveProductsFromDatabase();
CatHasPawsDbContext.RemoveManufacturersFromDatabase();
}
[Test]
public async Task GetProducts_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var manufacturer1 = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 1");
var manufacturer2 = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 2");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.1");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.2");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.3");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer2.Id, productName: "name 2.1");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer2.Id, productName: "name 2.2");
//Act
var response = await HttpClient.GetAsync("/api/report/getproducts");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ManufacturerProductViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.First(x => x.ManufacturerName == manufacturer1.ManufacturerName).Products, Has.Count.EqualTo(3));
Assert.That(data.First(x => x.ManufacturerName == manufacturer2.ManufacturerName).Products, Has.Count.EqualTo(2));
});
}
[Test]
public async Task GetSales_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var worker = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn();
var manufacturerId = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn();
var product1 = CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturerId.Id, productName: "name 1");
var product2 = CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturerId.Id, productName: "name 2");
CatHasPawsDbContext.InsertSaleToDatabaseAndReturn(worker.Id, products: [(product1.Id, 10, 1.1), (product2.Id, 10, 1.1)]);
CatHasPawsDbContext.InsertSaleToDatabaseAndReturn(worker.Id, products: [(product1.Id, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/report/getsales?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<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.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 GetSalary_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = CatHasPawsDbContext.InsertPostToDatabaseAndReturn();
var worker1 = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1", postId: post.PostId).AddPost(post);
var worker2 = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post);
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3));
//Act
var response = await HttpClient.GetAsync($"/api/report/getsalary?fromDate={DateTime.Now.AddDays(-7):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<WorkerSalaryByPeriodViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(2));
Assert.Multiple(() =>
{
Assert.That(data.First(x => x.WorkerFIO == worker1.Id).TotalSalary, Is.EqualTo(1000));
Assert.That(data.First(x => x.WorkerFIO == worker2.Id).TotalSalary, Is.EqualTo(800));
});
}
[Test]
public async Task GetSalary_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/report/getsalary?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 LoadProducts_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var manufacturer1 = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 1");
var manufacturer2 = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 2");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.1");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.2");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer1.Id, productName: "name 1.3");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer2.Id, productName: "name 2.1");
CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturer2.Id, productName: "name 2.2");
//Act
var response = await HttpClient.GetAsync("/api/report/LoadProducts");
//Assert
await AssertStreamAsync(response, "file.docx");
}
[Test]
public async Task LoadSales_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var worker = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn();
var manufacturerId = CatHasPawsDbContext.InsertManufacturerToDatabaseAndReturn();
var product1 = CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturerId.Id, productName: "name 1");
var product2 = CatHasPawsDbContext.InsertProductToDatabaseAndReturn(manufacturerId.Id, productName: "name 2");
CatHasPawsDbContext.InsertSaleToDatabaseAndReturn(worker.Id, products: [(product1.Id, 10, 1.1), (product2.Id, 10, 1.1)]);
CatHasPawsDbContext.InsertSaleToDatabaseAndReturn(worker.Id, products: [(product1.Id, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/report/loadsales?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.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.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 LoadSalary_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = CatHasPawsDbContext.InsertPostToDatabaseAndReturn();
var worker1 = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1", postId: post.PostId).AddPost(post);
var worker2 = CatHasPawsDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post);
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5));
CatHasPawsDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3));
//Act
var response = await HttpClient.GetAsync($"/api/report/loadsalary?fromDate={DateTime.Now.AddDays(-7):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.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.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));
}
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);
}
}