PageRenderTime 54ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-plugins/jira-core-reports-plugin/src/test/java/com/atlassian/jira/plugin/corereports/web/action/TestConfigureReport.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 319 lines | 263 code | 51 blank | 5 comment | 2 complexity | dc6367d780cae63b637a0ed711ff92ec MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.plugin.corereports.web.action;
  2. import com.atlassian.configurable.ObjectConfiguration;
  3. import com.atlassian.configurable.ObjectConfigurationException;
  4. import com.atlassian.configurable.ObjectConfigurationTypes;
  5. import com.atlassian.event.api.EventPublisher;
  6. import com.atlassian.jira.component.ComponentAccessor;
  7. import com.atlassian.jira.config.properties.APKeys;
  8. import com.atlassian.jira.config.properties.ApplicationProperties;
  9. import com.atlassian.jira.datetime.DateTimeFormatter;
  10. import com.atlassian.jira.datetime.DateTimeFormatterFactory;
  11. import com.atlassian.jira.datetime.DateTimeStyle;
  12. import com.atlassian.jira.junit.rules.AvailableInContainer;
  13. import com.atlassian.jira.junit.rules.MockitoMocksInContainer;
  14. import com.atlassian.jira.plugin.report.Report;
  15. import com.atlassian.jira.plugin.report.ReportModuleDescriptor;
  16. import com.atlassian.jira.project.MockProject;
  17. import com.atlassian.jira.project.Project;
  18. import com.atlassian.jira.project.ProjectManager;
  19. import com.atlassian.jira.projects.api.sidebar.ProjectSidebarRenderer;
  20. import com.atlassian.jira.security.JiraAuthenticationContext;
  21. import com.atlassian.jira.security.PermissionManager;
  22. import com.atlassian.jira.user.ApplicationUser;
  23. import com.atlassian.jira.user.UserProjectHistoryManager;
  24. import com.atlassian.jira.util.I18nHelper;
  25. import com.atlassian.jira.web.HttpServletVariables;
  26. import com.atlassian.plugin.ModuleDescriptor;
  27. import com.atlassian.plugin.PluginAccessor;
  28. import com.atlassian.soy.renderer.SoyTemplateRenderer;
  29. import com.atlassian.webresource.api.assembler.PageBuilderService;
  30. import com.atlassian.webresource.api.assembler.RequiredResources;
  31. import com.atlassian.webresource.api.assembler.WebResourceAssembler;
  32. import com.google.common.collect.ImmutableMap;
  33. import com.google.common.collect.Iterables;
  34. import java.util.Collection;
  35. import java.util.Collections;
  36. import java.util.Date;
  37. import java.util.LinkedHashMap;
  38. import java.util.Locale;
  39. import java.util.Map;
  40. import java.util.Optional;
  41. import javax.servlet.http.HttpServletRequest;
  42. import org.junit.Before;
  43. import org.junit.Rule;
  44. import org.junit.Test;
  45. import org.junit.rules.RuleChain;
  46. import org.junit.runner.RunWith;
  47. import org.mockito.Mock;
  48. import org.mockito.Mockito;
  49. import org.mockito.junit.MockitoJUnit;
  50. import org.mockito.junit.MockitoRule;
  51. import org.mockito.runners.MockitoJUnitRunner;
  52. import webwork.action.ActionContext;
  53. import static com.atlassian.jira.security.Permissions.BROWSE;
  54. import static java.util.Collections.singletonMap;
  55. import static org.hamcrest.Matchers.is;
  56. import static org.junit.Assert.assertEquals;
  57. import static org.junit.Assert.assertThat;
  58. import static org.junit.Assert.fail;
  59. import static org.mockito.Matchers.any;
  60. import static org.mockito.Matchers.anyMap;
  61. import static org.mockito.Matchers.anyString;
  62. import static org.mockito.Mockito.verify;
  63. import static org.mockito.Mockito.when;
  64. @RunWith(MockitoJUnitRunner.class)
  65. public class TestConfigureReport {
  66. private static final String CONFIGURE_REPORTS_CONTEXT = "com.atlassian.jira.jira-core-reports-plugin.configure-report";
  67. private static final String REPORT_RESULT_CONTEXT = "com.atlassian.jira.jira-core-reports-plugin.report-result";
  68. @Rule
  69. public RuleChain init = MockitoMocksInContainer.forTest(this);
  70. @Rule
  71. public MockitoRule mockitoRule = MockitoJUnit.rule();
  72. @Mock
  73. private EventPublisher mockEventPublisher;
  74. @Mock
  75. private PermissionManager mockPermissionManager;
  76. @Mock
  77. private PluginAccessor mockPluginAccessor;
  78. @Mock
  79. private ProjectManager mockProjectManager;
  80. @Mock
  81. private PageBuilderService mockPageBuilder;
  82. @Mock
  83. private WebResourceAssembler webResourceAssembler;
  84. @Mock
  85. private RequiredResources requiredResources;
  86. @Mock
  87. private SoyTemplateRenderer mockSoyRenderer;
  88. @Mock
  89. @AvailableInContainer
  90. private ApplicationProperties mockAppProperties;
  91. @Mock
  92. @AvailableInContainer
  93. private JiraAuthenticationContext mockAuthenticationContext;
  94. @Mock
  95. @AvailableInContainer
  96. private UserProjectHistoryManager userProjectHistoryManager;
  97. @Mock
  98. @AvailableInContainer
  99. private ProjectManager projectManager;
  100. @Mock
  101. @AvailableInContainer
  102. private HttpServletVariables httpServletVariables;
  103. @Mock
  104. @AvailableInContainer
  105. private DateTimeFormatterFactory dateTimeFormatterFactory;
  106. @Mock
  107. private HttpServletRequest mockRequest;
  108. @Mock
  109. private ApplicationUser mockUser;
  110. @Mock
  111. private ReportModuleDescriptor reportDescriptor;
  112. @Mock
  113. private Report report;
  114. @Mock
  115. private ObjectConfiguration reportObjectConfiguration;
  116. @Mock
  117. private ProjectSidebarRenderer projectSidebarRenderer;
  118. @Mock
  119. private ReportProjectContextResolver reportProjectContextResolver;
  120. @Mock
  121. private I18nHelper i18nHelper;
  122. @Mock
  123. private DateTimeFormatter dateTimeFormatter;
  124. @Mock
  125. private Project resolvedResultProject;
  126. private ConfigureReport configureReport;
  127. @Before
  128. @SuppressWarnings("unchecked")
  129. public void setUp() throws Exception {
  130. when(mockPageBuilder.assembler()).thenReturn(webResourceAssembler);
  131. when(webResourceAssembler.resources()).thenReturn(requiredResources);
  132. when(ComponentAccessor.getComponent(ApplicationProperties.class).getEncoding()).thenReturn("UTF-8");
  133. when(mockPluginAccessor.getEnabledPluginModule(anyString())).thenReturn((ModuleDescriptor) reportDescriptor);
  134. when(reportDescriptor.getObjectConfiguration(anyMap())).thenReturn(reportObjectConfiguration);
  135. when(report.showReport()).thenReturn(true);
  136. when(reportDescriptor.getModule()).thenReturn(report);
  137. when(httpServletVariables.getHttpRequest()).thenReturn(mockRequest);
  138. when(ComponentAccessor.getComponent(HttpServletVariables.class).getHttpRequest()).thenReturn(mockRequest); //Not the same one apparently
  139. when(mockAuthenticationContext.getLoggedInUser()).thenReturn(mockUser);
  140. when(ComponentAccessor.getComponent(JiraAuthenticationContext.class).getI18nHelper()).thenReturn(i18nHelper);
  141. when(ComponentAccessor.getComponent(DateTimeFormatterFactory.class).formatter()).thenReturn(dateTimeFormatter);
  142. when(dateTimeFormatter.forLoggedInUser()).thenReturn(dateTimeFormatter);
  143. when(dateTimeFormatter.withStyle(any(DateTimeStyle.class))).thenReturn(dateTimeFormatter);
  144. when(resolvedResultProject.getId()).thenReturn(10000L);
  145. when(projectManager.getProjectObj(10000L)).thenReturn(resolvedResultProject);
  146. when(ComponentAccessor.getComponent(ProjectManager.class).getProjectObj(10000L)).thenReturn(resolvedResultProject);
  147. when(reportProjectContextResolver.getProjectContext(
  148. any(ReportModuleDescriptor.class), any(HttpServletRequest.class))).thenReturn(Optional.of(resolvedResultProject));
  149. when(userProjectHistoryManager.getCurrentProject(BROWSE, null))
  150. .thenReturn(resolvedResultProject);
  151. when(ComponentAccessor.getComponent(UserProjectHistoryManager.class).getCurrentProject(BROWSE, null))
  152. .thenReturn(resolvedResultProject);
  153. configureReport = new ConfigureReport(
  154. mockProjectManager,
  155. mockPermissionManager,
  156. mockPluginAccessor,
  157. mockEventPublisher,
  158. mockPageBuilder,
  159. mockSoyRenderer,
  160. mockAppProperties,
  161. projectSidebarRenderer,
  162. reportProjectContextResolver);
  163. configureReport.setReportKey("test.report.key");
  164. }
  165. // TODO Someone who knows the difference can rename these two tests...
  166. @Test
  167. public void testGetQueryString1() {
  168. final Map<String, String[]> parameters = new LinkedHashMap<String, String[]>();
  169. parameters.put("a", toArray("b"));
  170. parameters.put("encode", toArray("yes sir"));
  171. parameters.put("funny", toArray("ch(ara=cter&s"));
  172. parameters.put("done", toArray("ok"));
  173. assertQueryString(parameters, "a=b&encode=yes+sir&funny=ch%28ara%3Dcter%26s&done=ok");
  174. }
  175. @Test
  176. public void testGetQueryString2() {
  177. final Map<String, String[]> parameters = singletonMap("one", toArray("value"));
  178. assertQueryString(parameters, "one=value");
  179. }
  180. @Test
  181. public void showSaveButtonWhenThereAreNoEmptySelectLists() throws ObjectConfigurationException {
  182. when(reportObjectConfiguration.getFieldKeys()).thenReturn(new String[]{"field1"});
  183. when(reportObjectConfiguration.getFieldType(anyString())).thenReturn(ObjectConfigurationTypes.SELECT);
  184. when(reportObjectConfiguration.getFieldValues(anyString())).thenReturn(ImmutableMap.of("option", "option"));
  185. assertThat(configureReport.isShowSaveButton(), is(true));
  186. }
  187. @Test
  188. public void dontShowSaveButtonWhenThereAreEmptySelectLists() throws ObjectConfigurationException {
  189. when(reportObjectConfiguration.getFieldKeys()).thenReturn(new String[]{"field1"});
  190. when(reportObjectConfiguration.getFieldType(anyString())).thenReturn(ObjectConfigurationTypes.SELECT);
  191. when(reportObjectConfiguration.getFieldValues(anyString())).thenReturn(Collections.emptyMap());
  192. assertThat(configureReport.isShowSaveButton(), is(false));
  193. }
  194. @Test
  195. public void sidebarIsRendered() {
  196. configureReport.setSelectedProject(new MockProject());
  197. configureReport.getSidebarHtml();
  198. verify(projectSidebarRenderer).render(any(Project.class), anyString());
  199. }
  200. @Test
  201. public void reportResultsResourcesAreIncludedOnDoExecute() throws Exception {
  202. configureReport.doExecute();
  203. verify(requiredResources).requireContext(REPORT_RESULT_CONTEXT);
  204. }
  205. @Test
  206. public void configureReportsResourcesAreIncludedOnDoDefault() throws Exception {
  207. configureReport.doDefault();
  208. verify(requiredResources).requireContext(CONFIGURE_REPORTS_CONTEXT);
  209. }
  210. @Test
  211. public void datePickerParameters() throws ObjectConfigurationException {
  212. when(reportObjectConfiguration.getFieldKeys()).thenReturn(new String[]{"field1"});
  213. when(i18nHelper.getLocale()).thenReturn(Locale.ENGLISH);
  214. when(dateTimeFormatter.format(Mockito.any(Date.class))).thenReturn("formatted-date");
  215. when(ComponentAccessor.getApplicationProperties()
  216. .getDefaultBackedString(APKeys.JIRA_DATE_PICKER_JAVASCRIPT_FORMAT))
  217. .thenReturn("date-format");
  218. ConfigureReport.ObjectConfigurationField field = Iterables.get(configureReport.getObjectConfigurationFields(), 0);
  219. Collection<ConfigureReport.DatePickerParameter> parameters = field.getDatePickerParameters();
  220. for (ConfigureReport.DatePickerParameter parameter : parameters) {
  221. String key = parameter.getKey();
  222. String value = parameter.getValue();
  223. switch (key) {
  224. case "firstDay":
  225. // Note: This value (the first day of the week) is locale dependent, but should always be zero for
  226. // English.
  227. assertThat(value, is("0"));
  228. break;
  229. case "date":
  230. case "todayDate":
  231. assertThat(value, is("formatted-date"));
  232. break;
  233. case "useISO8601WeekNumbers":
  234. assertThat(value, is("false"));
  235. break;
  236. case "ifFormat":
  237. assertThat(value, is("date-format"));
  238. break;
  239. default:
  240. fail("Unexpected parameter key: " + key);
  241. }
  242. }
  243. }
  244. @Test
  245. public void getsProjectFromContextResolver() throws Exception {
  246. configureReport.doDefault();
  247. Project project = configureReport.getSelectedProject();
  248. assertThat(project, is(resolvedResultProject));
  249. }
  250. @Test
  251. public void fallsBackToProjectInSessionWhenContextResolutionFails() {
  252. when(reportProjectContextResolver.getProjectContext(
  253. any(ReportModuleDescriptor.class), any(HttpServletRequest.class))).thenReturn(Optional.empty());
  254. when(userProjectHistoryManager.getCurrentProject(BROWSE, null))
  255. .thenReturn(resolvedResultProject);
  256. Project project = configureReport.getSelectedProject();
  257. assertThat(project, is(resolvedResultProject));
  258. }
  259. private void assertQueryString(final Map<String, String[]> parameters, final String expectedQueryString) {
  260. // Set up
  261. ActionContext.setParameters(parameters);
  262. // Invoke and check
  263. assertEquals(expectedQueryString, configureReport.getQueryString());
  264. }
  265. private String[] toArray(final String val) {
  266. return new String[]{val};
  267. }
  268. }