/** * Copyright Alex Objelean */ package ro.isdc.wro.maven.plugin; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.FileInputStream; import org.apache.commons.io.FileUtils; import org.apache.maven.plugin.MojoExecutionException; import org.junit.Test; import ro.isdc.wro.extensions.processor.support.linter.LinterException; import ro.isdc.wro.extensions.support.lint.LintReport; import ro.isdc.wro.extensions.support.lint.ReportXmlFormatter.FormatterType; import ro.isdc.wro.util.WroTestUtils; import ro.isdc.wro.util.WroUtil; /** * Test the {@link JsHintMojo} class. * * @author Alex Objelean */ public class TestJsHintMojo extends AbstractTestLinterMojo { /** * {@inheritDoc} */ @Override protected AbstractLinterMojo newLinterMojo() { return new JsHintMojo() { @Override void onException(final Exception e) { fail("Shouldn't fail. Exception message: " + e.getMessage()); } }; } @Test public void usePredefOptions() throws Exception { getMojo().setOptions("predef=['YUI','window','document','OnlineOpinion','xui']"); getMojo().setTargetGroups("undef"); getMojo().execute(); } @Test public void testMojoWithPropertiesSet() throws Exception { getMojo().setIgnoreMissingResources(true); getMojo().execute(); } @Test public void testWroXmlWithInvalidResourcesAndIgnoreMissingResourcesTrue() throws Exception { setWroWithInvalidResources(); getMojo().setIgnoreMissingResources(true); getMojo().execute(); } @Test public void testResourceWithUndefVariables() throws Exception { getMojo().setTargetGroups("undef"); getMojo().execute(); } @Test public void shouldProcessMultipleGroupsMore() throws Exception { for (int i = 0; i < 10; i++) { shouldProcessMultipleGroups(); } } @Test public void shouldProcessMultipleGroups() throws Exception { getMojo().setTargetGroups("undef,valid,g3"); getMojo().execute(); } @Test public void testEmptyOptions() throws Exception { getMojo().setOptions(""); getMojo().setTargetGroups("undef"); getMojo().execute(); } @Test public void shouldGenerateXmlReportFile() throws Exception { final File reportFile = WroUtil.createTempFile(); try { ((JsHintMojo) getMojo()).setReportFile(reportFile); getMojo().setOptions("undef, browser"); getMojo().setTargetGroups(null); getMojo().setFailNever(true); getMojo().setIgnoreMissingResources(true); getMojo().execute(); } finally { // Assert that file is big enough to prove that it contains serialized errors. assertTrue(reportFile.length() > 1000); FileUtils.deleteQuietly(reportFile); } } @Test public void shouldGenerateReportWithDefaultFormat() throws Exception { generateAndCompareReportFile(null, "jshint-default.xml"); } @Test public void shouldGenerateReportWithCheckstyleFormat() throws Exception { generateAndCompareReportFile(FormatterType.CHECKSTYLE.getFormat(), "jshint-checkstyle.xml"); } @Test(expected = MojoExecutionException.class) public void cannotGenerateReportWithInvalidFormat() throws Exception { final File reportFile = WroUtil.createTempFile(); final JsHintMojo mojo = (JsHintMojo) getMojo(); try { mojo.setReportFile(reportFile); mojo.setReportFormat("INVALID"); mojo.setOptions("undef, browser"); mojo.setTargetGroups(null); mojo.setFailNever(true); mojo.setIgnoreMissingResources(true); mojo.execute(); } finally { FileUtils.deleteQuietly(reportFile); } } @Test public void shouldNotFailWhenThresholdIsGreaterThanNumberOfErrors() throws Exception { final JsHintMojo jsHintMojo = (JsHintMojo) getMojo(); jsHintMojo.setFailThreshold(6); executeResourcesWithErrors(); } @Test(expected = MojoExecutionException.class) public void shouldFailWhenThresholdEqualsWithNumberOfErrors() throws Exception { final JsHintMojo jsHintMojo = (JsHintMojo) getMojo(); jsHintMojo.setFailThreshold(5); executeResourcesWithErrors(); } /** * Checks that build doesn't fail when the failFast is true and there is no resources to be processed. */ @Test public void shouldNotFailWhenNoErrorsFound() throws Exception { final JsHintMojo jsHintMojo = (JsHintMojo) getMojo(); jsHintMojo.setFailThreshold(0); jsHintMojo.setFailFast(false); jsHintMojo.setIgnoreMissingResources(true); jsHintMojo.setTargetGroups("invalidWildcardResource"); getMojo().execute(); } @Test(expected = MojoExecutionException.class) public void shouldReportOnlyFirstErrorWhenFailFastIsTrue() throws Exception { final JsHintMojo jsHintMojo = (JsHintMojo) getMojo(); jsHintMojo.setFailFast(true); try { executeResourcesWithErrors(); } finally { final LintReport<?> lintReport = jsHintMojo.getLintReport(); assertEquals(1, lintReport.getReports().size()); } } @Test(expected = MojoExecutionException.class) public void shouldReportAllErrorsWhenFailFastIsFalse() throws Exception { final JsHintMojo jsHintMojo = (JsHintMojo) getMojo(); jsHintMojo.setFailFast(false); try { executeResourcesWithErrors(); } catch (final Exception e) { e.printStackTrace(); throw e; } finally { final LintReport<?> lintReport = jsHintMojo.getLintReport(); assertEquals(2, lintReport.getReports().size()); } } private void executeResourcesWithErrors() throws MojoExecutionException { getMojo().setTargetGroups("invalidResources"); getMojo().setOptions("undef, browser"); getMojo().execute(); } private void generateAndCompareReportFile(final String reportFormat, final String expectedFileName) throws Exception { final File reportFile = WroUtil.createTempFile(); final JsHintMojo mojo = (JsHintMojo) getMojo(); try { mojo.setReportFile(reportFile); if (reportFormat != null) { mojo.setReportFormat(reportFormat); } mojo.setOptions("undef, browser"); mojo.setTargetGroups(null); mojo.setFailNever(true); mojo.setIgnoreMissingResources(true); mojo.execute(); } finally { // Assert that file is big enough to prove that it contains serialized errors. WroTestUtils.compare(getClass().getResourceAsStream("report/" + expectedFileName), new FileInputStream(reportFile)); FileUtils.deleteQuietly(reportFile); } } @Test(expected = LinterException.class) public void shouldFailWhenThereAreLinterErrorsEvenWhenIncrementBuildIsEnabled() throws Throwable { getMojo().setParallelProcessing(true); getMojo().setIncrementalBuildEnabled(true); getMojo().setTargetGroups("invalidResources"); try { getMojo().execute(); } catch (final MojoExecutionException e) { assertTrue(e.getCause() instanceof LinterException); try { getMojo().execute(); } catch (final MojoExecutionException secondException) { throw secondException.getCause(); } } finally { getMojo().clean(); } } }