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.google.common.base.Optional;
8   import com.jcabi.github.mock.MkGitHub;
9   import com.jcabi.http.Request;
10  import com.jcabi.http.mock.MkAnswer;
11  import com.jcabi.http.mock.MkContainer;
12  import com.jcabi.http.mock.MkGrizzlyContainer;
13  import com.jcabi.http.mock.MkQuery;
14  import com.jcabi.http.request.ApacheRequest;
15  import com.jcabi.http.request.FakeRequest;
16  import jakarta.json.Json;
17  import jakarta.json.JsonObject;
18  import java.io.IOException;
19  import java.io.StringReader;
20  import java.net.HttpURLConnection;
21  import org.hamcrest.MatcherAssert;
22  import org.hamcrest.Matchers;
23  import org.junit.jupiter.api.Test;
24  import org.junit.jupiter.api.extension.ExtendWith;
25  
26  /**
27   * Testcase for {@link RtStatuses}.
28   * @since 0.24
29   * @todo #1130:30min Write RtStatusesITCase, an integration test case for
30   *  RtStatuses/RtStatus against real GitHub commit status data.
31   * @todo #1490:30min Continue to close grizzle servers open on tests. Use
32   *  try-with-resource statement instead of try-catch whenever is possible.
33   * @checkstyle MultipleStringLiterals (500 lines)
34   * @checkstyle ClassDataAbstractionCouplingCheck (500 lines)
35   */
36  @ExtendWith(RandomPort.class)
37  @SuppressWarnings("PMD.AvoidDuplicateLiterals")
38  final class RtStatusesTest {
39  
40      /**
41       * RtStatuses can fetch its commit.
42       * @throws IOException If there is an I/O problem.
43       */
44      @Test
45      void fetchesCommit() throws IOException {
46          final Commit original = new MkGitHub().randomRepo().git()
47              .commits().get("5e8d65e0dbfab0716db16493e03a0baba480625a");
48          MatcherAssert.assertThat(
49              "Values are not equal",
50              new RtStatuses(new FakeRequest(), original).commit(),
51              Matchers.equalTo(original)
52          );
53      }
54  
55      @Test
56      void createsStatus() throws IOException {
57          final String stateprop = "state";
58          final String urlprop = "target_url";
59          final String descprop = "description";
60          final String contextprop = "context";
61          final String url = "https://ci.example.com/1000/output";
62          final String description = "Build has completed successfully";
63          final String context = "continuous-integration/jenkins";
64          final MkContainer container = new MkGrizzlyContainer().next(
65              new MkAnswer.Simple(
66                  HttpURLConnection.HTTP_CREATED,
67                  Json.createObjectBuilder().add(stateprop, "failure")
68                      .add(urlprop, url)
69                      .add(descprop, description)
70                      .add(contextprop, context)
71                      .build().toString()
72              )
73          ).start(RandomPort.port());
74          final Request entry = new ApacheRequest(container.home());
75          final Statuses statuses = new RtStatuses(
76              entry,
77              new RtCommit(
78                  entry,
79                  new MkGitHub().randomRepo(),
80                  "0abcd89jcabitest"
81              )
82          );
83          try {
84              statuses.create(
85                  new Statuses.StatusCreate(Status.State.FAILURE)
86                      .withTargetUrl(Optional.of(url))
87                      .withDescription(description)
88                      .withContext(Optional.of(context))
89              );
90              final MkQuery request = container.take();
91              MatcherAssert.assertThat(
92                  "Values are not equal",
93                  request.method(),
94                  Matchers.equalTo(Request.POST)
95              );
96              final JsonObject obj = Json.createReader(
97                  new StringReader(request.body())
98              ).readObject();
99              MatcherAssert.assertThat(
100                 "Values are not equal",
101                 obj.getString(stateprop),
102                 Matchers.equalTo(Status.State.FAILURE.identifier())
103             );
104             MatcherAssert.assertThat(
105                 "Values are not equal",
106                 obj.getString(contextprop),
107                 Matchers.equalTo(context)
108             );
109             MatcherAssert.assertThat(
110                 "Values are not equal",
111                 obj.getString(descprop),
112                 Matchers.equalTo(description)
113             );
114             MatcherAssert.assertThat(
115                 "Values are not equal",
116                 obj.getString(urlprop),
117                 Matchers.equalTo(url)
118             );
119         } finally {
120             container.stop();
121         }
122     }
123 }