From 4a6c046f62cf045c9c92a7ea4858c11d2370eb64 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 17 Jan 2014 16:42:12 +0400 Subject: [PATCH] Add test for time tracking support in JIRA, simplify test of task's state update --- .../intellij/tasks/jira/JiraRepository.java | 3 +- plugins/tasks/tasks-tests/tasks-tests.iml | 1 + .../integration/JiraIntegrationTest.java | 55 +++++++++++++------ 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepository.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepository.java index 129a798a5ba9..b1b23eecffb7 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepository.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepository.java @@ -5,7 +5,6 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; @@ -223,6 +222,6 @@ public class JiraRepository extends BaseRepositoryImpl { } public String getRestUrl(String... parts) { - return getUrl() + REST_API_PATH + "/" + FileUtil.join(parts); + return getUrl() + REST_API_PATH + "/" + StringUtil.join(parts, "/"); } } diff --git a/plugins/tasks/tasks-tests/tasks-tests.iml b/plugins/tasks/tasks-tests/tasks-tests.iml index deeddccdb91f..327823a77ef3 100644 --- a/plugins/tasks/tasks-tests/tasks-tests.iml +++ b/plugins/tasks/tasks-tests/tasks-tests.iml @@ -18,6 +18,7 @@ + diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/JiraIntegrationTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/JiraIntegrationTest.java index 645054013b07..b4b479845b15 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/JiraIntegrationTest.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/integration/JiraIntegrationTest.java @@ -15,15 +15,23 @@ */ package com.intellij.tasks.integration; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import com.intellij.tasks.Task; import com.intellij.tasks.TaskManagerTestCase; import com.intellij.tasks.TaskState; import com.intellij.tasks.config.TaskSettings; +import com.intellij.tasks.impl.LocalTaskImpl; +import com.intellij.tasks.impl.TaskUtil; import com.intellij.tasks.jira.JiraRepository; import com.intellij.tasks.jira.JiraRepositoryType; import com.intellij.tasks.jira.JiraVersion; +import org.apache.commons.httpclient.methods.GetMethod; import org.jetbrains.annotations.NonNls; +import java.util.Date; + /** * @author Dmitry Avdeev * Date: 1/15/13 @@ -90,34 +98,49 @@ public class JiraIntegrationTest extends TaskManagerTestCase { changeStateAndCheck(JIRA_5_TEST_SERVER_URL, "UT-8"); } - @SuppressWarnings("ConstantConditions") + public void testSetTimeSpend() throws Exception { + // only REST API 2.0 supports this feature + myRepository.setUrl(JIRA_5_TEST_SERVER_URL); + Task task = myRepository.findTask("UT-9"); + assertNotNull("Test task not found", task); + + // timestamp as comment + String comment = "Timestamp: " + TaskUtil.formatDate(new Date()); + + // semi-unique duration as timeSpend + // should be no longer than 8 hours in total, because it's considered as one full day + int minutes = (int)(System.currentTimeMillis() % 240) + 1; + String duration = String.format("%dh %dm", minutes / 60, minutes % 60); + myRepository.updateTimeSpent(new LocalTaskImpl(task), duration, comment); + + // possible race conditions? + GetMethod request = new GetMethod(myRepository.getRestUrl("issue", task.getId(), "worklog")); + String response = myRepository.executeMethod(request); + JsonObject object = new Gson().fromJson(response, JsonObject.class); + JsonArray worklogs = object.get("worklogs").getAsJsonArray(); + JsonObject last = worklogs.get(worklogs.size() - 1).getAsJsonObject(); + assertEquals(comment, last.get("comment").getAsString()); + assertEquals(duration, last.get("timeSpent").getAsString()); + } + private void changeStateAndCheck(String url, String key) throws Exception { myRepository.setUrl(url); Task task = myRepository.findTask(key); + assertNotNull("Test task not found", task); + assertEquals(String.format("Initial state of test task '%s' should be 'Reopened'", key), + TaskState.REOPENED, task.getState()); try { - myRepository.setTaskState(task, TaskState.IN_PROGRESS); - task = myRepository.findTask(key); - assertEquals(task.getState(), TaskState.IN_PROGRESS); myRepository.setTaskState(task, TaskState.RESOLVED); task = myRepository.findTask(key); assertEquals(task.getState(), TaskState.RESOLVED); - myRepository.setTaskState(task, TaskState.REOPENED); - assertEquals(myRepository.findTask(key).getState(), TaskState.REOPENED); - } - catch (Exception e) { - // always attempt to restore original state of the issue - try { - // transition to Resolved state usually is possible from any other - myRepository.setTaskState(task, TaskState.RESOLVED); - } - catch (Exception ignored) { - } + } finally { try { + // always attempt to restore original state of the issue myRepository.setTaskState(task, TaskState.REOPENED); } catch (Exception ignored) { + // empty } - throw e; } }