using FluentAssertions;
using foodmarket.Application.Common;
using Xunit;
namespace foodmarket.UnitTests;
/// PagedRequest / PagedResult — простые helper'ы, но Skip/Take/Desc/
/// TotalPages нетривиальны на edge-кейсах. Sprint 15 — расширение покрытия.
public class PagedRequestTests
{
[Theory]
[InlineData(1, 50, 0)] // первая страница → skip 0
[InlineData(2, 50, 50)] // вторая → skip 50
[InlineData(5, 20, 80)] // 5×20 = 80
[InlineData(0, 50, 0)] // невалидная страница ≤0 → skip 0 (Max)
public void Skip_calculated_from_Page_and_PageSize(int page, int pageSize, int expectedSkip)
=> new PagedRequest { Page = page, PageSize = pageSize }.Skip.Should().Be(expectedSkip);
[Theory]
[InlineData(50, 50)]
[InlineData(1, 1)]
[InlineData(501, 500)] // clamp на 500 сверху
[InlineData(0, 1)] // clamp на 1 снизу
[InlineData(-1, 1)] // отрицательные тоже клампим
public void Take_clamps_to_1_500(int requested, int expected)
=> new PagedRequest { PageSize = requested }.Take.Should().Be(expected);
[Theory]
[InlineData("desc", true)]
[InlineData("DESC", true)]
[InlineData("asc", false)]
[InlineData(null, false)]
[InlineData("", false)]
[InlineData("garbage", false)]
public void Desc_only_for_explicit_desc(string? order, bool expected)
=> new PagedRequest { Order = order }.Desc.Should().Be(expected);
[Theory]
[InlineData(100, 50, 2)]
[InlineData(101, 50, 3)]
[InlineData(0, 50, 0)]
[InlineData(7, 50, 1)]
public void TotalPages_calculated_from_Total_and_PageSize(int total, int pageSize, int expected)
{
var result = new PagedResult
{
Items = new List(),
Total = total,
Page = 1,
PageSize = pageSize,
};
result.TotalPages.Should().Be(expected);
}
[Fact]
public void Default_Page_and_PageSize_sensible()
{
var r = new PagedRequest();
r.Page.Should().Be(1);
r.PageSize.Should().Be(50);
r.Skip.Should().Be(0);
r.Take.Should().Be(50);
}
}