package ro.isdc.wro.maven.plugin.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.sonatype.plexus.build.incremental.BuildContext;
import ro.isdc.wro.util.WroUtil;
/**
* @author Alex Objelean
*/
public class TestBuildContextHolder {
private static final String KEY = "key";
private static final String VALUE = "value";
private BuildContextHolder victim;
@Mock
private BuildContext buildContext;
@Before
public void setUp() {
victim = new BuildContextHolder();
initMocks(this);
}
@After
public void tearDown() {
victim.destroy();
}
private void initVictimWithBuildContext() {
victim = new BuildContextHolder(buildContext, null);
}
@Test
public void shouldUseBuildContextIncrementalFlag() {
initVictimWithBuildContext();
when(buildContext.isIncremental()).thenReturn(false);
assertFalse(victim.isIncrementalBuild());
}
@Test
public void shouldInvokeSetValueOnBuildContext() {
initVictimWithBuildContext();
victim.setValue(KEY, VALUE);
verify(buildContext).setValue(KEY, VALUE);
}
@Test
public void shouldInvokeGetValueOnBuildContext() {
initVictimWithBuildContext();
victim.getValue(KEY);
verify(buildContext).getValue(KEY);
}
@Test
public void shouldDisableIncrementalBuildByDefault() {
assertFalse(victim.isIncrementalBuild());
}
@Test
public void shouldEnableIncrementalBuildWhenConfigured() {
victim.setIncrementalBuildEnabled(true);
assertTrue(victim.isIncrementalBuild());
}
@Test
public void shouldLoadExistingDefaultValue()
throws IOException {
final File tempFile = WroUtil.createTempFile();
try {
final Properties props = new Properties();
props.setProperty(KEY, VALUE);
props.store(new FileOutputStream(tempFile), null);
victim = new BuildContextHolder() {
@Override
File newFallbackStorageFile(final File rootFolder) {
return tempFile;
}
};
assertEquals(VALUE, victim.getValue(KEY));
} finally {
FileUtils.deleteQuietly(tempFile);
}
}
@Test
public void shouldPersisteSavedValue()
throws Exception {
victim.setValue(KEY, VALUE);
victim.persist();
final File storage = victim.getFallbackStorageFile();
final Properties props = new Properties();
props.load(new FileInputStream(storage));
assertEquals(VALUE, props.getProperty(KEY));
}
@Test
public void shouldNotHaveAnyValueByDefault() {
assertNull(victim.getValue(KEY));
}
@Test
public void shouldFindPreviouslyPersistedValue() {
victim.setValue(KEY, VALUE);
assertEquals(VALUE, victim.getValue(KEY));
}
@Test
public void shouldRemoveWhenNullValueProvided() {
victim.setValue(KEY, null);
assertNull(victim.getValue(KEY));
}
@Test
public void shouldNotStoreValueAssociatedWithNullKey() {
victim.setValue(null, VALUE);
assertNull(victim.getValue(null));
}
@Test
public void shouldRememberStoredValueAfterPersist() throws Exception {
final File tempFile = WroUtil.createTempFile();
try {
victim = new BuildContextHolder();
victim.setValue(KEY, VALUE);
victim.persist();
final BuildContextHolder secondVictim = new BuildContextHolder() {
@Override
File newFallbackStorageFile(final File rootFolder) {
return victim.getFallbackStorageFile();
};
};
assertEquals(VALUE, secondVictim.getValue(KEY));
} finally {
FileUtils.deleteQuietly(tempFile);
}
}
@Test
public void shouldForgetStoredValueIfPersistNotInvoked() {
final File tempFile = WroUtil.createTempFile();
try {
victim = new BuildContextHolder();
victim.setValue(KEY, VALUE);
final BuildContextHolder secondVictim = new BuildContextHolder() {
@Override
File newFallbackStorageFile(final File rootFolder) {
return victim.getFallbackStorageFile();
};
};
assertEquals(null, secondVictim.getValue(KEY));
} finally {
FileUtils.deleteQuietly(tempFile);
}
}
}