package org.apache.fineract.online

import android.content.Context
import io.reactivex.Observable
import org.apache.fineract.FakeRemoteDataSource
import org.apache.fineract.R
import org.apache.fineract.data.datamanager.api.DataManagerCustomer
import org.apache.fineract.data.models.customer.identification.Identification
import org.apache.fineract.exceptions.NoConnectivityException
import org.apache.fineract.ui.online.identification.identificationlist.IdentificationsContract
import org.apache.fineract.ui.online.identification.identificationlist.IdentificationsPresenter
import org.apache.fineract.util.RxSchedulersOverrideRule
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnitRunner

@RunWith(MockitoJUnitRunner::class)
class IdentificationPresenterTest {

    @Rule
    @JvmField
    val overrideSchedulersRule = RxSchedulersOverrideRule()

    @Mock
    lateinit var mockedView: IdentificationsContract.View

    @Mock
    lateinit var mockedDataManagerCustomer: DataManagerCustomer

    @Mock
    lateinit var mockedContext: Context

    lateinit var identificationPresenter: IdentificationsPresenter

    lateinit var identifications: List<Identification>

    val customerIdentifier: String = "identifier1"

    @Before
    fun setup() {
        identificationPresenter = IdentificationsPresenter(mockedContext,
                mockedDataManagerCustomer)
        identificationPresenter.attachView(mockedView)
        identifications = FakeRemoteDataSource.getIdentifications()
    }

    @Test
    fun testGetIdentifications() {
        `when`(mockedDataManagerCustomer.fetchIdentifications(customerIdentifier))
                .thenReturn(Observable.just(identifications))
        identificationPresenter.fetchIdentifications(customerIdentifier)
        verify(mockedView).showProgressbar()
        verify(mockedView).hideProgressbar()
        verify(mockedView).showIdentification(identifications)
    }

    @Test
    fun testGetIdentificationsFail() {
        `when`(mockedDataManagerCustomer.fetchIdentifications(customerIdentifier))
                .thenReturn(Observable.error(RuntimeException()))
        `when`(mockedContext.getString(R.string.error_fetching_identification_list))
                .thenReturn("Error while fetching identification cards")
        identificationPresenter.fetchIdentifications(customerIdentifier)
        verify(mockedView).showProgressbar()
        verify(mockedView).hideProgressbar()
        verify(mockedView).showError("Error while fetching identification cards")
    }

    @Test
    fun testGetIdentificationsFailDueToInternet() {
        `when`(mockedDataManagerCustomer.fetchIdentifications(customerIdentifier))
                .thenReturn(Observable.error(NoConnectivityException()))
        identificationPresenter.fetchIdentifications(customerIdentifier)
        verify(mockedView).showProgressbar()
        verify(mockedView).hideProgressbar()
        verify(mockedView).showNoInternetConnection()
    }

    @After
    fun tearDown() {
        identificationPresenter.detachView()
    }

}