Просмотр исходного кода

Added filtering and tests

pull/57/head
Safet Purkovic 3 лет назад
Родитель
Сommit
4ee84f21da

+ 37
- 0
Diligent.WebAPI.Business/Extensions/SelectionProcessExtensions.cs Просмотреть файл

@@ -0,0 +1,37 @@
namespace Diligent.WebAPI.Business.Extensions
{
public static class SelectionProcessExtensions
{
public static List<SelectionLevel> FilterLevels(this List<SelectionLevel> query, SelectionProcessFilterDto filter)
{
var filteredLevels = new List<SelectionLevel>();
// If filters are empty
if ((filter == null) || (!filter.DateStart.HasValue && !filter.DateEnd.HasValue && filter.Statuses != null && filter.Statuses.Length == 0))
return query;

foreach (var level in query)
{
List<SelectionProcess> selectionProcesses = level.SelectionProcesses;
if (filter.DateStart.HasValue)
{
selectionProcesses = level.SelectionProcesses.Where(sp => sp.Date >= filter.DateStart.Value).ToList();
}

if (filter.DateEnd.HasValue)
{
selectionProcesses = selectionProcesses.Where(sp => sp.Date <= filter.DateEnd.Value).ToList();
}

var filteredLevel = new SelectionLevel { Id = level.Id, Name = level.Name, SelectionProcesses = level.SelectionProcesses};

if(filter.Statuses != null && filter.Statuses.Length > 0) {
filteredLevel.SelectionProcesses = selectionProcesses.Where(f => filter.Statuses.Contains(f.Status)).ToList();
}

filteredLevels.Add(filteredLevel);
}

return filteredLevels;
}
}
}

+ 1
- 0
Diligent.WebAPI.Business/Services/Interfaces/ISelectionLevelService.cs Просмотреть файл

@@ -8,5 +8,6 @@ namespace Diligent.WebAPI.Business.Services.Interfaces
{
Task<List<SelectionLevelResponseWithDataDto>> GetAllAsync();
Task<SelectionLevelResposneDto> GetByIdAsync(int id);
List<SelectionLevelResponseWithDataDto> GetFilteredLevelsAsync(SelectionProcessFilterDto filters);
}
}

+ 9
- 2
Diligent.WebAPI.Business/Services/SelectionLevelService.cs Просмотреть файл

@@ -1,5 +1,5 @@
using Diligent.WebAPI.Contracts.DTOs.SelectionLevel;
using Diligent.WebAPI.Contracts.DTOs.SelectionProcess;
using Diligent.WebAPI.Business.Extensions;
using Diligent.WebAPI.Contracts.DTOs.SelectionLevel;

namespace Diligent.WebAPI.Business.Services
{
@@ -27,5 +27,12 @@ namespace Diligent.WebAPI.Business.Services
return _mapper.Map<SelectionLevelResposneDto>(sl);

}

public List<SelectionLevelResponseWithDataDto> GetFilteredLevelsAsync(SelectionProcessFilterDto filters)
{
var filteredLevels = _context.SelectionLevels.Include(x => x.SelectionProcesses).ThenInclude(sp => sp.Applicant).ToList().FilterLevels(filters);

return _mapper.Map<List<SelectionLevelResponseWithDataDto>>(filteredLevels);
}
}
}

+ 9
- 0
Diligent.WebAPI.Contracts/DTOs/Ad/SelectionProcessFilterDto.cs Просмотреть файл

@@ -0,0 +1,9 @@
namespace Diligent.WebAPI.Contracts.DTOs.Ad
{
public class SelectionProcessFilterDto
{
public string[]? Statuses { get; set; }
public DateTime? DateStart { get; set; }
public DateTime? DateEnd { get; set; }
}
}

+ 4
- 0
Diligent.WebAPI.Host/Controllers/V1/SelectionLevelsController.cs Просмотреть файл

@@ -16,6 +16,10 @@
public async Task<IActionResult> GetAll() =>
Ok(await _selectionLevelService.GetAllAsync());

[HttpGet("filtered")]
public async Task<IActionResult> GetFilteredLevels([FromQuery] SelectionProcessFilterDto request) =>
Ok(_selectionLevelService.GetFilteredLevelsAsync(request));

[Authorize]
[HttpGet("{id}")]
public async Task<IActionResult> GetById([FromRoute] int id) =>

+ 28
- 0
Diligent.WebAPI.Tests/Services/SelectionLevelsServiceTests.cs Просмотреть файл

@@ -1,6 +1,7 @@
using AutoMapper;
using Diligent.WebAPI.Business.MappingProfiles;
using Diligent.WebAPI.Business.Services;
using Diligent.WebAPI.Contracts.DTOs.Ad;
using Diligent.WebAPI.Contracts.DTOs.Applicant;
using Diligent.WebAPI.Contracts.DTOs.SelectionLevel;
using Diligent.WebAPI.Contracts.Exceptions;
@@ -27,6 +28,7 @@ namespace Diligent.WebAPI.Tests.Services
new List<Profile>
{
new SelectionLevelMappingProfile(),
new SelectionProcessMappingProfile(),
}));
_mapper = new Mapper(configuration);
}
@@ -42,6 +44,32 @@ namespace Diligent.WebAPI.Tests.Services
result.Should().HaveCount(4);
}

[Fact]
public async Task GetFilteredData_ShouldReturnListOfLevels_Always()
{
var databaseContext = await Helpers<SelectionLevel>.GetDatabaseContext(_levels);
databaseContext.SelectionLevels.First().SelectionProcesses = new List<SelectionProcess>
{
new SelectionProcess{ Id = 1, Status = "Obrađen", Date = DateTime.Now},
new SelectionProcess{ Id = 2, Status = "Obrađen", Date = DateTime.Now.AddMonths(-1)},
new SelectionProcess{ Id = 3, Status = "Čeka na zakazivanje", Date = DateTime.Now},
new SelectionProcess{ Id = 4, Status = "Čeka na zakazivanje", Date = DateTime.Now.AddMonths(-1)},
};

SelectionLevelService service = new(databaseContext, _mapper);
var filter = new SelectionProcessFilterDto
{
DateStart = DateTime.Now.AddDays(-1),
DateEnd = DateTime.Now.AddDays(1),
Statuses = new string[]{ "Obrađen", "Zakazan" }
};

var result = service.GetFilteredLevelsAsync(filter);

result.Should().HaveCount(4);
result.First().SelectionProcesses.Should().HaveCount(1);
}

[Fact]
public async Task GetById_ShouldReturnLevel_WhenLevelExist()
{

Загрузка…
Отмена
Сохранить