From 67dba38c74be127f0ecb1eab506bd2d051dccfe3 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Fri, 5 Mar 2021 03:27:47 +0530 Subject: [PATCH 01/15] task/DTSERWFOUR-235-Display-currency-codes-beneath-Available-Funds-labels --- settings.gradle | 1 + transferui/build.gradle | 1 + .../android/ui/transfer/TransferSource.java | 10 +- .../transfer/view/CreateTransferActivity.java | 7 +- .../transfer/view/CreateTransferFragment.java | 2 +- .../view/ListTransferSourceFragment.java | 2 +- .../view/ScheduleTransferFragment.java | 2 +- .../viewmodel/CreateTransferViewModel.java | 75 ++++++-- userbalancerepository/.gitignore | 1 + userbalancerepository/build.gradle | 12 ++ userbalancerepository/proguard-rules.pro | 21 +++ .../src/main/AndroidManifest.xml | 2 + .../repository/UserBalanceRepository.java | 56 ++++++ .../UserBalanceRepositoryFactory.java | 42 +++++ .../repository/UserBalanceRepositoryImpl.java | 66 +++++++ .../UserBalanceRepositoryFactoryTest.java | 34 ++++ .../UserBalanceRepositoryImplTest.java | 174 ++++++++++++++++++ .../src/test/resources/robolectric.properties | 1 + 18 files changed, 488 insertions(+), 21 deletions(-) create mode 100644 userbalancerepository/.gitignore create mode 100644 userbalancerepository/build.gradle create mode 100644 userbalancerepository/proguard-rules.pro create mode 100644 userbalancerepository/src/main/AndroidManifest.xml create mode 100644 userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java create mode 100644 userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java create mode 100644 userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java create mode 100644 userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java create mode 100644 userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java create mode 100644 userbalancerepository/src/test/resources/robolectric.properties diff --git a/settings.gradle b/settings.gradle index 5936c0594..193534004 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,5 @@ include ':commonui', ':transferrepository', ':transferui', ':userrepository', + ':userbalancerepository', ':testutils' diff --git a/transferui/build.gradle b/transferui/build.gradle index bf96374a1..ed60e9e79 100644 --- a/transferui/build.gradle +++ b/transferui/build.gradle @@ -15,6 +15,7 @@ dependencies { implementation project(":transfermethodrepository") implementation project(":userrepository") implementation project(":commonui") + implementation project(":userbalancerepository") implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/TransferSource.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/TransferSource.java index 1961bb4b6..29be4d876 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/TransferSource.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/TransferSource.java @@ -10,6 +10,7 @@ public class TransferSource implements Parcelable { private TransferMethod identification; private String type; private String token; + private String currencyCodes; public TransferSource() { } @@ -18,6 +19,7 @@ protected TransferSource(final Parcel in) { identification = in.readParcelable(TransferMethod.class.getClassLoader()); type = in.readString(); token = in.readString(); + currencyCodes = in.readString(); } @Override @@ -25,6 +27,7 @@ public void writeToParcel(final Parcel dest, int flags) { dest.writeParcelable(identification, flags); dest.writeString(type); dest.writeString(token); + dest.writeString(currencyCodes); } public static final Creator CREATOR = new Creator() { @@ -63,8 +66,13 @@ public TransferMethod getIdentification() { public void setIdentification(final TransferMethod identification) { this.identification = identification; } + public void setCurrencyCodes(final String currencyCodes) { + this.currencyCodes = currencyCodes; + } - + public String getCurrencyCodes() { + return currencyCodes; + } @Override public int describeContents() { return 0; diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java index d9ba2949b..6eda408e4 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java @@ -45,6 +45,7 @@ import com.hyperwallet.android.ui.transfer.viewmodel.CreateTransferViewModel; import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepositoryFactory; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepositoryFactory; +import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.user.repository.UserRepositoryFactory; /** @@ -86,13 +87,15 @@ public void onClick(View v) { TransferRepositoryFactory.getInstance().getTransferRepository(), TransferMethodRepositoryFactory.getInstance().getTransferMethodRepository(), UserRepositoryFactory.getInstance().getUserRepository(), - PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository()); + PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository(), + UserBalanceRepositoryFactory.getInstance().getUserBalanceRepository()); } else { factory = new CreateTransferViewModel.CreateTransferViewModelFactory(sourceToken, TransferRepositoryFactory.getInstance().getTransferRepository(), TransferMethodRepositoryFactory.getInstance().getTransferMethodRepository(), UserRepositoryFactory.getInstance().getUserRepository(), - PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository()); + PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository(), + UserBalanceRepositoryFactory.getInstance().getUserBalanceRepository()); } mCreateTransferViewModel = ViewModelProviders.of(this, factory).get(CreateTransferViewModel.class); diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java index a13061919..eafda9bad 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java @@ -87,7 +87,7 @@ public class CreateTransferFragment extends Fragment { private static final String NOTES_TAG = "NOTES_TAGGED"; private static final String ELLIPSIS = "..."; private static final int NOTES_MAX_LINE_LENGTH = 40; - private static final String REGEX_ONLY_NUMBER = "[^0-9]"; + public static final String REGEX_ONLY_NUMBER = "[^0-9]"; private static final String REGEX_REMOVE_EMPTY_SPACE = "^\\s+|\\s+$"; public static final String REGEX_ONLY_NUMBER_AND_DECIMAL = "[^0-9.]"; private static final String US_CURRENCY_CODE = "USD"; diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ListTransferSourceFragment.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ListTransferSourceFragment.java index c788fb7e5..1d21866ed 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ListTransferSourceFragment.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ListTransferSourceFragment.java @@ -229,7 +229,7 @@ void bind(@NonNull final TransferSource source, final boolean selected) { mTitle.setText(mTitle.getContext().getString(R.string.availableFunds)); mIcon.setText(mIcon.getContext().getString(R.string.available_funds_font_icon)); } - mTransferSourceIdentification.setText(source.getIdentification() == null ? "" + mTransferSourceIdentification.setText(source.getIdentification() == null ? source.getCurrencyCodes() : getTransferMethodDetail(mTransferSourceIdentification.getContext(), source.getIdentification(), source.getType())); diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ScheduleTransferFragment.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ScheduleTransferFragment.java index e0424e7e0..3ba2724b9 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ScheduleTransferFragment.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/ScheduleTransferFragment.java @@ -155,7 +155,7 @@ private void showTransferSource() { transferSourceTitle.setText(transferSourceIdentifier.getContext().getString(R.string.availableFunds)); transferSourceIcon.setText(transferSourceIcon.getContext().getString(R.string.available_funds_font_icon)); } - transferSourceIdentifier.setText(transferSource.getIdentification() == null ? "" + transferSourceIdentifier.setText(transferSource.getIdentification() == null ? transferSource.getCurrencyCodes() : getTransferMethodDetail(transferSourceIdentifier.getContext(), transferSource.getIdentification(), transferSource.getType())); } diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java index 98d451487..fa620356f 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java @@ -23,6 +23,7 @@ import static com.hyperwallet.android.model.transfermethod.TransferMethod.TransferMethodTypes.BANK_ACCOUNT; import static com.hyperwallet.android.model.transfermethod.TransferMethod.TransferMethodTypes.PREPAID_CARD; import static com.hyperwallet.android.ui.common.intent.HyperwalletIntent.ERROR_SDK_MODULE_UNAVAILABLE; +import static com.hyperwallet.android.ui.transfer.view.CreateTransferFragment.REGEX_ONLY_NUMBER; import android.os.Handler; import android.text.TextUtils; @@ -41,6 +42,7 @@ import com.hyperwallet.android.listener.HyperwalletListener; import com.hyperwallet.android.model.Error; import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; import com.hyperwallet.android.model.transfer.Transfer; import com.hyperwallet.android.model.transfermethod.PrepaidCard; import com.hyperwallet.android.model.transfermethod.TransferMethod; @@ -52,6 +54,7 @@ import com.hyperwallet.android.ui.transfer.repository.TransferRepository; import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepository; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepository; +import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepository; import com.hyperwallet.android.ui.user.repository.UserRepository; import java.util.ArrayList; @@ -73,12 +76,13 @@ public class CreateTransferViewModel extends ViewModel { private static final String DESTINATION_TOKEN_INPUT_FIELD = "destinationToken"; private static final String PRIVATE_TOKEN_PREFIX = "trm-"; public static final String CURRENCY_DOT_SEPARATOR = "."; - + public static final String COMMA_SEPARATOR = ", "; private final TransferRepository mTransferRepository; private final TransferMethodRepository mTransferMethodRepository; private final UserRepository mUserRepository; private final PrepaidCardRepository mPrepaidCardRepository; + private final UserBalanceRepository mUserBalanceRepository; private final MutableLiveData mTransferDestination = new MutableLiveData<>(); private final MutableLiveData mTransferAvailableFunds = new MutableLiveData<>(); @@ -112,24 +116,26 @@ public class CreateTransferViewModel extends ViewModel { /** * Initialize Create Transfer View Model with designated transfer source token - * - * @param sourceToken Source token that represents either from User, Bank or PrepaidCard tokens + * @param sourceToken Source token that represents either from User, Bank or PrepaidCard tokens * @param transferRepository Transfer repository for making transfer calls to Hyperwallet * @param transferMethodRepository Transfer Method repository for making transfer method calls to - * Hyperwallet + * Hyperwallet * @param userRepository User repository for making user calls to Hyperwallet * @param prepaidCardRepository prepaid card repository for making prepaid calls to Hyperwallet + * @param userBalanceRepository */ CreateTransferViewModel(@NonNull final String sourceToken, - @NonNull final TransferRepository transferRepository, - @NonNull final TransferMethodRepository transferMethodRepository, - @NonNull final UserRepository userRepository, @NonNull PrepaidCardRepository prepaidCardRepository) { + @NonNull final TransferRepository transferRepository, + @NonNull final TransferMethodRepository transferMethodRepository, + @NonNull final UserRepository userRepository, @NonNull PrepaidCardRepository prepaidCardRepository, + @NonNull UserBalanceRepository userBalanceRepository) { mTransferRepository = transferRepository; mTransferMethodRepository = transferMethodRepository; mUserRepository = userRepository; mSourceToken = sourceToken; mPrepaidCardRepository = prepaidCardRepository; + mUserBalanceRepository = userBalanceRepository; // initialize initialize(); @@ -137,19 +143,21 @@ public class CreateTransferViewModel extends ViewModel { /** * Initialize Create Transfer View Model with designated transfer source token - * - * @param transferRepository Transfer repository for making transfer calls to Hyperwallet + * @param transferRepository Transfer repository for making transfer calls to Hyperwallet * @param transferMethodRepository Transfer Method repository for making transfer method calls to Hyperwallet * @param userRepository User repository for making user calls to Hyperwallet + * @param userBalanceRepository */ CreateTransferViewModel(@NonNull final TransferRepository transferRepository, - @NonNull final TransferMethodRepository transferMethodRepository, - @NonNull final UserRepository userRepository, @NonNull final PrepaidCardRepository prepaidCardRepository) { + @NonNull final TransferMethodRepository transferMethodRepository, + @NonNull final UserRepository userRepository, @NonNull final PrepaidCardRepository prepaidCardRepository, + @NonNull UserBalanceRepository userBalanceRepository) { mTransferRepository = transferRepository; mTransferMethodRepository = transferMethodRepository; mUserRepository = userRepository; mPrepaidCardRepository = prepaidCardRepository; + mUserBalanceRepository = userBalanceRepository; // Initialize initialize(); @@ -443,6 +451,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); + loadUserBalance(sources.get(0)); loadPrepaidCardList(sources); } @@ -457,6 +466,24 @@ public void onError(@NonNull Errors errors) { } } + void loadUserBalance(final TransferSource source) + { + mIsLoading.postValue(Boolean.TRUE); + mUserBalanceRepository.loadUserBalances(new UserBalanceRepository.LoadUserBalanceListCallback() { + @Override + public void onUserBalanceListLoaded(@NonNull List balances) { + source.setCurrencyCodes(getCurrencyCode(balances)); + System.out.println(" currency code "+getCurrencyCode(balances)+" -- "+balances.size()); + } + + @Override + public void onError(@NonNull Errors errors) { + mIsLoading.postValue(Boolean.FALSE); + mLoadTransferRequiredDataErrors.postValue(new Event<>(errors)); + } + }); + } + @VisibleForTesting void loadTransferDestination(@NonNull final String sourceToken) { mIsLoading.postValue(Boolean.TRUE); @@ -646,6 +673,20 @@ private boolean hasTransferAmountChanged(@Nullable final Transfer transfer) { transfer.getDestinationAmount(), mTransferAmount.getValue()); } + private String getCurrencyCode(List balances) + { + StringBuilder builder = new StringBuilder(); + for (Balance balance:balances) { + if (Double.parseDouble(balance.getAmount().replaceAll(REGEX_ONLY_NUMBER, EMPTY_STRING)) != 0.0) { + if (builder.length() > 0){ + builder.append(COMMA_SEPARATOR); + } + builder.append(balance.getCurrency()); + } + } + return builder.toString(); + } + public ProgramModel getProgramModel() { getHyperwallet().getConfiguration(new HyperwalletListener() { @Override @@ -696,28 +737,32 @@ public static class CreateTransferViewModelFactory implements ViewModelProvider. private final UserRepository userRepository; private final String sourceToken; private final PrepaidCardRepository prepaidCardRepository; + private final UserBalanceRepository userBalanceRepository; public CreateTransferViewModelFactory(@NonNull final String sourceToken, @NonNull final TransferRepository transferRepository, @NonNull final TransferMethodRepository transferMethodRepository, @NonNull final UserRepository userRepository, - @NonNull final PrepaidCardRepository prepaidCardRepository) { + @NonNull final PrepaidCardRepository prepaidCardRepository, @NonNull final UserBalanceRepository userBalanceRepository) { this.sourceToken = sourceToken; this.transferMethodRepository = transferMethodRepository; this.transferRepository = transferRepository; this.userRepository = userRepository; this.prepaidCardRepository = prepaidCardRepository; + this.userBalanceRepository = userBalanceRepository; } public CreateTransferViewModelFactory(@NonNull final TransferRepository transferRepository, @NonNull final TransferMethodRepository transferMethodRepository, @NonNull final UserRepository userRepository, - @NonNull final PrepaidCardRepository prepaidCardRepository) { + @NonNull final PrepaidCardRepository prepaidCardRepository, + @NonNull final UserBalanceRepository userBalanceRepository) { this.sourceToken = null; this.transferMethodRepository = transferMethodRepository; this.transferRepository = transferRepository; this.userRepository = userRepository; this.prepaidCardRepository = prepaidCardRepository; + this.userBalanceRepository = userBalanceRepository; } @NonNull @@ -726,10 +771,10 @@ public T create(@NonNull Class modelClass) { if (modelClass.isAssignableFrom(CreateTransferViewModel.class)) { if (TextUtils.isEmpty(sourceToken)) { return (T) new CreateTransferViewModel(transferRepository, transferMethodRepository, - userRepository, prepaidCardRepository); + userRepository, prepaidCardRepository, userBalanceRepository); } return (T) new CreateTransferViewModel(sourceToken, transferRepository, transferMethodRepository, - userRepository, prepaidCardRepository); + userRepository, prepaidCardRepository, userBalanceRepository); } throw new IllegalArgumentException("Expecting ViewModel class: " + CreateTransferViewModel.class.getName()); diff --git a/userbalancerepository/.gitignore b/userbalancerepository/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/userbalancerepository/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/userbalancerepository/build.gradle b/userbalancerepository/build.gradle new file mode 100644 index 000000000..cfe277075 --- /dev/null +++ b/userbalancerepository/build.gradle @@ -0,0 +1,12 @@ +apply from: "$rootProject.projectDir/android-library.gradle" +description = 'Hyperwallet User Balance Repository SDK for Android to integrate with the Hyperwallet Platform' +project.ext { + mavenName = 'Hyperwallet Android User Balance Repository SDK' +} +apply from: "$rootProject.projectDir/publish.gradle" + +dependencies { + testImplementation "org.robolectric:robolectric:$robolectricVersion" + testImplementation "com.squareup.okhttp3:mockwebserver:$mockWebServerVersion" + testImplementation project(':testutils') +} diff --git a/userbalancerepository/proguard-rules.pro b/userbalancerepository/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/userbalancerepository/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/userbalancerepository/src/main/AndroidManifest.xml b/userbalancerepository/src/main/AndroidManifest.xml new file mode 100644 index 000000000..3a6117c7e --- /dev/null +++ b/userbalancerepository/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java new file mode 100644 index 000000000..98a8690a6 --- /dev/null +++ b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java @@ -0,0 +1,56 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.user.balance.repository; + +import androidx.annotation.NonNull; + +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; + +import java.util.List; + +/** + * User balance repository + */ +public interface UserBalanceRepository { + /** + * Load user balances + * + * @param callback + */ + void loadUserBalances(@NonNull final LoadUserBalanceListCallback callback); + + /** + * Load User balance callback + */ + interface LoadUserBalanceListCallback { + /** + * User balance loaded callback + * + * @param balances + */ + void onUserBalanceListLoaded(@NonNull final List balances); + + /** + * User balance load error + * + * @param errors + */ + void onError(@NonNull final Errors errors); + } +} \ No newline at end of file diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java new file mode 100644 index 000000000..32e0cb763 --- /dev/null +++ b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.user.balance.repository; + +public class UserBalanceRepositoryFactory { + private static UserBalanceRepositoryFactory sInstance; + private UserBalanceRepository mUserBalanceRepository; + + private UserBalanceRepositoryFactory() { + mUserBalanceRepository = new UserBalanceRepositoryImpl(); + } + + public static synchronized UserBalanceRepositoryFactory getInstance() { + if (sInstance == null) { + sInstance = new UserBalanceRepositoryFactory(); + } + return sInstance; + } + + public static void clearInstance() { + sInstance = null; + } + + public UserBalanceRepository getUserBalanceRepository() { + return mUserBalanceRepository; + } +} diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java new file mode 100644 index 000000000..5985bfa40 --- /dev/null +++ b/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java @@ -0,0 +1,66 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.hyperwallet.android.ui.user.balance.repository; + +import android.os.Handler; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; + +import java.util.ArrayList; + +public class UserBalanceRepositoryImpl implements UserBalanceRepository { + + private Handler mHandler = new Handler(); + private int LIMIT = 100; + + @VisibleForTesting + Hyperwallet getHyperwallet() { + return Hyperwallet.getDefault(); + } + + @Override + public void loadUserBalances(@NonNull final LoadUserBalanceListCallback callback) { + BalanceQueryParam queryParam = new BalanceQueryParam.Builder().limit(LIMIT).build(); + getHyperwallet().listUserBalances(queryParam, new HyperwalletListener>() { + @Override + public void onSuccess(@Nullable PageList result) { + callback.onUserBalanceListLoaded(result != null ? result.getDataList() : new ArrayList()); + } + + @Override + public void onFailure(HyperwalletException exception) { + callback.onError(exception.getErrors()); + } + + @Override + public Handler getHandler() { + return mHandler; + } + }); + } +} diff --git a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java new file mode 100644 index 000000000..59fd421be --- /dev/null +++ b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java @@ -0,0 +1,34 @@ +package com.hyperwallet.android.ui.user.balance.repository; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + +public class UserBalanceRepositoryFactoryTest { + + @Test + public void testGetInstance_verifyRepositoriesInitialized() { + UserBalanceRepositoryFactory userBalanceRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(notNullValue())); + assertThat(userBalanceRepositoryFactory.getUserBalanceRepository(), is(notNullValue())); + } + + @Test + public void testClearInstance_verifyRepositoriesCleared() { + UserBalanceRepositoryFactory userBalanceRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + + UserBalanceRepository userConfigurationRepository = userBalanceRepositoryFactory.getUserBalanceRepository(); + + UserBalanceRepositoryFactory currentRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(currentRepositoryFactory)); + + UserBalanceRepositoryFactory.clearInstance(); + + UserBalanceRepositoryFactory anotherRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(not(anotherRepositoryFactory))); + assertThat(userConfigurationRepository, is(not(anotherRepositoryFactory.getUserBalanceRepository()))); + } +} diff --git a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java new file mode 100644 index 000000000..1b6453673 --- /dev/null +++ b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java @@ -0,0 +1,174 @@ +package com.hyperwallet.android.ui.user.balance.repository; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.Error; +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.paging.PageList; +import com.hyperwallet.android.model.transfermethod.TransferMethod; +import com.hyperwallet.android.model.user.User; +import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; + +import org.hamcrest.Matchers; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +import static com.hyperwallet.android.model.user.User.ProfileTypes.INDIVIDUAL; +import static com.hyperwallet.android.model.user.User.UserStatuses.PRE_ACTIVATED; +import static com.hyperwallet.android.model.user.User.VerificationStatuses.NOT_REQUIRED; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(RobolectricTestRunner.class) +public class UserBalanceRepositoryImplTest { + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + + @Rule + public HyperwalletExternalResourceManager mResourceManager = new HyperwalletExternalResourceManager(); + + @Mock + UserBalanceRepository.LoadUserBalanceListCallback loadUserBalanceListCallback; + @Spy + UserBalanceRepositoryImpl userBalanceRepository; + @Mock + private Hyperwallet mHyperwallet; + @Captor + private ArgumentCaptor mErrorCaptor; + @Captor + private ArgumentCaptor> mUserBalanceCaptor; + + @Before + public void setup() { + doReturn(mHyperwallet).when(userBalanceRepository).getHyperwallet(); + } + + @Test + public void testLoadUserBalances_returnsBalances() throws JSONException, HyperwalletException { + + final String response = mResourceManager.getResourceContent("user_balances.json"); + JSONObject jObject = new JSONObject(response); + final PageList balances = new PageList<>(jObject, Balance.class); + + + /*doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + listener.onSuccess(balances); + return listener; + } + }).when(mHyperwallet).listUserBalances(any(),any());*/ + + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + + verify(loadUserBalanceListCallback).onUserBalanceListLoaded(mUserBalanceCaptor.capture()); + verify(loadUserBalanceListCallback, never()).onError(any(Errors.class)); + + verify(userBalanceRepository).getHyperwallet(); + + } + + /*@Test + public void testLoadUser_returnsNoUser() { + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); + + userBalanceRepository.loadUser(mMockCallback); + + verify(mMockCallback).onUserLoaded(mUserBalanceCaptor.capture()); + verify(mMockCallback, never()).onError(any(Errors.class)); + + User user = mUserBalanceCaptor.getValue(); + assertThat(user, is(Matchers.nullValue())); + }*/ + + + /* @Test + public void testLoadUser_withError() { + + final Error error = new Error("test message", "TEST_CODE"); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + List errorList = new ArrayList<>(); + errorList.add(error); + Errors errors = new Errors(errorList); + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); + + userBalanceRepository.loadUser(mMockCallback); + + verify(mMockCallback, never()).onUserLoaded(ArgumentMatchers.any()); + verify(mMockCallback).onError(mErrorCaptor.capture()); + + assertThat(mErrorCaptor.getValue().getErrors(), hasItem(error)); + } + + @Test + public void testRefreshUser_verifyHyperwalletCallGetUser() { + User.Builder builder = new User.Builder(); + final User user = builder + .token("test-user-token") + .profileType(INDIVIDUAL) + .build(); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + listener.onSuccess(user); + return listener; + } + }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); + + userBalanceRepository.loadUser(mMockCallback); + + verify(mHyperwallet).getUser(ArgumentMatchers.>any()); + + userBalanceRepository.loadUser(mMockCallback); + verify(mHyperwallet).getUser(ArgumentMatchers.>any()); + + userBalanceRepository.refreshUser(); + userBalanceRepository.loadUser(mMockCallback); + verify(mHyperwallet, times(2)).getUser(ArgumentMatchers.>any()); + + }*/ +} diff --git a/userbalancerepository/src/test/resources/robolectric.properties b/userbalancerepository/src/test/resources/robolectric.properties new file mode 100644 index 000000000..89a6c8b4c --- /dev/null +++ b/userbalancerepository/src/test/resources/robolectric.properties @@ -0,0 +1 @@ +sdk=28 \ No newline at end of file From ed49df01316f6292c756b03d10f371b57922eacd Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Fri, 5 Mar 2021 12:36:50 +0530 Subject: [PATCH 02/15] update unit test case --- .../CreateTransferViewModelTest.java | 82 +++++++++-------- .../UserBalanceRepositoryImplTest.java | 89 ++++++------------- .../src/test/resources/user_balances.json | 23 +++++ 3 files changed, 93 insertions(+), 101 deletions(-) create mode 100644 userbalancerepository/src/test/resources/user_balances.json diff --git a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java index f90584c98..53e31f79a 100644 --- a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java +++ b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java @@ -51,6 +51,8 @@ import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepositoryFactory; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepository; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepositoryFactory; +import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepository; +import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.user.repository.UserRepository; import com.hyperwallet.android.ui.user.repository.UserRepositoryFactory; import com.hyperwallet.android.util.JsonUtils; @@ -95,6 +97,8 @@ public class CreateTransferViewModelTest { private TransferRepository mTransferRepository; @Mock private PrepaidCardRepository mPrepaidCardRepository; + @Mock + private UserBalanceRepository mUserBalanceRepository; private Transfer mTransfer; private TransferSource mTransferSource; @@ -258,7 +262,7 @@ public void testCreateTransferViewModel_initializeWithoutFundingSource() { public void testInit_withFundingSource_walletModel() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( mTransfer.getToken(), mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); viewModel.init("0"); @@ -298,7 +302,7 @@ public void testInit_withFundingSource_walletModel() { public void testInit_withFundingSource_cardModel() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( mTransfer.getToken(), mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); viewModel.init("0"); @@ -336,7 +340,7 @@ public void testInit_withFundingSource_cardModel() { @Test public void testInit_withoutFundingSource_walletModel() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( - mTransferRepository, mTransferMethodRepository, mUserRepository, mPrepaidCardRepository + mTransferRepository, mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); viewModel.init("0"); doReturn(ProgramModel.WALLET_MODEL).when(viewModel).getProgramModel(); @@ -373,7 +377,7 @@ public void testInit_withoutFundingSource_walletModel() { @Test public void testInit_withoutFundingSource_cardModel() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( - mTransferRepository, mTransferMethodRepository, mUserRepository, mPrepaidCardRepository + mTransferRepository, mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); viewModel.init("0"); doReturn(ProgramModel.CARD_ONLY_MODEL).when(viewModel).getProgramModel(); @@ -447,7 +451,7 @@ public void testTransferNotes_verifyUpdatedTransferNotes() { public void testCreateQuoteTransfer_isSuccessful() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -484,7 +488,7 @@ public void testCreateQuoteTransfer_isSuccessful() { public void testCreateQuoteTransfer_isSuccessfulWithAllAvailableFunds() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -530,7 +534,7 @@ public void testCreateQuoteTransfer_hasGenericError() throws Exception { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); viewModel.setTransferAllAvailableFunds(true); @@ -574,7 +578,7 @@ public void testCreateQuoteTransfer_hasInvalidAmountError() throws Exception { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); viewModel.setTransferAllAvailableFunds(true); @@ -615,7 +619,7 @@ public void testCreateQuoteTransfer_hasInvalidDestinationError() throws Exceptio CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); viewModel.setTransferAllAvailableFunds(true); @@ -646,7 +650,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferSourceTokenUnknown_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -670,7 +674,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferSourceTokenUnknown_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -695,7 +699,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferDestinationUnknownOnError_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -732,7 +736,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferDestinationUnknownOnError_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -768,7 +772,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferDestinationUnknownNotFound_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -805,7 +809,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferDestinationUnknownNotFound_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -842,7 +846,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isQuoteInvalidWithQuoteObjectNull_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -874,7 +878,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isQuoteInvalidWithQuoteObjectNull_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -904,7 +908,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isQuoteInvalidWithQuoteSourceNotValid_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = spy(factory.create(CreateTransferViewModel.class)); doReturn(ProgramModel.WALLET_MODEL).when(viewModel).getProgramModel(); @@ -922,7 +926,7 @@ public void testRetry_isQuoteInvalidWithQuoteSourceNotValid_walletModel() { public void testRetry_isQuoteInvalidWithQuoteSourceNotValid_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = spy(factory.create(CreateTransferViewModel.class)); doReturn(ProgramModel.CARD_ONLY_MODEL).when(viewModel).getProgramModel(); @@ -939,7 +943,7 @@ public void testRetry_isQuoteInvalidWithQuoteSourceNotValid_cardModel() { public void testRetry_isQuoteInvalidWithQuoteDestinationNotValid_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); final Transfer transfer = new Transfer.Builder() .token("trf-transfer-token") @@ -981,7 +985,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isQuoteInvalidWithQuoteDestinationNotValid_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); final Transfer transfer = new Transfer.Builder() .token("trf-transfer-token") @@ -1022,7 +1026,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferAmountKnown_walletModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); final Transfer transfer = new Transfer.Builder() .token("trf-transfer-token") @@ -1067,7 +1071,7 @@ public Object answer(InvocationOnMock invocation) { public void testRetry_isTransferAmountKnown_cardModel() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); final Transfer transfer = new Transfer.Builder() .token("trf-transfer-token") @@ -1127,7 +1131,8 @@ public void testCreateTransferViewModelFactory_createCreateTransferViewModelUnSu TransferRepositoryFactory.getInstance().getTransferRepository(), TransferMethodRepositoryFactory.getInstance().getTransferMethodRepository(), UserRepositoryFactory.getInstance().getUserRepository(), - PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository()); + PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository(), + UserBalanceRepositoryFactory.getInstance().getUserBalanceRepository()); mExpectedException.expect(IllegalArgumentException.class); mExpectedException.expectMessage( "Expecting ViewModel class: com.hyperwallet.android.ui.transfer.viewmodel.CreateTransferViewModel"); @@ -1141,7 +1146,8 @@ public void testCreateTransferViewModelFactory_createCreateTransferViewModelSucc TransferRepositoryFactory.getInstance().getTransferRepository(), TransferMethodRepositoryFactory.getInstance().getTransferMethodRepository(), UserRepositoryFactory.getInstance().getUserRepository(), - PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository()); + PrepaidCardRepositoryFactory.getInstance().getPrepaidCardRepository(), + UserBalanceRepositoryFactory.getInstance().getUserBalanceRepository()); CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); assertThat(viewModel, is(notNullValue())); } @@ -1154,7 +1160,7 @@ class FakeModel extends ViewModel { public void testRefresh_callsRefreshWithQuote() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = spy(factory.create(CreateTransferViewModel.class)); @@ -1169,7 +1175,7 @@ public void testRefresh_callsRefreshWithQuote() { public void testRefresh_callsRefreshWithoutQuote() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -1185,7 +1191,7 @@ public void testRefresh_callsRefreshWithoutQuote() { public void testSortingPrepaidCard() throws JSONException, HyperwalletException { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -1208,7 +1214,7 @@ public void testSortingPrepaidCard() throws JSONException, HyperwalletException public void testTransferDestinationWithOutPPc() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -1237,7 +1243,7 @@ public void testNotifySourceUnavailable_hasSourceUnavailableError() { public void testTransferDestinationWithOutPPc_hasSucessWithEmpty() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); // test CreateTransferViewModel viewModel = factory.create(CreateTransferViewModel.class); @@ -1250,7 +1256,7 @@ public void testTransferDestinationWithOutPPc_hasSucessWithEmpty() { public void testRetry_isTransferSourceTokenknown() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory("usr-fake", mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); doAnswer(new Answer() { @Override @@ -1274,7 +1280,7 @@ public Object answer(InvocationOnMock invocation) { public void testRefreshTransferDestination_WithFunding() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory("usr-fake", mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = spy(factory.create(CreateTransferViewModel.class)); viewModel.refreshTransferDestination(); verify(mTransferMethodRepository, times(1)).loadLatestTransferMethod(any(TransferMethodRepository @@ -1286,7 +1292,7 @@ public void testRefreshTransferDestination_WithFunding() { public void testRefreshTransferDestination_WithoutFunding() { CreateTransferViewModel.CreateTransferViewModelFactory factory = new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, - mTransferMethodRepository, mUserRepository, mPrepaidCardRepository); + mTransferMethodRepository, mUserRepository, mPrepaidCardRepository, mUserBalanceRepository); CreateTransferViewModel viewModel = spy(factory.create(CreateTransferViewModel.class)); doReturn(ProgramModel.WALLET_MODEL).when(viewModel).getProgramModel(); viewModel.refreshTransferDestination(); @@ -1301,7 +1307,7 @@ public void testRefreshTransferDestination_WithoutFunding() { public void testRemovedPrePaidCardFromTransferMethodList() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( mTransfer.getToken(), mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); viewModel.init("0"); TransferSource source = new TransferSource(); @@ -1317,7 +1323,7 @@ public void testRemovedPrePaidCardFromTransferMethodList() { public void testCreateTransferViewModel_prepaidCardValue() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( "trm-ppc-token", mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository ,mUserBalanceRepository ).create(CreateTransferViewModel.class)); doAnswer(new Answer() { @@ -1343,7 +1349,7 @@ public Object answer(InvocationOnMock invocation) { public void testCreateTransferViewModel_prepaidCardValue_null() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( "trm-ppc-token", mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); doAnswer(new Answer() { @@ -1369,7 +1375,7 @@ public Object answer(InvocationOnMock invocation) { public void testCreateTransferViewModel_prepaidCardValue_error() { CreateTransferViewModel viewModel = spy(new CreateTransferViewModel.CreateTransferViewModelFactory( "trm-ppc-token", mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); doAnswer(new Answer() { @@ -1393,7 +1399,7 @@ public void testProgramModel() { CreateTransferViewModel viewModel = spy( new CreateTransferViewModel.CreateTransferViewModelFactory(mTransferRepository, mTransferMethodRepository, mUserRepository, - mPrepaidCardRepository + mPrepaidCardRepository, mUserBalanceRepository ).create(CreateTransferViewModel.class)); doReturn(mHyperwallet).when(viewModel).getHyperwallet(); doAnswer(new Answer() { diff --git a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java index 1b6453673..9ea8c87ce 100644 --- a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java +++ b/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java @@ -6,12 +6,10 @@ import com.hyperwallet.android.model.Error; import com.hyperwallet.android.model.Errors; import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; import com.hyperwallet.android.model.paging.PageList; -import com.hyperwallet.android.model.transfermethod.TransferMethod; -import com.hyperwallet.android.model.user.User; import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; -import org.hamcrest.Matchers; import org.json.JSONException; import org.json.JSONObject; import org.junit.Before; @@ -32,9 +30,6 @@ import java.util.ArrayList; import java.util.List; -import static com.hyperwallet.android.model.user.User.ProfileTypes.INDIVIDUAL; -import static com.hyperwallet.android.model.user.User.UserStatuses.PRE_ACTIVATED; -import static com.hyperwallet.android.model.user.User.VerificationStatuses.NOT_REQUIRED; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -42,7 +37,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @RunWith(RobolectricTestRunner.class) @@ -76,99 +70,68 @@ public void testLoadUserBalances_returnsBalances() throws JSONException, Hyperwa JSONObject jObject = new JSONObject(response); final PageList balances = new PageList<>(jObject, Balance.class); - - /*doAnswer(new Answer() { + doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { - HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; listener.onSuccess(balances); return listener; } - }).when(mHyperwallet).listUserBalances(any(),any());*/ + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); - + verify(userBalanceRepository).getHyperwallet(); verify(loadUserBalanceListCallback).onUserBalanceListLoaded(mUserBalanceCaptor.capture()); verify(loadUserBalanceListCallback, never()).onError(any(Errors.class)); - verify(userBalanceRepository).getHyperwallet(); + assertThat(mUserBalanceCaptor.getValue().size(),is(2)); } - /*@Test - public void testLoadUser_returnsNoUser() { + @Test + public void testLoadUserBalances_returnsEmptyBalances() { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { - HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; listener.onSuccess(null); return listener; } - }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); - - userBalanceRepository.loadUser(mMockCallback); - - verify(mMockCallback).onUserLoaded(mUserBalanceCaptor.capture()); - verify(mMockCallback, never()).onError(any(Errors.class)); + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); - User user = mUserBalanceCaptor.getValue(); - assertThat(user, is(Matchers.nullValue())); - }*/ + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback).onUserBalanceListLoaded(mUserBalanceCaptor.capture()); + verify(loadUserBalanceListCallback, never()).onError(any(Errors.class)); + assertThat(mUserBalanceCaptor.getValue().isEmpty(),is(true)); + } - /* @Test - public void testLoadUser_withError() { + @Test + public void testLoadUserBalances_onFailure() { final Error error = new Error("test message", "TEST_CODE"); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { - HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; List errorList = new ArrayList<>(); errorList.add(error); Errors errors = new Errors(errorList); listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); - - userBalanceRepository.loadUser(mMockCallback); - - verify(mMockCallback, never()).onUserLoaded(ArgumentMatchers.any()); - verify(mMockCallback).onError(mErrorCaptor.capture()); - - assertThat(mErrorCaptor.getValue().getErrors(), hasItem(error)); - } - - @Test - public void testRefreshUser_verifyHyperwalletCallGetUser() { - User.Builder builder = new User.Builder(); - final User user = builder - .token("test-user-token") - .profileType(INDIVIDUAL) - .build(); - - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[0]; - listener.onSuccess(user); - return listener; - } - }).when(mHyperwallet).getUser(ArgumentMatchers.>any()); - - userBalanceRepository.loadUser(mMockCallback); + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); - verify(mHyperwallet).getUser(ArgumentMatchers.>any()); + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); - userBalanceRepository.loadUser(mMockCallback); - verify(mHyperwallet).getUser(ArgumentMatchers.>any()); + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback, never()).onUserBalanceListLoaded(ArgumentMatchers.anyList()); + verify(loadUserBalanceListCallback).onError(mErrorCaptor.capture()); - userBalanceRepository.refreshUser(); - userBalanceRepository.loadUser(mMockCallback); - verify(mHyperwallet, times(2)).getUser(ArgumentMatchers.>any()); + assertThat(mErrorCaptor.getValue().getErrors(),hasItem(error)); - }*/ + } } diff --git a/userbalancerepository/src/test/resources/user_balances.json b/userbalancerepository/src/test/resources/user_balances.json new file mode 100644 index 000000000..b06520582 --- /dev/null +++ b/userbalancerepository/src/test/resources/user_balances.json @@ -0,0 +1,23 @@ +{ + "count": 2, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "CAD", + "amount": "110.45" + }, + { + "currency": "USD", + "amount": "530.77" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost/rest/v3/users/usr-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file From bdaf69d8c09a2ac47aabb9a8a373dc084ea6658d Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Fri, 5 Mar 2021 21:45:02 +0530 Subject: [PATCH 03/15] update UI changes in CreateTransfer Screen. --- publish.gradle | 3 +- .../ui/transfer/TransferUserFundsTest.java | 99 +++++++++++++++++++ .../transfer/view/CreateTransferFragment.java | 2 +- ...user_balance_single_currency_response.json | 19 ++++ 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 transferui/src/test/resources/user_balance_single_currency_response.json diff --git a/publish.gradle b/publish.gradle index 3d64f68a6..0944a33d6 100644 --- a/publish.gradle +++ b/publish.gradle @@ -46,7 +46,8 @@ publishing { "transfermethodui", "transferrepository", "transferui", - "userrepository" + "userrepository", + "userbalancerepository" ]) { dependencyNode.appendNode('groupId', "com.hyperwallet.android.ui") } else { diff --git a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java index ccb8112b4..79d06d9a9 100644 --- a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java +++ b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java @@ -132,6 +132,9 @@ public void cleanup() { @Test public void testTransferFunds_verifyTransferScreen() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); // Mock Response for the PPC mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); @@ -177,6 +180,10 @@ public void testTransferFunds_verifyTransferScreen() { @Test public void testTransferFunds_verifyTransferWithQuoteError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock Response for the PPC mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); @@ -223,6 +230,10 @@ public void testTransferFunds_verifyTransferWithQuoteError() { @Test public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatUSD() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock Response for the PPC mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); @@ -252,6 +263,11 @@ public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatUSD() { @Test public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatJOD() { + + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock Response for the PPC mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); @@ -311,6 +327,10 @@ public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatJPY() { @Test public void testTransferFunds_verifyAddDestinationDisplayedWhenUserHasNoExternalAccounts() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); @@ -334,6 +354,10 @@ public void testTransferFunds_verifyAddDestinationDisplayedWhenUserHasNoExternal @Test public void testTransferFunds_verifyDestinationUpdatedAfterAddingNewExternalAccount() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); @@ -383,6 +407,10 @@ public void testTransferFunds_verifyDestinationUpdatedAfterAddingNewExternalAcco @Test public void testTransferFunds_createTransferWithFX() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -481,6 +509,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferWithNoFX() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -554,6 +586,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferWithNotes() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -624,6 +660,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferWithEmptyFees() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -694,6 +734,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferWithAllFunds() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -803,6 +847,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferWithAllFundsAndFxChange() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -913,6 +961,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFunds_createTransferAmountNotSetError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -928,6 +980,10 @@ public void testTransferFunds_createTransferAmountNotSetError() { @Test public void testTransferFunds_createTransferInvalidAmountError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -946,6 +1002,10 @@ public void testTransferFunds_createTransferInvalidAmountError() { @Test public void testTransferFunds_createTransferDestinationNotSetError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -962,6 +1022,10 @@ public void testTransferFunds_createTransferDestinationNotSetError() { @Test public void testTransferFunds_createTransferLimitError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -988,6 +1052,10 @@ public void testTransferFunds_createTransferLimitError() { @Test public void testTransferFunds_createTransferInsufficientFundsError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -1012,6 +1080,10 @@ public void testTransferFunds_createTransferInsufficientFundsError() { @Test public void testTransferFunds_createTransferMinimumAmountError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -1037,6 +1109,10 @@ public void testTransferFunds_createTransferMinimumAmountError() { @Test public void testTransferFunds_createTransferInvalidSourceError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -1061,6 +1137,9 @@ public void testTransferFunds_createTransferInvalidSourceError() { @Test public void testTransferFunds_createTransferConnectionError() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); @@ -1088,6 +1167,10 @@ public void testTransferFunds_createTransferConnectionError() { @Test public void testTransferFunds_createTransferConfirmationConnectionErrorCancel() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -1135,6 +1218,10 @@ public void testTransferFunds_createTransferConfirmationConnectionErrorCancel() @Test public void testTransferFunds_createTransferConfirmationConnectionErrorTryAgain() throws InterruptedException { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -1204,6 +1291,10 @@ public void onReceive(Context context, Intent intent) { @Test public void testTransferFragment_verifyTransferFromPrepaidCard() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock the response with PPC source mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); @@ -1244,6 +1335,10 @@ public void testTransferFragment_verifyTransferFromPrepaidCard() { @Test public void testTransferFragment_verifyTransferToPrepaidCard() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock the response with PPC source mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); @@ -1271,6 +1366,10 @@ public void testTransferFragment_verifyTransferToPrepaidCard() { @Test public void testTransferFragment_verifyTransferFromPrepaidCardConfirmation() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java index eafda9bad..b1ec288eb 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferFragment.java @@ -748,7 +748,7 @@ private void showTransferSource(@NonNull final TransferSource transferSource) { transferSourceTitle.setText(transferSourceIdentifier.getContext().getString(R.string.availableFunds)); transferSourceIcon.setText(transferSourceIcon.getContext().getString(R.string.available_funds_font_icon)); } - transferSourceIdentifier.setText(transferSource.getIdentification() == null ? "" + transferSourceIdentifier.setText(transferSource.getIdentification() == null ? transferSource.getCurrencyCodes() : getTransferMethodDetail(transferSourceIdentifier.getContext(), transferSource.getIdentification(), transferSource.getType())); } diff --git a/transferui/src/test/resources/user_balance_single_currency_response.json b/transferui/src/test/resources/user_balance_single_currency_response.json new file mode 100644 index 000000000..25117a1dd --- /dev/null +++ b/transferui/src/test/resources/user_balance_single_currency_response.json @@ -0,0 +1,19 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "CAD", + "amount": "100.00" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost:8181/rest/v3/users/usr-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file From 77d10289b496246147dc1cc68499fb3af00d2764 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Sat, 6 Mar 2021 00:31:24 +0530 Subject: [PATCH 04/15] update Unit test. --- .../viewmodel/CreateTransferViewModel.java | 15 ++++++++++----- .../viewmodel/CreateTransferViewModelTest.java | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java index fa620356f..015b39a0f 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java @@ -451,8 +451,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); - loadUserBalance(sources.get(0)); - loadPrepaidCardList(sources); + loadUserBalance(sources,false); } @Override @@ -466,20 +465,25 @@ public void onError(@NonNull Errors errors) { } } - void loadUserBalance(final TransferSource source) + void loadUserBalance(@NonNull final ArrayList sources, final Boolean isSourceTokenAvailable) { mIsLoading.postValue(Boolean.TRUE); mUserBalanceRepository.loadUserBalances(new UserBalanceRepository.LoadUserBalanceListCallback() { @Override public void onUserBalanceListLoaded(@NonNull List balances) { - source.setCurrencyCodes(getCurrencyCode(balances)); - System.out.println(" currency code "+getCurrencyCode(balances)+" -- "+balances.size()); + sources.get(0).setCurrencyCodes(getCurrencyCode(balances)); + if(!isSourceTokenAvailable) { + loadPrepaidCardList(sources); + } } @Override public void onError(@NonNull Errors errors) { mIsLoading.postValue(Boolean.FALSE); mLoadTransferRequiredDataErrors.postValue(new Event<>(errors)); + if(!isSourceTokenAvailable) { + loadPrepaidCardList(sources); + } } }); } @@ -654,6 +658,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); + loadUserBalance(sources,true); mSelectedTransferSource.postValue(sourceWrapperForAvailableFunds); mTransferSources.postValue(sources); loadTransferDestination(mSourceToken); diff --git a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java index 53e31f79a..35c6838f5 100644 --- a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java +++ b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java @@ -34,6 +34,7 @@ import com.hyperwallet.android.model.Error; import com.hyperwallet.android.model.Errors; import com.hyperwallet.android.model.TypeReference; +import com.hyperwallet.android.model.balance.Balance; import com.hyperwallet.android.model.paging.PageList; import com.hyperwallet.android.model.transfer.Transfer; import com.hyperwallet.android.model.transfermethod.PrepaidCard; @@ -105,6 +106,7 @@ public class CreateTransferViewModelTest { private TransferMethod mTransferMethod; private PrepaidCard mPrepaidCard; private List mPrepaidCardList; + private List mUserBalanceList; @Mock private Hyperwallet mHyperwallet; @@ -139,6 +141,11 @@ public void setup() throws HyperwalletException, JSONException { final PageList prepaidCardList = new PageList<>(jsonObject, PrepaidCard.class); mPrepaidCardList = prepaidCardList.getDataList(); + String balanceJson = mResourceManager.getResourceContent("user_balance_single_currency_response.json"); + JSONObject balanceJsonObject = new JSONObject(balanceJson); + final PageList balanceList = new PageList<>(balanceJsonObject, Balance.class); + mUserBalanceList = balanceList.getDataList(); + final String transferListResponse = mResourceManager.getResourceContent("transfer_method_list_response.json"); JSONObject jObject = new JSONObject(transferListResponse); @@ -191,6 +198,15 @@ public Object answer(InvocationOnMock invocation) { } }).when(mUserRepository).loadUser(any(UserRepository.LoadUserCallback.class)); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + UserBalanceRepository.LoadUserBalanceListCallback callback = invocation.getArgument(0); + callback.onUserBalanceListLoaded(mUserBalanceList); + return callback; + } + }).when(mUserBalanceRepository).loadUserBalances(any(UserBalanceRepository.LoadUserBalanceListCallback.class)); + doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { From 2bc3316886dcd44c2acd2604e92502e89ad16b8b Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Mon, 8 Mar 2021 14:37:02 +0530 Subject: [PATCH 05/15] update Unit test. --- .../android/ui/transfer/TransferUserFundsTest.java | 4 ++++ .../ui/transfer/viewmodel/CreateTransferViewModelTest.java | 1 + 2 files changed, 5 insertions(+) diff --git a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java index 79d06d9a9..5c30d3a3c 100644 --- a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java +++ b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java @@ -298,6 +298,10 @@ public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatJOD() { @Test public void testTransferFunds_verifyTransferScreenAmountCurrencyFormatJPY() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + // Mock Response for the PPC mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_card_response.json")).mock(); diff --git a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java index 35c6838f5..1144b1ba3 100644 --- a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java +++ b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java @@ -173,6 +173,7 @@ public void setup() throws HyperwalletException, JSONException { mTransferSource = new TransferSource(); mTransferSource.setToken("usr-fake"); mTransferSource.setType(BANK_ACCOUNT); + mTransferSource.setCurrencyCodes("USD, CAD"); mTransferSource.setIdentification(null); From e44e0cbcdc58a02b03979d1533fdc8f9aeb45d0d Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Mon, 8 Mar 2021 23:10:56 +0530 Subject: [PATCH 06/15] fix transfer source ui for larger text. --- transferui/src/main/res/layout/widget_transfer_source.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/transferui/src/main/res/layout/widget_transfer_source.xml b/transferui/src/main/res/layout/widget_transfer_source.xml index 4cf3b95cd..5531d22e1 100644 --- a/transferui/src/main/res/layout/widget_transfer_source.xml +++ b/transferui/src/main/res/layout/widget_transfer_source.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:background="?android:attr/selectableItemBackground" android:layout_width="match_parent" - android:layout_height="@dimen/row_height_double_entry"> + android:layout_height="wrap_content" + android:minHeight="@dimen/row_height_double_entry"> From 513322a80c852cbc593b1e94439cf00e41177917 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Tue, 9 Mar 2021 11:38:10 +0530 Subject: [PATCH 07/15] fixed failed UI test causes. --- .../android/ui/transfer/SelectDestinationTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/SelectDestinationTest.java b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/SelectDestinationTest.java index f23903fa5..5bc1db8a3 100644 --- a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/SelectDestinationTest.java +++ b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/SelectDestinationTest.java @@ -87,6 +87,9 @@ public void setup() { .getResourceContent("user_response.json")).mock(); IdlingRegistry.getInstance().register(EspressoIdlingResource.getIdlingResource()); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("ppc/prepaid_cards_response.json")).mock(); } @@ -100,6 +103,7 @@ public void cleanup() { @Test public void testSelectDestination_verifyActiveExternalAccountsDisplayed() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("transfer_method_list_single_bank_account_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager From 4d0d643dbf8003a7e43d8af71aec5edafa57fa16 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Wed, 10 Mar 2021 14:20:53 +0530 Subject: [PATCH 08/15] address review comments --- .../ui/transfer/viewmodel/CreateTransferViewModel.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java index 015b39a0f..6f8ebd406 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java @@ -116,10 +116,11 @@ public class CreateTransferViewModel extends ViewModel { /** * Initialize Create Transfer View Model with designated transfer source token - * @param sourceToken Source token that represents either from User, Bank or PrepaidCard tokens + * + * @param sourceToken Source token that represents either from User, Bank or PrepaidCard tokens * @param transferRepository Transfer repository for making transfer calls to Hyperwallet * @param transferMethodRepository Transfer Method repository for making transfer method calls to - * Hyperwallet + * Hyperwallet * @param userRepository User repository for making user calls to Hyperwallet * @param prepaidCardRepository prepaid card repository for making prepaid calls to Hyperwallet * @param userBalanceRepository From 761a7b16448b6729ccc896adb02be7dcb97f0b07 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Wed, 10 Mar 2021 19:14:08 +0530 Subject: [PATCH 09/15] Added PrepaidCardBalanceRepository in UI SDK --- .../.gitignore | 0 .../build.gradle | 0 .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../PrepaidCardBalanceRepository.java | 30 ++++ .../PrepaidCardBalanceRepositoryFactory.java | 26 ++++ .../PrepaidCardBalanceRepositoryImpl.java | 73 +++++++++ .../repository/UserBalanceRepository.java | 2 +- .../UserBalanceRepositoryFactory.java | 2 +- .../repository/UserBalanceRepositoryImpl.java | 2 +- ...epaidCardBalanceRepositoryFactoryTest.java | 39 +++++ .../PrepaidCardBalanceRepositoryImplTest.java | 143 ++++++++++++++++++ .../UserBalanceRepositoryFactoryTest.java | 6 +- .../UserBalanceRepositoryImplTest.java | 20 +-- .../prepaid_card_balance_list_response.json | 19 +++ .../src/test/resources/robolectric.properties | 0 .../src/test/resources/user_balances.json | 0 publish.gradle | 2 +- settings.gradle | 2 +- .../transfer/view/CreateTransferActivity.java | 2 +- .../viewmodel/CreateTransferViewModel.java | 2 +- .../CreateTransferViewModelTest.java | 4 +- 22 files changed, 352 insertions(+), 22 deletions(-) rename {userbalancerepository => balancerepository}/.gitignore (100%) rename {userbalancerepository => balancerepository}/build.gradle (100%) rename {userbalancerepository => balancerepository}/proguard-rules.pro (100%) rename {userbalancerepository => balancerepository}/src/main/AndroidManifest.xml (100%) create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java rename {userbalancerepository/src/main/java/com/hyperwallet/android/ui/user => balancerepository/src/main/java/com/hyperwallet/android/ui}/balance/repository/UserBalanceRepository.java (96%) rename {userbalancerepository/src/main/java/com/hyperwallet/android/ui/user => balancerepository/src/main/java/com/hyperwallet/android/ui}/balance/repository/UserBalanceRepositoryFactory.java (96%) rename {userbalancerepository/src/main/java/com/hyperwallet/android/ui/user => balancerepository/src/main/java/com/hyperwallet/android/ui}/balance/repository/UserBalanceRepositoryImpl.java (97%) create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java rename {userbalancerepository/src/test/java/com/hyperwallet/android/ui/user => balancerepository/src/test/java/com/hyperwallet/android/ui}/balance/repository/UserBalanceRepositoryFactoryTest.java (96%) rename {userbalancerepository/src/test/java/com/hyperwallet/android/ui/user => balancerepository/src/test/java/com/hyperwallet/android/ui}/balance/repository/UserBalanceRepositoryImplTest.java (98%) create mode 100644 balancerepository/src/test/resources/prepaid_card_balance_list_response.json rename {userbalancerepository => balancerepository}/src/test/resources/robolectric.properties (100%) rename {userbalancerepository => balancerepository}/src/test/resources/user_balances.json (100%) diff --git a/userbalancerepository/.gitignore b/balancerepository/.gitignore similarity index 100% rename from userbalancerepository/.gitignore rename to balancerepository/.gitignore diff --git a/userbalancerepository/build.gradle b/balancerepository/build.gradle similarity index 100% rename from userbalancerepository/build.gradle rename to balancerepository/build.gradle diff --git a/userbalancerepository/proguard-rules.pro b/balancerepository/proguard-rules.pro similarity index 100% rename from userbalancerepository/proguard-rules.pro rename to balancerepository/proguard-rules.pro diff --git a/userbalancerepository/src/main/AndroidManifest.xml b/balancerepository/src/main/AndroidManifest.xml similarity index 100% rename from userbalancerepository/src/main/AndroidManifest.xml rename to balancerepository/src/main/AndroidManifest.xml diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java new file mode 100644 index 000000000..fe1e160bc --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java @@ -0,0 +1,30 @@ +package com.hyperwallet.android.ui.balance.repository; + +import androidx.annotation.NonNull; + +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; + +import java.util.List; + +public interface PrepaidCardBalanceRepository { + /** + * Load prepaid card balances + */ + void loadPrepaidCardBalances(String prepaidCardToken, @NonNull final LoadPrepaidCardBalanceCallback callback); + + /** + * Load prepaid card balance callback + */ + interface LoadPrepaidCardBalanceCallback { + /** + * On prepaid card balance list loaded + */ + void onPrepaidCardBalanceLoaded(@NonNull final List balances); + + /** + * On error + */ + void onError(@NonNull final Errors errors); + } +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java new file mode 100644 index 000000000..8b83e0608 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java @@ -0,0 +1,26 @@ +package com.hyperwallet.android.ui.balance.repository; + +public class PrepaidCardBalanceRepositoryFactory { + private static PrepaidCardBalanceRepositoryFactory sInstance; + private PrepaidCardBalanceRepository mPrepaidCardBalanceRepository; + + private PrepaidCardBalanceRepositoryFactory() { + mPrepaidCardBalanceRepository = new PrepaidCardBalanceRepositoryImpl(); + } + + public static synchronized PrepaidCardBalanceRepositoryFactory getInstance() { + if (sInstance == null) { + sInstance = new PrepaidCardBalanceRepositoryFactory(); + } + return sInstance; + } + + public static void clearInstance() { + sInstance = null; + } + + public PrepaidCardBalanceRepository getPrepaidCardBalanceRepository() { + return mPrepaidCardBalanceRepository; + } + +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java new file mode 100644 index 000000000..5f7cf39dc --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java @@ -0,0 +1,73 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +import android.os.Handler; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.PrepaidCardBalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; + +import java.util.ArrayList; + +public class PrepaidCardBalanceRepositoryImpl implements PrepaidCardBalanceRepository { + + private Handler mHandler = new Handler(); + private int LIMIT = 100; + + @VisibleForTesting + Hyperwallet getHyperwallet() { + return Hyperwallet.getDefault(); + } + + + @Override + public void loadPrepaidCardBalances(String prepaidCardToken, + @NonNull final LoadPrepaidCardBalanceCallback callback) { + PrepaidCardBalanceQueryParam queryParam = new PrepaidCardBalanceQueryParam.Builder() + .limit(LIMIT) + .sortByCurrencyAsc() + .build(); + + getHyperwallet().listPrepaidCardBalances(prepaidCardToken, queryParam, + new HyperwalletListener>() { + @Override + public void onSuccess(@Nullable PageList result) { + callback.onPrepaidCardBalanceLoaded( + result != null ? result.getDataList() : new ArrayList()); + } + + @Override + public void onFailure(HyperwalletException exception) { + callback.onError(exception.getErrors()); + } + + @Override + public Handler getHandler() { + return mHandler; + } + }); + } +} diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java similarity index 96% rename from userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java rename to balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java index 98a8690a6..0e9dbf28e 100644 --- a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepository.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java @@ -15,7 +15,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.hyperwallet.android.ui.user.balance.repository; +package com.hyperwallet.android.ui.balance.repository; import androidx.annotation.NonNull; diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java similarity index 96% rename from userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java rename to balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java index 32e0cb763..8c07b82a1 100644 --- a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactory.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java @@ -15,7 +15,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.hyperwallet.android.ui.user.balance.repository; +package com.hyperwallet.android.ui.balance.repository; public class UserBalanceRepositoryFactory { private static UserBalanceRepositoryFactory sInstance; diff --git a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java similarity index 97% rename from userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java rename to balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java index 5985bfa40..889a62db8 100644 --- a/userbalancerepository/src/main/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImpl.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java @@ -16,7 +16,7 @@ * THE SOFTWARE. */ -package com.hyperwallet.android.ui.user.balance.repository; +package com.hyperwallet.android.ui.balance.repository; import android.os.Handler; diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java new file mode 100644 index 000000000..618cf052d --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java @@ -0,0 +1,39 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + +import org.junit.Test; + +public class PrepaidCardBalanceRepositoryFactoryTest { + + @Test + public void testGetInstance_verifyRepositoriesInitialized() { + PrepaidCardBalanceRepositoryFactory prepaidCardBalanceRepository = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepository, is(notNullValue())); + assertThat(prepaidCardBalanceRepository.getPrepaidCardBalanceRepository(), is(notNullValue())); + } + + @Test + public void testClearInstance_verifyRepositoriesCleared() { + PrepaidCardBalanceRepositoryFactory prepaidCardBalanceRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + + PrepaidCardBalanceRepository prepaidCardBalanceRepository = + prepaidCardBalanceRepositoryFactory.getPrepaidCardBalanceRepository(); + + PrepaidCardBalanceRepositoryFactory currentRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepositoryFactory, is(currentRepositoryFactory)); + + PrepaidCardBalanceRepositoryFactory.clearInstance(); + + PrepaidCardBalanceRepositoryFactory anotherRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepositoryFactory, is(not(anotherRepositoryFactory))); + assertThat(prepaidCardBalanceRepository, is(not(anotherRepositoryFactory.getPrepaidCardBalanceRepository()))); + } +} diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java new file mode 100644 index 000000000..eadc7f0f6 --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java @@ -0,0 +1,143 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.Error; +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; +import com.hyperwallet.android.model.balance.PrepaidCardBalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; +import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class PrepaidCardBalanceRepositoryImplTest { + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + + @Rule + public HyperwalletExternalResourceManager mResourceManager = new HyperwalletExternalResourceManager(); + + @Mock + PrepaidCardBalanceRepository.LoadPrepaidCardBalanceCallback loadPrepaidCardBalanceListCallback; + @Spy + PrepaidCardBalanceRepositoryImpl prepaidCardBalanceRepository; + @Mock + private Hyperwallet mHyperwallet; + @Captor + private ArgumentCaptor mErrorCaptor; + @Captor + private ArgumentCaptor> mPrepaidCardBalanceCaptor; + + @Before + public void setup() { + doReturn(mHyperwallet).when(prepaidCardBalanceRepository).getHyperwallet(); + } + + @Test + public void testLoadUserBalances_returnsPrepaidCardBalances() throws JSONException, HyperwalletException { + + final String response = mResourceManager.getResourceContent("prepaid_card_balance_list_response.json"); + JSONObject jObject = new JSONObject(response); + final PageList balances = new PageList<>(jObject, Balance.class); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + listener.onSuccess(balances); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback).onPrepaidCardBalanceLoaded(mPrepaidCardBalanceCaptor.capture()); + verify(loadPrepaidCardBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mPrepaidCardBalanceCaptor.getValue().size(), is(1)); + + } + + @Test + public void testLoadUserBalances_returnsEmptyBalances() { + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback).onPrepaidCardBalanceLoaded(mPrepaidCardBalanceCaptor.capture()); + verify(loadPrepaidCardBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mPrepaidCardBalanceCaptor.getValue().isEmpty(), is(true)); + } + + @Test + public void testLoadUserBalances_onFailure() { + + final Error error = new Error("test message", "TEST_CODE"); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + List errorList = new ArrayList<>(); + errorList.add(error); + Errors errors = new Errors(errorList); + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback, never()).onPrepaidCardBalanceLoaded( + ArgumentMatchers.anyList()); + verify(loadPrepaidCardBalanceListCallback).onError(mErrorCaptor.capture()); + + assertThat(mErrorCaptor.getValue().getErrors(), hasItem(error)); + + } +} diff --git a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java similarity index 96% rename from userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java rename to balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java index 59fd421be..53c5e1fc4 100644 --- a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryFactoryTest.java +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java @@ -1,12 +1,12 @@ -package com.hyperwallet.android.ui.user.balance.repository; - -import org.junit.Test; +package com.hyperwallet.android.ui.balance.repository; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; +import org.junit.Test; + public class UserBalanceRepositoryFactoryTest { @Test diff --git a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java similarity index 98% rename from userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java rename to balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java index 9ea8c87ce..a7b32ac9a 100644 --- a/userbalancerepository/src/test/java/com/hyperwallet/android/ui/user/balance/repository/UserBalanceRepositoryImplTest.java +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java @@ -1,4 +1,13 @@ -package com.hyperwallet.android.ui.user.balance.repository; +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; @@ -30,15 +39,6 @@ import java.util.ArrayList; import java.util.List; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - @RunWith(RobolectricTestRunner.class) public class UserBalanceRepositoryImplTest { @Rule diff --git a/balancerepository/src/test/resources/prepaid_card_balance_list_response.json b/balancerepository/src/test/resources/prepaid_card_balance_list_response.json new file mode 100644 index 000000000..fd22bec7c --- /dev/null +++ b/balancerepository/src/test/resources/prepaid_card_balance_list_response.json @@ -0,0 +1,19 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "USD", + "amount": "991.05" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost:8181/rest/v3/users/test-user-token/prepaid-cards/trm-fake-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/userbalancerepository/src/test/resources/robolectric.properties b/balancerepository/src/test/resources/robolectric.properties similarity index 100% rename from userbalancerepository/src/test/resources/robolectric.properties rename to balancerepository/src/test/resources/robolectric.properties diff --git a/userbalancerepository/src/test/resources/user_balances.json b/balancerepository/src/test/resources/user_balances.json similarity index 100% rename from userbalancerepository/src/test/resources/user_balances.json rename to balancerepository/src/test/resources/user_balances.json diff --git a/publish.gradle b/publish.gradle index 0944a33d6..edc52460d 100644 --- a/publish.gradle +++ b/publish.gradle @@ -47,7 +47,7 @@ publishing { "transferrepository", "transferui", "userrepository", - "userbalancerepository" + "balancerepository" ]) { dependencyNode.appendNode('groupId', "com.hyperwallet.android.ui") } else { diff --git a/settings.gradle b/settings.gradle index 193534004..b85db0844 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,5 +7,5 @@ include ':commonui', ':transferrepository', ':transferui', ':userrepository', - ':userbalancerepository', + ':balancerepository', ':testutils' diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java index 6eda408e4..f36c96d65 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/view/CreateTransferActivity.java @@ -36,6 +36,7 @@ import com.hyperwallet.android.model.Errors; import com.hyperwallet.android.model.transfer.Transfer; +import com.hyperwallet.android.ui.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.common.repository.Event; import com.hyperwallet.android.ui.common.util.PageGroups; import com.hyperwallet.android.ui.common.view.ActivityUtils; @@ -45,7 +46,6 @@ import com.hyperwallet.android.ui.transfer.viewmodel.CreateTransferViewModel; import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepositoryFactory; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepositoryFactory; -import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.user.repository.UserRepositoryFactory; /** diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java index 6f8ebd406..ba39c97f8 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java @@ -47,6 +47,7 @@ import com.hyperwallet.android.model.transfermethod.PrepaidCard; import com.hyperwallet.android.model.transfermethod.TransferMethod; import com.hyperwallet.android.model.user.User; +import com.hyperwallet.android.ui.balance.repository.UserBalanceRepository; import com.hyperwallet.android.ui.common.repository.Event; import com.hyperwallet.android.ui.common.view.ProgramModel; import com.hyperwallet.android.ui.transfer.R; @@ -54,7 +55,6 @@ import com.hyperwallet.android.ui.transfer.repository.TransferRepository; import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepository; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepository; -import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepository; import com.hyperwallet.android.ui.user.repository.UserRepository; import java.util.ArrayList; diff --git a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java index 1144b1ba3..4126adfa2 100644 --- a/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java +++ b/transferui/src/test/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModelTest.java @@ -40,6 +40,8 @@ import com.hyperwallet.android.model.transfermethod.PrepaidCard; import com.hyperwallet.android.model.transfermethod.TransferMethod; import com.hyperwallet.android.model.user.User; +import com.hyperwallet.android.ui.balance.repository.UserBalanceRepository; +import com.hyperwallet.android.ui.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.common.view.ProgramModel; import com.hyperwallet.android.ui.testutils.TestAuthenticationProvider; import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; @@ -52,8 +54,6 @@ import com.hyperwallet.android.ui.transfermethod.repository.PrepaidCardRepositoryFactory; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepository; import com.hyperwallet.android.ui.transfermethod.repository.TransferMethodRepositoryFactory; -import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepository; -import com.hyperwallet.android.ui.user.balance.repository.UserBalanceRepositoryFactory; import com.hyperwallet.android.ui.user.repository.UserRepository; import com.hyperwallet.android.ui.user.repository.UserRepositoryFactory; import com.hyperwallet.android.util.JsonUtils; From c2a98e0904c58b83aa18adf0e393e3d0dc734c99 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Wed, 10 Mar 2021 19:15:05 +0530 Subject: [PATCH 10/15] Added PrepaidCardBalanceRepository in UI SDK --- transferui/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transferui/build.gradle b/transferui/build.gradle index ed60e9e79..a640d1ce2 100644 --- a/transferui/build.gradle +++ b/transferui/build.gradle @@ -15,7 +15,7 @@ dependencies { implementation project(":transfermethodrepository") implementation project(":userrepository") implementation project(":commonui") - implementation project(":userbalancerepository") + implementation project(":balancerepository") implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" From 5c62c4c90963a87ba65ecf21a827a20edc8b35dc Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Wed, 10 Mar 2021 19:22:28 +0530 Subject: [PATCH 11/15] fixed package name --- balancerepository/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/balancerepository/src/main/AndroidManifest.xml b/balancerepository/src/main/AndroidManifest.xml index 3a6117c7e..a5d7ef853 100644 --- a/balancerepository/src/main/AndroidManifest.xml +++ b/balancerepository/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ + package="com.hyperwallet.android.ui.balance.repository"/> From 63ee7c8d48eed926a9f43bd24faf734bbe3e493d Mon Sep 17 00:00:00 2001 From: Naren Date: Thu, 11 Mar 2021 13:26:28 +0530 Subject: [PATCH 12/15] UIcases for Currencycode validation --- .../ui/transfer/TransferUserFundsTest.java | 89 +++++++++++++++++++ ...ser_balance_multi_currencies_response.json | 67 ++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 transferui/src/test/resources/user_balance_multi_currencies_response.json diff --git a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java index 5c30d3a3c..357ca78e2 100644 --- a/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java +++ b/transferui/src/androidTest/java/com/hyperwallet/android/ui/transfer/TransferUserFundsTest.java @@ -1194,6 +1194,9 @@ public void testTransferFunds_createTransferConfirmationConnectionErrorCancel() onView(withId(R.id.transfer_amount)).perform(nestedScrollTo(), replaceText("100.00")); onView(withId(R.id.transfer_action_button)).perform(nestedScrollTo(), click()); + onView(ViewMatchers.withId(R.id.transfer_source_description_1)) + .check(ViewAssertions.matches(ViewMatchers.withText("CAD"))); + onView(withId(R.id.list_foreign_exchange)).check(matches(not(isDisplayed()))); onView(withId(R.id.amount_label)).check(matches(withText(R.string.mobileConfirmDetailsAmount))); onView(withId(R.id.amount_value)).check(matches(withText("$102.00 USD"))); @@ -1324,6 +1327,10 @@ public void testTransferFragment_verifyTransferFromPrepaidCard() { onView(ViewMatchers.withText(R.string.availableFunds)) .perform(ViewActions.click()); + //Verify currency code in Transfer From + onView(withId(R.id.transfer_source_list)).check( + matches(atPosition(0, hasDescendant(withText("CAD"))))); + // Select PPC from the Select From list String ppcInfoFrom = VISA + MASK + "9285"; onView(ViewMatchers.withText(ppcInfoFrom)) @@ -1458,6 +1465,88 @@ public void onReceive(Context context, Intent intent) { } + //Single Currency Code Validation + @Test + public void testTransferFragment_verifyAvailableFundsWithCurrencyCode() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_single_currency_response.json")).mock(); + + // Mock the response with PPC source + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("ppc/prepaid_cards_response.json")).mock(); + + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("transfer_method_list_with_one_ppc_response.json")).mock(); + + // only when transferMethods.size() > 0, get the quote by the source token + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("create_transfer_quote_response.json")).mock(); + + mActivityTestRule.launchActivity(null); + + // Transfer From + verifyTransferFromAvailbleFunds(); + + onView(ViewMatchers.withId(R.id.transfer_source_description_1)) + .check(ViewAssertions.matches(ViewMatchers.withText("CAD"))); + } + + //Multiple Currency Code Validation + @Test + public void testTransferFragment_verifyAvailableFundsWithMultipleCurrencyCode() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("user_balance_multi_currencies_response.json")).mock(); + + // Mock the response with PPC source + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("ppc/prepaid_cards_response.json")).mock(); + + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("transfer_method_list_with_one_ppc_response.json")).mock(); + + // only when transferMethods.size() > 0, get the quote by the source token + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("create_transfer_quote_response.json")).mock(); + + mActivityTestRule.launchActivity(null); + + // Transfer From + verifyTransferFromAvailbleFunds(); + + onView(ViewMatchers.withId(R.id.transfer_source_description_1)) + .check(ViewAssertions.matches(ViewMatchers.withText("CAD, TWD, TND, COP, CNY, INR, KRW, SEK, JOD, GBP, JPY, IDR, USD"))); + } + + //Error for CurrencyCode Validation + @Test + public void testTransferFragment_verifyErrorCurrencyCode() { + //Mock Response for user balance + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("errors/create_transfer_error_invalid_amount_response.json")).mock(); + + // Mock the response with PPC source + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("ppc/prepaid_cards_response.json")).mock(); + + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("transfer_method_list_with_one_ppc_response.json")).mock(); + + // only when transferMethods.size() > 0, get the quote by the source token + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("create_transfer_quote_response.json")).mock(); + + mActivityTestRule.launchActivity(null); + + onView(withText(R.string.error_dialog_unexpected_title)) + .inRoot(RootMatchers.isDialog()) + .check(matches(ViewMatchers.isDisplayed())); + onView(ViewMatchers.withId(android.R.id.button1)) + .check(matches(withText(R.string.ok))); + + } + /* @Test public void testTransferFragment_verifyTransferFromPrepaidCardConfirmation() { diff --git a/transferui/src/test/resources/user_balance_multi_currencies_response.json b/transferui/src/test/resources/user_balance_multi_currencies_response.json new file mode 100644 index 000000000..d7169458d --- /dev/null +++ b/transferui/src/test/resources/user_balance_multi_currencies_response.json @@ -0,0 +1,67 @@ +{ + "count": 3, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "CAD", + "amount": "100.00" + }, + { + "currency": "TWD", + "amount": "199001" + }, + { + "currency": "TND", + "amount": "1990" + }, + { + "currency": "COP", + "amount": "1280" + }, + { + "currency": "CNY", + "amount": "1001" + }, + { + "currency": "INR", + "amount": "2001" + }, + { + "currency": "KRW", + "amount": "19901" + }, + { + "currency": "SEK", + "amount": "2201" + }, + { + "currency": "JOD", + "amount": "12001" + }, + { + "currency": "GBP", + "amount": "3901" + }, + { + "currency": "JPY", + "amount": "19001" + }, + { + "currency": "IDR", + "amount": "3901" + }, + { + "currency": "USD", + "amount": "191.00" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost-hyperwallet.aws.paylution.net:8181/rest/v3/users/usr-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file From 4ee849ba82af645d2f22f28233f9aa28b9ac614e Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Thu, 11 Mar 2021 16:08:04 +0530 Subject: [PATCH 13/15] Address review comments --- balancerepository/build.gradle | 4 +- .../PrepaidCardBalanceRepository.java | 17 +++++++++ .../PrepaidCardBalanceRepositoryFactory.java | 17 +++++++++ .../viewmodel/CreateTransferViewModel.java | 37 +++++++++---------- 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/balancerepository/build.gradle b/balancerepository/build.gradle index cfe277075..9f64eff53 100644 --- a/balancerepository/build.gradle +++ b/balancerepository/build.gradle @@ -1,7 +1,7 @@ apply from: "$rootProject.projectDir/android-library.gradle" -description = 'Hyperwallet User Balance Repository SDK for Android to integrate with the Hyperwallet Platform' +description = 'Hyperwallet Balance Repository SDK for Android to integrate with the Hyperwallet Platform' project.ext { - mavenName = 'Hyperwallet Android User Balance Repository SDK' + mavenName = 'Hyperwallet Android Balance Repository SDK' } apply from: "$rootProject.projectDir/publish.gradle" diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java index fe1e160bc..24fe74a97 100644 --- a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java @@ -1,3 +1,20 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.hyperwallet.android.ui.balance.repository; import androidx.annotation.NonNull; diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java index 8b83e0608..14ed242b6 100644 --- a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java @@ -1,3 +1,20 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.hyperwallet.android.ui.balance.repository; public class PrepaidCardBalanceRepositoryFactory { diff --git a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java index ba39c97f8..bd779095e 100644 --- a/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java +++ b/transferui/src/main/java/com/hyperwallet/android/ui/transfer/viewmodel/CreateTransferViewModel.java @@ -123,7 +123,7 @@ public class CreateTransferViewModel extends ViewModel { * Hyperwallet * @param userRepository User repository for making user calls to Hyperwallet * @param prepaidCardRepository prepaid card repository for making prepaid calls to Hyperwallet - * @param userBalanceRepository + * @param userBalanceRepository User balance repository for making user balance calls to Hyperwallet */ CreateTransferViewModel(@NonNull final String sourceToken, @NonNull final TransferRepository transferRepository, @@ -144,10 +144,11 @@ public class CreateTransferViewModel extends ViewModel { /** * Initialize Create Transfer View Model with designated transfer source token - * @param transferRepository Transfer repository for making transfer calls to Hyperwallet + * + * @param transferRepository Transfer repository for making transfer calls to Hyperwallet * @param transferMethodRepository Transfer Method repository for making transfer method calls to Hyperwallet * @param userRepository User repository for making user calls to Hyperwallet - * @param userBalanceRepository + * @param userBalanceRepository User balance repository for making user balance calls to Hyperwallet */ CreateTransferViewModel(@NonNull final TransferRepository transferRepository, @NonNull final TransferMethodRepository transferMethodRepository, @@ -452,7 +453,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); - loadUserBalance(sources,false); + loadUserBalance(sources, false); } @Override @@ -466,14 +467,13 @@ public void onError(@NonNull Errors errors) { } } - void loadUserBalance(@NonNull final ArrayList sources, final Boolean isSourceTokenAvailable) - { + void loadUserBalance(@NonNull final ArrayList sources, final Boolean isSourceTokenAvailable) { mIsLoading.postValue(Boolean.TRUE); mUserBalanceRepository.loadUserBalances(new UserBalanceRepository.LoadUserBalanceListCallback() { @Override public void onUserBalanceListLoaded(@NonNull List balances) { - sources.get(0).setCurrencyCodes(getCurrencyCode(balances)); - if(!isSourceTokenAvailable) { + sources.get(0).setCurrencyCodes(getCurrencyCodes(balances)); + if (!isSourceTokenAvailable) { loadPrepaidCardList(sources); } } @@ -482,7 +482,7 @@ public void onUserBalanceListLoaded(@NonNull List balances) { public void onError(@NonNull Errors errors) { mIsLoading.postValue(Boolean.FALSE); mLoadTransferRequiredDataErrors.postValue(new Event<>(errors)); - if(!isSourceTokenAvailable) { + if (!isSourceTokenAvailable) { loadPrepaidCardList(sources); } } @@ -659,7 +659,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); - loadUserBalance(sources,true); + loadUserBalance(sources, true); mSelectedTransferSource.postValue(sourceWrapperForAvailableFunds); mTransferSources.postValue(sources); loadTransferDestination(mSourceToken); @@ -679,18 +679,14 @@ private boolean hasTransferAmountChanged(@Nullable final Transfer transfer) { transfer.getDestinationAmount(), mTransferAmount.getValue()); } - private String getCurrencyCode(List balances) - { - StringBuilder builder = new StringBuilder(); - for (Balance balance:balances) { + private String getCurrencyCodes(List balances) { + ArrayList currencyCodes = new ArrayList<>(); + for (Balance balance : balances) { if (Double.parseDouble(balance.getAmount().replaceAll(REGEX_ONLY_NUMBER, EMPTY_STRING)) != 0.0) { - if (builder.length() > 0){ - builder.append(COMMA_SEPARATOR); - } - builder.append(balance.getCurrency()); + currencyCodes.add(balance.getCurrency()); } } - return builder.toString(); + return currencyCodes.size() > 0 ? TextUtils.join(COMMA_SEPARATOR, currencyCodes) : ""; } public ProgramModel getProgramModel() { @@ -749,7 +745,8 @@ public CreateTransferViewModelFactory(@NonNull final String sourceToken, @NonNull final TransferRepository transferRepository, @NonNull final TransferMethodRepository transferMethodRepository, @NonNull final UserRepository userRepository, - @NonNull final PrepaidCardRepository prepaidCardRepository, @NonNull final UserBalanceRepository userBalanceRepository) { + @NonNull final PrepaidCardRepository prepaidCardRepository, + @NonNull final UserBalanceRepository userBalanceRepository) { this.sourceToken = sourceToken; this.transferMethodRepository = transferMethodRepository; this.transferRepository = transferRepository; From f0a6996fd5e168e9ee87c3aa4a820822b86eeee1 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Thu, 11 Mar 2021 20:35:02 +0530 Subject: [PATCH 14/15] address review comments. --- .../repository/PrepaidCardBalanceRepositoryImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java index eadc7f0f6..2d2c2d1e1 100644 --- a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java @@ -92,7 +92,7 @@ public Object answer(InvocationOnMock invocation) { } @Test - public void testLoadUserBalances_returnsEmptyBalances() { + public void testPrepaidCardBalances_returnsEmptyPrepaidCardBalances() { doAnswer(new Answer() { @Override @@ -113,7 +113,7 @@ public Object answer(InvocationOnMock invocation) { } @Test - public void testLoadUserBalances_onFailure() { + public void testPrepaidCardBalances_onFailure() { final Error error = new Error("test message", "TEST_CODE"); From 953047d98a23b02e1fff28ef3f7343df9bbe8662 Mon Sep 17 00:00:00 2001 From: ssabeerahamed Date: Mon, 15 Mar 2021 11:42:43 +0530 Subject: [PATCH 15/15] address review comments. --- .../balance/repository/PrepaidCardBalanceRepositoryImpl.java | 4 ++-- .../ui/balance/repository/UserBalanceRepositoryImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java index 5f7cf39dc..b092355ec 100644 --- a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java @@ -34,8 +34,8 @@ public class PrepaidCardBalanceRepositoryImpl implements PrepaidCardBalanceRepository { - private Handler mHandler = new Handler(); - private int LIMIT = 100; + private final Handler mHandler = new Handler(); + private final int LIMIT = 100; @VisibleForTesting Hyperwallet getHyperwallet() { diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java index 889a62db8..79f56b905 100644 --- a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java @@ -35,8 +35,8 @@ public class UserBalanceRepositoryImpl implements UserBalanceRepository { - private Handler mHandler = new Handler(); - private int LIMIT = 100; + private final Handler mHandler = new Handler(); + private final int LIMIT = 100; @VisibleForTesting Hyperwallet getHyperwallet() {