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 }