| /******************************************************************************* |
| * Copyright (c) 2010, 2013 Tasktop Technologies 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: |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.bugzilla.tests.core; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.SortedSet; |
| import java.util.TreeSet; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.mylyn.bugzilla.tests.support.BugzillaFixture; |
| import org.eclipse.mylyn.commons.net.AuthenticationCredentials; |
| import org.eclipse.mylyn.commons.net.AuthenticationType; |
| import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil.PrivilegeLevel; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion; |
| import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; |
| import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; |
| import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; |
| import org.eclipse.mylyn.tasks.core.ITaskMapping; |
| 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.TaskRepository; |
| import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttribute; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; |
| import org.eclipse.mylyn.tasks.core.data.TaskData; |
| import org.eclipse.mylyn.tasks.core.data.TaskDataCollector; |
| import org.eclipse.mylyn.tasks.core.data.TaskMapper; |
| |
| /** |
| * Tests should be run against Bugzilla 3.2.4 or greater |
| * |
| * @author Frank Becker |
| * @author Robert Elves |
| */ |
| public class BugzillaCustomFieldsTest extends TestCase { |
| |
| private TaskData fruitTaskData; |
| |
| public void testCustomAttributes() throws Exception { |
| String taskID = taskCustomFieldExists(); |
| if (taskID == null) { |
| taskID = createCustomFieldTask(); |
| } |
| String taskNumber = taskID; |
| TaskData taskData = BugzillaFixture.current().getTask(taskNumber, BugzillaFixture.current().client()); |
| assertNotNull(taskData); |
| TaskMapper mapper = new TaskMapper(taskData); |
| assertEquals(taskNumber, taskData.getTaskId()); |
| |
| // SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); |
| // assertEquals(format1.parse("2009-09-16 14:11"), mapper.getCreationDate()); |
| |
| AuthenticationCredentials credentials = BugzillaFixture.current() |
| .repository() |
| .getCredentials(AuthenticationType.REPOSITORY); |
| assertNotNull("credentials are null", credentials); |
| assertNotNull("Repositor User not set", credentials.getUserName()); |
| assertNotNull("no password for Repository", credentials.getPassword()); |
| |
| TaskAttribute colorAttribute = mapper.getTaskData().getRoot().getAttribute("cf_multiselect"); |
| assertNotNull("TaskAttribute Color did not exists", colorAttribute); |
| List<String> theColors = colorAttribute.getValues(); |
| assertNotNull(theColors); |
| assertFalse("no colors set", theColors.isEmpty()); |
| |
| boolean red = false; |
| boolean green = false; |
| boolean yellow = false; |
| boolean blue = false; |
| |
| for (Object element : theColors) { |
| String string = (String) element; |
| |
| if (!red && string.compareTo("Red") == 0) { |
| red = true; |
| } else if (!green && string.compareTo("Green") == 0) { |
| green = true; |
| } else if (!yellow && string.compareTo("Yellow") == 0) { |
| yellow = true; |
| } else if (!blue && string.compareTo("Blue") == 0) { |
| blue = true; |
| } |
| } |
| changeCollorAndSubmit(taskData, colorAttribute, red, green, yellow, blue); |
| taskData = BugzillaFixture.current().getTask(taskNumber, BugzillaFixture.current().client()); |
| assertNotNull(taskData); |
| mapper = new TaskMapper(taskData); |
| |
| colorAttribute = mapper.getTaskData().getRoot().getAttribute("cf_multiselect"); |
| assertNotNull("TaskAttribute Color did not exists", colorAttribute); |
| theColors = colorAttribute.getValues(); |
| assertNotNull(theColors); |
| assertFalse("no colors set", theColors.isEmpty()); |
| boolean red_new = false; |
| boolean green_new = false; |
| boolean yellow_new = false; |
| boolean blue_new = false; |
| |
| for (Object element : theColors) { |
| String string = (String) element; |
| |
| if (!red_new && string.compareTo("Red") == 0) { |
| red_new = true; |
| } else if (!green_new && string.compareTo("Green") == 0) { |
| green_new = true; |
| } else if (!yellow_new && string.compareTo("Yellow") == 0) { |
| yellow_new = true; |
| } else if (!blue_new && string.compareTo("Blue") == 0) { |
| blue_new = true; |
| } |
| } |
| assertTrue("wrong change", |
| (!red && green && !yellow && !blue && red_new && green_new && !yellow_new && !blue_new) |
| || (red && green && !yellow && !blue && !red_new && green_new && !yellow_new && !blue_new)); |
| changeCollorAndSubmit(taskData, colorAttribute, red_new, green_new, yellow_new, blue_new); |
| |
| } |
| |
| private void changeCollorAndSubmit(TaskData taskData, TaskAttribute colorAttribute, boolean red, boolean green, |
| boolean yellow, boolean blue) throws Exception { |
| if (!red && green && !yellow && !blue) { |
| List<String> newValue = new ArrayList<String>(2); |
| newValue.add("Red"); |
| newValue.add("Green"); |
| colorAttribute.setValues(newValue); |
| Set<TaskAttribute> changed = new HashSet<TaskAttribute>(); |
| changed.add(colorAttribute); |
| // Submit changes |
| BugzillaFixture.current().submitTask(taskData, BugzillaFixture.current().client()); |
| } else if (red && green && !yellow && !blue) { |
| List<String> newValue = new ArrayList<String>(2); |
| newValue.add("Green"); |
| colorAttribute.setValues(newValue); |
| Set<TaskAttribute> changed = new HashSet<TaskAttribute>(); |
| changed.add(colorAttribute); |
| // Submit changes |
| BugzillaFixture.current().submitTask(taskData, BugzillaFixture.current().client()); |
| } |
| } |
| |
| public void testCustomAttributesNewTask() throws Exception { |
| |
| BugzillaVersion version = new BugzillaVersion(BugzillaFixture.current().getVersion()); |
| if (version.isSmallerOrEquals(BugzillaVersion.BUGZILLA_3_2)) { |
| return; |
| } |
| |
| TaskData taskData = BugzillaFixture.current().createTask(PrivilegeLevel.USER, null, null); |
| assertNotNull(taskData); |
| assertNotNull(taskData.getRoot().getAttribute("token")); |
| TaskAttribute productAttribute = taskData.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey()); |
| assertNotNull(productAttribute); |
| assertEquals("ManualTest" + "", productAttribute.getValue()); |
| TaskAttribute cfAttribute1 = taskData.getRoot().getAttribute("cf_freetext"); |
| assertNotNull(cfAttribute1); |
| TaskAttribute cfAttribute2 = taskData.getRoot().getAttribute("cf_dropdown"); |
| assertNotNull(cfAttribute2); |
| TaskAttribute cfAttribute3 = taskData.getRoot().getAttribute("cf_largetextbox"); |
| assertNotNull(cfAttribute3); |
| TaskAttribute cfAttribute4 = taskData.getRoot().getAttribute("cf_multiselect"); |
| assertNotNull(cfAttribute4); |
| TaskAttribute cfAttribute5 = taskData.getRoot().getAttribute("cf_datetime"); |
| assertNotNull(cfAttribute5); |
| TaskAttribute cfAttribute6 = taskData.getRoot().getAttribute("cf_bugid"); |
| assertNotNull(cfAttribute6); |
| } |
| |
| public void testCustomFields() throws Exception { |
| |
| String taskNumber = "1"; |
| |
| fruitTaskData = BugzillaFixture.current().getTask(taskNumber, BugzillaFixture.current().client()); |
| assertNotNull(fruitTaskData); |
| |
| if (fruitTaskData.getRoot().getAttribute("cf_dropdown").getValue().equals("---")) { |
| setFruitValueTo("one"); |
| setFruitValueTo("two"); |
| setFruitValueTo("---"); |
| } else if (fruitTaskData.getRoot().getAttribute("cf_dropdown").getValue().equals("one")) { |
| setFruitValueTo("two"); |
| setFruitValueTo("one"); |
| setFruitValueTo("---"); |
| } else if (fruitTaskData.getRoot().getAttribute("cf_dropdown").getValue().equals("two")) { |
| setFruitValueTo("one"); |
| setFruitValueTo("two"); |
| setFruitValueTo("---"); |
| } |
| if (fruitTaskData != null) { |
| fruitTaskData = null; |
| } |
| } |
| |
| private void setFruitValueTo(String newValue) throws Exception { |
| Set<TaskAttribute> changed = new HashSet<TaskAttribute>(); |
| TaskAttribute cf_fruit = fruitTaskData.getRoot().getAttribute("cf_dropdown"); |
| cf_fruit.setValue(newValue); |
| assertEquals(newValue, fruitTaskData.getRoot().getAttribute("cf_dropdown").getValue()); |
| changed.add(cf_fruit); |
| BugzillaFixture.current().submitTask(fruitTaskData, BugzillaFixture.current().client()); |
| fruitTaskData = BugzillaFixture.current() |
| .getTask(fruitTaskData.getTaskId(), BugzillaFixture.current().client()); |
| assertEquals(newValue, fruitTaskData.getRoot().getAttribute("cf_dropdown").getValue()); |
| } |
| |
| private static TaskData createTaskData(TaskRepository taskRepository, ITaskMapping initializationData, |
| ITaskMapping selectionData, IProgressMonitor monitor) throws CoreException { |
| AbstractRepositoryConnector connector = BugzillaFixture.current().connector(); |
| AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler(); |
| TaskAttributeMapper mapper = taskDataHandler.getAttributeMapper(taskRepository); |
| TaskData taskData = new TaskData(mapper, taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(), |
| ""); //$NON-NLS-1$ |
| boolean result = taskDataHandler.initializeTaskData(taskRepository, taskData, initializationData, monitor); |
| if (!result) { |
| throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, |
| "Initialization of task failed. The provided data is insufficient.")); //$NON-NLS-1$ |
| } |
| if (selectionData != null) { |
| connector.getTaskMapping(taskData).merge(selectionData); |
| } |
| return taskData; |
| } |
| |
| private String taskCustomFieldExists() { |
| String taskID = null; |
| String queryUrlString = BugzillaFixture.current().repository().getRepositoryUrl() + "/buglist.cgi?" |
| + "short_desc=test%20Bug%20with%20Custom%20Fields&resolution=---&query_format=advanced" |
| + "&short_desc_type=casesubstring&component=ManualC2&product=ManualTest"; |
| RepositoryQuery query = new RepositoryQuery(BugzillaFixture.current().repository().getConnectorKind(), |
| "handle-testQueryViaConnector"); |
| query.setUrl(queryUrlString); |
| final Map<Integer, TaskData> changedTaskData = new HashMap<Integer, TaskData>(); |
| TaskDataCollector collector = new TaskDataCollector() { |
| @Override |
| public void accept(TaskData taskData) { |
| changedTaskData.put(Integer.valueOf(taskData.getTaskId()), taskData); |
| } |
| }; |
| BugzillaFixture.current() |
| .connector() |
| .performQuery(BugzillaFixture.current().repository(), query, collector, null, new NullProgressMonitor()); |
| if (changedTaskData.size() > 0) { |
| Set<Integer> ks = changedTaskData.keySet(); |
| SortedSet<Integer> sks = new TreeSet<Integer>(ks); |
| taskID = sks.last().toString(); |
| } |
| return taskID; |
| } |
| |
| private String createCustomFieldTask() throws Exception { |
| final TaskMapping taskMappingInit = new TaskMapping() { |
| @Override |
| public String getProduct() { |
| return "ManualTest"; |
| } |
| }; |
| final TaskMapping taskMappingSelect = new TaskMapping() { |
| @Override |
| public String getComponent() { |
| return "ManualC2"; |
| } |
| |
| @Override |
| public String getSummary() { |
| return "test Bug with Custom Fields"; |
| } |
| |
| @Override |
| public String getDescription() { |
| return "The Description of the test with Custom Fields Bug"; |
| } |
| }; |
| final TaskData[] taskDataNew = new TaskData[1]; |
| |
| // create Task |
| taskDataNew[0] = createTaskData(BugzillaFixture.current().repository(), taskMappingInit, taskMappingSelect, |
| null); |
| |
| RepositoryResponse response = BugzillaFixture.current().submitTask(taskDataNew[0], |
| BugzillaFixture.current().client()); |
| |
| assertNotNull(response); |
| assertEquals(ResponseKind.TASK_CREATED.toString(), response.getReposonseKind().toString()); |
| String taskId = response.getTaskId(); |
| |
| TaskData taskData = BugzillaFixture.current().getTask(taskId, BugzillaFixture.current().client()); |
| assertNotNull(taskData); |
| |
| TaskMapper mapper = new TaskMapper(taskData); |
| TaskAttribute cf_multiselect = mapper.getTaskData().getRoot().getAttribute("cf_multiselect"); |
| cf_multiselect.setValue("Green"); |
| response = BugzillaFixture.current().submitTask(taskData, BugzillaFixture.current().client()); |
| |
| return taskId; |
| } |
| |
| } |