Skip to content

Commit

Permalink
Merge pull request #384 from OpenSRP/tt-wk4-JsonFormFragmentPresenter…
Browse files Browse the repository at this point in the history
…Test

TT Week 4 Json Form Fragment Presenter unit tests
  • Loading branch information
githengi committed Mar 17, 2020
2 parents 12827d7 + b037075 commit 39dbd32
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public class JsonFormFragmentPresenter extends
MvpBasePresenter<JsonFormFragmentView<JsonFormFragmentViewState>> {

private static final String TAG = "FormFragmentPresenter";
private static final int RESULT_LOAD_IMG = 1;
protected static final int RESULT_LOAD_IMG = 1;
private final JsonFormFragment formFragment;
protected JSONObject mStepDetails;
protected String key;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -437,8 +437,7 @@ public static int spToPx(Context context, float sp) {
}

public static int dpToPixels(Context context, float dps) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dps * scale + 0.5f);
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dps, context.getResources().getDisplayMetrics());
}

public void showInfoIcon(String stepName, JSONObject jsonObject, CommonListener listener,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.vijay.jsonwizard.utils;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
Expand Down Expand Up @@ -70,9 +71,7 @@ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWi
}

public static int getDeviceWidth(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
return display.getWidth();
return Resources.getSystem().getDisplayMetrics().widthPixels;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.vijay.jsonwizard.presenters;

import android.Manifest.permission;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
Expand All @@ -18,6 +19,9 @@
import com.vijay.jsonwizard.interactors.JsonFormInteractor;
import com.vijay.jsonwizard.interfaces.CommonListener;
import com.vijay.jsonwizard.interfaces.OnFieldsInvalid;
import com.vijay.jsonwizard.shadow.ShadowContextCompat;
import com.vijay.jsonwizard.shadow.ShadowPermissionUtils;
import com.vijay.jsonwizard.utils.FormUtils;

import org.json.JSONException;
import org.json.JSONObject;
Expand All @@ -32,6 +36,7 @@
import org.powermock.reflect.Whitebox;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowToast;

import java.lang.ref.WeakReference;
Expand All @@ -40,18 +45,27 @@
import java.util.List;
import java.util.Stack;

import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_OK;
import static com.vijay.jsonwizard.constants.JsonFormConstants.STEP1;
import static com.vijay.jsonwizard.presenters.JsonFormFragmentPresenter.RESULT_LOAD_IMG;
import static com.vijay.jsonwizard.utils.PermissionUtils.CAMERA_PERMISSION_REQUEST_CODE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

/**
Expand All @@ -73,6 +87,9 @@ public class JsonFormFragmentPresenterRoboElectricTest extends BaseTest {
@Captor
private ArgumentCaptor<JSONObject> jsonArgumentCaptor;

@Captor
private ArgumentCaptor<Intent> intentArgumentCaptor;

@Mock
private JsonFormErrorFragment errorFragment;

Expand Down Expand Up @@ -224,7 +241,7 @@ public void testValidateAndWriteValues() {
assertEquals(0, presenter.getInvalidFields().size());
verify(formFragment, times(13)).writeValue(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyBoolean());
verify(onFieldsInvalid,times(2)).passInvalidFields(presenter.getInvalidFields());
verify(onFieldsInvalid, times(2)).passInvalidFields(presenter.getInvalidFields());
}

private void setTextValue(String address, String value) {
Expand Down Expand Up @@ -254,4 +271,74 @@ public void testOnSaveClickDisplaysErrorFragmentAndDisplaysToast() {
}


@Test
public void testOnSaveClickFinishesForm() throws JSONException {
initWithActualForm();
formFragment.getMainView().setTag(R.id.skip_validation, false);
setTextValue("step1:user_last_name", "Doe");
setTextValue("step1:user_first_name", "John");
setTextValue("step1:user_age", "21");
((AppCompatSpinner) formFragment.getJsonApi().getFormDataView("step1:user_spinner")).setSelection(1);
presenter.onSaveClick(formFragment.getMainView());
assertEquals(0, presenter.getInvalidFields().size());
verify(formFragment, times(7)).writeValue(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyBoolean());
assertNull(presenter.getErrorFragment());
assertNull(ShadowToast.getLatestToast());
verify(formFragment).onFormFinish();
verify(formFragment).finishWithResult(intentArgumentCaptor.capture());
assertFalse(intentArgumentCaptor.getValue().getBooleanExtra(JsonFormConstants.SKIP_VALIDATION, true));
JSONObject json = new JSONObject(intentArgumentCaptor.getValue().getStringExtra("json"));
assertNotNull(json);
assertEquals("Doe", FormUtils.getFieldFromForm(json, "user_last_name").getString(JsonFormConstants.VALUE));
assertEquals("John", FormUtils.getFieldFromForm(json, "user_first_name").getString(JsonFormConstants.VALUE));
assertEquals("21", FormUtils.getFieldFromForm(json, "user_age").getString(JsonFormConstants.VALUE));

}


@Test
public void testOnSaveClickErrorFragmentDisabledAndDisplaysSnackbar() throws JSONException {
initWithActualForm();
formFragment.getMainView().setTag(R.id.skip_validation, false);
formFragment.getJsonApi().getmJSONObject().put(JsonFormConstants.SHOW_ERRORS_ON_SUBMIT, false);
formFragment = spy(formFragment);
doNothing().when(formFragment).showSnackBar(anyString());
Whitebox.setInternalState(presenter, "viewRef", new WeakReference<>(formFragment));
presenter.onSaveClick(formFragment.getMainView());
assertEquals(4, presenter.getInvalidFields().size());
assertEquals("Please enter the last name", presenter.getInvalidFields().get("step1#Basic Form One:user_last_name").getErrorMessage());
assertEquals("Please enter user age", presenter.getInvalidFields().get("step1#Basic Form One:user_age").getErrorMessage());
assertEquals("Please enter the first name", presenter.getInvalidFields().get("step1#Basic Form One:user_first_name").getErrorMessage());
assertEquals("Please enter the sex", presenter.getInvalidFields().get("step1#Basic Form One:user_spinner").getErrorMessage());
verify(formFragment, times(6)).writeValue(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyBoolean());
assertNull(presenter.getErrorFragment());
assertNull(ShadowToast.getLatestToast());
verify(formFragment, never()).onFormFinish();
verify(formFragment).showSnackBar(context.getString(R.string.json_form_error_msg, 4));
}

@Test
public void testOnActivityResult() {
when(formFragment.getContext()).thenReturn(context);
presenter.onActivityResult(RESULT_LOAD_IMG, RESULT_CANCELED, null);
verify(formFragment).getJsonApi();
verifyNoMoreInteractions(formFragment);
presenter.onActivityResult(RESULT_LOAD_IMG, RESULT_OK, null);
verify(formFragment).updateRelevantImageView(null, null, null);
}

@Test
@Config(shadows = {ShadowContextCompat.class, ShadowPermissionUtils.class})
public void testOnRequestPermissionsResultDisplaysCameraIntent() {
Whitebox.setInternalState(presenter, "key", "user_image");
Whitebox.setInternalState(presenter, "type", "choose_image");
when(formFragment.getContext()).thenReturn(context);
presenter.onRequestPermissionsResult(CAMERA_PERMISSION_REQUEST_CODE, new String[]{permission.CAMERA, permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE}, new int[5]);
verify(formFragment).hideKeyBoard();
assertEquals("user_image",Whitebox.getInternalState(presenter,"mCurrentKey"));
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.vijay.jsonwizard.shadow;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

/**
* Created by samuelgithengi on 3/17/20.
*/
@Implements(ContextCompat.class)
public class ShadowContextCompat {

@Implementation
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission){
return 1;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.vijay.jsonwizard.shadow;

import android.support.v4.app.Fragment;

import com.vijay.jsonwizard.utils.PermissionUtils;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

/**
* Created by samuelgithengi on 3/17/20.
*/
@Implements(PermissionUtils.class)
public class ShadowPermissionUtils {

@Implementation
public static boolean isPermissionGranted(Fragment fragment, String[] permissions, int requestCode){
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,11 @@ public void testDpToPx() {
Mockito.doReturn(resources).when(context).getResources();
Mockito.doReturn(displayMetrics).when(resources).getDisplayMetrics();

Whitebox.setInternalState(displayMetrics, "density", 5);

float dpString = 30.0f;
int expected = 150;
float dpString = 30.0f;
PowerMockito.mockStatic(TypedValue.class);
PowerMockito.when(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpString, displayMetrics)).thenReturn(Float
.valueOf(expected));

int px = FormUtils.dpToPixels(context, dpString);
Assert.assertEquals(expected, px);
Expand Down Expand Up @@ -114,13 +115,16 @@ public void testGetValueFromSpOrDpOrPxWithADpInput() {
Mockito.doReturn(context).when(application).getApplicationContext();
Mockito.doReturn(resources).when(context).getResources();
Mockito.doReturn(displayMetrics).when(resources).getDisplayMetrics();

String dpString = "30dp";
int expected = 150;
PowerMockito.mockStatic(TextUtils.class);
PowerMockito.mockStatic(TypedValue.class);
PowerMockito.when(!TextUtils.isEmpty(dpString)).thenReturn(false);
Whitebox.setInternalState(displayMetrics, "density", 5);

Float dp = 30f;
int expected = 150;
PowerMockito.mockStatic(TypedValue.class);
PowerMockito.when(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics)).thenReturn(Float
.valueOf(expected));


int px = FormUtils.getValueFromSpOrDpOrPx(dpString, context);
Assert.assertEquals(expected, px);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.view.Display;
import android.view.WindowManager;
Expand Down Expand Up @@ -37,16 +38,8 @@ public void setUp() {

@Test
public void testGetDeviceWidth() {
Application application = Mockito.spy(Application.class);
Mockito.doReturn(context).when(application).getApplicationContext();
Mockito.doReturn(windowManager).when(context).getSystemService(Context.WINDOW_SERVICE);
Assert.assertNotNull(windowManager);
Mockito.doReturn(display).when(windowManager).getDefaultDisplay();
Assert.assertNotNull(display);

int width = ImageUtils.getDeviceWidth(context);
Assert.assertEquals(0, width);
Mockito.verify(display).getWidth();
Assert.assertEquals(Resources.getSystem().getDisplayMetrics().widthPixels, width);
}

@Test
Expand Down

0 comments on commit 39dbd32

Please sign in to comment.