Java tutorial
/* * 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.services; import com.hp.alm.ali.ServerVersion; import com.hp.alm.ali.TestTarget; import com.hp.alm.ali.idea.MultiTest; import com.hp.alm.ali.idea.RestInvocations; import com.hp.alm.ali.idea.entity.CachingEntityListener; import com.hp.alm.ali.idea.entity.EntityAdapter; import com.hp.alm.ali.idea.entity.EntityListener; import com.hp.alm.ali.idea.entity.EntityQuery; import com.hp.alm.ali.idea.entity.EntityRef; import com.hp.alm.ali.idea.model.Entity; import com.hp.alm.ali.idea.model.parser.EntityList; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.swing.SortOrder; import java.io.IOException; import java.util.Arrays; import java.util.Collections; public class EntityServiceTest extends MultiTest { private EntityService entityService; @Before public void preClean() { entityService = getComponent(EntityService.class); } @Test @TestTarget(ServerVersion.AGM) public void testGetEntity() { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); Entity defect = entityService.getEntity(new EntityRef("defect", 86)); Assert.assertEquals(86, defect.getId()); 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[87]}&order-by={}", 200).content("no_entities.xml"); try { entityService.getEntity(new EntityRef("defect", 87)); Assert.fail("should have failed"); } catch (Exception e) { Assert.assertEquals("Entity not found: defect #87", e.getMessage()); } } @Test @TestTarget(ServerVersion.AGM) public void testQuery() { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=priority,release-backlog-item.id,release-backlog-item.blocked,product-group-id&query={status[\"Fixed\"]; product-group-id[1000]}&order-by={priority[DESC]}", 200).content("entityServiceTest_entity.xml"); EntityQuery query = new EntityQuery("defect"); query.setValue("status", "Fixed"); query.addColumn("priority", 1); query.addOrder("priority", SortOrder.DESCENDING); EntityList list = entityService.query(query); Assert.assertEquals(1, list.size()); Assert.assertEquals(86, list.get(0).getId()); } @Test @TestTarget(ServerVersion.AGM) public void testQueryForStream() throws IOException { handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects?fields=&query={status[Fixed]}&order-by={}", 200).responseBody("simply content"); EntityQuery query = new EntityQuery("defect"); query.setValue("status", "Fixed"); query.setPropertyResolved("status", true); String content = IOUtils.toString(entityService.queryForStream(query)); Assert.assertEquals("simply content", content); } @Test @TestTarget(ServerVersion.AGM) public void testGetEntityAsync() throws IOException { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); handler.async(); entityService.getEntityAsync(new EntityRef("defect", 86), new EntityAdapter() { @Override public void entityLoaded(final Entity entity, final Event event) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals(86, entity.getId()); Assert.assertEquals(Event.GET, event); } }); } }); handler.consume(); 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[87]}&order-by={}", 200).content("no_entities.xml"); handler.async(); final EntityRef defect = new EntityRef("defect", 87); entityService.getEntityAsync(defect, new EntityAdapter() { @Override public void entityNotFound(final EntityRef ref, final boolean removed) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals(defect, ref); Assert.assertFalse(removed); } }); } }); } @Test @TestTarget(ServerVersion.AGM) public void refreshEntity() throws IOException { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); final EntityRef defect = new EntityRef("defect", 87); addEntityListener(new EntityAdapter() { @Override public void entityLoaded(final Entity entity, final Event event) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals(86, entity.getId()); Assert.assertEquals(Event.REFRESH, event); } }); } @Override public void entityNotFound(final EntityRef ref, final boolean removed) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals(defect, ref); Assert.assertFalse(removed); } }); } }); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); handler.async(); entityService.refreshEntity(new EntityRef("defect", 86)); handler.consume(); 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[87]}&order-by={}", 200).content("no_entities.xml"); handler.async(); entityService.refreshEntity(defect); } @Test @TestTarget(ServerVersion.AGM) public void testGetDefectLink_Apollo() { handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defect-links?fields=&query={id[2763]}&order-by={}", 200).content("entityServiceTest_defectLink.xml"); Entity link = entityService.getDefectLink(86, 2763); Assert.assertEquals(2763, link.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testGetDefectLink_Maya() { handler.addRequest(false, "GET", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 200).content("entityServiceTest_defectLink.xml"); Entity link = entityService.getDefectLink(86, 2763); Assert.assertEquals(2763, link.getId()); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 200) .expectXmlBody( "<Entity Type=\"defect\"><Fields><Field Name=\"status\"><Value>Closed</Value></Field></Fields></Entity>") .content("entityServiceTest_entity.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect", 86, EntityListener.Event.GET)); Entity defect = new Entity("defect", 86); defect.setProperty("priority", "1-Critical"); defect.setProperty("status", "Closed"); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), true, false, true); Assert.assertEquals(86, updated.getId()); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity_failure() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 500) .responseBody("Failed"); Entity defect = new Entity("defect", 86); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), false, false, true); Assert.assertNull(updated); checkError("Failed"); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity_silentFailure() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 500) .responseBody("Failed"); Entity defect = new Entity("defect", 86); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), true, false, true); Assert.assertNull(updated); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity_silentReload() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 500) .responseBody("Failed"); // get after failure: RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); Entity defect = new Entity("defect", 86); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), true, true, false); Assert.assertEquals(86, updated.getId()); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity_silentReloadFailure() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 500) .responseBody("Failed"); // get after failure: RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 500).responseBody("Failed again"); Entity defect = new Entity("defect", 86); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), false, true, false); Assert.assertNull(updated); checkError("Failed"); } @Test @TestTarget(ServerVersion.AGM) public void testUpdateEntity_noEvent() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86", 200) .expectXmlBody( "<Entity Type=\"defect\"><Fields><Field Name=\"status\"><Value>Closed</Value></Field></Fields></Entity>") .content("entityServiceTest_entity.xml"); addEntityListener(new EntityAdapter() { @Override public void entityLoaded(final Entity entity, final Event event) { Assert.fail("Event not expected"); } }); Entity defect = new Entity("defect", 86); defect.setProperty("priority", "1-Critical"); defect.setProperty("status", "Closed"); Entity updated = entityService.updateEntity(defect, Collections.singleton("status"), false, false, false); Assert.assertEquals(86, updated.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testUpdateEntity_MayaLink() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 200) .expectXmlBody( "<defect-link><comment>Yes!</comment><first-endpoint-id>86</first-endpoint-id></defect-link>") .content("entityServiceTest_defectLink.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect-link", 2763, EntityListener.Event.GET)); Entity link = new Entity("defect-link", 2763); link.setProperty("comment", "Yes!"); link.setProperty("first-endpoint-id", "86"); Entity updated = entityService.updateEntity(link, Collections.singleton("comment"), true, false, true); Assert.assertEquals(2763, updated.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testUpdateEntity_MayaLink_failure() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 500).responseBody("Failed"); Entity link = new Entity("defect-link", 2763); link.setProperty("first-endpoint-id", "86"); Entity updated = entityService.updateEntity(link, Collections.singleton("comment"), false, false, false); Assert.assertNull(updated); checkError("Failed"); } @Test @TestTarget(ServerVersion.ALM11) public void testUpdateEntity_MayaLink_silentFailure() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 500).responseBody("Failed"); Entity link = new Entity("defect-link", 2763); link.setProperty("first-endpoint-id", "86"); Entity updated = entityService.updateEntity(link, Collections.singleton("comment"), true, false, false); Assert.assertNull(updated); } @Test @TestTarget(ServerVersion.ALM11) public void testUpdateEntity_MayaLink_noEvent() { handler.addRequest(false, "PUT", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 200) .expectXmlBody( "<defect-link><comment>Yes!</comment><first-endpoint-id>86</first-endpoint-id></defect-link>") .content("entityServiceTest_defectLink.xml"); addEntityListener(new EntityAdapter() { @Override public void entityLoaded(final Entity entity, final Event event) { Assert.fail("Event not expected"); } }); Entity link = new Entity("defect-link", 2763); link.setProperty("comment", "Yes!"); link.setProperty("first-endpoint-id", "86"); Entity updated = entityService.updateEntity(link, Collections.singleton("comment"), true, false, false); Assert.assertEquals(2763, updated.getId()); } @Test @TestTarget(ServerVersion.AGM) public void testCreateEntity() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects", 201).expectXmlBody( "<Entity Type=\"defect\"><Fields><Field Name=\"status\"><Value>New</Value></Field></Fields></Entity>") .content("entityServiceTest_entity.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect", 86, EntityListener.Event.CREATE)); Entity defect = new Entity("defect"); defect.setProperty("status", "New"); Entity created = entityService.createEntity(defect, false); Assert.assertEquals(86, created.getId()); } @Test @TestTarget(ServerVersion.AGM) public void testCreateEntity_failure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects", 500) .responseBody("Failed"); Entity defect = new Entity("defect"); Entity created = entityService.createEntity(defect, false); Assert.assertNull(created); checkError("Failed"); } @Test @TestTarget(ServerVersion.AGM) public void testCreateEntity_silentFailure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects", 500) .responseBody("Failed"); Entity defect = new Entity("defect"); Entity created = entityService.createEntity(defect, true); Assert.assertNull(created); } @Test @TestTarget(ServerVersion.ALM11) public void testCreateEntity_MayaLink() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links", 201) .expectXmlBody( "<defect-link><comment>There</comment><first-endpoint-id>86</first-endpoint-id></defect-link>") .content("entityServiceTest_defectLink.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect-link", 2763, EntityListener.Event.CREATE)); Entity link = new Entity("defect-link"); link.setProperty("first-endpoint-id", "86"); link.setProperty("comment", "There"); Entity created = entityService.createEntity(link, false); Assert.assertEquals(2763, created.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testCreateEntity_MayaLink_failure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links", 500).responseBody("Failed"); Entity link = new Entity("defect-link"); link.setProperty("first-endpoint-id", "86"); Entity created = entityService.createEntity(link, false); Assert.assertNull(created); checkError("Failed"); } @Test @TestTarget(ServerVersion.ALM11) public void testCreateEntity_MayaLink_silentFailure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links", 500).responseBody("Failed"); Entity link = new Entity("defect-link"); link.setProperty("first-endpoint-id", "86"); Entity created = entityService.createEntity(link, true); Assert.assertNull(created); } @Test @TestTarget(ServerVersion.ALM11) public void testLockEntity() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 200) .content("entityServiceTest_entity.xml"); Entity defect = new Entity("defect", 86); Entity entity = entityService.lockEntity(defect, false); Assert.assertEquals(86, entity.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testLockEntity_withUpdate() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 200) .content("entityServiceTest_entity.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect", 86, EntityListener.Event.GET)); testMessages.add( "Item has been recently modified on the server. Local values have been updated to match the up-to-date revision.", 0); Entity defect = new Entity("defect", 86); defect.setProperty("status", "Open"); // different than obtained during lock Entity entity = entityService.lockEntity(defect, false); Assert.assertEquals(86, entity.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testLockEntity_withSilentUpdate() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 200) .content("entityServiceTest_entity.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, "defect", 86, EntityListener.Event.GET)); Entity defect = new Entity("defect", 86); defect.setProperty("status", "Open"); // different than obtained during lock Entity entity = entityService.lockEntity(defect, true); Assert.assertEquals(86, entity.getId()); } @Test @TestTarget(ServerVersion.ALM11) public void testLockEntity_failure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 500) .responseBody("Failed"); Entity defect = new Entity("defect", 86); Entity entity = entityService.lockEntity(defect, false); Assert.assertNull(entity); checkError("Failed"); } @Test @TestTarget(ServerVersion.ALM11) public void testLockEntity_silentFailure() { handler.addRequest(false, "POST", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 500) .responseBody("Failed"); Entity defect = new Entity("defect", 86); Entity entity = entityService.lockEntity(defect, true); Assert.assertNull(entity); } @Test @TestTarget(ServerVersion.AGM) public void testDeleteEntity() { handler.addRequest(false, "DELETE", "/qcbin/rest/domains/domain/projects/project/defects/86", 200); handler.async(); addEntityListener(new EntityNotFound(handler, "defect", 86, true)); Entity defect = new Entity("defect", 86); boolean deleted = entityService.deleteEntity(defect); Assert.assertTrue(deleted); } @Test @TestTarget(ServerVersion.AGM) public void testDeleteEntity_failure() { handler.addRequest(false, "DELETE", "/qcbin/rest/domains/domain/projects/project/defects/86", 500) .responseBody("Failed"); Entity defect = new Entity("defect", 86); boolean deleted = entityService.deleteEntity(defect); Assert.assertFalse(deleted); checkError("Failed"); } @Test @TestTarget(ServerVersion.ALM11) public void testDeleteEntity_MayaLink() { handler.addRequest(false, "DELETE", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 200); handler.async(); addEntityListener(new EntityNotFound(handler, "defect-link", 2763, true)); Entity link = new Entity("defect-link", 2763); link.setProperty("first-endpoint-id", "86"); boolean deleted = entityService.deleteEntity(link); Assert.assertTrue(deleted); } @Test @TestTarget(ServerVersion.ALM11) public void testDeleteEntity_MayaLink_failure() { handler.addRequest(false, "DELETE", "/qcbin/rest/domains/domain/projects/project/defects/86/defect-links/2763", 500) .responseBody("Failed"); Entity link = new Entity("defect-link", 2763); link.setProperty("first-endpoint-id", "86"); boolean deleted = entityService.deleteEntity(link); Assert.assertFalse(deleted); checkError("Failed"); } @Test @TestTarget(ServerVersion.ALM11) public void testUnlockEntity() { handler.addRequest(false, "DELETE", "/qcbin/rest/domains/domain/projects/project/defects/86/lock", 200); Entity defect = new Entity("defect", 86); entityService.unlockEntity(defect); } @Test @TestTarget(ServerVersion.AGM) public void testRequestCachedEntity() { EntityRef ref = new EntityRef("defect", 86); Entity entity = new Entity(ref.type, ref.id); entity.setProperty("status", "New"); addEntityListener(new Cache(ref, entity)); handler.async(); entityService.requestCachedEntity(ref, Arrays.asList("status"), new EntityLoaded(handler, "defect", 86, EntityListener.Event.CACHE, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { Assert.assertEquals("New", entity.getPropertyValue("status")); } })); } @Test @TestTarget(ServerVersion.AGM) public void testRequestCachedEntity_propertyMiss() { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); EntityRef ref = new EntityRef("defect", 86); Entity entity = new Entity(ref.type, ref.id); addEntityListener(new Cache(ref, entity)); handler.async(); entityService.requestCachedEntity(ref, Arrays.asList("status"), new EntityLoaded(handler, "defect", 86, EntityListener.Event.GET, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { Assert.assertEquals("Fixed", entity.getPropertyValue("status")); } })); } @Test @TestTarget(ServerVersion.AGM) public void testRequestCachedEntity_miss() { RestInvocations.loadMetadata(handler, "defect"); RestInvocations.loadMetadata(handler, "release-backlog-item"); 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[86]}&order-by={}", 200).content("entityServiceTest_entity.xml"); addEntityListener(new Cache(null, null)); handler.async(); entityService.requestCachedEntity(new EntityRef("defect", 86), Collections.<String>emptyList(), new EntityLoaded(handler, "defect", 86, EntityListener.Event.GET, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { Assert.assertEquals("Fixed", entity.getPropertyValue("status")); } })); } @Test @TestTarget(ServerVersion.AGM) public void testRequestCachedEntity_async() { EntityRef ref = new EntityRef("defect", 86); final Entity entity = new Entity(ref.type, ref.id); final String thread = Thread.currentThread().getName(); addEntityListener(new CachingEntityListener() { @Override public Entity lookup(EntityRef ref) { Assert.assertNotEquals("cache must be asynchronous", Thread.currentThread().getName(), thread); return entity; } @Override public void entityLoaded(Entity entity, Event event) { } @Override public void entityNotFound(EntityRef ref, boolean removed) { } }); handler.async(); entityService.requestCachedEntity(new EntityRef("defect", 86), Collections.<String>emptyList(), new EntityLoaded(handler, "defect", 86, EntityListener.Event.CACHE)); } private static class Cache implements CachingEntityListener { private final EntityRef key; private final Entity value; private Cache(EntityRef key, Entity value) { this.key = key; this.value = value; } @Override public Entity lookup(EntityRef ref) { if (ref.equals(key)) { return value; } else { return null; } } @Override public void entityLoaded(Entity entity, Event event) { } @Override public void entityNotFound(EntityRef ref, boolean removed) { } } }