package com.turhanoz.android.reactivedirectorychooser.observer;
import com.turhanoz.android.reactivedirectorychooser.event.DataSetChangedEvent;
import com.turhanoz.android.reactivedirectorychooser.event.OperationFailedEvent;
import com.turhanoz.android.reactivedirectorychooser.model.DirectoryList;
import com.turhanoz.android.reactivedirectorychooser.model.DirectoryTree;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.io.File;
import de.greenrobot.event.EventBus;
import static junit.framework.Assert.assertTrue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "library/src/main/AndroidManifest.xml", emulateSdk = 18)
public class ListDirectoryObserverTest {
ListDirectoryObserver sut;
EventBus mockBus;
DirectoryTree directoryTree;
@Before
public void setUp() throws Exception {
mockBus = mock(EventBus.class);
directoryTree = new DirectoryTree(mockBus);
sut = new ListDirectoryObserver(directoryTree, mockBus);
}
@Test
public void shouldClearDirectoryTreeOnInstanciation() throws Exception {
directoryTree.directoryList.add(mock(File.class));
new ListDirectoryObserver(directoryTree, mockBus);
assertTrue(directoryTree.directoryList.isEmpty());
}
@Test
public void onNextShouldUpdateDirectoryTree() throws Exception {
File mockFile1 = mock(File.class);
File mockFile2 = mock(File.class);
File mockFile3 = mock(File.class);
sut.onNext(mockFile1);
sut.onNext(mockFile2);
sut.onNext(mockFile3);
assertTrue(directoryTree.directoryList.contains(mockFile1));
assertTrue(directoryTree.directoryList.contains(mockFile2));
assertTrue(directoryTree.directoryList.contains(mockFile3));
}
@Test
public void onErrorShouldNotifyOperationFailedEvent() throws Exception {
sut.onError(new Exception());
verify(mockBus).post(any(OperationFailedEvent.class));
}
@Test
public void onCompleteShouldSortDirectoryTree() throws Exception {
DirectoryList spyDirectoryList = spy(new DirectoryList());
directoryTree.directoryList = spyDirectoryList;
sut.onCompleted();
verify(directoryTree.directoryList).sort();
}
@Test
public void onCompleteShouldAddParentDirectoryIfExists() throws Exception {
File mockParentFile = mock(File.class);
directoryTree.setParentDirectory(mockParentFile);
sut.onCompleted();
assertThat(directoryTree.directoryList.get(0), is(mockParentFile));
}
@Test
public void onCompleteShouldNotAddMissingParent() throws Exception {
directoryTree.setParentDirectory(null);
sut.onCompleted();
assertTrue(directoryTree.directoryList.isEmpty());
}
@Test
public void onCompleteShouldNotifyDataSetChanged() throws Exception {
sut.onCompleted();
verify(mockBus).post(any(DataSetChangedEvent.class));
}
}