218 lines
11 KiB
C#
218 lines
11 KiB
C#
using System.Net;
|
|
using CandyHouseContracts.ViewModels;
|
|
using CandyHouseTests.Infrastructure;
|
|
|
|
namespace CandyHouseTests.WebApiControllersTests;
|
|
|
|
[TestFixture]
|
|
internal class ReportControllerTests : BaseWebApiControllerTest
|
|
{
|
|
[TearDown]
|
|
public void TearDown()
|
|
{
|
|
CandyHouseDbContext.RemoveClientDiscountsFromDatabase();
|
|
CandyHouseDbContext.RemoveSalesFromDatabase();
|
|
CandyHouseDbContext.RemoveClientsFromDatabase();
|
|
CandyHouseDbContext.RemoveProductsFromDatabase();
|
|
}
|
|
|
|
[Test]
|
|
public async Task GetProductHistoryPrices_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var product1 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "Product 1", price: 10);
|
|
var product2 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "Product 2", price: 20);
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 17, DateTime.UtcNow.AddDays(-3));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 15, DateTime.UtcNow.AddDays(-2));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 12, DateTime.UtcNow.AddDays(-1));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product2.Id, 25, DateTime.UtcNow.AddDays(-4));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product2.Id, 26, DateTime.UtcNow.AddDays(-3));
|
|
//Act
|
|
var response = await HttpClient.GetAsync("/api/report/getproducthistoryprices");
|
|
//Assert
|
|
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
|
var data = await GetModelFromResponseAsync<List<ProductHistoryPricesViewModel>>(response);
|
|
Assert.That(data, Is.Not.Null);
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(data, Has.Count.EqualTo(2));
|
|
Assert.That(data.First(x => x.ProductName == product1.ProductName).Prices, Has.Count.EqualTo(3));
|
|
Assert.That(data.First(x => x.ProductName == product2.ProductName).Prices, Has.Count.EqualTo(2));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public async Task GetSales_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var worker = CandyHouseDbContext.InsertEmployeeToDatabaseAndReturn();
|
|
var product1 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "name 1");
|
|
var product2 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "name 2");
|
|
CandyHouseDbContext.InsertSaleToDatabaseAndReturn(worker.Id,
|
|
products: [(product1.Id, 10, 1.1), (product2.Id, 10, 1.1)]);
|
|
CandyHouseDbContext.InsertSaleToDatabaseAndReturn(worker.Id, products: [(product1.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 GetClientDiscount_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var client1 = CandyHouseDbContext.InsertClientToDatabaseAndReturn(fio: "fio 1", phoneNumber: "+5-555-555-55-55");
|
|
var client2 = CandyHouseDbContext.InsertClientToDatabaseAndReturn(fio: "fio 2", phoneNumber: "+5-555-555-57-56");
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 100,
|
|
discountDate: DateTime.UtcNow.AddDays(-10));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 1000,
|
|
discountDate: DateTime.UtcNow.AddDays(-5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 200,
|
|
discountDate: DateTime.UtcNow.AddDays(5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client2.Id, discountAmount: 500,
|
|
discountDate: DateTime.UtcNow.AddDays(-5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client2.Id, discountAmount: 300,
|
|
discountDate: DateTime.UtcNow.AddDays(-3));
|
|
//Act
|
|
var response = await HttpClient.GetAsync(
|
|
$"/api/report/GetClientDiscount?fromDate={DateTime.UtcNow.AddDays(-7):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<ClientDiscountByPeriodViewModel>>(response);
|
|
Assert.That(data, Is.Not.Null);
|
|
Assert.That(data, Has.Count.EqualTo(2));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(data.First(x => x.ClientFIO == client1.FIO).TotalDiscount, Is.EqualTo(1000));
|
|
Assert.That(data.First(x => x.ClientFIO == client2.FIO).TotalDiscount, Is.EqualTo(800));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public async Task GetClientDiscount_WhenDateIsIncorrect_ShouldBadRequest_Test()
|
|
{
|
|
//Act
|
|
var response = await HttpClient.GetAsync(
|
|
$"/api/report/GetClientDiscount?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 LoadProductHistoryPrices_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var product1 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "Product 1", price: 10);
|
|
var product2 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "Product 2", price: 20);
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 17, DateTime.UtcNow.AddDays(-3));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 15, DateTime.UtcNow.AddDays(-2));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product1.Id, 12, DateTime.UtcNow.AddDays(-1));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product2.Id, 25, DateTime.UtcNow.AddDays(-4));
|
|
CandyHouseDbContext.InsertProductHistoryToDatabaseAndReturn(product2.Id, 26, DateTime.UtcNow.AddDays(-3));
|
|
//Act
|
|
var response = await HttpClient.GetAsync("/api/report/LoadProductHistoryPrices");
|
|
//Assert
|
|
await AssertStreamAsync(response, "file.docx");
|
|
}
|
|
|
|
[Test]
|
|
public async Task LoadSales_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var worker = CandyHouseDbContext.InsertEmployeeToDatabaseAndReturn(fio: "fio_worker");
|
|
var product1 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "name 1");
|
|
var product2 = CandyHouseDbContext.InsertProductToDatabaseAndReturn(productName: "name 2");
|
|
CandyHouseDbContext.InsertSaleToDatabaseAndReturn(worker.Id, sum: 60,
|
|
products: [(product1.Id, 10, 2), (product2.Id, 10, 4)]);
|
|
CandyHouseDbContext.InsertSaleToDatabaseAndReturn(worker.Id, sum: 20, products: [(product1.Id, 10, 2)]);
|
|
//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 LoadSalary_WhenHaveRecords_ShouldSuccess_Test()
|
|
{
|
|
//Arrange
|
|
var client1 = CandyHouseDbContext.InsertClientToDatabaseAndReturn(fio: "fio 1", phoneNumber: "+5-555-555-55-55");
|
|
var client2 = CandyHouseDbContext.InsertClientToDatabaseAndReturn(fio: "fio 2", phoneNumber: "+5-555-555-57-56");
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 100,
|
|
discountDate: DateTime.UtcNow.AddDays(-10));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 1000,
|
|
discountDate: DateTime.UtcNow.AddDays(-5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client1.Id, discountAmount: 200,
|
|
discountDate: DateTime.UtcNow.AddDays(5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client2.Id, discountAmount: 500,
|
|
discountDate: DateTime.UtcNow.AddDays(-5));
|
|
CandyHouseDbContext.InsertClientDiscountToDatabaseAndReturn(client2.Id, discountAmount: 300,
|
|
discountDate: DateTime.UtcNow.AddDays(-3));
|
|
//Act
|
|
var response = await HttpClient.GetAsync(
|
|
$"/api/report/LoadClientDiscount?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 LoadClientDiscount_WhenDateIsIncorrect_ShouldBadRequest_Test()
|
|
{
|
|
//Act
|
|
var response = await HttpClient.GetAsync(
|
|
$"/api/report/loadclientdiscount?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);
|
|
}
|
|
} |