View Javadoc
1   /**
2    * Copyright (c) 2013-2023, jcabi.com
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met: 1) Redistributions of source code must retain the above
8    * copyright notice, this list of conditions and the following
9    * disclaimer. 2) Redistributions in binary form must reproduce the above
10   * copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided
12   * with the distribution. 3) Neither the name of the jcabi.com nor
13   * the names of its contributors may be used to endorse or promote
14   * products derived from this software without specific prior written
15   * permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21   * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28   * OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package com.jcabi.github;
31  
32  import com.jcabi.http.Request;
33  import com.jcabi.http.mock.MkAnswer;
34  import com.jcabi.http.mock.MkContainer;
35  import com.jcabi.http.mock.MkGrizzlyContainer;
36  import com.jcabi.http.request.ApacheRequest;
37  import java.net.HttpURLConnection;
38  import java.util.Iterator;
39  import java.util.NoSuchElementException;
40  import javax.json.Json;
41  import javax.json.JsonArray;
42  import javax.json.JsonObject;
43  import org.hamcrest.MatcherAssert;
44  import org.hamcrest.Matchers;
45  import org.junit.Rule;
46  import org.junit.Test;
47  
48  /**
49   * Test case for {@link RtValuePagination}.
50   * @author Paul Polishchuk (ppol@ua.fm)
51   * @version $Id: 2ad13a436f738ae784f13ec4ad04e5123aea3cd5 $
52   */
53  public final class RtValuePaginationTest {
54      /**
55       * The rule for skipping test if there's BindException.
56       * @checkstyle VisibilityModifierCheck (3 lines)
57       */
58      @Rule
59      public final transient RandomPort resource = new RandomPort();
60  
61      /**
62       * RtPagination can jump to next page of results.
63       * @throws Exception if there is any problem
64       */
65      @Test
66      public void jumpNextPage() throws Exception {
67          final String jeff = "Jeff";
68          final String mark = "Mark";
69          final String judy = "Judy";
70          final String jessy = "Jessy";
71          final MkContainer container = new MkGrizzlyContainer().next(
72              RtValuePaginationTest.simple(jeff, mark)
73                  .withHeader("Link", "</s?page=3&per_page=100>; rel=\"next\"")
74          ).next(RtValuePaginationTest.simple(judy, jessy))
75              .start(this.resource.port());
76          final Request request = new ApacheRequest(container.home());
77          final RtValuePagination<JsonObject, JsonArray> page =
78              new RtValuePagination<>(
79                  request,
80                  object -> Json.createObjectBuilder()
81                      .add("id1", object.getString(0))
82                      .add("id2", object.getString(1))
83                      .build()
84              );
85          final Iterator<JsonObject> iterator = page.iterator();
86          MatcherAssert.assertThat(
87              iterator.next().toString(),
88              Matchers.allOf(
89                  Matchers.containsString(jeff),
90                  Matchers.containsString(mark)
91              )
92          );
93          MatcherAssert.assertThat(
94              iterator.next().toString(),
95              Matchers.allOf(
96                  Matchers.containsString(judy),
97                  Matchers.containsString(jessy)
98              )
99          );
100         container.stop();
101     }
102 
103     /**
104      * RtValuePagination can throw if there is no more elements in pagination.
105      * @throws Exception if there is any problem
106      */
107     @Test(expected = NoSuchElementException.class)
108     public void throwsIfNoMoreElement() throws Exception {
109         final String jeff = "other Jeff";
110         final String mark = "other Mark";
111         final MkContainer container = new MkGrizzlyContainer().next(
112             RtValuePaginationTest.simple(jeff, mark)
113         ).start(this.resource.port());
114         try {
115             final Request request = new ApacheRequest(container.home());
116             final RtValuePagination<JsonObject, JsonArray> page =
117                 new RtValuePagination<>(
118                     request,
119                     object -> Json.createObjectBuilder()
120                         .add("id3", object.getString(0))
121                         .add("id4", object.getString(1))
122                         .build()
123                 );
124             final Iterator<JsonObject> iterator = page.iterator();
125             iterator.next();
126             MatcherAssert.assertThat(
127                 iterator.next(),
128                 Matchers.notNullValue()
129             );
130         } finally {
131             container.stop();
132         }
133     }
134 
135     /**
136      * Create and return MkAnswer.Simple to test.
137      * @param one First array element
138      * @param another Second array element
139      * @return MkAnswer.Simple
140      */
141     private static MkAnswer.Simple simple(final String one,
142         final String another
143     ) {
144         final String message = Json.createArrayBuilder()
145             .add(Json.createArrayBuilder().add(one).add(another))
146             .build().toString();
147         return new MkAnswer.Simple(HttpURLConnection.HTTP_OK, message);
148     }
149 }