From 9c0e9063a6c3281548a8d230883315c8a6591e0e Mon Sep 17 00:00:00 2001 From: bennsimon Date: Tue, 27 Oct 2020 11:07:19 +0300 Subject: [PATCH 1/2] add tests to shoeInformationDialog --- .../presenters/JsonFormFragmentPresenter.java | 230 +++++++++--------- ...FormFragmentPresenterRoboElectricTest.java | 46 ++++ 2 files changed, 166 insertions(+), 110 deletions(-) diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java index a9a47169e..237f8aa56 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java @@ -13,6 +13,8 @@ import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.FileProvider; @@ -92,8 +94,8 @@ public class JsonFormFragmentPresenter extends MvpBasePresenter> { - private static final String TAG = "FormFragmentPresenter"; protected static final int RESULT_LOAD_IMG = 1; + private static final String TAG = "FormFragmentPresenter"; private final JsonFormFragment formFragment; protected JSONObject mStepDetails; protected String key; @@ -121,6 +123,109 @@ public JsonFormFragmentPresenter(JsonFormFragment formFragment) { incorrectlyFormattedFields = new Stack<>(); } + public static ValidationStatus validate(JsonFormFragmentView formFragmentView, View childAt, + boolean requestFocus) { + if (childAt instanceof RadioGroup) { + RadioGroup radioGroup = (RadioGroup) childAt; + ValidationStatus validationStatus = NativeRadioButtonFactory + .validate(formFragmentView, radioGroup); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } else if (childAt instanceof NativeEditText) { + NativeEditText editText = (NativeEditText) childAt; + ValidationStatus validationStatus = NativeEditTextFactory + .validate(formFragmentView, editText); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } else if (childAt instanceof MaterialEditText) { + MaterialEditText editText = (MaterialEditText) childAt; + ValidationStatus validationStatus = EditTextFactory.validate(formFragmentView, editText); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } else if (childAt instanceof ImageView) { + ValidationStatus validationStatus = ImagePickerFactory + .validate(formFragmentView, (ImageView) childAt); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } else if (childAt instanceof Button) { + String type = (String) childAt.getTag(R.id.type); + if (!TextUtils.isEmpty(type) && type.equals(JsonFormConstants.GPS)) { + ValidationStatus validationStatus = GpsFactory.validate(formFragmentView, (Button) childAt); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } + } else if (childAt instanceof MaterialSpinner) { + final MaterialSpinner spinner = (MaterialSpinner) childAt; + final ValidationStatus validationStatus = SpinnerFactory.validate(formFragmentView, spinner); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + ((JsonFormActivity) formFragmentView.getContext()).runOnUiThread(new Runnable() { + @Override + public void run() { + setSpinnerError(spinner, validationStatus.getErrorMessage()); + } + }); + return validationStatus; + } + } else if (childAt instanceof ViewGroup + && childAt.getTag(R.id.is_checkbox_linear_layout) != null && + Boolean.TRUE.equals(childAt.getTag(R.id.is_checkbox_linear_layout))) { + LinearLayout checkboxLinearLayout = (LinearLayout) childAt; + ValidationStatus validationStatus = CheckBoxFactory + .validate(formFragmentView, checkboxLinearLayout); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + + } else if (childAt instanceof ViewGroup + && childAt.getTag(R.id.is_number_selector_linear_layout) != null && + Boolean.TRUE.equals(childAt.getTag(R.id.is_number_selector_linear_layout))) { + ValidationStatus validationStatus = NumberSelectorFactory + .validate(formFragmentView, (ViewGroup) childAt); + if (!validationStatus.isValid()) { + if (requestFocus) { + validationStatus.requestAttention(); + } + return validationStatus; + } + } + + return new ValidationStatus(true, null, null, null); + } + + private static void setSpinnerError(MaterialSpinner spinner, String spinnerError) { + try { + spinner.setError(spinnerError); + } catch (IllegalArgumentException e) { + Log.e(TAG, e.getMessage(), e); + } + } + public JsonFormFragment getFormFragment() { return formFragment; } @@ -411,109 +516,6 @@ public Map getInvalidFields() { return invalidFields; } - public static ValidationStatus validate(JsonFormFragmentView formFragmentView, View childAt, - boolean requestFocus) { - if (childAt instanceof RadioGroup) { - RadioGroup radioGroup = (RadioGroup) childAt; - ValidationStatus validationStatus = NativeRadioButtonFactory - .validate(formFragmentView, radioGroup); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } else if (childAt instanceof NativeEditText) { - NativeEditText editText = (NativeEditText) childAt; - ValidationStatus validationStatus = NativeEditTextFactory - .validate(formFragmentView, editText); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } else if (childAt instanceof MaterialEditText) { - MaterialEditText editText = (MaterialEditText) childAt; - ValidationStatus validationStatus = EditTextFactory.validate(formFragmentView, editText); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } else if (childAt instanceof ImageView) { - ValidationStatus validationStatus = ImagePickerFactory - .validate(formFragmentView, (ImageView) childAt); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } else if (childAt instanceof Button) { - String type = (String) childAt.getTag(R.id.type); - if (!TextUtils.isEmpty(type) && type.equals(JsonFormConstants.GPS)) { - ValidationStatus validationStatus = GpsFactory.validate(formFragmentView, (Button) childAt); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } - } else if (childAt instanceof MaterialSpinner) { - final MaterialSpinner spinner = (MaterialSpinner) childAt; - final ValidationStatus validationStatus = SpinnerFactory.validate(formFragmentView, spinner); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - ((JsonFormActivity) formFragmentView.getContext()).runOnUiThread(new Runnable() { - @Override - public void run() { - setSpinnerError(spinner, validationStatus.getErrorMessage()); - } - }); - return validationStatus; - } - } else if (childAt instanceof ViewGroup - && childAt.getTag(R.id.is_checkbox_linear_layout) != null && - Boolean.TRUE.equals(childAt.getTag(R.id.is_checkbox_linear_layout))) { - LinearLayout checkboxLinearLayout = (LinearLayout) childAt; - ValidationStatus validationStatus = CheckBoxFactory - .validate(formFragmentView, checkboxLinearLayout); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - - } else if (childAt instanceof ViewGroup - && childAt.getTag(R.id.is_number_selector_linear_layout) != null && - Boolean.TRUE.equals(childAt.getTag(R.id.is_number_selector_linear_layout))) { - ValidationStatus validationStatus = NumberSelectorFactory - .validate(formFragmentView, (ViewGroup) childAt); - if (!validationStatus.isValid()) { - if (requestFocus) { - validationStatus.requestAttention(); - } - return validationStatus; - } - } - - return new ValidationStatus(true, null, null, null); - } - - private static void setSpinnerError(MaterialSpinner spinner, String spinnerError) { - try { - spinner.setError(spinnerError); - } catch (IllegalArgumentException e) { - Log.e(TAG, e.getMessage(), e); - } - } - public void onSaveClick(LinearLayout mainView) { validateAndWriteValues(); checkAndStopCountdownAlarm(); @@ -792,18 +794,21 @@ private void setViewGroupEditable(View childElement) { } protected void showInformationDialog(View view) { - if (view.getTag(R.id.label_dialog_image_src) != null) { showCustomDialog(view); } else { showAlertDialog(view); } + } + @VisibleForTesting + protected AlertDialog.Builder getAlertDialogBuilder() { + return new AlertDialog.Builder(getView().getContext(), + R.style.AppThemeAlertDialog); } private void showAlertDialog(View view) { - AlertDialog.Builder builderSingle = new AlertDialog.Builder(getView().getContext(), - R.style.AppThemeAlertDialog); + AlertDialog.Builder builderSingle = getAlertDialogBuilder(); builderSingle.setTitle((String) view.getTag(R.id.label_dialog_title)); builderSingle.setMessage((String) view.getTag(R.id.label_dialog_info)); builderSingle.setIcon(R.drawable.dialog_info_filled); @@ -819,8 +824,13 @@ public void onClick(DialogInterface dialog, int which) { builderSingle.show(); } - private void showCustomDialog(View view) { - final Dialog dialog = new Dialog(view.getContext()); + @VisibleForTesting + protected Dialog getCustomDialog(View view) { + return new Dialog(view.getContext()); + } + + private void showCustomDialog(@NonNull View view) { + final Dialog dialog = getCustomDialog(view); dialog.setContentView(R.layout.native_form_custom_dialog); if (dialog.getWindow() != null) { WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); @@ -855,7 +865,7 @@ private void showCustomDialog(View view) { try { dialogImage.setImageDrawable(FormUtils.readImageFromAsset(view.getContext(), imagePath)); } catch (IOException e) { - Log.e(TAG, "Encountered an error reading image from assets" + e); + Timber.e(e); } dialogButton.setOnClickListener(new View.OnClickListener() { @Override diff --git a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java index fa8f2a245..f40a9c817 100644 --- a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java +++ b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java @@ -1,6 +1,8 @@ package com.vijay.jsonwizard.presenters; import android.Manifest.permission; +import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -37,6 +39,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.powermock.reflect.Whitebox; @@ -536,4 +539,47 @@ public void testOnItemSelectedShouldWriteSelectedValueToForm() throws JSONExcept nullable(String.class), nullable(String.class), nullable(String.class), eq(false)); } + + @Test + public void testShowInformationDialogShouldShowCustomDialog() { + View view = new View(RuntimeEnvironment.application); + view.setTag(R.id.label_dialog_image_src, "label"); + view.setTag(R.id.label_dialog_title, "title"); + view.setTag(R.id.label_dialog_info, "info"); + + JsonFormFragmentPresenter spyPresenter = Mockito.spy(presenter); + Dialog dialogSpy = Mockito.spy(new Dialog(view.getContext())); + Mockito.doReturn(dialogSpy).when(spyPresenter).getCustomDialog(view); + spyPresenter.showInformationDialog(view); + + verify(dialogSpy, Mockito.times(1)).show(); + + assertTrue(dialogSpy.findViewById(R.id.dialogText).isShown()); + + assertTrue(dialogSpy.findViewById(R.id.dialogTitle).isShown()); + + assertTrue(dialogSpy.findViewById(R.id.dialogImage).isShown()); + + dialogSpy.findViewById(R.id.dialogButton).performClick(); + + verify(dialogSpy, Mockito.times(1)).dismiss(); + } + + @Test + public void testShowInformationDialogShouldShowAlertDialog() { + View view = new View(RuntimeEnvironment.application); + view.setTag(R.id.label_dialog_title, "title"); + view.setTag(R.id.label_dialog_info, "info"); + + JsonFormFragmentPresenter spyPresenter = Mockito.spy(presenter); + + AlertDialog.Builder spyBuilder = Mockito.spy(new AlertDialog.Builder(view.getContext(), + R.style.AppThemeAlertDialog)); + + Mockito.doReturn(spyBuilder).when(spyPresenter).getAlertDialogBuilder(); + + spyPresenter.showInformationDialog(view); + + verify(spyBuilder, Mockito.times(1)).show(); + } } From 57a2c656b2719a5c5405c92afa0703cb354da03c Mon Sep 17 00:00:00 2001 From: bennsimon Date: Tue, 27 Oct 2020 11:19:37 +0300 Subject: [PATCH 2/2] fix codacy issue --- ...FormFragmentPresenterRoboElectricTest.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java index f40a9c817..92c52d13b 100644 --- a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java +++ b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenterRoboElectricTest.java @@ -39,7 +39,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.powermock.reflect.Whitebox; @@ -547,12 +546,12 @@ public void testShowInformationDialogShouldShowCustomDialog() { view.setTag(R.id.label_dialog_title, "title"); view.setTag(R.id.label_dialog_info, "info"); - JsonFormFragmentPresenter spyPresenter = Mockito.spy(presenter); - Dialog dialogSpy = Mockito.spy(new Dialog(view.getContext())); - Mockito.doReturn(dialogSpy).when(spyPresenter).getCustomDialog(view); + JsonFormFragmentPresenter spyPresenter = spy(presenter); + Dialog dialogSpy = spy(new Dialog(view.getContext())); + doReturn(dialogSpy).when(spyPresenter).getCustomDialog(view); spyPresenter.showInformationDialog(view); - verify(dialogSpy, Mockito.times(1)).show(); + verify(dialogSpy, times(1)).show(); assertTrue(dialogSpy.findViewById(R.id.dialogText).isShown()); @@ -562,7 +561,7 @@ public void testShowInformationDialogShouldShowCustomDialog() { dialogSpy.findViewById(R.id.dialogButton).performClick(); - verify(dialogSpy, Mockito.times(1)).dismiss(); + verify(dialogSpy, times(1)).dismiss(); } @Test @@ -571,15 +570,15 @@ public void testShowInformationDialogShouldShowAlertDialog() { view.setTag(R.id.label_dialog_title, "title"); view.setTag(R.id.label_dialog_info, "info"); - JsonFormFragmentPresenter spyPresenter = Mockito.spy(presenter); + JsonFormFragmentPresenter spyPresenter = spy(presenter); - AlertDialog.Builder spyBuilder = Mockito.spy(new AlertDialog.Builder(view.getContext(), + AlertDialog.Builder spyBuilder = spy(new AlertDialog.Builder(view.getContext(), R.style.AppThemeAlertDialog)); - Mockito.doReturn(spyBuilder).when(spyPresenter).getAlertDialogBuilder(); + doReturn(spyBuilder).when(spyPresenter).getAlertDialogBuilder(); spyPresenter.showInformationDialog(view); - verify(spyBuilder, Mockito.times(1)).show(); + verify(spyBuilder, times(1)).show(); } }