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.JdkRequest;
12  import com.jcabi.immutable.ArrayMap;
13  import jakarta.json.Json;
14  import jakarta.json.JsonObject;
15  import java.io.IOException;
16  import java.net.HttpURLConnection;
17  import java.util.EnumMap;
18  import org.hamcrest.MatcherAssert;
19  import org.hamcrest.Matchers;
20  import org.junit.jupiter.api.Test;
21  import org.junit.jupiter.api.extension.ExtendWith;
22  import org.mockito.Mockito;
23  
24  /**
25   * Test case for {@link RtIssues}.
26   * @since 0.1
27   * @checkstyle ClassDataAbstractionCouplingCheck (500 lines)
28   */
29  @ExtendWith(RandomPort.class)
30  final class RtIssuesTest {
31  
32      /**
33       * The rule for skipping test if there's BindException.
34       * @checkstyle VisibilityModifierCheck (3 lines)
35       */
36      @Test
37      void createIssue() throws IOException {
38          final String title = "Found a bug";
39          final String body = RtIssuesTest.issue(title).toString();
40          try (
41              MkContainer container = new MkGrizzlyContainer().next(
42                  new MkAnswer.Simple(HttpURLConnection.HTTP_CREATED, body)
43              ).next(new MkAnswer.Simple(HttpURLConnection.HTTP_OK, body))
44                  .start(RandomPort.port())
45          ) {
46              final RtIssues issues = new RtIssues(
47                  new JdkRequest(container.home()),
48                  RtIssuesTest.repo()
49              );
50              final Issue issue = issues.create(
51                  title, "having a problem with it."
52              );
53              MatcherAssert.assertThat(
54                  "Values are not equal",
55                  container.take().method(),
56                  Matchers.equalTo(Request.POST)
57              );
58              MatcherAssert.assertThat(
59                  "Values are not equal",
60                  new Issue.Smart(issue).title(),
61                  Matchers.equalTo(title)
62              );
63              container.stop();
64          }
65      }
66  
67      @Test
68      void getSingleIssue() throws IOException {
69          final String title = "Unit test";
70          try (
71              MkContainer container = new MkGrizzlyContainer().next(
72                  new MkAnswer.Simple(
73                      HttpURLConnection.HTTP_OK,
74                      RtIssuesTest.issue(title).toString()
75                  )
76              ).start(RandomPort.port())
77          ) {
78              final RtIssues issues = new RtIssues(
79                  new JdkRequest(container.home()),
80                  RtIssuesTest.repo()
81              );
82              final Issue issue = issues.get(1);
83              MatcherAssert.assertThat(
84                  "Values are not equal",
85                  new Issue.Smart(issue).title(),
86                  Matchers.equalTo(title)
87              );
88              container.stop();
89          }
90      }
91  
92      @Test
93      void iterateIssues() throws IOException {
94          try (
95              MkContainer container = new MkGrizzlyContainer().next(
96                  new MkAnswer.Simple(
97                      HttpURLConnection.HTTP_OK,
98                      Json.createArrayBuilder()
99                          .add(RtIssuesTest.issue("new issue"))
100                         .add(RtIssuesTest.issue("code issue"))
101                         .build().toString()
102                 )
103             ).start(RandomPort.port())
104         ) {
105             final RtIssues issues = new RtIssues(
106                 new JdkRequest(container.home()),
107                 RtIssuesTest.repo()
108             );
109             MatcherAssert.assertThat(
110                 "Collection size is incorrect",
111                 issues.iterate(new ArrayMap<>()),
112                 Matchers.iterableWithSize(2)
113             );
114             container.stop();
115         }
116     }
117 
118     @Test
119     void searchIssues() throws IOException {
120         try (
121             MkContainer container = new MkGrizzlyContainer().next(
122                 new MkAnswer.Simple(
123                     HttpURLConnection.HTTP_OK,
124                     Json.createArrayBuilder()
125                         .add(RtIssuesTest.issue("some issue"))
126                         .add(RtIssuesTest.issue("some other issue"))
127                         .build().toString()
128                 )
129             ).start(RandomPort.port())
130         ) {
131             final RtIssues issues = new RtIssues(
132                 new JdkRequest(container.home()),
133                 RtIssuesTest.repo()
134             );
135             MatcherAssert.assertThat(
136                 "Collection size is incorrect",
137                 issues.search(
138                     Issues.Sort.UPDATED,
139                     Search.Order.ASC,
140                     new EnumMap<>(
141                         Issues.Qualifier.class
142                     )
143                 ),
144                 Matchers.iterableWithSize(2)
145             );
146             container.stop();
147         }
148     }
149 
150     /**
151      * Create and return JsonObject to test.
152      * @param title The title of the issue
153      * @return JsonObject
154      */
155     private static JsonObject issue(final String title) {
156         return Json.createObjectBuilder()
157             .add("number", 1)
158             .add("state", Issue.OPEN_STATE)
159             .add("title", title)
160             .build();
161     }
162 
163     /**
164      * Create and return repo to test.
165      * @return Repo
166      */
167     private static Repo repo() {
168         final Repo repo = Mockito.mock(Repo.class);
169         Mockito.doReturn(new Coordinates.Simple("mark", "test"))
170             .when(repo).coordinates();
171         return repo;
172     }
173 }