package com.turhanoz.android.reactivedirectorychooser.observable;
import com.turhanoz.android.reactivedirectorychooser.exception.DirectoryExistsException;
import com.turhanoz.android.reactivedirectorychooser.exception.PermissionDeniedException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowEnvironment;
import java.io.File;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "library/src/main/AndroidManifest.xml", emulateSdk = 18)
public class MakeDirectoryObservableTest {
MakeDirectoryObservable sut;
Observer mockObserver;
@Before
public void setUp() throws Exception {
sut = new MakeDirectoryObservable();
mockObserver = mock(Observer.class);
}
@Test
public void shouldThroughPermissionDeniedExceptionIfRootFolderNotWritable() throws Exception {
File stubRootDirectory = mock(File.class);
when(stubRootDirectory.canWrite()).thenReturn(false);
sut.create(stubRootDirectory, "fileName")
.subscribeOn(Schedulers.immediate())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mockObserver);
verify(mockObserver).onError(any(PermissionDeniedException.class));
verify(mockObserver, never()).onCompleted();
}
@Test
public void shouldThroughDirectoryExistsException() throws Exception {
File rootDirectory = ShadowEnvironment.getExternalStorageDirectory();
String folderName = "folderName";
createDirectory(rootDirectory, folderName);
sut.create(rootDirectory, folderName)
.subscribeOn(Schedulers.immediate())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mockObserver);
verify(mockObserver).onError(any(DirectoryExistsException.class));
verify(mockObserver, never()).onCompleted();
}
private void createDirectory(File rootDirectory, String folderName) {
File newDirectory = new File(rootDirectory, folderName);
newDirectory.mkdir();
}
@Test
public void shouldMakeDirectory() throws Exception {
File rootDirectory = ShadowEnvironment.getExternalStorageDirectory();
String folderName = "folderName";
sut.create(rootDirectory, folderName)
.subscribeOn(Schedulers.immediate())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mockObserver);
ArgumentCaptor<File> argumentCaptor = ArgumentCaptor.forClass(File.class);
verify(mockObserver).onNext(argumentCaptor.capture());
verify(mockObserver).onCompleted();
assertEquals(rootDirectory.toString() + File.separator + folderName, argumentCaptor.getValue().getAbsolutePath());
}
}