изменил всё под историчность сущности
This commit is contained in:
@@ -14,33 +14,49 @@ internal class ReportContract(ISoftwareStorageContract softwareStorageContract,
|
||||
private readonly ISoftwareStorageContract _softwareStorageContract = softwareStorageContract;
|
||||
private readonly IRequestStorageContract _requestStorageContract = requestStorageContract;
|
||||
private readonly BaseWordBuilder _baseWordBuilder = baseWordBuilder;
|
||||
|
||||
private readonly ILogger _logger = logger;
|
||||
|
||||
public Task<List<ManufacturerSoftwareDataModel>> GetDataSoftwaresByManufacturerAsync(CancellationToken ct)
|
||||
internal static readonly string[] tableHeader = ["Дата", "Сумма", "Товар", "Кол-во"];
|
||||
internal static readonly string[] documentHeader = ["Название ПО", "Старая цена", "Дата"];
|
||||
|
||||
public Task<List<HistoryOfSoftwareDataModel>> GetDataSoftwaresByHistoryAsync(CancellationToken ct)
|
||||
{
|
||||
_logger.LogInformation("Get data SoftwaresByManufacturer");
|
||||
return GetDataBySoftwaresAsync(ct);
|
||||
}
|
||||
private async Task<List<ManufacturerSoftwareDataModel>> GetDataBySoftwaresAsync(CancellationToken ct)
|
||||
=> [.. (await _softwareStorageContract.GetListAsync(ct))
|
||||
.GroupBy(x => x.ManufacturerName)
|
||||
.Select(x => new ManufacturerSoftwareDataModel
|
||||
{
|
||||
ManufacturerName = x.Key, Softwares = [.. x.Select(y => y.SoftwareName)]
|
||||
})];
|
||||
private async Task<List<HistoryOfSoftwareDataModel>> GetDataBySoftwaresAsync(CancellationToken ct)
|
||||
=> [.. (await _softwareStorageContract.GetListAsync(ct)).GroupBy(x => x.SoftwareName).Select(x => new HistoryOfSoftwareDataModel {
|
||||
SoftwareName = x.Key, Histories = [.. x.Select(y => y.OldPrice.ToString())], Data = [.. x.Select(y => y.ChangeDate.ToString())] })];
|
||||
|
||||
|
||||
public async Task<Stream> CreateDocumentSoftwaresByManufacturerAsync(CancellationToken ct)
|
||||
public async Task<Stream> CreateDocumentSoftwaresByHistoryAsync(CancellationToken ct)
|
||||
{
|
||||
_logger.LogInformation("Create report SoftwaresByManufacturer");
|
||||
var data = await GetDataBySoftwaresAsync(ct) ?? throw new
|
||||
InvalidOperationException("No found data");
|
||||
_logger.LogInformation("Create report HistoryBySoftware");
|
||||
var data = await GetDataBySoftwaresAsync(ct) ?? throw new InvalidOperationException("No found data");
|
||||
|
||||
var tableData = new List<string[]>
|
||||
{
|
||||
documentHeader
|
||||
};
|
||||
|
||||
foreach (var software in data)
|
||||
{
|
||||
tableData.Add(new string[] { software.SoftwareName, "", "" });
|
||||
|
||||
var pairs = software.Histories.Zip(software.Data,
|
||||
(price, date) => new string[] { "", price, date });
|
||||
|
||||
tableData.AddRange(pairs);
|
||||
}
|
||||
|
||||
return _baseWordBuilder
|
||||
.AddHeader("Software по производителям")
|
||||
.AddParagraph($"Сформировано на дату {DateTime.Now}")
|
||||
.AddTable([10, 20], [.. data.SelectMany(x => (new List<string[]>() { new string[] { x.ManufacturerName, "" }}).Union(x.Softwares.Select(y => new string[] { "", y }))).ToList()])
|
||||
.Build();
|
||||
.AddHeader("Истории ПО")
|
||||
.AddParagraph($"Сформировано на дату {DateTime.Now}")
|
||||
.AddTable(
|
||||
widths: new[] { 3000, 3000, 3000 },
|
||||
data: tableData
|
||||
)
|
||||
.Build();
|
||||
}
|
||||
|
||||
public Task<List<RequestDataModel>> GetDataRequestByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
|
||||
@@ -55,8 +71,7 @@ internal class ReportContract(ISoftwareStorageContract softwareStorageContract,
|
||||
{
|
||||
throw new IncorrectDatesException(dateStart, dateFinish);
|
||||
}
|
||||
return [.. (await _requestStorageContract.GetListAsync(dateStart,
|
||||
dateFinish, ct)).OrderBy(x => x.RequestDate)];
|
||||
return [.. (await _requestStorageContract.GetListAsync(dateStart, dateFinish, ct)).OrderBy(x => x.RequestDate)];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace SmallSoftwareContracts.AdapterContracts.OperationResponses;
|
||||
|
||||
public class ReportOperationResponse : OperationResponse
|
||||
{
|
||||
public static ReportOperationResponse OK(List<ManufacturerSoftwareViewModel> data) => OK<ReportOperationResponse, List<ManufacturerSoftwareViewModel>>(data);
|
||||
public static ReportOperationResponse OK(List<HistoryOfSoftwareViewModel> data) => OK<ReportOperationResponse, List<HistoryOfSoftwareViewModel>>(data);
|
||||
public static ReportOperationResponse OK(List<RequestViewModel> data) => OK<ReportOperationResponse, List<RequestViewModel>>(data);
|
||||
public static ReportOperationResponse OK(Stream data, string filename) => OK<ReportOperationResponse, Stream>(data, filename);
|
||||
public static ReportOperationResponse BadRequest(string message) => BadRequest<ReportOperationResponse>(message);
|
||||
|
||||
@@ -4,9 +4,9 @@ namespace SmallSoftwareContracts.BusinessLogicsContracts;
|
||||
|
||||
public interface IReportContract
|
||||
{
|
||||
Task<List<ManufacturerSoftwareDataModel>> GetDataSoftwaresByManufacturerAsync(CancellationToken ct);
|
||||
Task<List<HistoryOfSoftwareDataModel>> GetDataSoftwaresByHistoryAsync(CancellationToken ct);
|
||||
Task<List<RequestDataModel>> GetDataRequestByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
|
||||
Task<Stream> CreateDocumentSoftwaresByManufacturerAsync(CancellationToken ct);
|
||||
Task<Stream> CreateDocumentSoftwaresByHistoryAsync(CancellationToken ct);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace SmallSoftwareContracts.DataModels;
|
||||
|
||||
public class HistoryOfSoftwareDataModel
|
||||
{
|
||||
public required string SoftwareName { get; set; }
|
||||
public required List<string> Histories { get; set; }
|
||||
public required List<string> Data { get; set; }
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SmallSoftwareContracts.DataModels;
|
||||
|
||||
public class ManufacturerSoftwareDataModel
|
||||
{
|
||||
public required string ManufacturerName { get; set; }
|
||||
public required List<string> Softwares { get; set; }
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace SmallSoftwareContracts.StoragesContracts;
|
||||
|
||||
public interface ISoftwareStorageContract
|
||||
{
|
||||
Task<List<SoftwareDataModel>> GetListAsync(CancellationToken ct);
|
||||
Task<List<SoftwareHistoryDataModel>> GetListAsync(CancellationToken ct);
|
||||
List<SoftwareDataModel> GetList(bool onlyActive = true, string? manufacturerId = null);
|
||||
List<SoftwareHistoryDataModel> GetHistoryBySoftwareId(string softwareId);
|
||||
SoftwareDataModel? GetElementById(string id);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace SmallSoftwareContracts.ViewModels;
|
||||
|
||||
public class HistoryOfSoftwareViewModel
|
||||
{
|
||||
public required string SoftwareName { get; set; }
|
||||
public required List<string> Histories { get; set; }
|
||||
public required List<string> Data { get; set; }
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SmallSoftwareContracts.ViewModels;
|
||||
|
||||
public class ManufacturerSoftwareViewModel
|
||||
{
|
||||
public required string ManufacturerName { get; set; }
|
||||
public required List<string> Softwares { get; set; }
|
||||
}
|
||||
@@ -26,12 +26,12 @@ internal class SoftwareStorageContract : ISoftwareStorageContract
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
|
||||
public async Task<List<SoftwareDataModel>> GetListAsync(CancellationToken ct)
|
||||
public async Task<List<SoftwareHistoryDataModel>> GetListAsync(CancellationToken ct)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
return [.. await _dbContext.Softwares.Include(x => x.Manufacturer).Select(x => _mapper.Map<SoftwareDataModel>(x)).ToListAsync(ct)];
|
||||
return [.. await _dbContext.SoftwareHistories.Include(x => x.Software).Select(x => _mapper.Map<SoftwareHistoryDataModel>(x)).ToListAsync(ct)];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Moq;
|
||||
using SmallSoftwareBusinessLogic.Implementations;
|
||||
using SmallSoftwareBusinessLogic.OfficePackage;
|
||||
@@ -34,51 +35,46 @@ internal class ReportContractTests
|
||||
public async Task GetDataSoftwaresByManufacturer_ShouldSuccess_Test()
|
||||
{
|
||||
//Arrange
|
||||
var manufacturer1 = new
|
||||
ManufacturerDataModel(Guid.NewGuid().ToString(), "name1");
|
||||
var manufacturer2 = new
|
||||
ManufacturerDataModel(Guid.NewGuid().ToString(), "name2");
|
||||
_softwareStorageContract.Setup(x =>
|
||||
x.GetListAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(new
|
||||
List<SoftwareDataModel>()
|
||||
{
|
||||
new(Guid.NewGuid().ToString(), "name 1.1",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 2.1",
|
||||
SoftwareType.AudioDriver, manufacturer2.Id, 10, false, manufacturer2),
|
||||
new(Guid.NewGuid().ToString(), "name 1.2",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 1.3",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 2.2",
|
||||
SoftwareType.AudioDriver, manufacturer2.Id, 10, false, manufacturer2)
|
||||
}));
|
||||
var manufacturer1 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name1");
|
||||
var manufacturer2 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name2");
|
||||
var softwareId1 = Guid.NewGuid().ToString();
|
||||
var softwareId2 = Guid.NewGuid().ToString();
|
||||
|
||||
var software1 = new SoftwareDataModel(softwareId1, "name1", SoftwareType.AudioDriver, manufacturer1.Id, 10, false);
|
||||
var software2 = new SoftwareDataModel(softwareId2, "name2", SoftwareType.AudioDriver, manufacturer2.Id, 10, false);
|
||||
|
||||
_softwareStorageContract.Setup(x => x.GetListAsync(It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.FromResult(new List<SoftwareHistoryDataModel>()
|
||||
{
|
||||
new(softwareId1, 22, DateTime.UtcNow, software1),
|
||||
new(softwareId2, 21, DateTime.UtcNow, software2),
|
||||
new(softwareId1, 33, DateTime.UtcNow, software1),
|
||||
new(softwareId1, 32, DateTime.UtcNow, software1),
|
||||
new(softwareId2, 65, DateTime.UtcNow, software2)
|
||||
}));
|
||||
|
||||
//Act
|
||||
var data = await
|
||||
_reportContract.GetDataSoftwaresByManufacturerAsync(CancellationToken.None);
|
||||
var data = await _reportContract.GetDataSoftwaresByHistoryAsync(CancellationToken.None);
|
||||
|
||||
//Assert
|
||||
Assert.That(data, Is.Not.Null);
|
||||
Assert.That(data, Is.Not.Null);
|
||||
Assert.That(data, Has.Count.EqualTo(2));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(data.First(x => x.ManufacturerName ==
|
||||
manufacturer1.ManufacturerName).Softwares, Has.Count.EqualTo(3));
|
||||
Assert.That(data.First(x => x.ManufacturerName ==
|
||||
manufacturer2.ManufacturerName).Softwares, Has.Count.EqualTo(2));
|
||||
Assert.That(data.First(x => x.SoftwareName == software1.SoftwareName).Histories, Has.Count.EqualTo(3));
|
||||
Assert.That(data.First(x => x.SoftwareName == software2.SoftwareName).Histories, Has.Count.EqualTo(2));
|
||||
});
|
||||
_softwareStorageContract.Verify(x =>
|
||||
x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
_softwareStorageContract.Verify(x => x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
[Test]
|
||||
public async Task GetDataSoftwaresByManufacturer_WhenNoRecords_ShouldSuccess_Test()
|
||||
public async Task GetDataSoftwaresByHistory_WhenNoRecords_ShouldSuccess_Test()
|
||||
{
|
||||
//Arrange
|
||||
_softwareStorageContract.Setup(x =>
|
||||
x.GetListAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(new
|
||||
List<SoftwareDataModel>()));
|
||||
x.GetListAsync(It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.FromResult(new List<SoftwareHistoryDataModel>()));
|
||||
//Act
|
||||
var data = await
|
||||
_reportContract.GetDataSoftwaresByManufacturerAsync(CancellationToken.None);
|
||||
var data = await _reportContract.GetDataSoftwaresByHistoryAsync(CancellationToken.None);
|
||||
//Assert
|
||||
Assert.That(data, Is.Not.Null);
|
||||
Assert.That(data, Has.Count.EqualTo(0));
|
||||
@@ -86,80 +82,80 @@ internal class ReportContractTests
|
||||
x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
[Test]
|
||||
public void GetDataSoftwaresByManufacturer_WhenStorageThrowError_ShouldFail_Test()
|
||||
public void GetDataSoftwaresByHistory_WhenStorageThrowError_ShouldFail_Test()
|
||||
{
|
||||
//Arrange
|
||||
_softwareStorageContract.Setup(x => x.GetListAsync(It.IsAny<CancellationToken>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
//Act&Assert
|
||||
Assert.That(async () => await _reportContract.GetDataSoftwaresByManufacturerAsync(CancellationToken.None), Throws.TypeOf<StorageException>());
|
||||
Assert.That(async () => await _reportContract.GetDataSoftwaresByHistoryAsync(CancellationToken.None), Throws.TypeOf<StorageException>());
|
||||
_softwareStorageContract.Verify(x => x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task CreateDocumentSoftwaresByManufacturer_ShouldeSuccess_Test()
|
||||
public async Task CreateDocumentSoftwaresByHistory_ShouldeSuccess_Test()
|
||||
{
|
||||
//Arrange
|
||||
var manufacturer1 = new
|
||||
ManufacturerDataModel(Guid.NewGuid().ToString(), "name1");
|
||||
var manufacturer2 = new
|
||||
ManufacturerDataModel(Guid.NewGuid().ToString(), "name2");
|
||||
_softwareStorageContract.Setup(x =>
|
||||
x.GetListAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(new List<SoftwareDataModel>()
|
||||
{
|
||||
new(Guid.NewGuid().ToString(), "name 1.1",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 2.1",
|
||||
SoftwareType.AudioDriver, manufacturer2.Id, 10, false, manufacturer2),
|
||||
new(Guid.NewGuid().ToString(), "name 1.2",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 1.3",
|
||||
SoftwareType.AudioDriver, manufacturer1.Id, 10, false, manufacturer1),
|
||||
new(Guid.NewGuid().ToString(), "name 2.2",
|
||||
SoftwareType.AudioDriver, manufacturer2.Id, 10, false, manufacturer2)
|
||||
}));
|
||||
_baseWordBuilder.Setup(x =>
|
||||
x.AddHeader(It.IsAny<string>())).Returns(_baseWordBuilder.Object);
|
||||
_baseWordBuilder.Setup(x =>
|
||||
x.AddParagraph(It.IsAny<string>())).Returns(_baseWordBuilder.Object);
|
||||
var softwareId1 = Guid.NewGuid().ToString();
|
||||
var softwareId2 = Guid.NewGuid().ToString();
|
||||
|
||||
var software1 = new SoftwareDataModel(softwareId1, "name1", SoftwareType.AudioDriver, manufacturer1.Id, 10, false);
|
||||
var software2 = new SoftwareDataModel(softwareId2, "name2", SoftwareType.AudioDriver, manufacturer2.Id, 10, false);
|
||||
|
||||
var histories = new List<SoftwareHistoryDataModel>()
|
||||
{
|
||||
new(softwareId1, 22, DateTime.UtcNow, software1),
|
||||
new(softwareId1, 33, DateTime.UtcNow, software1),
|
||||
new(softwareId1, 32, DateTime.UtcNow, software1),
|
||||
new(softwareId2, 21, DateTime.UtcNow, software2),
|
||||
new(softwareId2, 65, DateTime.UtcNow, software2)
|
||||
};
|
||||
|
||||
_softwareStorageContract.Setup(x => x.GetListAsync(It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.FromResult(histories));
|
||||
|
||||
_baseWordBuilder.Setup(x => x.AddHeader(It.IsAny<string>())).Returns(_baseWordBuilder.Object);
|
||||
_baseWordBuilder.Setup(x => x.AddParagraph(It.IsAny<string>())).Returns(_baseWordBuilder.Object);
|
||||
|
||||
var countRows = 0;
|
||||
string[] firstRow = [];
|
||||
string[] secondRow = [];
|
||||
|
||||
_baseWordBuilder.Setup(x => x.AddTable(It.IsAny<int[]>(),
|
||||
It.IsAny<List<string[]>>()))
|
||||
.Callback((int[] widths, List<string[]> data) =>
|
||||
{
|
||||
countRows = data.Count;
|
||||
firstRow = data[0];
|
||||
secondRow = data[1];
|
||||
})
|
||||
.Returns(_baseWordBuilder.Object);
|
||||
//Act
|
||||
var data = await
|
||||
_reportContract.CreateDocumentSoftwaresByManufacturerAsync(CancellationToken.None)
|
||||
;
|
||||
//Assert
|
||||
_softwareStorageContract.Verify(x =>
|
||||
x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddHeader(It.IsAny<string>()),
|
||||
Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddParagraph(It.IsAny<string>()),
|
||||
Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddTable(It.IsAny<int[]>(),
|
||||
It.IsAny<List<string[]>>()), Times.Once);
|
||||
It.IsAny<List<string[]>>()))
|
||||
.Callback((int[] widths, List<string[]> data) =>
|
||||
{
|
||||
countRows = data.Count;
|
||||
if (data.Count > 0) firstRow = data[0];
|
||||
if (data.Count > 1) secondRow = data[1];
|
||||
})
|
||||
.Returns(_baseWordBuilder.Object);
|
||||
|
||||
// Act
|
||||
var data = await _reportContract.CreateDocumentSoftwaresByHistoryAsync(CancellationToken.None);
|
||||
|
||||
// Assert
|
||||
_softwareStorageContract.Verify(x => x.GetListAsync(It.IsAny<CancellationToken>()), Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddHeader(It.IsAny<string>()), Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddParagraph(It.IsAny<string>()), Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.AddTable(It.IsAny<int[]>(), It.IsAny<List<string[]>>()), Times.Once);
|
||||
_baseWordBuilder.Verify(x => x.Build(), Times.Once);
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(countRows, Is.EqualTo(7));
|
||||
Assert.That(firstRow, Has.Length.EqualTo(2));
|
||||
Assert.That(secondRow, Has.Length.EqualTo(2));
|
||||
});
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(firstRow[0],
|
||||
Is.EqualTo(manufacturer1.ManufacturerName));
|
||||
Assert.That(firstRow[1], Is.Empty);
|
||||
Assert.That(secondRow[0], Is.Empty);
|
||||
Assert.That(secondRow[1], Is.EqualTo("name 1.1"));
|
||||
Assert.That(countRows, Is.EqualTo(8));
|
||||
|
||||
Assert.That(firstRow, Has.Length.EqualTo(3));
|
||||
Assert.That(secondRow, Has.Length.EqualTo(3));
|
||||
|
||||
Assert.That(firstRow[0], Is.EqualTo("Название ПО"));
|
||||
Assert.That(firstRow[1], Is.EqualTo("Старая цена"));
|
||||
|
||||
Assert.That(secondRow[0], Is.EqualTo("name1"));
|
||||
Assert.That(secondRow[1], Is.EqualTo(""));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -32,14 +32,18 @@ internal class SoftwareStorageContractTests : BaseStorageContractTest
|
||||
[Test]
|
||||
public async Task Try_GetListAsync_WhenHaveRecords_Test()
|
||||
{
|
||||
var software =
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id, softwareName: "name 1");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id, softwareName: "name 2");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id, softwareName: "name 3");
|
||||
var manufacturer1 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name1");
|
||||
|
||||
var software1 = new SoftwareDataModel(Guid.NewGuid().ToString(), "name1", SoftwareType.AudioDriver, manufacturer1.Id, 10, false);
|
||||
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturer.Id, software1.Id, softwareName: "name 1");
|
||||
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 11);
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 12);
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 13);
|
||||
var list = await _softwareStorageContract.GetListAsync(CancellationToken.None);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(x => x.Id == software.Id), software);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using SmallSoftwareContracts.ViewModels;
|
||||
using SmallSoftwareContracts.DataModels;
|
||||
using SmallSoftwareContracts.Enums;
|
||||
using SmallSoftwareContracts.ViewModels;
|
||||
using SmallSoftwareDatabase.Models;
|
||||
using SmallSoftwareTests.Infrastructure;
|
||||
using System.Net;
|
||||
@@ -21,30 +23,39 @@ internal class ReportControllerTests : BaseWebApiControllerTest
|
||||
[Test]
|
||||
public async Task GetSoftwares_WhenHaveRecords_ShouldSuccess_Test()
|
||||
{
|
||||
//Arrange
|
||||
var manufacturer1 =
|
||||
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 1");
|
||||
var manufacturer2 =
|
||||
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturerName: "name 2");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id, softwareName: "name 1.1");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id, softwareName: "name 1.2");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id, softwareName: "name 1.3");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer2.Id, softwareName: "name 2.1");
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer2.Id, softwareName: "name 2.2");
|
||||
//Act
|
||||
// Arrange
|
||||
var manufacturer1 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name1");
|
||||
var manufacturer2 = new ManufacturerDataModel(Guid.NewGuid().ToString(), "name2");
|
||||
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer1.Id, manufacturerName: manufacturer1.ManufacturerName);
|
||||
SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn(manufacturer2.Id, manufacturerName: manufacturer2.ManufacturerName);
|
||||
|
||||
|
||||
var software1 = new SoftwareDataModel(Guid.NewGuid().ToString(), "soft1", SoftwareType.AudioDriver, manufacturer1.Id, 10, false);
|
||||
var software2 = new SoftwareDataModel(Guid.NewGuid().ToString(), "soft2", SoftwareType.AudioDriver, manufacturer2.Id, 10, false);
|
||||
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer1.Id, software1.Id, softwareName: software1.SoftwareName);
|
||||
SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer2.Id, software2.Id, softwareName: software2.SoftwareName);
|
||||
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 11);
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 12);
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software1.Id, 13);
|
||||
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software2.Id, 11);
|
||||
SmallSoftwareDbContext.InsertSoftwareHistoryToDatabaseAndReturn(software2.Id, 12);
|
||||
|
||||
// Act
|
||||
var response = await HttpClient.GetAsync("/api/report/getsoftwares");
|
||||
//Assert
|
||||
|
||||
// Assert
|
||||
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
var data = await
|
||||
GetModelFromResponseAsync<List<ManufacturerSoftwareViewModel>>(response);
|
||||
var data = await GetModelFromResponseAsync<List<HistoryOfSoftwareViewModel>>(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).Softwares, Has.Count.EqualTo(3));
|
||||
Assert.That(data.First(x => x.ManufacturerName ==
|
||||
manufacturer2.ManufacturerName).Softwares, Has.Count.EqualTo(2));
|
||||
Assert.That(data.First(x => x.SoftwareName == software1.SoftwareName).Histories, Has.Count.EqualTo(3));
|
||||
Assert.That(data.First(x => x.SoftwareName == software2.SoftwareName).Histories, Has.Count.EqualTo(2));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ public class ReportAdapter : IReportAdapter
|
||||
_logger = logger;
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
cfg.CreateMap<ManufacturerSoftwareDataModel, ManufacturerSoftwareViewModel>();
|
||||
cfg.CreateMap<HistoryOfSoftwareDataModel, HistoryOfSoftwareViewModel>();
|
||||
cfg.CreateMap<RequestDataModel, RequestViewModel>();
|
||||
cfg.CreateMap<InstallationRequestDataModel, InstallationRequestViewModel>();
|
||||
});
|
||||
@@ -32,7 +32,7 @@ public class ReportAdapter : IReportAdapter
|
||||
try
|
||||
{
|
||||
return ReportOperationResponse.OK([.. (await _reportContract
|
||||
.GetDataSoftwaresByManufacturerAsync(ct)).Select(x => _mapper.Map<ManufacturerSoftwareViewModel>(x))]);
|
||||
.GetDataSoftwaresByHistoryAsync(ct)).Select(x => _mapper.Map<HistoryOfSoftwareViewModel>(x))]);
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
@@ -56,7 +56,7 @@ public class ReportAdapter : IReportAdapter
|
||||
{
|
||||
try
|
||||
{
|
||||
var stream = await _reportContract.CreateDocumentSoftwaresByManufacturerAsync(ct);
|
||||
var stream = await _reportContract.CreateDocumentSoftwaresByHistoryAsync(ct);
|
||||
stream.Position = 0;
|
||||
return ReportOperationResponse.OK(stream, "products.docx");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user