1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package it;
18
19 import com.atlassian.jira.nimblefunctests.annotation.JiraBuildNumberDependent;
20 import com.atlassian.jira.rest.client.IntegrationTestUtil;
21 import com.atlassian.jira.rest.client.api.IssueRestClient;
22 import com.atlassian.jira.rest.client.api.RestClientException;
23 import com.atlassian.jira.rest.client.api.domain.Issue;
24 import com.atlassian.jira.rest.client.api.domain.TimeTracking;
25 import com.atlassian.jira.rest.client.api.domain.Visibility;
26 import com.atlassian.jira.rest.client.api.domain.Worklog;
27 import com.atlassian.jira.rest.client.api.domain.input.WorklogInput;
28 import com.atlassian.jira.rest.client.api.domain.input.WorklogInputBuilder;
29 import com.atlassian.jira.rest.client.api.domain.util.ErrorCollection;
30 import com.atlassian.jira.rest.client.internal.json.TestConstants;
31 import com.google.common.collect.ImmutableSet;
32 import com.google.common.collect.Iterators;
33 import com.google.common.collect.Sets;
34 import org.joda.time.DateTime;
35 import org.junit.Before;
36 import org.junit.Test;
37
38 import javax.annotation.Nullable;
39 import java.util.Set;
40
41 import static com.atlassian.jira.rest.client.IntegrationTestUtil.GROUP_JIRA_ADMINISTRATORS;
42 import static com.atlassian.jira.rest.client.TestUtil.toUri;
43 import static com.atlassian.jira.rest.client.internal.ServerVersionConstants.BN_JIRA_5;
44 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
45 import static org.junit.Assert.assertEquals;
46 import static org.junit.Assert.assertThat;
47 import static org.junit.Assert.fail;
48
49 public class AsynchronousIssueRestClientWorklogTest extends AbstractAsynchronousRestClientTest {
50
51 public static final String ISSUE_KEY = "TST-5";
52 public static final String ISSUE_KEY_ANONYMOUS = "ANONEDIT-2";
53
54 private static boolean alreadyRestored;
55
56 @Before
57 public void setup() {
58 if (!alreadyRestored) {
59 IntegrationTestUtil.restoreAppropriateJiraData(TestConstants.DEFAULT_JIRA_DUMP_FILE, administration);
60 alreadyRestored = true;
61 }
62 }
63
64 @JiraBuildNumberDependent(BN_JIRA_5)
65 @Test
66 public void testAddWorklogAsLoggedUser() {
67 testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder());
68 }
69
70 @JiraBuildNumberDependent(BN_JIRA_5)
71 @Test
72 public void testAddWorklogAsAnonymousWithoutPermissions() {
73 setAnonymousMode();
74 try {
75 testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder());
76 fail("error expected, no permissions");
77 } catch (RestClientException ex) {
78 final ErrorCollection errors = Iterators.getOnlyElement(ex.getErrorCollections().iterator());
79 assertThat(errors.getErrorMessages(),
80 containsInAnyOrder("You do not have the permission to see the specified issue.", "Login Required"));
81 }
82 }
83
84 @JiraBuildNumberDependent(BN_JIRA_5)
85 @Test
86 public void testAddWorklogAsAnonymous() {
87 setAnonymousMode();
88 testAddWorklogImpl(ISSUE_KEY_ANONYMOUS, createDefaulWorklogInputBuilder());
89 }
90
91 @JiraBuildNumberDependent(BN_JIRA_5)
92 @Test
93 public void testAddWorklogWithEmptyComment() {
94 testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder().setComment(""));
95 }
96
97 @JiraBuildNumberDependent(BN_JIRA_5)
98 @Test
99 public void testAddWorklogWithVisibility() {
100 Visibility visibility = Visibility.group(GROUP_JIRA_ADMINISTRATORS);
101 testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder().setVisibility(visibility));
102 }
103
104 @JiraBuildNumberDependent(BN_JIRA_5)
105 @Test
106 public void testAddWorklogsWithEstimateAdjustment() {
107 final String issueKey = ISSUE_KEY;
108
109
110 navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
111
112 final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
113 final IssueRestClient issueClient = client.getIssueClient();
114
115
116 final Issue initialIssue = issueClient.getIssue(issueKey).claim();
117
118
119 final WorklogInput worklogInput = worklogInputBuilder
120 .setIssueUri(initialIssue.getSelf())
121 .setMinutesSpent(2)
122 .build();
123 issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput).claim();
124
125
126 final Issue issueAfterFirstChange = issueClient.getIssue(issueKey).claim();
127 final Integer actualTimeSpentAfterChange = getTimeSpentMinutesNotNull(issueAfterFirstChange.getTimeTracking());
128 final Integer expectedTimeSpentAfterChange = getTimeSpentMinutesNotNull(initialIssue.getTimeTracking()) + worklogInput
129 .getMinutesSpent();
130 assertEquals(expectedTimeSpentAfterChange, actualTimeSpentAfterChange);
131
132 final int actualRemainingEstimate = getRemainingEstimateMinutesNotNull(issueAfterFirstChange.getTimeTracking());
133 final int expectedRemaningEstimate = getRemainingEstimateMinutesNotNull(initialIssue.getTimeTracking()) - worklogInput
134 .getMinutesSpent();
135 assertEquals(expectedRemaningEstimate, actualRemainingEstimate);
136
137
138 final Integer newEstimateValue = 15;
139 final WorklogInput worklogInput2 = worklogInputBuilder
140 .setIssueUri(initialIssue.getSelf())
141 .setMinutesSpent(2)
142 .setAdjustEstimateNew(newEstimateValue)
143 .build();
144 issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput2).claim();
145
146
147 final Issue issueAfterSecondChange = issueClient.getIssue(issueKey).claim();
148 final Integer actualTimeSpentAfterChange2 = getTimeSpentMinutesNotNull(issueAfterSecondChange.getTimeTracking());
149 final Integer expectedTimeSpentAfterChange2 = getTimeSpentMinutesNotNull(issueAfterFirstChange.getTimeTracking())
150 + worklogInput2.getMinutesSpent();
151 assertEquals(expectedTimeSpentAfterChange2, actualTimeSpentAfterChange2);
152
153
154 final Integer actualRemainingEstimate2 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
155 assertEquals(newEstimateValue, actualRemainingEstimate2);
156
157
158 final WorklogInput worklogInput3 = worklogInputBuilder
159 .setIssueUri(initialIssue.getSelf())
160 .setMinutesSpent(2)
161 .setAdjustEstimateLeave()
162 .build();
163 issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput3).claim();
164
165
166 final Issue issueAfterThirdChange = issueClient.getIssue(issueKey).claim();
167 final Integer actualTimeSpentAfterChange3 = getTimeSpentMinutesNotNull(issueAfterThirdChange.getTimeTracking());
168 final Integer expectedTimeSpentAfterChange3 = getTimeSpentMinutesNotNull(issueAfterSecondChange.getTimeTracking())
169 + worklogInput3.getMinutesSpent();
170 assertEquals(expectedTimeSpentAfterChange3, actualTimeSpentAfterChange3);
171
172
173 final Integer actualRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterThirdChange.getTimeTracking());
174 final Integer expectedRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
175 assertEquals(expectedRemainingEstimate3, actualRemainingEstimate3);
176
177
178 final int reduceByValueManual = 7;
179 final WorklogInput worklogInput4 = worklogInputBuilder
180 .setIssueUri(initialIssue.getSelf())
181 .setMinutesSpent(2)
182 .setAdjustEstimateManual(reduceByValueManual)
183 .build();
184
185 issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput4).claim();
186
187
188 final Issue issueAfterFourthChange = issueClient.getIssue(issueKey).claim();
189 final Integer actualTimeSpentAfterChange4 = getTimeSpentMinutesNotNull(issueAfterFourthChange.getTimeTracking());
190 final Integer expectedTimeSpentAfterChange4 = getTimeSpentMinutesNotNull(issueAfterThirdChange.getTimeTracking())
191 + worklogInput4.getMinutesSpent();
192 assertEquals(expectedTimeSpentAfterChange4, actualTimeSpentAfterChange4);
193
194
195 final Integer actualRemainingEstimate4 = getRemainingEstimateMinutesNotNull(issueAfterFourthChange.getTimeTracking());
196 final Integer expectedRemainingEstimate4 = getRemainingEstimateMinutesNotNull(issueAfterThirdChange.getTimeTracking())
197 - reduceByValueManual;
198 assertEquals(expectedRemainingEstimate4, actualRemainingEstimate4);
199 }
200
201 @JiraBuildNumberDependent(BN_JIRA_5)
202 @Test
203 public void testAddWorklogsWithEstimateAdjustmentUsingTimeUnits() {
204 final String issueKey = ISSUE_KEY;
205
206
207 navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
208
209 final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
210 final IssueRestClient issueClient = client.getIssueClient();
211
212
213 final Issue initialIssue = issueClient.getIssue(issueKey).claim();
214
215
216 final int estimateWeeks = 2;
217 final int estimateDays = 3;
218 final int estimateHours = 4;
219 final int estimateMinutes = 7;
220 final WorklogInput worklogInput = worklogInputBuilder
221 .setIssueUri(initialIssue.getSelf())
222 .setAdjustEstimateNew(String
223 .format("%sw %sd %sh %sm", estimateWeeks, estimateDays, estimateHours, estimateMinutes))
224 .build();
225 issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput).claim();
226
227
228 final Issue modifiedIssue = issueClient.getIssue(issueKey).claim();
229 final int actualRemainingEstimate = getRemainingEstimateMinutesNotNull(modifiedIssue.getTimeTracking());
230
231 final int expectedRemaningEstimate = ((estimateWeeks * 5 + estimateDays) * 8 + estimateHours) * 60 + estimateMinutes;
232 assertEquals(expectedRemaningEstimate, actualRemainingEstimate);
233 }
234
235 private int getTimeSpentMinutesNotNull(@Nullable TimeTracking timeTracking) {
236 if (timeTracking == null) {
237 return 0;
238 }
239
240 Integer timeSpentMinutes = timeTracking.getTimeSpentMinutes();
241 return timeSpentMinutes == null ? 0 : timeSpentMinutes;
242 }
243
244 private int getRemainingEstimateMinutesNotNull(@Nullable TimeTracking timeTracking) {
245 if (timeTracking == null) {
246 return 0;
247 }
248
249 Integer remainingEstimateMinutes = timeTracking.getRemainingEstimateMinutes();
250 return remainingEstimateMinutes == null ? 0 : remainingEstimateMinutes;
251 }
252
253
254 private Worklog getAddedWorklog(final Set<Worklog> initialWorklogs, Issue issue) {
255 final Set<Worklog> worklogs = Sets.newHashSet(issue.getWorklogs());
256 worklogs.removeAll(initialWorklogs);
257 assertEquals(1, worklogs.size());
258 return worklogs.iterator().next();
259 }
260
261 private void testAddWorklogImpl(String issueKey, WorklogInputBuilder worklogInputBuilder) {
262 final IssueRestClient issueClient = client.getIssueClient();
263
264
265 final Issue issue = issueClient.getIssue(issueKey).claim();
266 final Set<Worklog> initialWorklogs = ImmutableSet.copyOf(issue.getWorklogs());
267
268
269 final WorklogInput worklogInput = worklogInputBuilder.setIssueUri(issue.getSelf()).build();
270 issueClient.addWorklog(issue.getWorklogUri(), worklogInput).claim();
271
272
273 final Issue issueWithWorklog = issueClient.getIssue(issueKey).claim();
274 final Worklog addedWorklog = getAddedWorklog(initialWorklogs, issueWithWorklog);
275 assertEquals(worklogInput.getStartDate(), addedWorklog.getStartDate());
276 assertEquals(worklogInput.getMinutesSpent(), addedWorklog.getMinutesSpent());
277 assertEquals(worklogInput.getIssueUri(), addedWorklog.getIssueUri());
278 assertEquals(worklogInput.getComment(), addedWorklog.getComment());
279 assertEquals(worklogInput.getVisibility(), worklogInput.getVisibility());
280 }
281
282 private WorklogInputBuilder createDefaulWorklogInputBuilder() {
283 return new WorklogInputBuilder(toUri("dummy://uri"))
284 .setComment("I created test for adding worklog.")
285 .setStartDate(new DateTime())
286 .setMinutesSpent(20);
287 }
288
289 }