/* * 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.idea.IntellijTest; import com.hp.alm.ali.idea.entity.EntityAdapter; import com.hp.alm.ali.idea.entity.EntityListener; import com.hp.alm.ali.idea.entity.EntityRef; import com.hp.alm.ali.idea.model.Entity; import com.hp.alm.ali.idea.progress.IndicatingInputStream; import com.hp.alm.ali.idea.rest.RestException; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; public class AttachmentServiceTest extends IntellijTest { public AttachmentServiceTest() { super(ServerVersion.AGM); } private AttachmentService attachmentService; private File file; @Before public void preCleanup() throws IOException { attachmentService = getComponent(AttachmentService.class); file = createFile(); } @Test public void testCreateAttachment() throws IOException { handler.addRequest("POST", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments", 201) .expectHeader("Content-Type", "application/octet-stream") .expectHeader("Slug", "logfile.txt") .content("attachmentServiceTest_attachment.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { checkAttachment(entity); Assert.assertEquals(EntityListener.Event.CREATE, event); } })); String name = attachmentService.createAttachment("logfile.txt", new IndicatingInputStream(file, null), file.length(), new EntityRef("defect", 1)); Assert.assertEquals("logfile.txt", name); } @Test public void testCreateAttachment_failure() throws IOException { handler.addRequest("POST", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments", 500) .responseBody("Failed"); String name = attachmentService.createAttachment("logfile.txt", new IndicatingInputStream(file, null), file.length(), new EntityRef("defect", 1)); Assert.assertNull(name); checkError("Failed"); } @Test public void testDeleteAttachment() { handler.addRequest("DELETE", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 200) .content("attachmentServiceTest_attachment.xml"); handler.async(); addEntityListener(new EntityNotFound(handler, "attachment", 653, true)); attachmentService.deleteAttachment("logfile.txt", new EntityRef("defect", 1)); } @Test public void testDeleteAttachment_failure() { handler.addRequest("DELETE", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 500) .responseBody("Failed"); attachmentService.deleteAttachment("logfile.txt", new EntityRef("defect", 1)); checkError("Failed"); } @Test public void testUpdateAttachmentProperty() { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 200) .content("attachmentServiceTest_attachment.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { checkAttachment(entity); Assert.assertEquals(EntityListener.Event.GET, event); } })); Entity attachment = attachmentService.updateAttachmentProperty("logfile.txt", new EntityRef("defect", 1), "description", "newValue", false); checkAttachment(attachment); } @Test public void testUpdateAttachmentProperty_fail() { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 500) .responseBody("Failed"); Entity attachment = attachmentService.updateAttachmentProperty("logfile.txt", new EntityRef("defect", 1), "description", "newValue", false); Assert.assertNull(attachment); checkError("Failed"); } @Test public void testUpdateAttachmentProperty_failSilently() { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 500) .responseBody("Failed"); Entity attachment = attachmentService.updateAttachmentProperty("logfile.txt", new EntityRef("defect", 1), "description", "newValue", true); Assert.assertNull(attachment); } @Test public void testUpdateAttachmentContent() throws FileNotFoundException { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 200) .expectHeader("Content-Type", "application/octet-stream") .content("attachmentServiceTest_attachment.xml"); handler.async(); addEntityListener(new EntityLoaded(handler, new EntityLoaded.Listener() { @Override public void evaluate(Entity entity, EntityListener.Event event) { checkAttachment(entity); Assert.assertEquals(EntityListener.Event.GET, event); } })); boolean updated = attachmentService.updateAttachmentContent("logfile.txt", new EntityRef("defect", 1), new IndicatingInputStream(file, null), file.length(), false); Assert.assertTrue(updated); } @Test public void testUpdateAttachmentContent_fail() throws FileNotFoundException { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 500) .responseBody("Failed"); boolean updated = attachmentService.updateAttachmentContent("logfile.txt", new EntityRef("defect", 1), new IndicatingInputStream(file, null), file.length(), false); Assert.assertFalse(updated); checkError("Failed"); } @Test public void testUpdateAttachmentContent_failSilently() throws FileNotFoundException { handler.addRequest("PUT", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/logfile.txt", 500) .responseBody("Failed"); boolean updated = attachmentService.updateAttachmentContent("logfile.txt", new EntityRef("defect", 1), new IndicatingInputStream(file, null), file.length(), true); Assert.assertFalse(updated); } @Test public void testGetAttachmentEntity() { handler.addRequest("GET", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/my%20name?alt=application/xml", 200) .content("attachmentServiceTest_attachment.xml"); Entity attachment = new Entity("attachment", 653); attachment.setProperty("name", "my name"); attachment.setProperty("parent-type", "defect"); attachment.setProperty("parent-id", "1"); Entity entity = attachmentService.getAttachmentEntity(attachment); checkAttachment(entity); } @Test public void testGetAttachmentEntity_alternative() { handler.addRequest("GET", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/my%20name?alt=application/xml", 200) .content("attachmentServiceTest_attachment.xml"); Entity entity = attachmentService.getAttachmentEntity("my name", new EntityRef("defect", 1)); checkAttachment(entity); } @Test public void testGetAttachmentEntity_failure() { handler.addRequest("GET", "/qcbin/rest/domains/domain/projects/project/defects/1/attachments/my%20name?alt=application/xml", 500) .responseBody("Not this time"); Entity entity = attachmentService.getAttachmentEntity("my name", new EntityRef("defect", 1)); Assert.assertNull(entity); checkError("Not this time"); } @Test public void testGetAttachmentEntity_illegal() { Entity defect = new Entity("defect", 1); try { attachmentService.getAttachmentEntity(defect); Assert.fail("should have failed"); } catch (IllegalArgumentException e) { } } private void checkAttachment(Entity entity) { Assert.assertEquals("attachment", entity.getType()); Assert.assertEquals(653, entity.getId()); Assert.assertEquals("1", entity.getPropertyValue("parent-id")); Assert.assertEquals("defect", entity.getPropertyValue("parent-type")); Assert.assertEquals("7", entity.getPropertyValue("file-size")); } private File createFile() throws IOException { File tempFile = File.createTempFile("AttachmentServiceTest", null); tempFile.deleteOnExit(); FileWriter fw = new FileWriter(tempFile); IOUtils.copy(new StringReader("content"), fw); fw.close(); return tempFile; } }