void testPagingDoubleEncoding()

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