PageRenderTime 28ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-plugins/jira-rest/jira-rest-plugin/src/test/java/com/atlassian/jira/rest/v2/issue/UniversalAvatarResourceTest.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 282 lines | 217 code | 48 blank | 17 comment | 2 complexity | 0810dffe937efa0e650523eede7c427f MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.rest.v2.issue;
  2. import com.atlassian.jira.avatar.Avatar;
  3. import com.atlassian.jira.avatar.AvatarImageResolver;
  4. import com.atlassian.jira.avatar.AvatarManager;
  5. import com.atlassian.jira.junit.rules.MockitoMocksInContainer;
  6. import com.atlassian.jira.mock.MockAvatar;
  7. import com.atlassian.jira.icon.IconOwningObjectId;
  8. import com.atlassian.jira.icon.IconType;
  9. import com.atlassian.jira.rest.v2.avatar.AvatarUrls;
  10. import com.atlassian.jira.rest.v2.avatar.TemporaryAvatarHelper;
  11. import com.atlassian.jira.security.JiraAuthenticationContext;
  12. import com.atlassian.jira.user.ApplicationUser;
  13. import com.atlassian.jira.user.MockApplicationUser;
  14. import com.google.common.collect.ImmutableList;
  15. import com.google.common.collect.ImmutableMap;
  16. import org.junit.Before;
  17. import org.junit.Rule;
  18. import org.junit.Test;
  19. import org.junit.rules.TestRule;
  20. import org.mockito.Mock;
  21. import org.mockito.invocation.InvocationOnMock;
  22. import org.mockito.stubbing.Answer;
  23. import javax.servlet.http.HttpServletRequest;
  24. import javax.ws.rs.core.Response;
  25. import java.net.URI;
  26. import java.util.List;
  27. import java.util.Map;
  28. import static org.hamcrest.Matchers.equalTo;
  29. import static org.hamcrest.Matchers.is;
  30. import static org.junit.Assert.assertThat;
  31. import static org.mockito.Matchers.any;
  32. import static org.mockito.Mockito.mock;
  33. import static org.mockito.Mockito.never;
  34. import static org.mockito.Mockito.verify;
  35. import static org.mockito.Mockito.when;
  36. public class UniversalAvatarResourceTest {
  37. public static final long AVATAR_ID = 45l;
  38. @Rule
  39. public final TestRule mockInContainer = MockitoMocksInContainer.forTest(this);
  40. private static final String OWNER_ISSUE1 = "ISSUE_TYPE_1";
  41. private static final String OWNER_ISSUE2 = "ISSUE_TYPE_2";
  42. public static final long SAMPLE_SIZE = 16l;
  43. private Avatar ISSUE1_AVATAR;
  44. private Avatar ISSUE2_AVATAR;
  45. private Avatar SYSTEM_ISSUE_AVATAR;
  46. private final ApplicationUser ADMIN_USER = new MockApplicationUser("admin");
  47. @Mock
  48. private JiraAuthenticationContext authContext;
  49. @Mock
  50. AvatarResourceHelper avatarResourceHelper;
  51. @Mock
  52. private AvatarImageResolver avatarImageResolver;
  53. @Mock
  54. private AvatarManager avatarManager;
  55. UniversalAvatarResource testObj;
  56. AvatarUrls avatarUrls = new AvatarUrls();
  57. private Answer<URI> avatar_and_size_to_uri = new Answer<URI>() {
  58. @Override
  59. public URI answer(final InvocationOnMock invocationOnMock) throws Throwable {
  60. Avatar avatar = (Avatar) invocationOnMock.getArguments()[1];
  61. Avatar.Size size = (Avatar.Size) invocationOnMock.getArguments()[2];
  62. return createUriFor(avatar, size);
  63. }
  64. };
  65. @Mock
  66. private TemporaryAvatarHelper avatarTemporaryHelper;
  67. private static URI createUriFor(final Avatar avatar, final Avatar.Size size) {
  68. return URI.create(String.format("http://%s/%s", avatar.getFileName(), size.getPixels()));
  69. }
  70. @Before
  71. public void setUp() {
  72. ISSUE1_AVATAR = new MockAvatar(1, "issue1.jpg", "jpg", IconType.ISSUE_TYPE_ICON_TYPE, OWNER_ISSUE1, false);
  73. ISSUE2_AVATAR = new MockAvatar(3, "issue2.jpg", "jpg", IconType.ISSUE_TYPE_ICON_TYPE, OWNER_ISSUE2, false);
  74. SYSTEM_ISSUE_AVATAR = new MockAvatar(2, "system.jpg", "jpg", IconType.ISSUE_TYPE_ICON_TYPE, null, true);
  75. testObj = new UniversalAvatarResource(authContext, avatarUrls, avatarResourceHelper,
  76. avatarTemporaryHelper, avatarManager, avatarImageResolver);
  77. when(authContext.getUser()).thenReturn(ADMIN_USER);
  78. when(authContext.getLoggedInUser()).thenReturn(ADMIN_USER);
  79. when(avatarImageResolver.getAvatarAbsoluteUri(any(ApplicationUser.class), any(Avatar.class), any(Avatar.Size.class))).
  80. thenAnswer(avatar_and_size_to_uri);
  81. when(avatarManager.getAllSystemAvatars(IconType.ISSUE_TYPE_ICON_TYPE)).thenReturn(
  82. ImmutableList.of(SYSTEM_ISSUE_AVATAR)
  83. );
  84. when(avatarManager.getCustomAvatarsForOwner(IconType.ISSUE_TYPE_ICON_TYPE, OWNER_ISSUE1)).thenReturn(
  85. ImmutableList.of(ISSUE1_AVATAR)
  86. );
  87. when(avatarManager.getCustomAvatarsForOwner(IconType.ISSUE_TYPE_ICON_TYPE, OWNER_ISSUE2)).thenReturn(
  88. ImmutableList.of(ISSUE2_AVATAR)
  89. );
  90. }
  91. @Test
  92. public void shouldReturnAllAvatarsForGivenOwnerWithType() {
  93. when(avatarManager.userCanDelete(ADMIN_USER, ISSUE1_AVATAR)).thenReturn(true);
  94. when(avatarManager.isValidIconType(IconType.ISSUE_TYPE_ICON_TYPE)).thenReturn(true);
  95. // when
  96. Response avatars = testObj.getAvatars(IconType.ISSUE_TYPE_ICON_TYPE.getKey(), OWNER_ISSUE1);
  97. // then
  98. Map<String, List<AvatarBean>> result = (Map<String, List<AvatarBean>>) avatars.getEntity();
  99. final Map<String, List<AvatarBean>> avatarBeans =
  100. ImmutableMap.<String, List<AvatarBean>>builder().
  101. put(
  102. "system",
  103. ImmutableList.of(
  104. getAvatarBeanForAvatar(SYSTEM_ISSUE_AVATAR)
  105. )).
  106. put(
  107. "custom",
  108. ImmutableList.of(
  109. getAvatarBeanForAvatar(ISSUE1_AVATAR)
  110. )).
  111. build();
  112. assertThat(result, is(equalTo(avatarBeans)));
  113. }
  114. @Test
  115. public void shoulReturnCreateFromTemporaryServiceResult() {
  116. // given
  117. HttpServletRequest request = mock(HttpServletRequest.class);
  118. final AvatarBean avatarBean = new AvatarBean("12", OWNER_ISSUE1);
  119. final AvatarCroppingBean croppingBean = new AvatarCroppingBean("a", 3, 3, 3, true);
  120. when(avatarManager.isValidIconType(IconType.PROJECT_ICON_TYPE)).thenReturn(true);
  121. when(avatarTemporaryHelper.createAvatarFromTemporary(
  122. ADMIN_USER,
  123. IconType.PROJECT_ICON_TYPE,
  124. OWNER_ISSUE1,
  125. croppingBean)).thenReturn(avatarBean);
  126. // when
  127. final Response response = testObj.createAvatarFromTemporary(
  128. IconType.PROJECT_ICON_TYPE.getKey(),
  129. OWNER_ISSUE1,
  130. croppingBean);
  131. // then
  132. assertThat((AvatarBean) response.getEntity(), is(avatarBean));
  133. }
  134. @Test
  135. public void shouldRespondWithNotFoundWhenAskingForUnknownAvatarTypeAvatarCreateFromTemp() {
  136. HttpServletRequest request = mock(HttpServletRequest.class);
  137. final AvatarCroppingBean croppingBean = new AvatarCroppingBean("a", 3, 3, 3, true);
  138. IconType invalidIconType = IconType.of("this-type-doesnt-exist");
  139. when(avatarManager.isValidIconType(invalidIconType)).thenReturn(false);
  140. // when
  141. Response avatars = testObj.createAvatarFromTemporary("this-type-doesnt-exist", OWNER_ISSUE1,
  142. croppingBean);
  143. assertThat(avatars.getStatus(), is(equalTo(Response.Status.NOT_FOUND.getStatusCode())));
  144. }
  145. @Test
  146. public void shoulReturnUploadServiceResultWhenSecurityAcceptsChange() {
  147. // given
  148. when(avatarManager.userCanCreateFor(ADMIN_USER, IconType.PROJECT_ICON_TYPE, new IconOwningObjectId(OWNER_ISSUE1))).thenReturn(true);
  149. when(avatarManager.isValidIconType(IconType.PROJECT_ICON_TYPE)).thenReturn(true);
  150. HttpServletRequest request = mock(HttpServletRequest.class);
  151. Response mockResponse = mock(Response.class);
  152. when(avatarTemporaryHelper.storeTemporaryAvatar(
  153. ADMIN_USER,
  154. IconType.PROJECT_ICON_TYPE, OWNER_ISSUE1,
  155. Avatar.Size.LARGE, "file.jpg",
  156. SAMPLE_SIZE,
  157. request)).thenReturn(mockResponse);
  158. // when
  159. final Response response = testObj.storeTemporaryAvatar(
  160. IconType.PROJECT_ICON_TYPE.getKey(),
  161. OWNER_ISSUE1,
  162. "file.jpg",
  163. SAMPLE_SIZE,
  164. request);
  165. // then
  166. assertThat(response, is(mockResponse));
  167. }
  168. @Test
  169. public void shouldRespondWithNotFoundWhenAskingForUnknownAvatarTypeAvatarUpload() {
  170. HttpServletRequest request = mock(HttpServletRequest.class);
  171. // when
  172. Response avatars = testObj.storeTemporaryAvatar("this-type-doesnt-exist", OWNER_ISSUE1,
  173. "file.jpg",
  174. SAMPLE_SIZE,
  175. request);
  176. assertThat(avatars.getStatus(), is(equalTo(Response.Status.NOT_FOUND.getStatusCode())));
  177. }
  178. @Test
  179. public void shoulFailAndNotCallDeleteWhenSecurityRejectChange() {
  180. // given
  181. when(avatarManager.userCanCreateFor(ADMIN_USER, IconType.PROJECT_ICON_TYPE, new IconOwningObjectId(OWNER_ISSUE1))).thenReturn(false);
  182. when(avatarManager.isValidIconType(IconType.PROJECT_ICON_TYPE)).thenReturn(true);
  183. HttpServletRequest request = mock(HttpServletRequest.class);
  184. // when
  185. final Response response = testObj.deleteAvatar(
  186. IconType.PROJECT_ICON_TYPE.getKey(),
  187. OWNER_ISSUE1,
  188. AVATAR_ID);
  189. // then
  190. assertThat(response.getStatus(), is(equalTo(Response.Status.FORBIDDEN.getStatusCode())));
  191. verify(avatarResourceHelper, never()).deleteAvatar(AVATAR_ID);
  192. }
  193. @Test
  194. public void shoulReturnDeleteServiceResultWhenSecurityAcceptsChange() {
  195. // given
  196. when(avatarManager.userCanCreateFor(ADMIN_USER, IconType.PROJECT_ICON_TYPE, new IconOwningObjectId(OWNER_ISSUE1))).thenReturn(true);
  197. when(avatarManager.isValidIconType(IconType.PROJECT_ICON_TYPE)).thenReturn(true);
  198. Response mockResponse = mock(Response.class);
  199. when(avatarResourceHelper.deleteAvatar(AVATAR_ID)).thenReturn(mockResponse);
  200. // when
  201. final Response response = testObj.deleteAvatar(
  202. IconType.PROJECT_ICON_TYPE.getKey(),
  203. OWNER_ISSUE1,
  204. AVATAR_ID);
  205. // then
  206. assertThat(response, is(mockResponse));
  207. }
  208. @Test
  209. public void shouldRespondWithNotFoundWhenAskingForUnknownAvatarTypeAvatarDelete() {
  210. HttpServletRequest request = mock(HttpServletRequest.class);
  211. when(avatarManager.isValidIconType(IconType.of("this-type-doesnt-exist"))).thenReturn(false);
  212. // when
  213. Response avatars = testObj.deleteAvatar("this-type-doesnt-exist", OWNER_ISSUE1,
  214. AVATAR_ID);
  215. assertThat(avatars.getStatus(), is(equalTo(Response.Status.NOT_FOUND.getStatusCode())));
  216. }
  217. private AvatarBean getAvatarBeanForAvatar(final Avatar avatar) {
  218. Map<String, URI> icons = createIconsURIForAvatars(avatar);
  219. return new AvatarBean(String.valueOf(avatar.getId()), avatar.getOwner(), avatar.isSystemAvatar(), icons);
  220. }
  221. private Map<String, URI> createIconsURIForAvatars(final Avatar avatar) {
  222. final Map<String, URI> icons;
  223. ImmutableMap.Builder<String, URI> iconsBuilder = ImmutableMap.builder();
  224. for (Avatar.Size size : Avatar.Size.values()) {
  225. final int px = size.getPixels();
  226. if (px <= 48) {
  227. final String sizeName = String.format("%dx%d", px, px);
  228. iconsBuilder.put(sizeName, createUriFor(avatar, size));
  229. }
  230. }
  231. icons = iconsBuilder.build();
  232. return icons;
  233. }
  234. }