View Javadoc

1   /*
2    * Copyright (C) 2012 Atlassian
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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         // set estimate in issue
110         navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
111 
112         final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
113         final IssueRestClient issueClient = client.getIssueClient();
114 
115         // get issue
116         final Issue initialIssue = issueClient.getIssue(issueKey).claim();
117 
118         // # First change - test auto
119         final WorklogInput worklogInput = worklogInputBuilder
120                 .setIssueUri(initialIssue.getSelf())
121                 .setMinutesSpent(2)
122                 .build();
123         issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput).claim();
124 
125         // check if estimate has changed
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         // # Second change - test new; also we want to be sure that logged time are added, and not set to given value
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         // check if logged time has changed
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         // check if estimate has changed
154         final Integer actualRemainingEstimate2 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
155         assertEquals(newEstimateValue, actualRemainingEstimate2);
156 
157         // # Third change - test leave
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         // check if logged time has changed
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         // check if estimate has NOT changed
173         final Integer actualRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterThirdChange.getTimeTracking());
174         final Integer expectedRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
175         assertEquals(expectedRemainingEstimate3, actualRemainingEstimate3);
176 
177         // # Fourth change - test manual
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         // check if logged time has changed
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         // check if estimate has NOT changed
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         // set estimate in issue
207         navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
208 
209         final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
210         final IssueRestClient issueClient = client.getIssueClient();
211 
212         // get issue
213         final Issue initialIssue = issueClient.getIssue(issueKey).claim();
214 
215         // add worklog
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         // check if estimate has changed
228         final Issue modifiedIssue = issueClient.getIssue(issueKey).claim();
229         final int actualRemainingEstimate = getRemainingEstimateMinutesNotNull(modifiedIssue.getTimeTracking());
230         // in current configuration 1w = 5d, 1d = 8h
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         // get initial worklogs
265         final Issue issue = issueClient.getIssue(issueKey).claim();
266         final Set<Worklog> initialWorklogs = ImmutableSet.copyOf(issue.getWorklogs());
267 
268         // create and add new
269         final WorklogInput worklogInput = worklogInputBuilder.setIssueUri(issue.getSelf()).build();
270         issueClient.addWorklog(issue.getWorklogUri(), worklogInput).claim();
271 
272         // check if added correctly
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 }