PageRenderTime 26ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/test/src/test/java/it/AsynchronousIssueRestClientWorklogTest.java

https://bitbucket.org/trevmex/jira-rest-java-client
Java | 276 lines | 194 code | 46 blank | 36 comment | 6 complexity | bf7df67e5e321a0c0da223056bf3519a MD5 | raw file
  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. package it;
  17. import com.atlassian.jira.nimblefunctests.annotation.JiraBuildNumberDependent;
  18. import com.atlassian.jira.nimblefunctests.annotation.RestoreOnce;
  19. import com.atlassian.jira.rest.client.api.IssueRestClient;
  20. import com.atlassian.jira.rest.client.api.RestClientException;
  21. import com.atlassian.jira.rest.client.api.domain.Issue;
  22. import com.atlassian.jira.rest.client.api.domain.TimeTracking;
  23. import com.atlassian.jira.rest.client.api.domain.Visibility;
  24. import com.atlassian.jira.rest.client.api.domain.Worklog;
  25. import com.atlassian.jira.rest.client.api.domain.input.WorklogInput;
  26. import com.atlassian.jira.rest.client.api.domain.input.WorklogInputBuilder;
  27. import com.atlassian.jira.rest.client.api.domain.util.ErrorCollection;
  28. import com.atlassian.jira.rest.client.internal.json.TestConstants;
  29. import com.google.common.collect.ImmutableSet;
  30. import com.google.common.collect.Iterators;
  31. import com.google.common.collect.Sets;
  32. import org.joda.time.DateTime;
  33. import org.junit.Test;
  34. import javax.annotation.Nullable;
  35. import java.util.Set;
  36. import static com.atlassian.jira.rest.client.IntegrationTestUtil.GROUP_JIRA_ADMINISTRATORS;
  37. import static com.atlassian.jira.rest.client.TestUtil.toUri;
  38. import static com.atlassian.jira.rest.client.internal.ServerVersionConstants.BN_JIRA_5;
  39. import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
  40. import static org.junit.Assert.*;
  41. @RestoreOnce(TestConstants.DEFAULT_JIRA_DUMP_FILE)
  42. public class AsynchronousIssueRestClientWorklogTest extends AbstractAsynchronousRestClientTest {
  43. public static final String ISSUE_KEY = "TST-5";
  44. public static final String ISSUE_KEY_ANONYMOUS = "ANONEDIT-2";
  45. @JiraBuildNumberDependent(BN_JIRA_5)
  46. @Test
  47. public void testAddWorklogAsLoggedUser() {
  48. testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder());
  49. }
  50. @JiraBuildNumberDependent(BN_JIRA_5)
  51. @Test
  52. public void testAddWorklogAsAnonymousWithoutPermissions() {
  53. setAnonymousMode();
  54. try {
  55. testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder());
  56. } catch (RestClientException ex) {
  57. final ErrorCollection errors = Iterators.getOnlyElement(ex.getErrorCollections().iterator());
  58. assertThat(errors.getErrorMessages(),
  59. containsInAnyOrder("You do not have the permission to see the specified issue.", "Login Required"));
  60. }
  61. }
  62. @JiraBuildNumberDependent(BN_JIRA_5)
  63. @Test
  64. public void testAddWorklogAsAnonymous() {
  65. setAnonymousMode();
  66. testAddWorklogImpl(ISSUE_KEY_ANONYMOUS, createDefaulWorklogInputBuilder());
  67. }
  68. @JiraBuildNumberDependent(BN_JIRA_5)
  69. @Test
  70. public void testAddWorklogWithEmptyComment() {
  71. testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder().setComment(""));
  72. }
  73. @JiraBuildNumberDependent(BN_JIRA_5)
  74. @Test
  75. public void testAddWorklogWithVisibility() {
  76. Visibility visibility = Visibility.group(GROUP_JIRA_ADMINISTRATORS);
  77. testAddWorklogImpl(ISSUE_KEY, createDefaulWorklogInputBuilder().setVisibility(visibility));
  78. }
  79. @JiraBuildNumberDependent(BN_JIRA_5)
  80. @Test
  81. public void testAddWorklogsWithEstimateAdjustment() {
  82. final String issueKey = ISSUE_KEY;
  83. // set estimate in issue
  84. navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
  85. final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
  86. final IssueRestClient issueClient = client.getIssueClient();
  87. // get issue
  88. final Issue initialIssue = issueClient.getIssue(issueKey).claim();
  89. // # First change - test auto
  90. final WorklogInput worklogInput = worklogInputBuilder
  91. .setIssueUri(initialIssue.getSelf())
  92. .setMinutesSpent(2)
  93. .build();
  94. issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput).claim();
  95. // check if estimate has changed
  96. final Issue issueAfterFirstChange = issueClient.getIssue(issueKey).claim();
  97. final Integer actualTimeSpentAfterChange = getTimeSpentMinutesNotNull(issueAfterFirstChange.getTimeTracking());
  98. final Integer expectedTimeSpentAfterChange = getTimeSpentMinutesNotNull(initialIssue.getTimeTracking()) + worklogInput
  99. .getMinutesSpent();
  100. assertEquals(expectedTimeSpentAfterChange, actualTimeSpentAfterChange);
  101. final int actualRemainingEstimate = getRemainingEstimateMinutesNotNull(issueAfterFirstChange.getTimeTracking());
  102. final int expectedRemaningEstimate = getRemainingEstimateMinutesNotNull(initialIssue.getTimeTracking()) - worklogInput
  103. .getMinutesSpent();
  104. assertEquals(expectedRemaningEstimate, actualRemainingEstimate);
  105. // # Second change - test new; also we want to be sure that logged time are added, and not set to given value
  106. final Integer newEstimateValue = 15;
  107. final WorklogInput worklogInput2 = worklogInputBuilder
  108. .setIssueUri(initialIssue.getSelf())
  109. .setMinutesSpent(2)
  110. .setAdjustEstimateNew(newEstimateValue)
  111. .build();
  112. issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput2).claim();
  113. // check if logged time has changed
  114. final Issue issueAfterSecondChange = issueClient.getIssue(issueKey).claim();
  115. final Integer actualTimeSpentAfterChange2 = getTimeSpentMinutesNotNull(issueAfterSecondChange.getTimeTracking());
  116. final Integer expectedTimeSpentAfterChange2 = getTimeSpentMinutesNotNull(issueAfterFirstChange.getTimeTracking())
  117. + worklogInput2.getMinutesSpent();
  118. assertEquals(expectedTimeSpentAfterChange2, actualTimeSpentAfterChange2);
  119. // check if estimate has changed
  120. final Integer actualRemainingEstimate2 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
  121. assertEquals(newEstimateValue, actualRemainingEstimate2);
  122. // # Third change - test leave
  123. final WorklogInput worklogInput3 = worklogInputBuilder
  124. .setIssueUri(initialIssue.getSelf())
  125. .setMinutesSpent(2)
  126. .setAdjustEstimateLeave()
  127. .build();
  128. issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput3).claim();
  129. // check if logged time has changed
  130. final Issue issueAfterThirdChange = issueClient.getIssue(issueKey).claim();
  131. final Integer actualTimeSpentAfterChange3 = getTimeSpentMinutesNotNull(issueAfterThirdChange.getTimeTracking());
  132. final Integer expectedTimeSpentAfterChange3 = getTimeSpentMinutesNotNull(issueAfterSecondChange.getTimeTracking())
  133. + worklogInput3.getMinutesSpent();
  134. assertEquals(expectedTimeSpentAfterChange3, actualTimeSpentAfterChange3);
  135. // check if estimate has NOT changed
  136. final Integer actualRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterThirdChange.getTimeTracking());
  137. final Integer expectedRemainingEstimate3 = getRemainingEstimateMinutesNotNull(issueAfterSecondChange.getTimeTracking());
  138. assertEquals(expectedRemainingEstimate3, actualRemainingEstimate3);
  139. // # Fourth change - test manual
  140. final int reduceByValueManual = 7;
  141. final WorklogInput worklogInput4 = worklogInputBuilder
  142. .setIssueUri(initialIssue.getSelf())
  143. .setMinutesSpent(2)
  144. .setAdjustEstimateManual(reduceByValueManual)
  145. .build();
  146. issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput4).claim();
  147. // check if logged time has changed
  148. final Issue issueAfterFourthChange = issueClient.getIssue(issueKey).claim();
  149. final Integer actualTimeSpentAfterChange4 = getTimeSpentMinutesNotNull(issueAfterFourthChange.getTimeTracking());
  150. final Integer expectedTimeSpentAfterChange4 = getTimeSpentMinutesNotNull(issueAfterThirdChange.getTimeTracking())
  151. + worklogInput4.getMinutesSpent();
  152. assertEquals(expectedTimeSpentAfterChange4, actualTimeSpentAfterChange4);
  153. // check if estimate has NOT changed
  154. final Integer actualRemainingEstimate4 = getRemainingEstimateMinutesNotNull(issueAfterFourthChange.getTimeTracking());
  155. final Integer expectedRemainingEstimate4 = getRemainingEstimateMinutesNotNull(issueAfterThirdChange.getTimeTracking())
  156. - reduceByValueManual;
  157. assertEquals(expectedRemainingEstimate4, actualRemainingEstimate4);
  158. }
  159. @JiraBuildNumberDependent(BN_JIRA_5)
  160. @Test
  161. public void testAddWorklogsWithEstimateAdjustmentUsingTimeUnits() {
  162. final String issueKey = ISSUE_KEY;
  163. // set estimate in issue
  164. navigation.issue().setEstimates(ISSUE_KEY, "20", "20");
  165. final WorklogInputBuilder worklogInputBuilder = createDefaulWorklogInputBuilder();
  166. final IssueRestClient issueClient = client.getIssueClient();
  167. // get issue
  168. final Issue initialIssue = issueClient.getIssue(issueKey).claim();
  169. // add worklog
  170. final int estimateWeeks = 2;
  171. final int estimateDays = 3;
  172. final int estimateHours = 4;
  173. final int estimateMinutes = 7;
  174. final WorklogInput worklogInput = worklogInputBuilder
  175. .setIssueUri(initialIssue.getSelf())
  176. .setAdjustEstimateNew(String
  177. .format("%sw %sd %sh %sm", estimateWeeks, estimateDays, estimateHours, estimateMinutes))
  178. .build();
  179. issueClient.addWorklog(initialIssue.getWorklogUri(), worklogInput).claim();
  180. // check if estimate has changed
  181. final Issue modifiedIssue = issueClient.getIssue(issueKey).claim();
  182. final int actualRemainingEstimate = getRemainingEstimateMinutesNotNull(modifiedIssue.getTimeTracking());
  183. // in current configuration 1w = 5d, 1d = 8h
  184. final int expectedRemaningEstimate = ((estimateWeeks * 5 + estimateDays) * 8 + estimateHours) * 60 + estimateMinutes;
  185. assertEquals(expectedRemaningEstimate, actualRemainingEstimate);
  186. }
  187. private int getTimeSpentMinutesNotNull(@Nullable TimeTracking timeTracking) {
  188. if (timeTracking == null) {
  189. return 0;
  190. }
  191. Integer timeSpentMinutes = timeTracking.getTimeSpentMinutes();
  192. return timeSpentMinutes == null ? 0 : timeSpentMinutes;
  193. }
  194. private int getRemainingEstimateMinutesNotNull(@Nullable TimeTracking timeTracking) {
  195. if (timeTracking == null) {
  196. return 0;
  197. }
  198. Integer remainingEstimateMinutes = timeTracking.getRemainingEstimateMinutes();
  199. return remainingEstimateMinutes == null ? 0 : remainingEstimateMinutes;
  200. }
  201. private Worklog getAddedWorklog(final Set<Worklog> initialWorklogs, Issue issue) {
  202. final Set<Worklog> worklogs = Sets.newHashSet(issue.getWorklogs());
  203. worklogs.removeAll(initialWorklogs);
  204. assertEquals(1, worklogs.size());
  205. return worklogs.iterator().next();
  206. }
  207. private void testAddWorklogImpl(String issueKey, WorklogInputBuilder worklogInputBuilder) {
  208. final IssueRestClient issueClient = client.getIssueClient();
  209. // get initial worklogs
  210. final Issue issue = issueClient.getIssue(issueKey).claim();
  211. final Set<Worklog> initialWorklogs = ImmutableSet.copyOf(issue.getWorklogs());
  212. // create and add new
  213. final WorklogInput worklogInput = worklogInputBuilder.setIssueUri(issue.getSelf()).build();
  214. issueClient.addWorklog(issue.getWorklogUri(), worklogInput).claim();
  215. // check if added correctly
  216. final Issue issueWithWorklog = issueClient.getIssue(issueKey).claim();
  217. final Worklog addedWorklog = getAddedWorklog(initialWorklogs, issueWithWorklog);
  218. assertEquals(worklogInput.getStartDate(), addedWorklog.getStartDate());
  219. assertEquals(worklogInput.getMinutesSpent(), addedWorklog.getMinutesSpent());
  220. assertEquals(worklogInput.getIssueUri(), addedWorklog.getIssueUri());
  221. assertEquals(worklogInput.getComment(), addedWorklog.getComment());
  222. assertEquals(worklogInput.getVisibility(), worklogInput.getVisibility());
  223. }
  224. private WorklogInputBuilder createDefaulWorklogInputBuilder() {
  225. return new WorklogInputBuilder(toUri("dummy://uri"))
  226. .setComment("I created test for adding worklog.")
  227. .setStartDate(new DateTime())
  228. .setMinutesSpent(20);
  229. }
  230. }