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); } }