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.aspects.Tv;
33 import com.jcabi.github.mock.MkGithub;
34 import com.jcabi.http.mock.MkAnswer;
35 import com.jcabi.http.mock.MkContainer;
36 import com.jcabi.http.mock.MkGrizzlyContainer;
37 import com.jcabi.http.request.ApacheRequest;
38 import java.net.HttpURLConnection;
39 import javax.json.Json;
40 import javax.json.JsonObject;
41 import org.hamcrest.MatcherAssert;
42 import org.hamcrest.Matchers;
43 import org.junit.Rule;
44 import org.junit.Test;
45
46 /**
47 * Test case for {@link RtUserOrganizations}.
48 *
49 * @author Carlos Miranda (miranda.cma@gmail.com)
50 * @author Chris Rebert (github@chrisrebert.com)
51 * @version $Id: 0b07dbace45db72a12d1f7d2d6bef49fe28b9b22 $
52 */
53 public final class RtUserOrganizationsTest {
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 * RtUserOrganizations can iterate organizations for
63 * an unauthenticated user.
64 *
65 * @throws Exception If a problem occurs
66 */
67 @Test
68 public void canIterateOrganizationsForUnauthUser() throws Exception {
69 final String username = "octopus";
70 final Github github = new MkGithub();
71 final User user = github.users().get(username);
72 final MkContainer container = new MkGrizzlyContainer().next(
73 new MkAnswer.Simple(
74 HttpURLConnection.HTTP_OK,
75 Json.createArrayBuilder()
76 .add(org(Tv.THREE, "org11"))
77 .add(org(Tv.FOUR, "org12"))
78 .add(org(Tv.FIVE, "org13"))
79 .build().toString()
80 )
81 ).start(this.resource.port());
82 try {
83 final UserOrganizations orgs = new RtUserOrganizations(
84 github,
85 new ApacheRequest(container.home()),
86 user
87 );
88 MatcherAssert.assertThat(
89 orgs.iterate(),
90 Matchers.<Organization>iterableWithSize(Tv.THREE)
91 );
92 MatcherAssert.assertThat(
93 container.take().uri().toString(),
94 Matchers.endsWith(String.format("/users/%s/orgs", username))
95 );
96 } finally {
97 container.stop();
98 }
99 }
100
101 /**
102 * Create and return organization to test.
103 * @param number Organization ID
104 * @param login Organization login name.
105 * @return JsonObject
106 */
107 private static JsonObject org(final int number, final String login) {
108 return Json.createObjectBuilder()
109 .add("id", number)
110 .add("login", login)
111 .build();
112 }
113 }