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.aspects.Immutable;
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 com.jcabi.http.request.FakeRequest;
38  import java.io.IOException;
39  import java.net.HttpURLConnection;
40  import javax.json.Json;
41  import javax.json.JsonObject;
42  import org.hamcrest.MatcherAssert;
43  import org.hamcrest.Matchers;
44  import org.junit.Rule;
45  import org.junit.Test;
46  import org.mockito.Mockito;
47  
48  /**
49   * Test case for {@link RtDeployKeys}.
50   * @author Andres Candal (andres.candal@rollasolution.com)
51   * @version $Id: 0b9cd34a296e9a064c03d9414a5e6e3c5e0d3dc6 $
52   * @since 0.8
53   */
54  @Immutable
55  public final class RtDeployKeysTest {
56  
57      /**
58       * The rule for skipping test if there's BindException.
59       * @checkstyle VisibilityModifierCheck (3 lines)
60       */
61      @Rule
62      public final transient RandomPort resource = new RandomPort();
63  
64      /**
65       * RtDeployKeys can fetch empty list of deploy keys.
66       */
67      @Test
68      public void canFetchEmptyListOfDeployKeys() {
69          final DeployKeys deployKeys = new RtDeployKeys(
70              new FakeRequest().withBody("[]"),
71              RtDeployKeysTest.repo()
72          );
73          MatcherAssert.assertThat(
74              deployKeys.iterate(),
75              Matchers.emptyIterable()
76          );
77      }
78  
79      /**
80       * RtDeployKeys can fetch non empty list of deploy keys.
81       *
82       * @throws IOException If some problem inside.
83       */
84      @Test
85      public void canFetchNonEmptyListOfDeployKeys() throws IOException {
86          try (final MkContainer container = new MkGrizzlyContainer().next(
87              new MkAnswer.Simple(
88                  HttpURLConnection.HTTP_OK,
89                  Json.createArrayBuilder()
90                      .add(key(1))
91                      .add(key(2))
92                      .build().toString()
93              )
94          )) {
95              container.start(this.resource.port());
96              MatcherAssert.assertThat(
97                  new RtDeployKeys(
98                      new ApacheRequest(container.home()),
99                      RtDeployKeysTest.repo()
100                 ).iterate(),
101                 Matchers.<DeployKey>iterableWithSize(2)
102             );
103         }
104     }
105 
106     /**
107      * RtDeployKeys can fetch single deploy key.
108      * @throws IOException If some problem inside
109      */
110     @Test
111     public void canFetchSingleDeployKey() throws IOException {
112         final int number = 1;
113         final DeployKeys keys = new RtDeployKeys(
114             // @checkstyle MultipleStringLiterals (1 line)
115             new FakeRequest().withBody(String.format("{\"id\":%d}", number)),
116             RtDeployKeysTest.repo()
117         );
118         MatcherAssert.assertThat(
119             // @checkstyle MultipleStringLiterals (1 line)
120             keys.get(number).json().getInt("id"),
121             Matchers.equalTo(number)
122         );
123     }
124 
125     /**
126      * RtDeployKeys can create a key.
127      * @throws IOException If some problem inside.
128      */
129     @Test
130     public void canCreateDeployKey() throws IOException {
131         final int number = 2;
132         try (final MkContainer container = new MkGrizzlyContainer().next(
133             new MkAnswer.Simple(
134                 HttpURLConnection.HTTP_CREATED,
135                 String.format("{\"id\":%d}", number)
136             )
137         )) {
138             container.start(this.resource.port());
139             final DeployKeys keys = new RtDeployKeys(
140                 new ApacheRequest(container.home()), RtDeployKeysTest.repo()
141             );
142             MatcherAssert.assertThat(
143                 keys.create("Title", "Key").number(),
144                 Matchers.equalTo(number)
145             );
146         }
147     }
148 
149     /**
150      * Create and return repo for testing.
151      * @return Repo
152      */
153     private static Repo repo() {
154         final Repo repo = Mockito.mock(Repo.class);
155         Mockito.doReturn(new Coordinates.Simple("test", "keys"))
156             .when(repo).coordinates();
157         return repo;
158     }
159 
160     /**
161      * Create and return key to test.
162      * @param number Deploy Key Id
163      * @return JsonObject
164      */
165     private static JsonObject key(final int number) {
166         return Json.createObjectBuilder()
167             .add("id", number)
168             .add("key", "ssh-rsa AAA")
169             .build();
170     }
171 }