Skip to content

Commit 8bf5a22

Browse files
author
Bart Koelman
authored
Do not render defaults in paging links (#827)
1 parent 0654b42 commit 8bf5a22

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

src/JsonApiDotNetCore/Serialization/Building/LinkBuilder.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,23 @@ private string GetPageLink(ResourceContext resourceContext, int pageOffset, Page
117117
{
118118
string queryString = BuildQueryString(parameters =>
119119
{
120-
parameters["page[size]"] = pageSize.ToString();
121-
parameters["page[number]"] = pageOffset.ToString();
120+
if (pageSize == null || pageSize.Equals(_options.DefaultPageSize))
121+
{
122+
parameters.Remove("page[size]");
123+
}
124+
else
125+
{
126+
parameters["page[size]"] = pageSize.ToString();
127+
}
128+
129+
if (pageOffset == 1)
130+
{
131+
parameters.Remove("page[number]");
132+
}
133+
else
134+
{
135+
parameters["page[number]"] = pageOffset.ToString();
136+
}
122137
});
123138

124139
return $"{_request.BasePath}/{resourceContext.PublicName}" + queryString;

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/PaginationLinkTests.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public async Task When_page_number_is_specified_it_must_display_correct_top_leve
5656
"&fields[owner]=firstName&include=owner&sort=ordinal&foo=bar,baz";
5757
string route = pageNumber != 1
5858
? routePrefix + $"&page[size]={_defaultPageSize}&page[number]={pageNumber}"
59-
: routePrefix;
59+
: routePrefix + $"&page[size]={_defaultPageSize}";
6060

6161
// Act
6262
var response = await _client.GetAsync(route);
@@ -67,12 +67,12 @@ public async Task When_page_number_is_specified_it_must_display_correct_top_leve
6767
var body = await response.Content.ReadAsStringAsync();
6868
var links = JsonConvert.DeserializeObject<Document>(body).Links;
6969

70-
Assert.EndsWith($"{routePrefix}&page[size]={_defaultPageSize}&page[number]={selfLink}", links.Self);
70+
Assert.EndsWith($"{routePrefix}{GetPageNumberInQueryString(selfLink)}", links.Self);
7171

7272
if (firstLink.HasValue)
7373
{
74-
Assert.EndsWith($"{routePrefix}&page[size]={_defaultPageSize}&page[number]={firstLink.Value}",
75-
links.First);
74+
var expected = $"{routePrefix}{GetPageNumberInQueryString(firstLink.Value)}";
75+
Assert.EndsWith(expected, links.First);
7676
}
7777
else
7878
{
@@ -81,7 +81,8 @@ public async Task When_page_number_is_specified_it_must_display_correct_top_leve
8181

8282
if (prevLink.HasValue)
8383
{
84-
Assert.EndsWith($"{routePrefix}&page[size]={_defaultPageSize}&page[number]={prevLink}", links.Prev);
84+
var expected = $"{routePrefix}{GetPageNumberInQueryString(prevLink.Value)}";
85+
Assert.EndsWith(expected, links.Prev);
8586
}
8687
else
8788
{
@@ -90,7 +91,8 @@ public async Task When_page_number_is_specified_it_must_display_correct_top_leve
9091

9192
if (nextLink.HasValue)
9293
{
93-
Assert.EndsWith($"{routePrefix}&page[size]={_defaultPageSize}&page[number]={nextLink}", links.Next);
94+
var expected = $"{routePrefix}{GetPageNumberInQueryString(nextLink.Value)}";
95+
Assert.EndsWith(expected, links.Next);
9496
}
9597
else
9698
{
@@ -99,12 +101,18 @@ public async Task When_page_number_is_specified_it_must_display_correct_top_leve
99101

100102
if (lastLink.HasValue)
101103
{
102-
Assert.EndsWith($"{routePrefix}&page[size]={_defaultPageSize}&page[number]={lastLink}", links.Last);
104+
var expected = $"{routePrefix}{GetPageNumberInQueryString(lastLink.Value)}";
105+
Assert.EndsWith(expected, links.Last);
103106
}
104107
else
105108
{
106109
Assert.Null(links.Last);
107110
}
108111
}
112+
113+
private static string GetPageNumberInQueryString(int offset)
114+
{
115+
return offset == 1 ? string.Empty : $"&page[number]={offset}";
116+
}
109117
}
110118
}

test/UnitTests/Builders/LinkBuilderTests.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace UnitTests
1414
{
1515
public sealed class LinkBuilderTests
1616
{
17-
private readonly IPaginationContext _paginationContext;
17+
private readonly IPaginationContext _paginationContext = GetPaginationContext();
1818
private readonly Mock<IResourceGraph> _provider = new Mock<IResourceGraph>();
1919
private readonly IRequestQueryStringAccessor _queryStringAccessor = new FakeRequestQueryStringAccessor("?foo=bar");
2020
private const string _host = "http://www.example.com";
@@ -27,11 +27,6 @@ public sealed class LinkBuilderTests
2727
private const string _relSelf = "http://www.example.com/articles/123/relationships/author";
2828
private const string _relRelated = "http://www.example.com/articles/123/author";
2929

30-
public LinkBuilderTests()
31-
{
32-
_paginationContext = GetPaginationContext();
33-
}
34-
3530
[Theory]
3631
[InlineData(LinkTypes.All, LinkTypes.NotConfigured, _resourceSelf)]
3732
[InlineData(LinkTypes.Self, LinkTypes.NotConfigured, _resourceSelf)]
@@ -167,8 +162,8 @@ public void BuildTopLevelLinks_GlobalAndResourceConfiguration_ExpectedLinks(
167162
if (pages)
168163
{
169164
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10&page[number]=2", links.Self);
170-
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10&page[number]=1", links.First);
171-
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10&page[number]=1", links.Prev);
165+
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10", links.First);
166+
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10", links.Prev);
172167
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10&page[number]=3", links.Next);
173168
Assert.Equal($"{_host}/articles?foo=bar&page[size]=10&page[number]=3", links.Last);
174169
}
@@ -203,7 +198,7 @@ private IJsonApiOptions GetConfiguration(LinkTypes resourceLinks = LinkTypes.All
203198
return config.Object;
204199
}
205200

206-
private IPaginationContext GetPaginationContext()
201+
private static IPaginationContext GetPaginationContext()
207202
{
208203
var mock = new Mock<IPaginationContext>();
209204
mock.Setup(x => x.PageNumber).Returns(new PageNumber(2));

0 commit comments

Comments
 (0)