package com.mobify.astro.plugins;

import android.os.Bundle;

import com.mobify.astro.ActivityTestBase;
import com.mobify.astro.AstroActivity;
import com.mobify.astro.PluginResolver;
import com.mobify.astro.dialogs.DialogManager;
import com.mobify.astro.messaging.EventManager;
import com.mobify.astro.messaging.MessageSender;
import com.mobify.astro.messaging.RpcResponse;

import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

public class PromptViewPluginTest extends ActivityTestBase {

    private PromptViewPlugin promptViewPlugin;
    private DialogManager mockDialogManager;
    private RpcResponse response;

    @Before
    public void setup() {
        PluginResolver mockPluginResolver = mock(PluginResolver.class);
        EventManager mockEventManager = mock(EventManager.class);
        MessageSender mockMessageSender = mock(MessageSender.class);

        promptViewPlugin = new PromptViewPlugin(getActivity(), mockPluginResolver, mockEventManager, mockMessageSender);

        mockDialogManager = mock(DialogManager.class);
        promptViewPlugin.dialogManager = mockDialogManager;
    }

    @Test
    public void testSetPrompt() {
        final String prompt = "THIS IS PROMPT";

        promptViewPlugin.setPrompt(prompt);
        assertEquals(prompt, promptViewPlugin.bundle.getString(PromptViewPlugin.KEY_PROMPT));
    }

    @Test
    public void testSetPlaceholder() {
        final String placeholder = "THIS IS PLACEHOLDER";

        promptViewPlugin.setPlaceholder(placeholder);
        assertEquals(placeholder, promptViewPlugin.bundle.getString(PromptViewPlugin.KEY_PLACEHOLDER));
    }

    @Test
    public void testSetSubmitButtonLabel() {
        final String submitButtonLabel = "THIS IS SUBMIT BUTTON LABEL";

        promptViewPlugin.setSubmitButtonLabel(submitButtonLabel);
        assertEquals(submitButtonLabel, promptViewPlugin.bundle.getString(PromptViewPlugin.KEY_SUBMIT_BUTTON));
    }

    @Test
    public void testSetCancelButtonLabel() {
        final String cancelButtonLabel = "THIS IS CANCEL BUTTON LABEL";

        promptViewPlugin.setCancelButtonLabel(cancelButtonLabel);
        assertEquals(cancelButtonLabel, promptViewPlugin.bundle.getString(PromptViewPlugin.KEY_CANCEL_BUTTON));
    }

    @Test
    public void testShowingDialog() throws Exception {
        promptViewPlugin.show(response, null);
        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(mockDialogManager).showPromptView(argumentCaptor.capture(), any(AstroActivity.class), eq(response), eq(promptViewPlugin.REQUEST_CODE));
        Bundle actualBundle = argumentCaptor.getValue();
        Bundle expectedBundle = promptViewPlugin.getLocalizedBundle();
        assertEquals(expectedBundle.getString(PromptViewPlugin.KEY_SUBMIT_BUTTON), actualBundle.getString(PromptViewPlugin.KEY_SUBMIT_BUTTON));
        assertEquals(expectedBundle.getString(PromptViewPlugin.KEY_CANCEL_BUTTON), actualBundle.getString(PromptViewPlugin.KEY_CANCEL_BUTTON));
    }
}
