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

/src/test/java/it/com/atlassian/bamboo/plugins/nodejs/tasks/MochaTaskTest.java

https://bitbucket.org/atlassian/bamboo-nodejs-plugin
Java | 188 lines | 131 code | 38 blank | 19 comment | 0 complexity | b4bfacda3e23a1b30764910810688d00 MD5 | raw file
  1. package it.com.atlassian.bamboo.plugins.nodejs.tasks;
  2. import com.atlassian.bamboo.pageobjects.pages.plan.configuration.JobTaskConfigurationPage;
  3. import com.atlassian.bamboo.pageobjects.pages.tasks.ScriptTaskComponent;
  4. import com.atlassian.bamboo.plugins.nodejs.tasks.mocha.runner.MochaRunnerConfigurator;
  5. import com.atlassian.bamboo.plugins.nodejs.tasks.npm.NpmConfigurator;
  6. import com.atlassian.bamboo.task.TaskConfigConstants;
  7. import com.atlassian.bamboo.testutils.model.TestBuildDetails;
  8. import com.atlassian.bamboo.testutils.model.task.ScriptTaskDetails;
  9. import com.atlassian.bamboo.testutils.model.task.ScriptTaskDetails.ScriptLocation;
  10. import com.google.common.collect.ImmutableMap;
  11. import it.com.atlassian.bamboo.plugins.nodejs.pageobjects.MochaParserTaskComponent;
  12. import it.com.atlassian.bamboo.plugins.nodejs.pageobjects.MochaRunnerTaskComponent;
  13. import it.com.atlassian.bamboo.plugins.nodejs.pageobjects.NpmTaskComponent;
  14. import org.apache.commons.io.FileUtils;
  15. import org.jetbrains.annotations.NotNull;
  16. import org.junit.Rule;
  17. import org.junit.Test;
  18. import org.junit.rules.TemporaryFolder;
  19. import java.io.File;
  20. import java.io.InputStream;
  21. import java.nio.file.Files;
  22. import java.nio.file.StandardCopyOption;
  23. import java.util.Collections;
  24. import java.util.Map;
  25. import static org.hamcrest.CoreMatchers.is;
  26. import static org.hamcrest.MatcherAssert.assertThat;
  27. public class MochaTaskTest extends AbstractNodeTaskTest {
  28. @Rule
  29. public TemporaryFolder temporaryFolder = new TemporaryFolder();
  30. @Override
  31. protected void onSetUp() {
  32. }
  33. @Override
  34. protected void onTearDown() {
  35. }
  36. @Test
  37. public void testMochaRunnerWithParsingEnabled() throws Exception {
  38. product.gotoLoginPage().loginAsSysAdmin();
  39. final TestBuildDetails plan = createPlanWithNpmModulesInstalled();
  40. final JobTaskConfigurationPage taskConfigurationPage = product.visit(JobTaskConfigurationPage.class, plan.getDefaultJob());
  41. // add Mocha runner task
  42. final Map<String, String> mochaRunnerTaskConfig = ImmutableMap.of(
  43. MochaRunnerConfigurator.TEST_FILES, "test/mocha/",
  44. MochaRunnerConfigurator.PARSE_TEST_RESULTS, Boolean.TRUE.toString());
  45. taskConfigurationPage.addNewTask(MochaRunnerTaskComponent.TASK_NAME, MochaRunnerTaskComponent.class, null, mochaRunnerTaskConfig);
  46. backdoor.plans().triggerBuild(plan.getKey());
  47. backdoor.plans().waitForSuccessfulBuild(plan.getKey(), 1);
  48. assertThat("Should have found 1 successful test", getNumberOfSuccessfulTestsForBuild(plan.getKey(), 1), is(1));
  49. }
  50. @Test
  51. public void testMochaRunnerWithMochaParser() throws Exception {
  52. product.gotoLoginPage().loginAsSysAdmin();
  53. final TestBuildDetails plan = createPlanWithNpmModulesInstalled();
  54. final JobTaskConfigurationPage taskConfigurationPage = product.visit(JobTaskConfigurationPage.class, plan.getDefaultJob());
  55. // add Mocha runner task
  56. final Map<String, String> mochaRunnerTaskConfig = ImmutableMap.of(
  57. MochaRunnerConfigurator.TEST_FILES, "test/mocha/",
  58. MochaRunnerConfigurator.PARSE_TEST_RESULTS, Boolean.FALSE.toString());
  59. taskConfigurationPage.addNewTask(MochaRunnerTaskComponent.TASK_NAME, MochaRunnerTaskComponent.class, null, mochaRunnerTaskConfig);
  60. // assert that with parsing disabled we don't see any test results
  61. backdoor.plans().triggerBuild(plan.getKey());
  62. backdoor.plans().waitForSuccessfulBuild(plan.getKey(), 1);
  63. assertThat("Shouldn't have found any test results", getTotalNumberOfTestsForBuild(plan.getKey(), 1), is(0));
  64. // add Mocha parser task
  65. final Map<String, String> mochaParserTaskConfig = ImmutableMap.of();
  66. taskConfigurationPage.addNewTask(MochaParserTaskComponent.TASK_NAME, MochaParserTaskComponent.class, null, mochaParserTaskConfig);
  67. backdoor.plans().triggerBuild(plan.getKey());
  68. backdoor.plans().waitForSuccessfulBuild(plan.getKey(), 2);
  69. assertThat("Should have found 1 successful test", getNumberOfSuccessfulTestsForBuild(plan.getKey(), 2), is(1));
  70. }
  71. @Test
  72. public void testMochaParserPicksUpOutdatedFiles() throws Exception {
  73. product.gotoLoginPage().loginAsSysAdmin();
  74. final TestBuildDetails plan = createPlanWithNpmModulesInstalled();
  75. final JobTaskConfigurationPage taskConfigurationPage = product.visit(JobTaskConfigurationPage.class, plan.getDefaultJob());
  76. createMochaReportInWorkingDirectory(taskConfigurationPage, "mocha.json");
  77. // mock test report creation date
  78. final Map<String, String> mockDateTaskConfig = generateScriptTaskConfig("touch -t 201201010000 mocha.json");
  79. taskConfigurationPage.addNewTask(ScriptTaskComponent.getName(), ScriptTaskComponent.class, "mock report creation date", mockDateTaskConfig);
  80. // add Mocha parser task without picking outdated files
  81. final Map<String, String> mochaParserTaskConfig = Collections.emptyMap();
  82. final String mochaParserTaskDescription = "parse results";
  83. taskConfigurationPage.addNewTask(MochaParserTaskComponent.TASK_NAME, MochaParserTaskComponent.class, mochaParserTaskDescription, mochaParserTaskConfig);
  84. backdoor.plans().triggerBuild(plan.getKey());
  85. backdoor.plans().waitForCompletedBuild(plan.getKey(), 1);
  86. final boolean firstBuildSuccessful = backdoor.plans().getBuildResult(plan.getKey(), 1).isSuccessful();
  87. assertThat(firstBuildSuccessful, is(false));
  88. // modify mocha parser task to pick outdated files
  89. final Map<String, String> updatedMochaParserTaskConfig = ImmutableMap.of(TaskConfigConstants.CFG_TEST_OUTDATED_RESULTS_FILE, "true");
  90. taskConfigurationPage.editTask(mochaParserTaskDescription, MochaParserTaskComponent.class, mochaParserTaskDescription, updatedMochaParserTaskConfig);
  91. backdoor.plans().triggerBuild(plan.getKey());
  92. backdoor.plans().waitForSuccessfulBuild(plan.getKey(), 2);
  93. }
  94. @Test
  95. public void testMochaParserUsesWorkingDirectoryField() throws Exception {
  96. product.gotoLoginPage().loginAsSysAdmin();
  97. final TestBuildDetails plan = createPlanWithNpmModulesInstalled();
  98. final JobTaskConfigurationPage taskConfigurationPage = product.visit(JobTaskConfigurationPage.class, plan.getDefaultJob());
  99. createMochaReportInWorkingDirectory(taskConfigurationPage, "mocha.json");
  100. // script task to be updated later, to move the report file to a different directory
  101. final String moreReportFileScriptName = "move report file";
  102. taskConfigurationPage.addNewTask(ScriptTaskComponent.getName(), ScriptTaskComponent.class, moreReportFileScriptName, generateScriptTaskConfig(""));
  103. // add Mocha parser task with subdirectory set
  104. final Map<String, String> mochaParserTaskConfig = ImmutableMap.of(TaskConfigConstants.CFG_WORKING_SUB_DIRECTORY, "subdirectory");
  105. taskConfigurationPage.addNewTask(MochaParserTaskComponent.TASK_NAME, MochaParserTaskComponent.class, "parse results", mochaParserTaskConfig);
  106. backdoor.plans().triggerBuild(plan.getKey());
  107. backdoor.plans().waitForCompletedBuild(plan.getKey(), 1);
  108. final boolean firstBuildSuccessful = backdoor.plans().getBuildResult(plan.getKey(), 1).isSuccessful();
  109. assertThat(firstBuildSuccessful, is(false));
  110. // move the report to the subdirectory
  111. final Map<String, String> moveReportTaskConfig = generateScriptTaskConfig("mkdir -p subdirectory && mv mocha.json subdirectory");
  112. taskConfigurationPage.editTask(moreReportFileScriptName, ScriptTaskComponent.class, moreReportFileScriptName, moveReportTaskConfig);
  113. backdoor.plans().triggerBuild(plan.getKey());
  114. backdoor.plans().waitForSuccessfulBuild(plan.getKey(), 2);
  115. }
  116. @NotNull
  117. private TestBuildDetails createPlanWithNpmModulesInstalled() throws Exception {
  118. final TestBuildDetails plan = createAndSetupPlan();
  119. final JobTaskConfigurationPage taskConfigurationPage = product.visit(JobTaskConfigurationPage.class, plan.getDefaultJob());
  120. // install required modules using npm
  121. final Map<String, String> npmTaskConfig = ImmutableMap.of(NpmConfigurator.COMMAND, "install mocha mocha-bamboo-reporter");
  122. taskConfigurationPage.addNewTask(NpmTaskComponent.TASK_NAME, NpmTaskComponent.class, "npm install", npmTaskConfig);
  123. return plan;
  124. }
  125. private void createMochaReportInWorkingDirectory(@NotNull JobTaskConfigurationPage taskConfigurationPage, @NotNull String reportFileName) throws Exception {
  126. // copy report content to temporary file
  127. final File temporaryFile = temporaryFolder.newFile();
  128. try (final InputStream reportFileInputStream = getClass().getResourceAsStream("/mocha.json")) {
  129. Files.copy(reportFileInputStream, temporaryFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  130. }
  131. // copy report file from temporary folder to working directory
  132. final Map<String, String> produceReportTaskConfig = generateScriptTaskConfig(String.format("cp %s %s", temporaryFile.getCanonicalPath(), reportFileName));
  133. taskConfigurationPage.addNewTask(ScriptTaskComponent.getName(), ScriptTaskComponent.class, "produce report", produceReportTaskConfig);
  134. }
  135. /**
  136. * Returns config of a {@link ScriptTaskComponent} that will execute the given script body.
  137. * <p>
  138. * Using temporary file as a workaround solution instead of inline script, as {@link ScriptTaskComponent} does not
  139. * properly handle all characters (e.g. the hyphen).
  140. */
  141. @NotNull
  142. private Map<String, String> generateScriptTaskConfig(@NotNull String scriptBody) throws Exception {
  143. final File temporaryFile = temporaryFolder.newFile();
  144. FileUtils.write(temporaryFile, scriptBody);
  145. return ImmutableMap.of(
  146. ScriptTaskComponent.CONFIG_INTERPRETER, ScriptTaskDetails.Interpreter.LEGACY_SH_BAT.name(),
  147. ScriptTaskComponent.CONFIG_SCRIPT_LOCATION, ScriptLocation.FILE.name(),
  148. ScriptTaskComponent.CONFIG_SCRIPT_FILE, temporaryFile.getCanonicalPath());
  149. }
  150. }