View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2013-2025 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.jcabi.github;
6   
7   import com.jcabi.http.Request;
8   import com.jcabi.http.mock.MkAnswer;
9   import com.jcabi.http.mock.MkContainer;
10  import com.jcabi.http.mock.MkGrizzlyContainer;
11  import com.jcabi.http.request.ApacheRequest;
12  import jakarta.json.Json;
13  import jakarta.json.JsonObject;
14  import java.io.IOException;
15  import java.net.HttpURLConnection;
16  import java.util.Iterator;
17  import org.hamcrest.MatcherAssert;
18  import org.hamcrest.Matchers;
19  import org.junit.jupiter.api.Assertions;
20  import org.junit.jupiter.api.Test;
21  import org.junit.jupiter.api.extension.ExtendWith;
22  
23  /**
24   * Test case for {@link RtPagination}.
25   * @since 0.4
26   */
27  @ExtendWith(RandomPort.class)
28  final class RtPaginationTest {
29      /**
30       * The rule for skipping test if there's BindException.
31       * @checkstyle VisibilityModifierCheck (3 lines)
32       */
33      @Test
34      void jumpNextPage() throws IOException {
35          try (
36              MkContainer container = new MkGrizzlyContainer().next(
37                  RtPaginationTest.simple("Hi Jeff")
38                      .withHeader(
39                          "Link",
40                          "</s?page=3&per_page=100>; rel=\"next\""
41                      )
42              ).next(RtPaginationTest.simple("Hi Mark"))
43                  .start(RandomPort.port())
44          ) {
45              final Request request = new ApacheRequest(container.home());
46              final RtPagination<JsonObject> page = new RtPagination<>(
47                  request,
48                  object -> object
49              );
50              final Iterator<JsonObject> iterator = page.iterator();
51              MatcherAssert.assertThat(
52                  "String does not contain expected value",
53                  iterator.next().toString(),
54                  Matchers.containsString("Jeff")
55              );
56              MatcherAssert.assertThat(
57                  "String does not contain expected value",
58                  iterator.next().toString(),
59                  Matchers.containsString("Mark")
60              );
61              container.stop();
62          }
63      }
64  
65      @Test
66      void throwsIfNoMoreElement() throws IOException {
67          try (
68              MkContainer container = new MkGrizzlyContainer()
69                  .next(RtPaginationTest.simple("Hi there")).start(RandomPort.port())
70          ) {
71              final Request request = new ApacheRequest(container.home());
72              final RtPagination<JsonObject> page = new RtPagination<>(
73                  request,
74                  object -> object
75              );
76              final Iterator<JsonObject> iterator = page.iterator();
77              iterator.next();
78              Assertions.assertThrows(
79                  java.util.NoSuchElementException.class,
80                  iterator::next,
81                  "Should throw when no more elements"
82              );
83              container.stop();
84          }
85      }
86  
87      /**
88       * Create and return MkAnswer.Simple to test.
89       * @param msg Message to build MkAnswer.Simple
90       * @return MkAnswer.Simple
91       */
92      private static MkAnswer.Simple simple(final String msg) {
93          final String message = Json.createArrayBuilder()
94              .add(Json.createObjectBuilder().add("msg", msg))
95              .build().toString();
96          return new MkAnswer.Simple(HttpURLConnection.HTTP_OK, message);
97      }
98  }