/*
* Copyright 2013 Hewlett-Packard Development Company, L.P
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hp.alm.ali.idea.tasks;
import com.hp.alm.ali.ServerVersion;
import com.hp.alm.ali.idea.IntellijTest;
import com.hp.alm.ali.idea.RestInvocations;
import com.hp.alm.ali.idea.cfg.AliProjectConfiguration;
import com.hp.alm.ali.idea.entity.EntityQuery;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationDisplayType;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.tasks.Comment;
import com.intellij.tasks.Task;
import com.intellij.tasks.TaskType;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class HpAlmRepositoryTest extends IntellijTest {
private AliProjectConfiguration projectConfiguration;
public HpAlmRepositoryTest() {
super(ServerVersion.AGM);
}
@Before
public void preClean() {
projectConfiguration = getComponent(AliProjectConfiguration.class);
}
@Test
public void testGetIssues() throws Exception {
RestInvocations.loadMetadata(handler, "defect");
RestInvocations.loadMetadata(handler, "release-backlog-item");
RestInvocations.loadMetadata(handler, "requirement");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=&query={name['*what*']}&order-by={}", 200)
.content("entityServiceTest_entity.xml");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=&query={name['*what*']}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
Task[] list = repository.getIssues("what", 5, 100);
Assert.assertEquals(1, list.length);
checkTask(list[0]);
}
@Test
public void testGetIssues_unassigned() throws Exception {
HpAlmRepository repository = new HpAlmRepository();
Task[] list = repository.getIssues("foo", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testGetIssues_noDefects() throws Exception {
RestInvocations.loadMetadata(handler, "release-backlog-item");
RestInvocations.loadMetadata(handler, "requirement");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=&query={name['*foo*']}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
TaskConfig config = new TaskConfig("defect");
config.setEnabled(false);
repository.setDefect(config);
Task[] list = repository.getIssues("foo", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testGetIssues_storedQuery() throws Exception {
RestInvocations.loadMetadata(handler, "release-backlog-item");
RestInvocations.loadMetadata(handler, "requirement");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=&query={id[1]; name['*foo*']}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
TaskConfig config = new TaskConfig("defect");
config.setEnabled(false);
repository.setDefect(config);
EntityQuery query = new EntityQuery("requirement");
query.setName("fav1");
query.setValue("id", "1");
projectConfiguration.storeFilter("requirement", query);
TaskConfig reqConfig = new TaskConfig("requirement");
reqConfig.setCustomSelected(false);
reqConfig.setStoredQuery(query.getName() + " (project)");
repository.setRequirement(reqConfig);
Task[] list = repository.getIssues("foo", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testGetIssues_storedQuery_missing() throws Exception {
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
TaskConfig config = new TaskConfig("defect");
config.setEnabled(false);
repository.setDefect(config);
TaskConfig reqConfig = new TaskConfig("requirement");
reqConfig.setCustomSelected(false);
reqConfig.setStoredQuery("fav2 (project)");
repository.setRequirement(reqConfig);
final MessageBusConnection connection = getProject().getMessageBus().connect();
handler.async();
connection.subscribe(Notifications.TOPIC, new Notifications() {
@Override
public void notify(@NotNull Notification notification) {
Assert.assertEquals("HP ALM Integration", notification.getGroupId());
Assert.assertEquals("Cannot retrieve task information from HP ALM:<br/> 'fav2 (project)' query not found", notification.getTitle());
Assert.assertEquals(NotificationType.ERROR, notification.getType());
connection.disconnect();
handler.done();
}
@Override
public void register(@NotNull String groupDisplayName, @NotNull NotificationDisplayType defaultDisplayType) {
}
@Override
public void register(@NotNull String groupDisplayName, @NotNull NotificationDisplayType defaultDisplayType, boolean shouldLog) {
}
// needed for 13, adapter class not defined in 12.1.1
public void register(@NotNull String groupDisplayName, @NotNull NotificationDisplayType defaultDisplayType, boolean shouldLog, boolean shouldReadAloud) {
}
});
Task[] list = repository.getIssues("foo", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testGetIssues_custom() throws Exception {
RestInvocations.loadMetadata(handler, "release-backlog-item");
RestInvocations.loadMetadata(handler, "requirement");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=&query={id[2]; name['*foo*']}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
TaskConfig config = new TaskConfig("defect");
config.setEnabled(false);
repository.setDefect(config);
TaskConfig reqConfig = new TaskConfig("requirement");
EntityQuery query = new EntityQuery("requirement");
query.setValue("id", "2");
reqConfig.setCustomFilter(query);
repository.setRequirement(reqConfig);
Task[] list = repository.getIssues("foo", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testGetIssues_byId() throws Exception {
RestInvocations.loadMetadata(handler, "defect");
RestInvocations.loadMetadata(handler, "release-backlog-item");
RestInvocations.loadMetadata(handler, "requirement");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=&query={name['*111*']}&order-by={}", 200)
.content("no_entities.xml");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=actual-fix-time,attachment,in-bucket,changeset,build-closed,closing-version,closing-date,dev-comments,id,status,description,detected-by,build-detected,detected-in-rcyc,detected-in-rel,detection-version,creation-time,estimated-fix-time,extended-reference,fixed-on-date,has-change,has-linkage,has-others-linkage,last-modified,planned-closing-ver,priority,user-04,user-03,reproducible,severity,subject,name,user-02,user-01,watch-id,release-backlog-item.product-id,release-backlog-item.owner,release-backlog-item.blocked,release-backlog-item.entity-name,release-backlog-item.entity-type,release-backlog-item.feature-id,release-backlog-item.invested,release-backlog-item.kanban-status-id,release-backlog-item.linked-entities-info,release-backlog-item.no-of-sons,release-backlog-item.kanban-parent-status-id,release-backlog-item.rank,release-backlog-item.release-id,release-backlog-item.entity-id,release-backlog-item.remaining,release-backlog-item.sprint-id,release-backlog-item.status,release-backlog-item.kan-parent-duration,release-backlog-item.story-points,release-backlog-item.kan-status-duration,release-backlog-item.team-id,release-backlog-item.theme-id,release-backlog-item.estimated,release-backlog-item.watch-id,release-backlog-item.id,product-group-id&query={id[111]}&order-by={}", 200)
.content("no_entities.xml");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=&query={name['*111*']}&order-by={}", 200)
.content("no_entities.xml");
handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/requirements?fields=products-id,attachment,owner,no-of-blis,comments,creation-time,req-time,description,cover-status,last-modified,name,no-of-sons,req-priority,id,req-reviewed,release-backlog-item.product-id,release-backlog-item.owner,release-backlog-item.blocked,release-backlog-item.entity-name,release-backlog-item.entity-type,release-backlog-item.feature-id,release-backlog-item.invested,release-backlog-item.kanban-status-id,release-backlog-item.linked-entities-info,release-backlog-item.no-of-sons,release-backlog-item.kanban-parent-status-id,release-backlog-item.rank,release-backlog-item.release-id,release-backlog-item.entity-id,release-backlog-item.remaining,release-backlog-item.sprint-id,release-backlog-item.status,release-backlog-item.kan-parent-duration,release-backlog-item.story-points,release-backlog-item.kan-status-duration,release-backlog-item.team-id,release-backlog-item.theme-id,release-backlog-item.estimated,release-backlog-item.watch-id,release-backlog-item.id,product-group-id&query={id[111]}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
Task[] list = repository.getIssues("111", 5, 100);
Assert.assertEquals(0, list.length);
}
@Test
public void testFindTask() throws Exception {
RestInvocations.loadMetadata(handler, "defect");
RestInvocations.loadMetadata(handler, "release-backlog-item");
handler.addRequest("GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=actual-fix-time,attachment,in-bucket,changeset,build-closed,closing-version,closing-date,dev-comments,id,status,description,detected-by,build-detected,detected-in-rcyc,detected-in-rel,detection-version,creation-time,estimated-fix-time,extended-reference,fixed-on-date,has-change,has-linkage,has-others-linkage,last-modified,planned-closing-ver,priority,user-04,user-03,reproducible,severity,subject,name,user-02,user-01,watch-id,release-backlog-item.product-id,release-backlog-item.owner,release-backlog-item.blocked,release-backlog-item.entity-name,release-backlog-item.entity-type,release-backlog-item.feature-id,release-backlog-item.invested,release-backlog-item.kanban-status-id,release-backlog-item.linked-entities-info,release-backlog-item.no-of-sons,release-backlog-item.kanban-parent-status-id,release-backlog-item.rank,release-backlog-item.release-id,release-backlog-item.entity-id,release-backlog-item.remaining,release-backlog-item.sprint-id,release-backlog-item.status,release-backlog-item.kan-parent-duration,release-backlog-item.story-points,release-backlog-item.kan-status-duration,release-backlog-item.team-id,release-backlog-item.theme-id,release-backlog-item.estimated,release-backlog-item.watch-id,release-backlog-item.id,product-group-id&query={id[86]}&order-by={}", 200)
.content("entityServiceTest_entity.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
Task task = repository.findTask("defect #86");
checkTask(task);
}
@Test
public void testFindTask_unassigned() throws Exception {
HpAlmRepository repository = new HpAlmRepository();
Task task = repository.findTask("defect #86");
Assert.assertNull(task);
}
@Test
public void testFindTask_negative() throws Exception {
RestInvocations.loadMetadata(handler, "defect");
RestInvocations.loadMetadata(handler, "release-backlog-item");
handler.addRequest("GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=actual-fix-time,attachment,in-bucket,changeset,build-closed,closing-version,closing-date,dev-comments,id,status,description,detected-by,build-detected,detected-in-rcyc,detected-in-rel,detection-version,creation-time,estimated-fix-time,extended-reference,fixed-on-date,has-change,has-linkage,has-others-linkage,last-modified,planned-closing-ver,priority,user-04,user-03,reproducible,severity,subject,name,user-02,user-01,watch-id,release-backlog-item.product-id,release-backlog-item.owner,release-backlog-item.blocked,release-backlog-item.entity-name,release-backlog-item.entity-type,release-backlog-item.feature-id,release-backlog-item.invested,release-backlog-item.kanban-status-id,release-backlog-item.linked-entities-info,release-backlog-item.no-of-sons,release-backlog-item.kanban-parent-status-id,release-backlog-item.rank,release-backlog-item.release-id,release-backlog-item.entity-id,release-backlog-item.remaining,release-backlog-item.sprint-id,release-backlog-item.status,release-backlog-item.kan-parent-duration,release-backlog-item.story-points,release-backlog-item.kan-status-duration,release-backlog-item.team-id,release-backlog-item.theme-id,release-backlog-item.estimated,release-backlog-item.watch-id,release-backlog-item.id,product-group-id&query={id[87]}&order-by={}", 200)
.content("no_entities.xml");
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
repository._assignProject();
try {
repository.findTask("defect #87");
} catch (RuntimeException e) {
Assert.assertEquals("Entity not found: defect #87", e.getMessage());
}
}
@Test
public void testExtractId() {
HpAlmRepository repository = new HpAlmRepository();
Assert.assertEquals("defect #123", repository.extractId("defect #123"));
}
@Test
public void testClone() {
HpAlmRepository repository = new HpAlmRepository(getProject().getName(), 1);
HpAlmRepository clone = repository.clone();
Assert.assertEquals(repository.getId(), clone.getId());
Assert.assertEquals(repository.getUrl(), clone.getUrl());
Assert.assertEquals(repository.getDefect(), clone.getDefect());
Assert.assertEquals(repository.getRequirement(), clone.getRequirement());
}
@Test
public void testCompareTo() {
HpAlmRepository repository1 = new HpAlmRepository(getProject().getName(), 1);
HpAlmRepository repository2 = new HpAlmRepository(getProject().getName(), 2);
Assert.assertEquals(-1, repository1.compareTo(repository2));
Assert.assertEquals(1, repository2.compareTo(repository1));
Assert.assertEquals(0, repository1.compareTo(repository1));
}
private void checkTask(Task task) {
Assert.assertEquals("defect #86", task.getId());
Assert.assertEquals("2012-09-03 00:00:00 +0200", HpAlmCommentTest.format.format(task.getCreated()));
Assert.assertEquals("something", task.getDescription());
Assert.assertEquals("somewhat", task.getSummary());
Assert.assertEquals(TaskType.BUG, task.getType());
Assert.assertEquals("2013-05-27 06:13:29 +0200", HpAlmCommentTest.format.format(task.getUpdated()));
Assert.assertEquals(2, task.getComments().length);
Comment comment1 = task.getComments()[0];
Assert.assertEquals("Jack Jack", comment1.getAuthor());
Assert.assertEquals("2012-09-17 00:00:00 +0200", HpAlmCommentTest.format.format(comment1.getDate()));
Assert.assertEquals("Temporarily fixed by removing notNull validation.", comment1.getText());
Comment comment2 = task.getComments()[1];
Assert.assertEquals("Joe Joe", comment2.getAuthor());
Assert.assertEquals("2012-09-18 00:00:00 +0200", HpAlmCommentTest.format.format(comment2.getDate()));
Assert.assertEquals("Fixed in revision 127279", comment2.getText());
}
}