1   /*
2    * Copyright (C) 2010 Atlassian
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package it;
18  
19  import com.atlassian.jira.nimblefunctests.annotation.JiraBuildNumberDependent;
20  import com.atlassian.jira.nimblefunctests.annotation.RestoreOnce;
21  import com.atlassian.jira.rest.client.TestUtil;
22  import com.atlassian.jira.rest.client.domain.BasicIssueType;
23  import com.atlassian.jira.rest.client.domain.BasicPriority;
24  import com.atlassian.jira.rest.client.domain.BasicResolution;
25  import com.atlassian.jira.rest.client.domain.BasicStatus;
26  import com.atlassian.jira.rest.client.domain.Issue;
27  import com.atlassian.jira.rest.client.domain.IssueType;
28  import com.atlassian.jira.rest.client.domain.IssuelinksType;
29  import com.atlassian.jira.rest.client.domain.Priority;
30  import com.atlassian.jira.rest.client.domain.Resolution;
31  import com.atlassian.jira.rest.client.domain.ServerInfo;
32  import com.atlassian.jira.rest.client.domain.Status;
33  import com.atlassian.jira.rest.client.domain.Transition;
34  import com.atlassian.jira.rest.client.domain.input.TransitionInput;
35  import com.atlassian.jira.rest.client.internal.json.TestConstants;
36  import com.google.common.collect.Iterables;
37  import org.joda.time.DateTime;
38  import org.junit.Test;
39  
40  import javax.ws.rs.core.Response;
41  
42  import static com.atlassian.jira.rest.client.internal.ServerVersionConstants.BN_JIRA_4_3;
43  import static org.junit.Assert.*;
44  
45  /**
46   * Those tests mustn't change anything on server side, as jira is restored only once
47   */
48  // Ignore "May produce NPE" warnings, as we know what we are doing in tests
49  @SuppressWarnings("ConstantConditions")
50  @RestoreOnce(TestConstants.DEFAULT_JIRA_DUMP_FILE)
51  public class JerseyMetadataRestClientReadOnlyTest extends AbstractJerseyRestClientTest {
52  	@Test
53  	public void testGetServerInfo() throws Exception {
54  		final ServerInfo serverInfo = client.getMetadataClient().getServerInfo(pm);
55  		assertEquals("Your Company JIRA", serverInfo.getServerTitle());
56  		assertTrue(serverInfo.getBuildDate().isBeforeNow());
57  		assertTrue(serverInfo.getServerTime().isAfter(new DateTime().minusMinutes(5)));
58  		assertTrue(serverInfo.getServerTime().isBefore(new DateTime().plusMinutes(5)));
59  	}
60  
61  	@Test
62  	public void testGetIssueTypeNonExisting() throws Exception {
63  		final BasicIssueType basicIssueType = client.getIssueClient().getIssue("TST-1", pm).getIssueType();
64  		TestUtil.assertErrorCode(Response.Status.NOT_FOUND, "The issue type with id '" +
65  				TestUtil.getLastPathSegment(basicIssueType.getSelf()) + "fake" +
66  				"' does not exist", new Runnable() {
67  			@Override
68  			public void run() {
69  				client.getMetadataClient().getIssueType(TestUtil.toUri(basicIssueType.getSelf() + "fake"), pm);
70  			}
71  		});
72  	}
73  
74  	@Test
75  	public void testGetIssueType() {
76  		final BasicIssueType basicIssueType = client.getIssueClient().getIssue("TST-1", pm).getIssueType();
77  		final IssueType issueType = client.getMetadataClient().getIssueType(basicIssueType.getSelf(), pm);
78  		assertEquals("Bug", issueType.getName());
79  		assertEquals("A problem which impairs or prevents the functions of the product.", issueType.getDescription());
80  		Long expectedId = isJira5xOrNewer() ? 1L : null;
81  		assertEquals(expectedId, issueType.getId());
82  		assertTrue(issueType.getIconUri().toString().endsWith("bug.gif"));
83  	}
84  
85  	@JiraBuildNumberDependent(BN_JIRA_4_3)
86  	@Test
87  	public void testGetIssueTypes() {
88  		final Iterable<IssuelinksType> issueTypes = client.getMetadataClient().getIssueLinkTypes(pm);
89  		assertEquals(1, Iterables.size(issueTypes));
90  		final IssuelinksType issueType = Iterables.getOnlyElement(issueTypes);
91  		assertEquals("Duplicate", issueType.getName());
92  		assertEquals("is duplicated by", issueType.getInward());
93  		assertEquals("duplicates", issueType.getOutward());
94  	}
95  
96  	@Test
97  	public void testGetStatus() {
98  		final BasicStatus basicStatus = client.getIssueClient().getIssue("TST-1", pm).getStatus();
99  		final Status status = client.getMetadataClient().getStatus(basicStatus.getSelf(), pm);
100 		assertEquals("The issue is open and ready for the assignee to start work on it.", status.getDescription());
101 		assertTrue(status.getIconUrl().toString().endsWith("status_open.gif"));
102 		assertEquals("Open", status.getName());
103 	}
104 
105 	@Test
106 	public void testGetStatusNonExisting() throws Exception {
107 		final BasicStatus basicStatus = client.getIssueClient().getIssue("TST-1", pm).getStatus();
108 		TestUtil.assertErrorCode(Response.Status.NOT_FOUND, "The status with id '" +
109 				TestUtil.getLastPathSegment(basicStatus.getSelf()) + "fake" +
110 				"' does not exist", new Runnable() {
111 			@Override
112 			public void run() {
113 				client.getMetadataClient().getStatus(TestUtil.toUri(basicStatus.getSelf() + "fake"), pm);
114 			}
115 		});
116 	}
117 
118 	@Test
119 	public void testGetPriority() {
120 		final BasicPriority basicPriority = client.getIssueClient().getIssue("TST-2", pm).getPriority();
121 		final Priority priority = client.getMetadataClient().getPriority(basicPriority.getSelf(), pm);
122 		assertEquals(basicPriority.getSelf(), priority.getSelf());
123 		assertEquals("Major", priority.getName());
124 		assertEquals("#009900", priority.getStatusColor());
125 		assertEquals("Major loss of function.", priority.getDescription());
126 		final Long expectedId = isJira5xOrNewer() ? 3L : null;
127 		assertEquals(expectedId, priority.getId());
128 		assertTrue(priority.getIconUri().toString().startsWith(jiraUri.toString()));
129 		assertTrue(priority.getIconUri().toString().endsWith("/images/icons/priority_major.gif"));
130 
131 	}
132 
133 	@Test
134 	public void testGetResolution() {
135 		final Issue issue = client.getIssueClient().getIssue("TST-2", pm);
136 		assertNull(issue.getResolution());
137 		final Iterable<Transition> transitions = client.getIssueClient().getTransitions(issue, pm);
138 		final Transition resolveTransition = TestUtil.getTransitionByName(transitions, "Resolve Issue");
139 
140 		client.getIssueClient().transition(issue, new TransitionInput(resolveTransition.getId()), pm);
141 
142 		final Issue resolvedIssue = client.getIssueClient().getIssue("TST-2", pm);
143 		final BasicResolution basicResolution = resolvedIssue.getResolution();
144 		assertNotNull(basicResolution);
145 
146 		final Resolution resolution = client.getMetadataClient().getResolution(basicResolution.getSelf(), pm);
147 		assertEquals(basicResolution.getName(), resolution.getName());
148 		assertEquals(basicResolution.getSelf(), resolution.getSelf());
149 		assertEquals("A fix for this issue is checked into the tree and tested.", resolution.getDescription());
150 	}
151 }