1   /*
2    * Copyright (C) 2012 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  package it;
17  
18  import com.atlassian.jira.nimblefunctests.annotation.JiraBuildNumberDependent;
19  import com.atlassian.jira.nimblefunctests.annotation.RestoreOnce;
20  import com.atlassian.jira.rest.client.RestClientException;
21  import com.atlassian.jira.rest.client.domain.EntityHelper;
22  import com.atlassian.jira.rest.client.domain.Project;
23  import com.atlassian.jira.rest.client.domain.ProjectRole;
24  import com.atlassian.jira.rest.client.domain.RoleActor;
25  import com.atlassian.jira.rest.client.internal.ServerVersionConstants;
26  import com.atlassian.jira.rest.client.internal.json.TestConstants;
27  import com.google.common.base.Function;
28  import com.google.common.collect.ImmutableList;
29  import com.google.common.collect.Iterables;
30  import com.google.common.collect.Lists;
31  import org.junit.Rule;
32  import org.junit.Test;
33  import org.junit.rules.ExpectedException;
34  
35  import java.net.URI;
36  
37  import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
38  import static org.junit.Assert.*;
39  
40  @RestoreOnce(TestConstants.DEFAULT_JIRA_DUMP_FILE)
41  public class JerseyProjectRoleRestClientTest extends AbstractJerseyRestClientTest {
42  
43  	private static final String ANONYMOUS_PROJECT_KEY = "ANNON";
44  	private static final String RESTRICTED_PROJECT_KEY = "RST";
45  
46  	@Rule
47  	public final ExpectedException exception = ExpectedException.none();
48  
49  	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
50  	@Test
51  	public void testGetProjectRoleWithRoleKeyFromAnonymousProject() {
52  		final Project anonProject = client.getProjectClient().getProject(ANONYMOUS_PROJECT_KEY, pm);
53  		final ProjectRole role = client.getProjectRolesRestClient().getRole(anonProject.getSelf(), 10000l, pm);
54  		assertNotNull(role);
55  		assertEquals("Users", role.getName());
56  		assertEquals("A project role that represents users in a project", role.getDescription());
57  		final RoleActor actor = Iterables.getOnlyElement(role.getActors());
58  		assertEquals("jira-users", actor.getDisplayName());
59  		assertEquals("atlassian-group-role-actor", actor.getType());
60  		assertEquals("jira-users", actor.getName());
61  		assertEquals(jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10083"), actor.getAvatarUri());
62  	}
63  
64  	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
65  	@Test
66  	public void testGetProjectRoleWithRoleKeyFromRestrictedProject() {
67  		final Project restrictedProject = client.getProjectClient().getProject(RESTRICTED_PROJECT_KEY, pm);
68  		final ProjectRole role = client.getProjectRolesRestClient().getRole(restrictedProject.getSelf(), 10000l, pm);
69  		assertNotNull(role);
70  		assertEquals("Users", role.getName());
71  		assertEquals("A project role that represents users in a project", role.getDescription());
72  		final RoleActor actor = Iterables.getOnlyElement(role.getActors());
73  		assertEquals("Administrator", actor.getDisplayName());
74  		assertEquals("atlassian-user-role-actor", actor.getType());
75  		assertEquals("admin", actor.getName());
76  		assertEquals(jiraUri.resolve("/jira/secure/useravatar?size=small&ownerId=admin&avatarId=10054"), actor.getAvatarUri());
77  	}
78  
79  	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
80  	@Test
81  	public void testGetProjectRoleWithRoleKeyFromRestrictedProjectWithoutPermission() {
82  		final Project restrictedProject = client.getProjectClient().getProject(RESTRICTED_PROJECT_KEY, pm);
83  		setAnonymousMode();
84  		exception.expect(RestClientException.class);
85  		exception.expectMessage("com.sun.jersey.api.client.UniformInterfaceException: Client response status: 404");
86  		client.getProjectRolesRestClient().getRole(restrictedProject.getUri(), 10000l, pm);
87  	}
88  
89  	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
90  	@Test
91  	public void testGetProjectRoleWithFullURI() {
92  		final Project anonProject = client.getProjectClient().getProject(ANONYMOUS_PROJECT_KEY, pm);
93  		final URI roleURI = client.getProjectRolesRestClient().getRole(anonProject.getSelf(), 10000l, pm).getSelf();
94  		final ProjectRole role = client.getProjectRolesRestClient().getRole(roleURI, pm);
95  		assertNotNull(role);
96  		assertEquals("Users", role.getName());
97  		assertEquals("A project role that represents users in a project", role.getDescription());
98  		final RoleActor actor = Iterables.getOnlyElement(role.getActors());
99  		assertEquals("jira-users", actor.getDisplayName());
100 		assertEquals("atlassian-group-role-actor", actor.getType());
101 		assertEquals("jira-users", actor.getName());
102 		assertEquals(jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10083"), actor.getAvatarUri());
103 	}
104 
105 	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
106 	@Test
107 	public void testGetAllRolesForProject() {
108 		final Project anonymousProject = client.getProjectClient().getProject(ANONYMOUS_PROJECT_KEY, pm);
109 		final Iterable<ProjectRole> projectRoles = client.getProjectRolesRestClient().getRoles(anonymousProject.getSelf(), pm);
110 		final Iterable<ProjectRole> projectRolesWithoutSelf = Iterables.transform(
111 				projectRoles,
112 				new Function<ProjectRole, ProjectRole>() {
113 					@Override
114 					public ProjectRole apply(final ProjectRole role) {
115 						return new ProjectRole(role.getId(), null, role.getName(), role.getDescription(), Lists.newArrayList(role.getActors()));
116 					}
117 				}
118 		);
119 		assertThat(projectRolesWithoutSelf, containsInAnyOrder(
120 				new ProjectRole(10000l, null, "Users", "A project role that represents users in a project",
121 						ImmutableList.<RoleActor>of(
122 								new RoleActor(10062l, "jira-users", "atlassian-group-role-actor", "jira-users",
123 										jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10083"))
124 						)),
125 				new ProjectRole(10001l, null, "Developers", "A project role that represents developers in a project",
126 						ImmutableList.<RoleActor>of(
127 								new RoleActor(10061l, "jira-developers", "atlassian-group-role-actor", "jira-developers",
128 										jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10083")),
129 								new RoleActor(10063l, "My Test User", "atlassian-user-role-actor", "user",
130 										jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10082"))
131 						)),
132 				new ProjectRole(10002l, null, "Administrators", "A project role that represents administrators in a project",
133 						ImmutableList.<RoleActor>of(
134 								new RoleActor(10060l, "jira-administrators", "atlassian-group-role-actor", "jira-administrators",
135 										jiraUri.resolve("/jira/secure/useravatar?size=small&avatarId=10083"))
136 						))
137 		));
138 
139 		assertNotNull(Iterables.find(projectRoles, new EntityHelper.AddressEndsWithPredicate("project/ANNON/role/10000")));
140 		assertNotNull(Iterables.find(projectRoles, new EntityHelper.AddressEndsWithPredicate("project/ANNON/role/10001")));
141 		assertNotNull(Iterables.find(projectRoles, new EntityHelper.AddressEndsWithPredicate("project/ANNON/role/10002")));
142 	}
143 
144 	@JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_4_4)
145 	@Test
146 	public void testGetProjectRoleWithRoleKeyErrorCode() {
147 		final Project anonProject = client.getProjectClient().getProject(ANONYMOUS_PROJECT_KEY, pm);
148 		exception.expect(RestClientException.class);
149 		exception.expectMessage("Can not retrieve a role actor for a null project role.");
150 		client.getProjectRolesRestClient().getRole(anonProject.getSelf(), -1l, pm);
151 	}
152 
153 }