@Test
 public void testDeleteItemFail() throws Exception {
   when(mRepository.delete(anyLong())).thenReturn(Observable.just(false));
   fetchData();
   mViewModel.deleteItem(0).toBlocking().single();
   assertThat(mViewModel.getTodoItems()).hasSize(3);
   assertEquals(View.GONE, mViewModel.getAlertVisibility().get());
 }
 @Test
 public void testDeleteItemSuccess() throws Exception {
   when(mRepository.delete(anyLong())).thenReturn(Observable.just(true));
   fetchData();
   for (int i = 0; i < 3; i++) mViewModel.deleteItem(0).toBlocking().single();
   assertThat(mViewModel.getTodoItems()).hasSize(0);
   assertEquals(View.VISIBLE, mViewModel.getAlertVisibility().get());
 }
 @Test
 public void testCheckChangeItemFail() throws Exception {
   when(mRepository.createOrUpdate(any(Todo.class)))
       .thenReturn(
           Observable.create(
               (Observable.OnSubscribe<Todo>)
                   subscriber -> {
                     try {
                       throw new Exception("error");
                     } catch (Exception ex) {
                       subscriber.onError(ex);
                     }
                   }));
   fetchData();
   mViewModel
       .checkChangeItem(mItemViewModelList.get(0))
       .subscribeOn(Schedulers.immediate())
       .subscribe(
           todo -> {
             fail("Should not success");
           },
           throwable -> {
             assertEquals("error", throwable.getMessage());
           });
   assertFalse(mItemViewModelList.get(0).isCompleted());
 }
 @Test
 public void testUpdate() throws Exception {
   fetchData();
   Todo todo = DataUtils.provideTodo();
   todo.setId(0L);
   mViewModel.update(todo);
   assertEquals("title", mItemViewModelList.get(0).getTitle());
 }
 @Test
 public void testUpdateNotFound() throws Exception {
   fetchData();
   Todo todo = DataUtils.provideTodo();
   todo.setId(100L);
   mViewModel.update(todo);
   for (int i = 0; i < 3; i++) {
     assertNotEquals(Long.valueOf(100), mItemViewModelList.get(i).getTodo().getId());
     assertNotEquals("title", mItemViewModelList.get(i).getTodo().getTitle());
   }
 }
 @Test
 public void testCheckChangeItemSuccess() throws Exception {
   when(mRepository.createOrUpdate(any(Todo.class)))
       .thenAnswer(
           invocation -> {
             Object[] args = invocation.getArguments();
             return Observable.just((Todo) args[0]);
           });
   fetchData();
   mViewModel.checkChangeItem(mItemViewModelList.get(0)).toBlocking().single();
   assertTrue(mItemViewModelList.get(0).isCompleted());
 }
 @Test
 public void testGetAlertVisibilityGone() throws Exception {
   fetchData();
   assertEquals(View.GONE, mViewModel.getAlertVisibility().get());
 }
 @Test
 public void testGetAlertVisibilityVisibleNoItem() throws Exception {
   when(mRepository.getAll()).thenReturn(Observable.just(DataUtils.provideEmptyList()));
   mViewModel.fetchAllTodo().toBlocking().single();
   assertEquals(View.VISIBLE, mViewModel.getAlertVisibility().get());
 }
 @Test
 public void testGetAlertVisibilityOnStart() throws Exception {
   assertEquals(View.GONE, mViewModel.getAlertVisibility().get());
 }
 private void fetchData() {
   mViewModel.fetchAllTodo().toBlocking().single();
   mItemViewModelList = mViewModel.getTodoItems();
 }
 @Test
 public void testInsert() throws Exception {
   mViewModel.insert(DataUtils.provideTodo());
   assertEquals(View.GONE, mViewModel.getAlertVisibility().get());
 }