/*******************************************************************************
* Copyright (c) 2010 Red Hat Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.bugzilla.tests;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.mylyn.bugzilla.tests.support.BugzillaFixture;
import org.eclipse.mylyn.internal.bugzilla.core.Messages;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
import org.eclipse.mylyn.tasks.core.TaskMapping;
import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
import org.eclipse.mylyn.tasks.core.data.TaskOperation;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
/**
* @author Charley Wang
*/
public class BugzillaCustomRepositoryTest extends AbstractBugzillaTest {
public void testWorkflow() throws Exception {
doCustomWorkflow("3");
}
private void doCustomWorkflow(String DupBugID) throws Exception {
final TaskMapping taskMappingInit = new TaskMapping() {
@Override
public String getProduct() {
return "TestProduct";
}
};
final TaskMapping taskMappingSelect = new TaskMapping() {
@Override
public String getComponent() {
return "TestComponent";
}
@Override
public String getSummary() {
return "test the custom workflow";
}
@Override
public String getDescription() {
return "The Description of the custom workflow task";
}
};
final TaskData[] taskDataNew = new TaskData[1];
// create Task
taskDataNew[0] = TasksUiInternal.createTaskData(repository, taskMappingInit, taskMappingSelect, null);
ITask taskNew = TasksUiUtil.createOutgoingNewTask(taskDataNew[0].getConnectorKind(),
taskDataNew[0].getRepositoryUrl());
ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(taskNew, taskDataNew[0]);
Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
workingCopy.save(changed, null);
RepositoryResponse response = BugzillaFixture.current().submitTask(taskDataNew[0], client);
((AbstractTask) taskNew).setSubmitting(true);
assertNotNull(response);
assertEquals(ResponseKind.TASK_CREATED.toString(), response.getReposonseKind().toString());
String taskId = response.getTaskId();
// change Status from NEW -> ASSIGNED
ITask task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
TaskDataModel model = createModel(task);
TaskData taskData = model.getTaskData();
assertNotNull(taskData);
TaskAttribute statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("NEW", statusAttribute.getValue());
TaskAttribute selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "accept", Messages.BugzillaOperation_Accept_to_ASSIGNED);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
// response = submit(taskNew, taskData, changed);
// assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 1: Change workflow for standard statuses
// change Status from ASSIGNED -> NEW should not work and should not throw an error
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("ASSIGNED", statusAttribute.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "markNew", Messages.BugzillaOperation_Mark_as_NEW);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 3: Special Bugzilla information (duplicateStatus)
// change Status from ASSIGNED -> DUPLICATE
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("ASSIGNED", statusAttribute.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "duplicate", Messages.BugzillaOperation_Duplicate_of);
TaskAttribute duplicateAttribute = taskData.getRoot().getAttribute("dup_id");
duplicateAttribute.setValue(DupBugID);
model.attributeChanged(selectedOperationAttribute);
model.attributeChanged(duplicateAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
changed.add(duplicateAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 3: Special Bugzilla information (duplicateStatus)
// change Status from [CLOSED] DUPLICATE -> VERIFIED
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("CLOSED", statusAttribute.getValue());
TaskAttribute resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
assertEquals("DUPLICATE", resolution.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "verify", Messages.BugzillaOperation_Mark_as_VERIFIED);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 2: Custom name, open bug_status
// change Status from VERIFIED -> MODIFIED
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("VERIFIED", statusAttribute.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "MODIFIED", Messages.BugzillaOperation_Reopen_bug);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 2: Custom name, open bug_status
// change Status from MODIFIED -> ON_DEV
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("MODIFIED", statusAttribute.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "ON_DEV", Messages.BugzillaOperation_Reopen_bug);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 2: Custom name, closed bug_status
// change Status from ON_DEV -> POST FIXED
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("ON_DEV", statusAttribute.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "POST", Messages.BugzillaOperation_Resolve_as);
resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
resolution.setValue("FIXED");
model.attributeChanged(selectedOperationAttribute);
model.attributeChanged(resolution);
changed.clear();
changed.add(selectedOperationAttribute);
changed.add(resolution);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 2: Custom name, closing bug
// change Status from POST FIXED -> CLOSED FIXED
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("POST", statusAttribute.getValue());
resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
assertEquals("FIXED", resolution.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "close", Messages.BugzillaOperation_Resolve_as);
resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
resolution.setValue("FIXED");
model.attributeChanged(selectedOperationAttribute);
model.attributeChanged(resolution);
changed.clear();
changed.add(selectedOperationAttribute);
changed.add(resolution);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// Customization case 1: Change workflow for standard statuses
// change Status from CLOSE -> REOPENED should not work
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("CLOSED", statusAttribute.getValue());
resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
assertEquals("FIXED", resolution.getValue());
selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
TaskOperation.applyTo(selectedOperationAttribute, "reopen", Messages.BugzillaOperation_Reopen_bug);
model.attributeChanged(selectedOperationAttribute);
changed.clear();
changed.add(selectedOperationAttribute);
workingCopy.save(changed, null);
response = BugzillaFixture.current().submitTask(taskData, client);
assertNotNull(response);
assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
// test last state has not changed
task = generateLocalTaskAndDownload(taskId);
assertNotNull(task);
model = createModel(task);
taskData = model.getTaskData();
assertNotNull(taskData);
statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
assertEquals("CLOSED", statusAttribute.getValue());
resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
assertEquals("FIXED", resolution.getValue());
}
}