/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.wisdom.maven.mojos;
import com.google.common.collect.ImmutableList;
import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugin.logging.SystemStreamLog;
import org.apache.maven.project.MavenProject;
import org.junit.Before;
import org.junit.Test;
import org.wisdom.maven.WatchingException;
import org.wisdom.maven.node.NodeManager;
import java.io.File;
import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class CSSMinifierMojoTest {
public static final String FAKE_PROJECT = "target/test-classes/fake-project";
public static final String FAKE_PROJECT_TARGET = "target/test-classes/fake-project/target";
File nodeDirectory;
private CSSMinifierMojo mojo;
private LessCompilerMojo less;
@Before
public void setUp() throws IOException {
MavenProject project = new MavenProject();
project.setArtifactId("test-artifact");
nodeDirectory = new File("target/test/node");
nodeDirectory.mkdirs();
Log log = new SystemStreamLog();
mojo = new CSSMinifierMojo();
mojo.project = project;
NodeManager manager = new NodeManager(log, nodeDirectory, mojo);
manager.installIfNotInstalled();
mojo.basedir = new File(FAKE_PROJECT);
mojo.buildDirectory = new File(FAKE_PROJECT_TARGET);
mojo.buildDirectory.mkdirs();
mojo.cleanCssVersion = CSSMinifierMojo.CLEANCSS_NPM_VERSION;
mojo.cssMinifierSuffix = "-min";
// Less stuff
less = new LessCompilerMojo();
NodeManager manager2 = new NodeManager(log, nodeDirectory, less);
manager2.installIfNotInstalled();
less.project = project;
less.basedir = new File(FAKE_PROJECT);
less.buildDirectory = new File(FAKE_PROJECT_TARGET);
less.lessVersion = LessCompilerMojo.LESS_VERSION;
cleanup();
}
private void cleanup() {
FileUtils.deleteQuietly(mojo.buildDirectory);
}
@Test
public void testAccept() throws Exception {
mojo.basedir = new File("junk");
File file = new File(mojo.basedir, "src/main/resources/assets/foo.css");
assertThat(mojo.accept(file)).isTrue();
file = new File(mojo.basedir, "src/main/resources/assets/foo/foo.css");
assertThat(mojo.accept(file)).isTrue();
file = new File(mojo.basedir, "src/main/resources/assets/foo.js");
assertThat(mojo.accept(file)).isFalse();
// Not a valid resources
file = new File(mojo.basedir, "src/main/foo.css");
assertThat(mojo.accept(file)).isFalse();
file = new File(mojo.basedir, "src/main/assets/foo.css");
assertThat(mojo.accept(file)).isTrue();
file = new File(mojo.basedir, "src/main/assets/foo/foo.css");
assertThat(mojo.accept(file)).isTrue();
file = new File(mojo.basedir, "src/main/assets/foo.js");
assertThat(mojo.accept(file)).isFalse();
// Not a valid resources
file = new File(mojo.basedir, "src/main/foo.css");
assertThat(mojo.accept(file)).isFalse();
}
@Test
public void testIsNotMinified() throws Exception {
mojo.cssMinifierSuffix = "-minified";
File file = new File("foo.css");
assertThat(mojo.isNotMinified(file)).isTrue();
file = new File("foo-min.css");
assertThat(mojo.isNotMinified(file)).isFalse();
file = new File("foo.min.css");
assertThat(mojo.isNotMinified(file)).isFalse();
file = new File("foo-minified.css");
assertThat(mojo.isNotMinified(file)).isFalse();
}
@Test
public void testGetMinifiedFile() {
mojo.cssMinifierSuffix = "-minified";
mojo.basedir = new File("target/junk/root");
mojo.buildDirectory = new File(mojo.basedir, "target");
File file = new File(mojo.basedir,
"src/main/resources/assets/foo.css");
assertThat(mojo.getMinifiedFile(file).getAbsolutePath()).isEqualTo(new File(mojo.buildDirectory,
"classes/assets/foo-minified.css").getAbsolutePath());
file = new File(mojo.basedir,
"src/main/assets/foo.css");
assertThat(mojo.getMinifiedFile(file).getAbsolutePath()).isEqualTo(new File(mojo.buildDirectory,
"wisdom/assets/foo-minified.css").getAbsolutePath());
}
@Test
public void testGetDefaultOutputFile() {
mojo.cssMinifierSuffix = "-min";
mojo.basedir = new File("target/junk/root");
mojo.buildDirectory = new File(mojo.basedir, "target");
Stylesheets stylesheets = new Stylesheets();
mojo.stylesheets = stylesheets;
MavenProject project = mock(MavenProject.class);
when(project.getArtifactId()).thenReturn("my-artifact");
mojo.project = project;
Aggregation aggregation = new Aggregation();
aggregation.setMinification(true);
stylesheets.setAggregations(ImmutableList.of(aggregation));
assertThat(mojo.getDefaultOutputFile(aggregation).getAbsolutePath()).isEqualTo(new File(mojo.buildDirectory,
"classes/assets/my-artifact-min.css").getAbsolutePath());
}
@Test
public void testProcessingOfFiles() throws MojoFailureException, MojoExecutionException, IOException {
cleanup();
less.execute();
mojo.execute();
File site = new File(FAKE_PROJECT_TARGET, "classes/assets/css/site-min.css");
assertThat(site).isFile();
assertThat(FileUtils.readFileToString(site))
.contains("h1{color:red}");
File style = new File(FAKE_PROJECT_TARGET, "classes/assets/less/style-min.css");
assertThat(style).isFile();
}
@Test
public void testCustomArguments() throws MojoFailureException, MojoExecutionException, IOException {
cleanup();
less.execute();
mojo.cleanCssArguments = "--debug -c ie7 -b";
mojo.execute();
File site = new File(FAKE_PROJECT_TARGET, "classes/assets/css/site-min.css");
assertThat(site).isFile();
assertThat(FileUtils.readFileToString(site))
.contains("h1{color:red}");
File style = new File(FAKE_PROJECT_TARGET, "classes/assets/less/style-min.css");
assertThat(style).isFile();
assertThat(FileUtils.readLines(style)).hasSize(2); // We don't remove line break.
}
@Test
public void testDeletionAndReCreation() throws MojoFailureException, MojoExecutionException, IOException,
WatchingException {
cleanup();
less.execute();
mojo.execute();
File site = new File(FAKE_PROJECT_TARGET, "classes/assets/css/site-min.css");
File siteMap = new File(FAKE_PROJECT_TARGET, "classes/assets/css/site-min.css.map");
assertThat(site).isFile();
assertThat(siteMap).isFile();
assertThat(FileUtils.readFileToString(site))
.contains("h1{color:red}");
File style = new File(FAKE_PROJECT_TARGET, "classes/assets/less/style-min.css");
File styleMap = new File(FAKE_PROJECT_TARGET, "classes/assets/less/style-min.css.map");
assertThat(style).isFile();
assertThat(styleMap).isFile();
File source = new File(FAKE_PROJECT, "src/main/resources/assets/css/site.css");
mojo.fileDeleted(source);
assertThat(site).doesNotExist();
assertThat(siteMap).doesNotExist();
// Recreate it.
mojo.fileUpdated(source);
assertThat(site).isFile();
assertThat(siteMap).isFile();
assertThat(FileUtils.readFileToString(site))
.contains("h1{color:red}");
}
@Test
public void testProcessingOfStylesheets() throws MojoFailureException, MojoExecutionException, IOException {
cleanup();
// Copy site file to target as the aggregation checks file fron the output directory.
final File destDir = new File(mojo.buildDirectory, "classes/assets/css");
destDir.mkdirs();
FileUtils.copyFileToDirectory(new File(mojo.basedir, "src/main/resources/assets/css/site.css"),
destDir);
mojo.stylesheets = new Stylesheets();
Aggregation aggregation1 = new Aggregation();
aggregation1.setFiles(ImmutableList.of(
"less/style.css",
"css/site.css"
));
aggregation1.setOutput("aggregation1.css");
Aggregation aggregation2 = new Aggregation();
aggregation2.setFiles(ImmutableList.of(
"css/site.css"
));
mojo.stylesheets.setAggregations(ImmutableList.of(aggregation1, aggregation2));
less.execute();
mojo.execute();
File agg = new File(FAKE_PROJECT_TARGET, "classes/assets/test-artifact-min.css");
assertThat(agg).isFile();
assertThat(FileUtils.readFileToString(agg))
.contains("h1{color:red}")
.doesNotContain(".box");
File agg1 = new File(FAKE_PROJECT_TARGET, "classes/assets/aggregation1.css");
assertThat(agg1).isFile();
assertThat(FileUtils.readFileToString(agg1))
.contains("h1{color:red}")
.contains(".box");
}
@Test
public void testProcessingOfStylesheetsWithoutMinification() throws MojoFailureException, MojoExecutionException,
IOException {
cleanup();
// Copy site file to target as the aggregation checks file fron the output directory.
final File destDir = new File(mojo.buildDirectory, "classes/assets/css");
destDir.mkdirs();
FileUtils.copyFileToDirectory(new File(mojo.basedir, "src/main/resources/assets/css/site.css"),
destDir);
mojo.stylesheets = new Stylesheets();
Aggregation aggregation1 = new Aggregation();
aggregation1.setFiles(ImmutableList.of(
"less/style.css",
"css/site.css"
));
aggregation1.setMinification(false);
Aggregation aggregation2 = new Aggregation();
aggregation2.setFiles(ImmutableList.of(
"css/site.css"
));
aggregation2.setMinification(false);
aggregation2.setOutput("aggregation2.css");
mojo.stylesheets.setAggregations(ImmutableList.of(aggregation1, aggregation2));
less.execute();
mojo.execute();
File agg = new File(FAKE_PROJECT_TARGET, "classes/assets/test-artifact.css");
assertThat(agg).isFile();
assertThat(FileUtils.readFileToString(agg))
.contains("h1{color:red}")
.contains(".box");
File agg2 = new File(FAKE_PROJECT_TARGET, "classes/assets/aggregation2.css");
assertThat(agg2).isFile();
assertThat(FileUtils.readFileToString(agg2))
.contains("h1{color:red}")
.doesNotContain(".box");
}
}