package com.chameth.yaotp.viewmodel import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.chameth.yaotp.accounts.Account import com.nhaarman.mockitokotlin2.* import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test class OtpListViewModelTest { @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule() private val viewModel = OtpListViewModel() private val observer = mock() @Test fun testAddAccount_incrementsNumberOfAccounts() { assertEquals(0, viewModel.numberOfAccounts) viewModel.addAccount(mock()) assertEquals(1, viewModel.numberOfAccounts) viewModel.addAccount(mock()) assertEquals(2, viewModel.numberOfAccounts) } @Test fun testRemoveAccount_decrementsNumberOfAccounts() { val account1 = mock() val account2 = mock() viewModel.addAccount(account1) viewModel.addAccount(account2) viewModel.removeAccount(account1) assertEquals(1, viewModel.numberOfAccounts) viewModel.removeAccount(account2) assertEquals(0, viewModel.numberOfAccounts) } @Test fun testRemoveAccount_withNonExistantAccount_doesNothing() { val account1 = mock() val account2 = mock() viewModel.addAccount(account1) viewModel.addObserver(observer) viewModel.removeAccount(account2) verifyNoMoreInteractions(observer) } @Test fun testAddAccount_notifiesRegisteredObservers() { viewModel.addAccount(mock()) viewModel.addObserver(observer) viewModel.addAccount(mock()) viewModel.removeObserver(observer) viewModel.addAccount(mock()) verify(observer).accountAdded(1) verify(observer, never()).accountAdded(0) verify(observer, never()).accountAdded(2) } @Test fun testRemoveAccount_notifiesRegisteredObservers() { val account1 = mock() val account2 = mock() val account3 = mock() viewModel.addAccount(account1) viewModel.addAccount(account2) viewModel.addAccount(account3) viewModel.removeAccount(account1) viewModel.addObserver(observer) viewModel.removeAccount(account3) viewModel.removeObserver(observer) viewModel.removeAccount(account2) verify(observer).accountRemoved(1) verify(observer, never()).accountRemoved(0) } @Test fun testGetViewModel_returnsCorrectViewModel() { viewModel.addAccount(mock { on { label } doReturn "Foo" }) viewModel.addAccount(mock { on { label } doReturn "Bar" }) assertEquals("Foo", viewModel.getViewModelForAccount(0).label.value) assertEquals("Bar", viewModel.getViewModelForAccount(1).label.value) } }