PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/java/com/atlassian/jira/plugins/bitbucket/bitbucket/TestDefaultBitbucketMapper.java

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 248 lines | 199 code | 15 blank | 34 comment | 1 complexity | 1f1116cf74b169cc829cab9baa9597b2 MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.bitbucket;
  2. import static junit.framework.Assert.*;
  3. import static org.mockito.Matchers.*;
  4. import static org.mockito.Mockito.*;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import org.mockito.ArgumentMatcher;
  11. import org.mockito.Mock;
  12. import org.mockito.MockitoAnnotations;
  13. import org.mockito.invocation.InvocationOnMock;
  14. import org.mockito.stubbing.Answer;
  15. import com.atlassian.activeobjects.external.ActiveObjects;
  16. import com.atlassian.jira.plugins.bitbucket.activeobjects.v2.IssueMapping;
  17. import com.atlassian.jira.plugins.bitbucket.activeobjects.v2.ProjectMapping;
  18. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  19. import com.atlassian.jira.plugins.bitbucket.api.Encryptor;
  20. import com.atlassian.jira.plugins.bitbucket.api.impl.DefaultRepositoryPersister;
  21. import com.atlassian.jira.plugins.bitbucket.spi.Communicator;
  22. import com.atlassian.jira.plugins.bitbucket.spi.RepositoryUri;
  23. import com.atlassian.jira.plugins.bitbucket.spi.bitbucket.impl.BitbucketRepositoryManager;
  24. import com.atlassian.jira.plugins.bitbucket.spi.bitbucket.impl.BitbucketRepositoryUri;
  25. import com.atlassian.sal.api.transaction.TransactionCallback;
  26. /**
  27. * Unit tests for {@link DefaultRepositoryPersister}
  28. */
  29. @SuppressWarnings("unchecked")
  30. public class TestDefaultBitbucketMapper
  31. {
  32. private static final String URL = "https://bitbucket.org/owner/slug";
  33. private static final RepositoryUri REPOSITORY_URI = new BitbucketRepositoryUri("https","bitbucket.org","owner","slug");
  34. private static final int SOME_ID = 123;
  35. @Mock
  36. ActiveObjects activeObjects;
  37. @Mock
  38. Communicator bitbucket;
  39. @Mock
  40. ProjectMapping projectMapping;
  41. @Mock
  42. IssueMapping issueMapping;
  43. @Mock
  44. Changeset changeset;
  45. @Mock
  46. Encryptor encryptor;
  47. @Before
  48. public void setup()
  49. {
  50. MockitoAnnotations.initMocks(this);
  51. when(projectMapping.getID()).thenReturn(SOME_ID);
  52. when(projectMapping.getRepositoryUrl()).thenReturn(URL);
  53. when(activeObjects.find(ProjectMapping.class, "PROJECT_KEY = ?", "JST")).thenReturn(new ProjectMapping[]{projectMapping});
  54. when(activeObjects.find(ProjectMapping.class, "REPOSITORY_URL = ? and PROJECT_KEY = ?","https://bitbucket.org/owner/slug", "JST")).thenReturn(new ProjectMapping[]{});
  55. when(activeObjects.create(eq(ProjectMapping.class), anyMap())).thenReturn(projectMapping);
  56. when(changeset.getBranch()).thenReturn("default");
  57. when(changeset.getNode()).thenReturn("1");
  58. when(changeset.getRepositoryId()).thenReturn(SOME_ID);
  59. //noinspection unchecked
  60. when(activeObjects.executeInTransaction(isA(TransactionCallback.class))).thenAnswer(
  61. new Answer<Object>()
  62. {
  63. @SuppressWarnings("rawtypes")
  64. @Override
  65. public Object answer(InvocationOnMock invocationOnMock) throws Throwable
  66. {
  67. return ((TransactionCallback) invocationOnMock.getArguments()[0]).doInTransaction();
  68. }
  69. }
  70. );
  71. when(encryptor.encrypt(anyString(), anyString(), anyString())).thenAnswer(
  72. new Answer<String>()
  73. {
  74. @Override
  75. public String answer(InvocationOnMock invocationOnMock) throws Throwable
  76. {
  77. return StringUtils.reverse(String.valueOf(invocationOnMock.getArguments()[0]));
  78. }
  79. }
  80. );
  81. when(encryptor.decrypt(anyString(), anyString(), anyString())).thenAnswer(
  82. new Answer<String>()
  83. {
  84. @Override
  85. public String answer(InvocationOnMock invocationOnMock) throws Throwable
  86. {
  87. return StringUtils.reverse(String.valueOf(invocationOnMock.getArguments()[0]));
  88. }
  89. }
  90. );
  91. }
  92. @Test
  93. public void testAddAnonymousRepositoryCreatesValidMap()
  94. {
  95. new DefaultRepositoryPersister(activeObjects).
  96. addRepository("bitbucket", "JST", REPOSITORY_URI.getRepositoryUrl(), null, null, null, null, null);
  97. verify(activeObjects, times(1)).create(eq(ProjectMapping.class),
  98. argThat(new ArgumentMatcher<Map<String, Object>>()
  99. {
  100. @Override
  101. public boolean matches(Object o)
  102. {
  103. //noinspection unchecked
  104. Map<String, Object> map = (Map<String, Object>) o;
  105. return map.get("REPOSITORY_URL").equals(URL) &&
  106. map.get("PROJECT_KEY").equals("JST") &&
  107. !map.containsKey("USERNAME") && !map.containsKey("PASSWORD");
  108. }
  109. }));
  110. }
  111. @Test
  112. public void testAddAuthentictedRepositoryCreatesValidMap()
  113. {
  114. new DefaultRepositoryPersister(activeObjects).
  115. addRepository("bitbucket", "JST", REPOSITORY_URI.getRepositoryUrl(), "user", "pass", null, null, null);
  116. verify(activeObjects, times(1)).create(eq(ProjectMapping.class),
  117. argThat(new ArgumentMatcher<Map<String, Object>>()
  118. {
  119. @Override
  120. public boolean matches(Object o)
  121. {
  122. //noinspection unchecked
  123. Map<String, Object> map = (Map<String, Object>) o;
  124. return map.get("REPOSITORY_URL").equals(URL) &&
  125. map.get("PROJECT_KEY").equals("JST") &&
  126. map.get("USERNAME").equals("user") &&
  127. map.containsKey("PASSWORD");
  128. }
  129. }));
  130. }
  131. @Test
  132. public void testPasswordNotStoredInPlainText()
  133. {
  134. new BitbucketRepositoryManager(new DefaultRepositoryPersister(activeObjects), bitbucket, encryptor, null, null, null)
  135. .addRepository("bitbucket", "JST", REPOSITORY_URI.getRepositoryUrl(), "user", "pass", null, null, "");
  136. verify(activeObjects, times(1)).create(eq(ProjectMapping.class),
  137. argThat(new ArgumentMatcher<Map<String, Object>>()
  138. {
  139. @Override
  140. public boolean matches(Object o)
  141. {
  142. //noinspection unchecked
  143. Map<String, Object> map = (Map<String, Object>) o;
  144. return !map.get("PASSWORD").equals("pass");
  145. }
  146. }));
  147. verify(encryptor, times(1)).encrypt("pass", "JST", "https://bitbucket.org/owner/slug");
  148. }
  149. @Test
  150. public void testRemoveRepositoryAlsoRemovesIssues()
  151. {
  152. when(activeObjects.get(ProjectMapping.class, SOME_ID)).thenReturn(projectMapping);
  153. when(activeObjects.find(IssueMapping.class, "REPOSITORY_ID = ?", SOME_ID)).thenReturn(new IssueMapping[] { issueMapping });
  154. new DefaultRepositoryPersister(activeObjects).removeRepository(SOME_ID);
  155. verify(activeObjects, times(1)).get(ProjectMapping.class, SOME_ID);
  156. verify(activeObjects, times(1)).find(IssueMapping.class, "REPOSITORY_ID = ?", SOME_ID);
  157. verify(activeObjects, times(1)).delete(projectMapping);
  158. verify(activeObjects, times(1)).delete(issueMapping);
  159. }
  160. @Test
  161. public void testGetChangesets()
  162. {
  163. when(activeObjects.find(IssueMapping.class, "ISSUE_ID = ?", "JST-1"))
  164. .thenReturn(new IssueMapping[] { issueMapping });
  165. when(activeObjects.find(ProjectMapping.class, "REPOSITORY_TYPE = ?", "bitbucket"))
  166. .thenReturn(new ProjectMapping[] { projectMapping });
  167. when(issueMapping.getNode()).thenReturn("1");
  168. when(issueMapping.getRepositoryId()).thenReturn(SOME_ID);
  169. List<IssueMapping> issueMappings = new DefaultRepositoryPersister(activeObjects).getIssueMappings("JST-1", "bitbucket");
  170. assertTrue(issueMappings.size()==1);
  171. assertEquals(issueMapping, issueMappings.get(0));
  172. // verify(activeObjects, times(1)).find(ProjectMapping.class,
  173. // "PROJECT_KEY = ? and REPOSITORY_URI = ?", "JST", "owner/slug");
  174. // verify(activeObjects, times(1)).find(IssueMapping.class,
  175. // "ISSUE_ID = ?", "JST-1");
  176. // verify(bitbucket, times(1)).getChangeset(argThat(new ArgumentMatcher<Authentication>()
  177. // {
  178. // @Override
  179. // public boolean matches(Object o)
  180. // {
  181. // return o == Authentication.ANONYMOUS;
  182. // }
  183. // }), eq("owner"), eq("slug"), eq("1"));
  184. }
  185. @Test
  186. public void testGetChangesetsOnAuthenticatedRepository()
  187. {
  188. when(activeObjects.find(IssueMapping.class, "ISSUE_ID = ?", "JST-1"))
  189. .thenReturn(new IssueMapping[] { issueMapping });
  190. when(activeObjects.find(ProjectMapping.class, "REPOSITORY_TYPE = ?", "bitbucket"))
  191. .thenReturn(new ProjectMapping[] { projectMapping });
  192. when(projectMapping.getUsername()).thenReturn("user");
  193. when(projectMapping.getPassword()).thenReturn("ssap");
  194. when(issueMapping.getNode()).thenReturn("1");
  195. when(issueMapping.getRepositoryId()).thenReturn(SOME_ID);
  196. List<IssueMapping> issueMappings = new DefaultRepositoryPersister(activeObjects).getIssueMappings("JST-1", "bitbucket");
  197. assertTrue(issueMappings.size()==1);
  198. assertEquals(issueMapping, issueMappings.get(0));
  199. // verify(activeObjects, times(1)).find(ProjectMapping.class,
  200. // "PROJECT_KEY = ? and REPOSITORY_URI = ?",
  201. // "JST", "owner/slug");
  202. // verify(activeObjects, times(1)).find(IssueMapping.class,
  203. // "ISSUE_ID = ?", "JST-1");
  204. // verify(bitbucket, times(1)).getChangeset(argThat(new ArgumentMatcher<Authentication>()
  205. // {
  206. // @Override
  207. // public boolean matches(Object o)
  208. // {
  209. // BasicAuthentication auth = (BasicAuthentication) o;
  210. // return auth.getUsername().equals("user") && auth.getPassword().equals("pass");
  211. // }
  212. // }), eq("owner"), eq("slug"), eq("1"));
  213. }
  214. @Test
  215. public void testAddChangesetToSameBranch()
  216. {
  217. when(activeObjects.get(ProjectMapping.class,SOME_ID)).thenReturn(projectMapping);
  218. new DefaultRepositoryPersister(activeObjects).addChangeset("JST-1", changeset);
  219. verify(activeObjects, times(1)).create(eq(IssueMapping.class),
  220. argThat(new ArgumentMatcher<Map<String, Object>>()
  221. {
  222. @Override
  223. public boolean matches(Object o)
  224. {
  225. //noinspection unchecked
  226. Map<String, Object> map = (Map<String, Object>) o;
  227. return map.get("REPOSITORY_ID").equals(SOME_ID) &&
  228. map.get("NODE").equals("1") &&
  229. map.get("ISSUE_ID").equals("JST-1");
  230. }
  231. }));
  232. }
  233. }