-
Notifications
You must be signed in to change notification settings - Fork 251
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ContentTag pagination sadly doesn't conform to Zendesk's standards. It uses cursor pagination, but doesn't include a `links.next` node in the response (which would normally hold the URL of the next page of results). Because of this, we have to build the 'next page URL' ourselves by extracting the `meta.after_cursor` node value & using it to add a `&page[after]=<cursorValue>` parameter to the original query URL
- Loading branch information
1 parent
0620db7
commit 8f76412
Showing
6 changed files
with
250 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
117 changes: 117 additions & 0 deletions
117
src/test/java/org/zendesk/client/v2/ContentTagsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
package org.zendesk.client.v2; | ||
|
||
import com.github.tomakehurst.wiremock.junit.WireMockClassRule; | ||
import org.apache.commons.text.RandomStringGenerator; | ||
import org.junit.After; | ||
import org.junit.Before; | ||
import org.junit.ClassRule; | ||
import org.junit.Rule; | ||
import org.junit.Test; | ||
import org.zendesk.client.v2.model.hc.ContentTag; | ||
|
||
import java.text.SimpleDateFormat; | ||
import java.util.TimeZone; | ||
|
||
import static com.github.tomakehurst.wiremock.client.WireMock.*; | ||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
|
||
|
||
public class ContentTagsTest { | ||
|
||
private static final String MOCK_URL_FORMATTED_STRING = "http://localhost:%d"; | ||
public static final RandomStringGenerator RANDOM_STRING_GENERATOR = | ||
new RandomStringGenerator.Builder().withinRange('a', 'z').build(); | ||
private static final String MOCK_API_TOKEN = RANDOM_STRING_GENERATOR.generate(15); | ||
private static final String MOCK_USERNAME = RANDOM_STRING_GENERATOR.generate(10).toLowerCase() + "@cloudbees.com"; | ||
|
||
@ClassRule | ||
public static WireMockClassRule zendeskApiClass = new WireMockClassRule(options() | ||
.dynamicPort() | ||
.dynamicHttpsPort() | ||
.usingFilesUnderClasspath("wiremock") | ||
); | ||
|
||
@Rule | ||
public WireMockClassRule zendeskApiMock = zendeskApiClass; | ||
|
||
private Zendesk client; | ||
|
||
@Before | ||
public void setUp() throws Exception { | ||
int ephemeralPort = zendeskApiMock.port(); | ||
|
||
String hostname = String.format(MOCK_URL_FORMATTED_STRING, ephemeralPort); | ||
|
||
client = new Zendesk.Builder(hostname) | ||
.setUsername(MOCK_USERNAME) | ||
.setToken(MOCK_API_TOKEN) | ||
.build(); | ||
} | ||
|
||
@After | ||
public void closeClient() { | ||
if (client != null) { | ||
client.close(); | ||
} | ||
client = null; | ||
} | ||
|
||
@Test | ||
public void getContentTags_willPageOverMultiplePages() throws Exception { | ||
zendeskApiMock.stubFor( | ||
get( | ||
urlPathEqualTo("/api/v2/guide/content_tags")) | ||
.withQueryParam("page%5Bsize%5D", equalTo("2")) | ||
.willReturn(ok() | ||
.withBodyFile("content_tags/content_tag_search_first_page.json") | ||
) | ||
); | ||
zendeskApiMock.stubFor( | ||
get( | ||
urlPathEqualTo("/api/v2/guide/content_tags")) | ||
.withQueryParam("page%5Bsize%5D", equalTo("2")) | ||
.withQueryParam("page%5Bafter%5D", equalTo("first_after_cursor")) | ||
.willReturn(ok() | ||
.withBodyFile("content_tags/content_tag_search_second_page.json") | ||
) | ||
); | ||
zendeskApiMock.stubFor( | ||
get( | ||
urlPathEqualTo("/api/v2/guide/content_tags")) | ||
.withQueryParam("page%5Bsize%5D", equalTo("2")) | ||
.withQueryParam("page%5Bafter%5D", equalTo("second_after_cursor")) | ||
.willReturn(ok() | ||
.withBodyFile("content_tags/content_tag_search_third_page.json") | ||
) | ||
); | ||
|
||
Iterable<ContentTag> actualResults = client.getContentTags(2); | ||
|
||
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); | ||
df.setTimeZone(TimeZone.getTimeZone("UTC")); | ||
|
||
assertThat(actualResults).containsExactly( | ||
new ContentTag("11111111111111111111111111", "first name", | ||
df.parse("2023-03-13 10:01:00"), | ||
df.parse("2023-03-13 10:01:01") | ||
), | ||
new ContentTag("22222222222222222222222222", "second name", | ||
df.parse("2023-03-13 10:02:00"), | ||
df.parse("2023-03-13 10:02:02") | ||
), | ||
new ContentTag("33333333333333333333333333", "third name", | ||
df.parse("2023-03-13 10:03:00"), | ||
df.parse("2023-03-13 10:03:03") | ||
), | ||
new ContentTag("44444444444444444444444444", "fourth name", | ||
df.parse("2023-03-13 10:04:00"), | ||
df.parse("2023-03-13 10:04:04") | ||
), | ||
new ContentTag("55555555555555555555555555", "fifth name", | ||
df.parse("2023-03-13 10:05:00"), | ||
df.parse("2023-03-13 10:05:05") | ||
) | ||
); | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
src/test/resources/wiremock/__files/content_tags/content_tag_search_first_page.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"records": [ | ||
{ | ||
"id": "11111111111111111111111111", | ||
"name": "first name", | ||
"created_at": "2023-03-13T10:01:00.000Z", | ||
"updated_at": "2023-03-13T10:01:01.000Z" | ||
}, | ||
{ | ||
"id": "22222222222222222222222222", | ||
"name": "second name", | ||
"created_at": "2023-03-13T10:02:00.000Z", | ||
"updated_at": "2023-03-13T10:02:02.000Z" | ||
} | ||
], | ||
"meta": { | ||
"has_more": true, | ||
"after_cursor": "first_after_cursor", | ||
"before_cursor": "first_before_cursor" | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
src/test/resources/wiremock/__files/content_tags/content_tag_search_second_page.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"records": [ | ||
{ | ||
"id": "33333333333333333333333333", | ||
"name": "third name", | ||
"created_at": "2023-03-13T10:03:00.000Z", | ||
"updated_at": "2023-03-13T10:03:03.000Z" | ||
}, | ||
{ | ||
"id": "44444444444444444444444444", | ||
"name": "fourth name", | ||
"created_at": "2023-03-13T10:04:00.000Z", | ||
"updated_at": "2023-03-13T10:04:04.000Z" | ||
} | ||
], | ||
"meta": { | ||
"has_more": true, | ||
"after_cursor": "second_after_cursor", | ||
"before_cursor": "second_before_cursor" | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
src/test/resources/wiremock/__files/content_tags/content_tag_search_third_page.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"records": [ | ||
{ | ||
"id": "55555555555555555555555555", | ||
"name": "fifth name", | ||
"created_at": "2023-03-13T10:05:00.000Z", | ||
"updated_at": "2023-03-13T10:05:05.000Z" | ||
} | ||
], | ||
"meta": { | ||
"has_more": false, | ||
"after_cursor": "third_after_cursor", | ||
"before_cursor": "third_before_cursor" | ||
} | ||
} |