in genie-web/src/integTest/java/com/netflix/genie/web/apis/rest/v3/controllers/ClusterRestControllerIntegrationTest.java [885:972]
void testPagingDoubleEncoding() throws Exception {
final String id1 = UUID.randomUUID().toString();
final String id2 = UUID.randomUUID().toString();
final String id3 = UUID.randomUUID().toString();
final String name1 = "Test " + UUID.randomUUID().toString();
final String name2 = "Test " + UUID.randomUUID().toString();
final String name3 = "Test " + UUID.randomUUID().toString();
final String user1 = UUID.randomUUID().toString();
final String user2 = UUID.randomUUID().toString();
final String user3 = UUID.randomUUID().toString();
final String version1 = UUID.randomUUID().toString();
final String version2 = UUID.randomUUID().toString();
final String version3 = UUID.randomUUID().toString();
this.createConfigResource(
new Cluster.Builder(name1, user1, version1, ClusterStatus.UP).withId(id1).build(),
null
);
Thread.sleep(1000);
this.createConfigResource(
new Cluster.Builder(name2, user2, version2, ClusterStatus.OUT_OF_SERVICE).withId(id2).build(),
null
);
Thread.sleep(1000);
this.createConfigResource(
new Cluster.Builder(name3, user3, version3, ClusterStatus.TERMINATED).withId(id3).build(),
null
);
Assertions.assertThat(this.clusterRepository.count()).isEqualTo(3L);
final URLEncoder urlEncoder = new URLEncoder();
final String unencodedNameQuery = "Test %";
final String singleEncodedNameQuery = urlEncoder.encode(unencodedNameQuery, StandardCharsets.UTF_8);
// Query by name with wildcard and get the second page containing a single result (out of 3)
final JsonNode responseJsonNode = GenieObjectMapper
.getMapper()
.readTree(
RestAssured
.given(this.getRequestSpecification())
.param("name", unencodedNameQuery)
.param("size", 1)
.param("page", 1)
.when()
.port(this.port)
.get(CLUSTERS_API)
.then()
.statusCode(Matchers.is(HttpStatus.OK.value()))
.contentType(Matchers.containsString(MediaTypes.HAL_JSON_VALUE))
.body(CLUSTERS_LIST_PATH, Matchers.hasSize(1))
.extract()
.asByteArray()
);
// Self link is not double-encoded
Assertions
.assertThat(
responseJsonNode
.get("_links")
.get("self")
.get("href")
.asText()
)
.contains(singleEncodedNameQuery);
// Pagination links that were double-encoded
final String[] doubleEncodedHREFS = new String[]{
"first", "next", "prev", "last",
};
for (String doubleEncodedHref : doubleEncodedHREFS) {
final String linkString = responseJsonNode
.get("_links")
.get(doubleEncodedHref)
.get("href")
.asText();
Assertions.assertThat(linkString).isNotBlank();
final Map<String, String> params = Maps.newHashMap();
URLEncodedUtils
.parse(new URI(linkString), StandardCharsets.UTF_8)
.forEach(nameValuePair -> params.put(nameValuePair.getName(), nameValuePair.getValue()));
Assertions.assertThat(params).containsKey("name");
Assertions.assertThat(params.get("name")).isEqualTo(unencodedNameQuery);
}
}