package org.springframework.roo.file.monitor;
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.mock;
import static org.mockito.Mockito.when;
import static org.springframework.roo.file.monitor.event.FileOperation.CREATED;
import static org.springframework.roo.file.monitor.event.FileOperation.DELETED;
import static org.springframework.roo.file.monitor.event.FileOperation.RENAMED;
import static org.springframework.roo.file.monitor.event.FileOperation.UPDATED;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.roo.file.monitor.event.FileOperation;
/**
* Unit test of {@link MonitoringRequestEditor}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class MonitoringRequestEditorTest {
private static final File TEMP_DIR = new File(System.getProperty("java.io.tmpdir"));
private MonitoringRequestEditor editor;
// Fixture
private File testDirectory;
private File testFile;
/**
* Asserts that the editor converts the given {@link MonitoringRequest} to
* the given text
*
* @param mockMonitoringRequest
* @param expectedText
* @throws Exception
*/
private void assertAsText(final MonitoringRequest mockMonitoringRequest, final String expectedText)
throws Exception {
// Set up
final File mockFile = mock(File.class);
when(mockMonitoringRequest.getFile()).thenReturn(mockFile);
when(mockFile.getCanonicalPath()).thenReturn("/path/to/file");
final FileOperation[] operations = {CREATED, DELETED};
when(mockMonitoringRequest.getNotifyOn()).thenReturn(Arrays.asList(operations));
editor.setValue(mockMonitoringRequest);
// Invoke
final String text = editor.getAsText();
// Check
assertEquals(expectedText, text);
}
/**
* Asserts that passing the given text to the
* {@link MonitoringRequestEditor} results in a <code>null</code>
* {@link MonitoringRequest}.
*
* @param text the text to pass (can be blank)
*/
private void assertCreatesNullMonitoringRequest(final String text) {
// Set up
editor.setAsText(text);
// Invoke
final MonitoringRequest monitoringRequest = editor.getValue();
// Check
assertNull(monitoringRequest);
}
/**
* Asserts that passing the given text to
* {@link MonitoringRequestEditor#setAsText(String)} results in a
* {@link MonitoringRequest} with the given values
*
* @param text the text to parse as a {@link MonitoringRequest}
* @param expectedFile the file we expect to be monitored
* @param expectedFileOperations the operations about which we expect to be
* notified
* @return the generated {@link MonitoringRequest} for any further
* assertions
*/
private MonitoringRequest assertMonitoringRequest(final String text, final File expectedFile,
final FileOperation... expectedFileOperations) {
// Set up
editor.setAsText(text);
// Invoke
final MonitoringRequest monitoringRequest = editor.getValue();
// Check
assertEquals(expectedFile, monitoringRequest.getFile());
final Collection<FileOperation> notifyOn = monitoringRequest.getNotifyOn();
assertEquals(expectedFileOperations.length, notifyOn.size());
assertTrue("Expected " + Arrays.toString(expectedFileOperations) + " but was " + notifyOn,
notifyOn.containsAll(Arrays.asList(expectedFileOperations)));
return monitoringRequest;
}
@Before
public void setUp() throws Exception {
editor = new MonitoringRequestEditor();
testDirectory = new File(TEMP_DIR, getClass().getSimpleName());
testDirectory.mkdir();
testFile = File.createTempFile(getClass().getSimpleName(), null);
}
@After
public void tearDown() {
testDirectory.delete();
testFile.delete();
}
@Test
public void testGetAsTextWhenMonitoringDirectoryAndSubTree() throws Exception {
// Set up
final DirectoryMonitoringRequest mockMonitoringRequest = mock(DirectoryMonitoringRequest.class);
when(mockMonitoringRequest.isWatchSubtree()).thenReturn(true);
assertAsText(mockMonitoringRequest, "/path/to/file,CD,**");
}
@Test
public void testGetAsTextWhenMonitoringDirectoryOnly() throws Exception {
// Set up
final DirectoryMonitoringRequest mockMonitoringRequest = mock(DirectoryMonitoringRequest.class);
when(mockMonitoringRequest.isWatchSubtree()).thenReturn(false);
assertAsText(mockMonitoringRequest, "/path/to/file,CD");
}
@Test
public void testGetAsTextWhenMonitoringFile() throws Exception {
assertAsText(mock(MonitoringRequest.class), "/path/to/file,CD");
}
@Test
public void testGetAsTextWhenNoValueSet() {
assertNull(editor.getAsText());
}
@Test
public void testMonitorDirectoryAndSubtreeForDelete() {
final MonitoringRequest monitoringRequest =
assertMonitoringRequest(testDirectory.getAbsolutePath() + ",D,**", testDirectory, DELETED);
final DirectoryMonitoringRequest directoryMonitoringRequest =
(DirectoryMonitoringRequest) monitoringRequest;
assertTrue(directoryMonitoringRequest.isWatchSubtree());
}
@Test
public void testMonitorDirectoryButNotSubtreeForRename() {
final MonitoringRequest monitoringRequest =
assertMonitoringRequest(testDirectory.getAbsolutePath() + ",R", testDirectory, RENAMED);
final DirectoryMonitoringRequest directoryMonitoringRequest =
(DirectoryMonitoringRequest) monitoringRequest;
assertFalse(directoryMonitoringRequest.isWatchSubtree());
}
@Test
public void testMonitorFileForRenameUpdateOrDelete() {
assertMonitoringRequest(testFile.getAbsolutePath() + ",RUD", testFile, RENAMED, UPDATED,
DELETED);
}
@Test(expected = IllegalArgumentException.class)
public void testMonitoringSubTreeOfFileIsInvalid() {
editor.setAsText(testFile.getAbsolutePath() + ",C,**");
}
@Test
public void testSettingEmptyAsTextCreatesNullValue() {
assertCreatesNullMonitoringRequest("");
}
@Test
public void testSettingNullAsTextCreatesNullValue() {
assertCreatesNullMonitoringRequest(null);
}
@Test(expected = IllegalArgumentException.class)
public void testSettingTextWithNoCommaIsInvalid() {
editor.setAsText("foo");
}
@Test(expected = IllegalArgumentException.class)
public void testSettingTextWithNoOperationCodesIsInvalid() {
editor.setAsText("foo,");
}
}