/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.modules.dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.app.Activity;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.JavaOnlyMap;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ActivityController;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
public class DialogModuleTest {
private ActivityController<Activity> mActivityController;
private Activity mActivity;
private DialogModule mDialogModule;
final static class SimpleCallback implements Callback {
private Object[] mArgs;
private int mCalls;
@Override
public void invoke(Object... args) {
mCalls++;
mArgs = args;
}
public int getCalls() {
return mCalls;
}
public Object[] getArgs() {
return mArgs;
}
}
@Before
public void setUp() throws Exception {
mActivityController = Robolectric.buildActivity(Activity.class);
mActivity = mActivityController
.create()
.start()
.resume()
.get();
final ReactApplicationContext context = PowerMockito.mock(ReactApplicationContext.class);
PowerMockito.when(context.hasActiveCatalystInstance()).thenReturn(true);
PowerMockito.when(context, "getCurrentActivity").thenReturn(mActivity);
mDialogModule = new DialogModule(context);
mDialogModule.onHostResume();
}
@After
public void tearDown() {
mActivityController.pause().stop().destroy();
mActivityController = null;
mDialogModule = null;
}
@Test
public void testAllOptions() {
final JavaOnlyMap options = new JavaOnlyMap();
options.putString("title", "Title");
options.putString("message", "Message");
options.putString("buttonPositive", "OK");
options.putString("buttonNegative", "Cancel");
options.putString("buttonNeutral", "Later");
options.putBoolean("cancelable", false);
mDialogModule.showAlert(options, null, null);
final AlertFragment fragment = getFragment();
assertNotNull("Fragment was not displayed", fragment);
assertEquals(false, fragment.isCancelable());
final AlertDialog dialog = (AlertDialog) fragment.getDialog();
assertEquals("OK", dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText().toString());
assertEquals("Cancel", dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText().toString());
assertEquals("Later", dialog.getButton(DialogInterface.BUTTON_NEUTRAL).getText().toString());
}
@Test
public void testCallbackPositive() {
final JavaOnlyMap options = new JavaOnlyMap();
options.putString("buttonPositive", "OK");
final SimpleCallback actionCallback = new SimpleCallback();
mDialogModule.showAlert(options, null, actionCallback);
final AlertDialog dialog = (AlertDialog) getFragment().getDialog();
dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
assertEquals(1, actionCallback.getCalls());
assertEquals(DialogModule.ACTION_BUTTON_CLICKED, actionCallback.getArgs()[0]);
assertEquals(DialogInterface.BUTTON_POSITIVE, actionCallback.getArgs()[1]);
}
@Test
public void testCallbackNegative() {
final JavaOnlyMap options = new JavaOnlyMap();
options.putString("buttonNegative", "Cancel");
final SimpleCallback actionCallback = new SimpleCallback();
mDialogModule.showAlert(options, null, actionCallback);
final AlertDialog dialog = (AlertDialog) getFragment().getDialog();
dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
assertEquals(1, actionCallback.getCalls());
assertEquals(DialogModule.ACTION_BUTTON_CLICKED, actionCallback.getArgs()[0]);
assertEquals(DialogInterface.BUTTON_NEGATIVE, actionCallback.getArgs()[1]);
}
@Test
public void testCallbackNeutral() {
final JavaOnlyMap options = new JavaOnlyMap();
options.putString("buttonNeutral", "Later");
final SimpleCallback actionCallback = new SimpleCallback();
mDialogModule.showAlert(options, null, actionCallback);
final AlertDialog dialog = (AlertDialog) getFragment().getDialog();
dialog.getButton(DialogInterface.BUTTON_NEUTRAL).performClick();
assertEquals(1, actionCallback.getCalls());
assertEquals(DialogModule.ACTION_BUTTON_CLICKED, actionCallback.getArgs()[0]);
assertEquals(DialogInterface.BUTTON_NEUTRAL, actionCallback.getArgs()[1]);
}
@Test
public void testCallbackDismiss() {
final JavaOnlyMap options = new JavaOnlyMap();
final SimpleCallback actionCallback = new SimpleCallback();
mDialogModule.showAlert(options, null, actionCallback);
getFragment().getDialog().dismiss();
assertEquals(1, actionCallback.getCalls());
assertEquals(DialogModule.ACTION_DISMISSED, actionCallback.getArgs()[0]);
}
private AlertFragment getFragment() {
return (AlertFragment) mActivity.getFragmentManager()
.findFragmentByTag(DialogModule.FRAGMENT_TAG);
}
}