/*
* Copyright (C) 2011 . All rights reserved.
*/
package ro.isdc.wro.model.factory;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FilenameUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.isdc.wro.config.Context;
import ro.isdc.wro.manager.factory.BaseWroManagerFactory;
import ro.isdc.wro.model.WroModel;
import ro.isdc.wro.model.group.Group;
import ro.isdc.wro.model.group.processor.Injector;
import ro.isdc.wro.model.group.processor.InjectorBuilder;
import ro.isdc.wro.model.resource.Resource;
import ro.isdc.wro.model.resource.ResourceType;
import ro.isdc.wro.model.resource.locator.ClasspathUriLocator;
import ro.isdc.wro.model.resource.processor.factory.ProcessorsFactory;
import ro.isdc.wro.model.transformer.WildcardExpanderModelTransformer;
import ro.isdc.wro.util.Function;
import ro.isdc.wro.util.WroUtil;
/**
* @author Alex Objelean
*/
public class TestWildcardExpanderModelTransformer {
private static final Logger LOG = LoggerFactory.getLogger(TestWildcardExpanderModelTransformer.class);
private WildcardExpanderModelTransformer transformer;
@Mock
private WroModelFactory decoratedFactory;
@Mock
private ProcessorsFactory processorsFactory;
@BeforeClass
public static void onBeforeClass() {
assertEquals(0, Context.countActive());
}
@AfterClass
public static void onAfterClass() {
assertEquals(0, Context.countActive());
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
Context.set(Context.standaloneContext());
transformer = new WildcardExpanderModelTransformer();
// create manager to force correct initialization.
final BaseWroManagerFactory factory = new BaseWroManagerFactory();
factory.setProcessorsFactory(processorsFactory);
factory.addModelTransformer(transformer);
final Injector injector = InjectorBuilder.create(factory).build();
injector.inject(transformer);
}
@Test
public void testEmptyModel() {
final WroModel model = new WroModel();
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
Assert.assertEquals(model.getGroups().size(), changedModel.getGroups().size());
}
@Test
public void testGroupWithNoWildcard() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/file1.js",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
Assert.assertEquals(1, changedModel.getGroups().size());
}
/**
* Invalid resources should be ignored, leaving the model unchanged.
*/
@Test
public void testGroupWithInvalidResource() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/INVALID.*",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
Assert.assertEquals(1, changedModel.getGroups().size());
}
@Test
public void testExpandWildcardWithASingleResource() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/?cript1.js",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
LOG.debug("model: {}", changedModel);
Assert.assertEquals(1, changedModel.getGroupByName("group").getResources().size());
}
@Test
public void testExpandWildcardWithMultipleResources() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/*.js",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
LOG.debug("model: {}", changedModel);
Assert.assertEquals(3, changedModel.getGroupByName("group").getResources().size());
}
@Test
public void testExpandWildcardRootDir()
throws Exception {
final String uri = "/**.js";
final Resource resource = Resource.create(uri, ResourceType.JS);
final Group group = new Group("group").addResource(resource);
final String baseNameFolder = WroUtil.toPackageAsFolder(getClass());
final Function<Collection<File>, Void> expanderHandler = transformer.createExpanderHandler(group, resource,
baseNameFolder);
final File mockFile1 = Mockito.mock(File.class);
Mockito.when(mockFile1.getPath()).thenReturn(baseNameFolder + "/js1.js");
final File mockFile2 = Mockito.mock(File.class);
Mockito.when(mockFile2.getPath()).thenReturn(baseNameFolder + "/js2.js");
expanderHandler.apply(Arrays.asList(mockFile1, mockFile2));
LOG.debug("group: {}", group);
Assert.assertEquals(2, group.getResources().size());
Assert.assertEquals("/js1.js", group.getResources().get(0).getUri());
Assert.assertEquals("/js2.js", group.getResources().get(1).getUri());
}
@Test
public void shouldCorrectlyDetectFilesFromFoldersWithDirectoriesOnlyAsChildren() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/subfolder/**.js",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
LOG.debug("model: {}", changedModel);
final String resultPathPrefix = String.format("%s%s/expander/subfolder", ClasspathUriLocator.PREFIX,
WroUtil.toPackageAsFolder(getClass()));
Assert.assertEquals(2, changedModel.getGroupByName("group").getResources().size());
Assert.assertEquals(resultPathPrefix + "/folder1/script1.js",
changedModel.getGroupByName("group").getResources().get(0).getUri());
Assert.assertEquals(resultPathPrefix + "/folder2/script2.js",
changedModel.getGroupByName("group").getResources().get(1).getUri());
}
@Test
public void wildcardResourcesAreOrderedAlphabetically() {
final WroModel model = new WroModel();
final String uri = String.format(ClasspathUriLocator.PREFIX + "%s/expander/order/**.js",
WroUtil.toPackageAsFolder(getClass()));
model.addGroup(new Group("group").addResource(Resource.create(uri, ResourceType.JS)));
Mockito.when(decoratedFactory.create()).thenReturn(model);
final WroModel changedModel = transformer.transform(model);
LOG.debug("model: {}", changedModel);
Assert.assertEquals(7, changedModel.getGroupByName("group").getResources().size());
final List<Resource> resources = changedModel.getGroupByName("group").getResources();
Assert.assertEquals("01-xyc.js", FilenameUtils.getName(resources.get(0).getUri()));
Assert.assertEquals("02-xyc.js", FilenameUtils.getName(resources.get(1).getUri()));
Assert.assertEquals("03-jquery-ui.js", FilenameUtils.getName(resources.get(2).getUri()));
Assert.assertEquals("04-xyc.js", FilenameUtils.getName(resources.get(3).getUri()));
Assert.assertEquals("05-xyc.js", FilenameUtils.getName(resources.get(4).getUri()));
Assert.assertEquals("06-xyc.js", FilenameUtils.getName(resources.get(5).getUri()));
Assert.assertEquals("07-jquery-impromptu.js", FilenameUtils.getName(resources.get(6).getUri()));
}
@After
public void tearDown() {
Context.unset();
}
}