View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2013-2025 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.jcabi.github.mock;
6   
7   import com.google.common.base.Optional;
8   import com.jcabi.github.Event;
9   import java.io.IOException;
10  import java.util.Iterator;
11  import org.hamcrest.MatcherAssert;
12  import org.hamcrest.Matchers;
13  import org.junit.jupiter.api.Test;
14  
15  /**
16   * Test case for {@link MkIssueEvents}.
17   * @since 0.23
18   */
19  @SuppressWarnings("PMD.AvoidDuplicateLiterals")
20  final class MkIssueEventsTest {
21      /**
22       * Absent optional string.
23       */
24      private static final Optional<String> ABSENT_STR = Optional.absent();
25  
26      /**
27       * MkIssueEvents can create issue events.
28       * @throws Exception If some problem inside
29       */
30      @Test
31      void createsIssueEvent() throws Exception {
32          final MkIssueEvents events = MkIssueEventsTest.issueEvents();
33          final String login = "jack";
34          final String type = "locked";
35          final long before = MkIssueEventsTest.now();
36          final Event.Smart event = new Event.Smart(
37              events.create(
38                  type,
39                  2,
40                  login,
41                  MkIssueEventsTest.ABSENT_STR
42              )
43          );
44          final long after = MkIssueEventsTest.now();
45          MatcherAssert.assertThat(
46              "Values are not equal",
47              event.type(),
48              Matchers.equalTo(type)
49          );
50          MatcherAssert.assertThat(
51              "Values are not equal",
52              event.author().login(),
53              Matchers.equalTo(login)
54          );
55          MatcherAssert.assertThat(
56              "Values are not equal",
57              event.url().toString(),
58              Matchers.equalTo(
59                  String.format(
60                      // @checkstyle LineLength (1 line)
61                      "https://api.jcabi-github.invalid/repos/jeff/%s/issues/events/1",
62                      events.repo().coordinates().repo()
63                  )
64              )
65          );
66          MatcherAssert.assertThat(
67              "Value is not greater than expected",
68              event.createdAt().getTime(),
69              Matchers.greaterThanOrEqualTo(before)
70          );
71          MatcherAssert.assertThat(
72              "Value is not less than expected",
73              event.createdAt().getTime(),
74              Matchers.lessThanOrEqualTo(after)
75          );
76      }
77  
78      /**
79       * MkIssueEvents can create an issue event with a label attribute.
80       * @throws Exception If some problem inside
81       */
82      @Test
83      void createsIssueEventWithLabel() throws Exception {
84          final MkIssueEvents events = MkIssueEventsTest.issueEvents();
85          final String label = "my label";
86          final Event.Smart event = new Event.Smart(
87              events.create(
88                  "labeled",
89                  2,
90                  "samuel",
91                  Optional.of(label)
92              )
93          );
94          MatcherAssert.assertThat(
95              "Values are not equal",
96              event.label().get().name(),
97              Matchers.equalTo(label)
98          );
99      }
100 
101     /**
102      * MkIssueEvents can get a single issue event.
103      * @throws Exception If some problem inside
104      */
105     @Test
106     void getsIssueEvent() throws Exception {
107         final MkIssueEvents events = MkIssueEventsTest.issueEvents();
108         final String type = "unlocked";
109         final String login = "jill";
110         final int eventnum = events.create(
111             type,
112             2,
113             login,
114             MkIssueEventsTest.ABSENT_STR
115         ).number();
116         final Event.Smart event = new Event.Smart(events.get(eventnum));
117         MatcherAssert.assertThat(
118             "Values are not equal",
119             event.number(),
120             Matchers.equalTo(eventnum)
121         );
122         MatcherAssert.assertThat(
123             "Values are not equal",
124             event.type(),
125             Matchers.equalTo(type)
126         );
127         MatcherAssert.assertThat(
128             "Values are not equal",
129             event.author().login(),
130             Matchers.equalTo(login)
131         );
132     }
133 
134     /**
135      * MkIssueEvents can iterate over issue events in correct order.
136      * @throws Exception If some problem inside
137      */
138     @Test
139     void iteratesIssueEvents() throws Exception {
140         final MkIssueEvents events = MkIssueEventsTest.issueEvents();
141         final Event first = events.create(
142             "closed",
143             3,
144             "john",
145             MkIssueEventsTest.ABSENT_STR
146         );
147         final Event second = events.create(
148             "reopened",
149             3,
150             "jane",
151             MkIssueEventsTest.ABSENT_STR
152         );
153         MatcherAssert.assertThat(
154             "Collection size is incorrect",
155             events.iterate(),
156             Matchers.iterableWithSize(2)
157         );
158         final Iterator<Event> iter = events.iterate().iterator();
159         MatcherAssert.assertThat(
160             "Values are not equal",
161             iter.next(),
162             Matchers.equalTo(first)
163         );
164         MatcherAssert.assertThat(
165             "Values are not equal",
166             iter.next(),
167             Matchers.equalTo(second)
168         );
169     }
170 
171     /**
172      * Create an MkIssueEvents to work with.
173      * Can't use normal IssueEvents because we need the mock-only
174      * {@link MkIssueEvents#create(String, int, String, Optional)} method.
175      * @return MkIssueEvents
176      */
177     private static MkIssueEvents issueEvents() throws IOException {
178         return MkIssueEvents.class.cast(
179             new MkGitHub().randomRepo().issueEvents()
180         );
181     }
182 
183     /**
184      * Obtains the current time.
185      * @return Current time (in milliseconds since epoch) truncated to the nearest second
186      */
187     private static long now() {
188         final long sinceepoch = System.currentTimeMillis();
189         return sinceepoch - sinceepoch % 1000;
190     }
191 }