package com.ragdroid.mockstar;

import com.ragdroid.mockstar.contracts.MainScene;
import com.ragdroid.mockstar.dagger.BaseLogicTest;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import java.net.HttpURLConnection;
import java.util.concurrent.TimeUnit;

import javax.inject.Inject;

import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.RecordedRequest;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

/**
 * Created by garimajain on 05/03/17.
 */
@RunWith(MockitoJUnitRunner.class)
public class MainPresenterImplTest extends BaseLogicTest {

    @Inject PokeDataSource pokeDataSource;
    @Mock MainScene mainSceneMock;

    @Override
    public void setUp() throws Exception {
        getComponent().inject(this);
        super.setUp();
    }




    @Test
    public void testOnSceneAdded() {
        reset(mainSceneMock);
        MainPresenterImpl presenter = new MainPresenterImpl(schedulersProvider, pokeDataSource);

        presenter.onSceneAdded(mainSceneMock, null);

        testScheduler.triggerActions();

        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);

        verify(mainSceneMock).setApiText(captor.capture());

        assertEquals("Id: 12\n" +
                "Name: butterfreeAbility Name : tinted-lens\n" +
                " Is Hidden : true", captor.getValue());
    }

    @Test
    public void testDemoResponseError503() {
        reset(mainSceneMock);
        MainPresenterImpl presenter = new MainPresenterImpl(schedulersProvider, pokeDataSource);

        MockResponse response = new MockResponse();
        response.setResponseCode(HttpURLConnection.HTTP_UNAVAILABLE);

        getErrorMockWebServer().enqueue(response);

        presenter.onSceneAdded(mainSceneMock, null);

        testScheduler.triggerActions();

        verify(mainSceneMock, times(0)).setApiText(anyString());
        verify(mainSceneMock, times(1)).showErrorDialog("Fire on the Server");
    }

    @Test
    public void testDemoResponseError404() {
        reset(mainSceneMock);

        MainPresenterImpl presenter = new MainPresenterImpl(schedulersProvider, pokeDataSource);

        MockResponse response = new MockResponse();
        response.setResponseCode(HttpURLConnection.HTTP_NOT_FOUND);

        getErrorMockWebServer().enqueue(response);

        presenter.onSceneAdded(mainSceneMock, null);

        testScheduler.triggerActions();

        verify(mainSceneMock, times(1)).showErrorDialog("Lost!");
        verify(mainSceneMock, times(0)).setApiText(anyString());
    }

    @Test
    public void testDemoResponseError403() {
        reset(mainSceneMock);

        MainPresenterImpl presenter = new MainPresenterImpl(schedulersProvider, pokeDataSource);

        MockResponse response = new MockResponse();
        response.setResponseCode(HttpURLConnection.HTTP_UNAUTHORIZED);

        getErrorMockWebServer().enqueue(response);

        presenter.onSceneAdded(mainSceneMock, null);

        testScheduler.triggerActions();

        verify(mainSceneMock, times(1)).showErrorDialog("You shall not pass!");
        verify(mainSceneMock, times(0)).setApiText(anyString());
    }


    @Test
    public void testDemoResponseErrorSocket() {
        reset(mainSceneMock);

        MainPresenterImpl presenter = new MainPresenterImpl(schedulersProvider, pokeDataSource);

        MockResponse response = new MockResponse();
        response.setBody("\"message\":\"Hello\"").throttleBody(1, 2, TimeUnit.SECONDS);

        getErrorMockWebServer().enqueue(response);

        presenter.onSceneAdded(mainSceneMock, null);

        testScheduler.triggerActions();

        verify(mainSceneMock, times(1)).showErrorDialog(anyString());
        verify(mainSceneMock, times(0)).setApiText(anyString());
    }



}