diff --git a/balancerepository/.gitignore b/balancerepository/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/balancerepository/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/balancerepository/build.gradle b/balancerepository/build.gradle new file mode 100644 index 000000000..9f64eff53 --- /dev/null +++ b/balancerepository/build.gradle @@ -0,0 +1,12 @@ +apply from: "$rootProject.projectDir/android-library.gradle" +description = 'Hyperwallet Balance Repository SDK for Android to integrate with the Hyperwallet Platform' +project.ext { + mavenName = 'Hyperwallet Android 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/balancerepository/proguard-rules.pro b/balancerepository/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/balancerepository/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/balancerepository/src/main/AndroidManifest.xml b/balancerepository/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a5d7ef853 --- /dev/null +++ b/balancerepository/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + 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..24fe74a97 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java @@ -0,0 +1,47 @@ +/* + * 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; + +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..14ed242b6 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java @@ -0,0 +1,43 @@ +/* + * 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 { + 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..b092355ec --- /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 final Handler mHandler = new Handler(); + private final 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/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java new file mode 100644 index 000000000..0e9dbf28e --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/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.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/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java new file mode 100644 index 000000000..8c07b82a1 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/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.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/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 new file mode 100644 index 000000000..79f56b905 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/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.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 final Handler mHandler = new Handler(); + private final 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/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..2d2c2d1e1 --- /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 testPrepaidCardBalances_returnsEmptyPrepaidCardBalances() { + + 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 testPrepaidCardBalances_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/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java new file mode 100644 index 000000000..53c5e1fc4 --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java @@ -0,0 +1,34 @@ +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 + 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/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java new file mode 100644 index 000000000..a7b32ac9a --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java @@ -0,0 +1,137 @@ +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; +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.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 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()[1]; + listener.onSuccess(balances); + return listener; + } + }).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)); + + assertThat(mUserBalanceCaptor.getValue().size(),is(2)); + + } + + @Test + public void testLoadUserBalances_returnsEmptyBalances() { + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(null); + return listener; + } + }).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)); + + assertThat(mUserBalanceCaptor.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()[1]; + List errorList = new ArrayList<>(); + errorList.add(error); + Errors errors = new Errors(errorList); + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); + + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback, never()).onUserBalanceListLoaded(ArgumentMatchers.anyList()); + verify(loadUserBalanceListCallback).onError(mErrorCaptor.capture()); + + assertThat(mErrorCaptor.getValue().getErrors(),hasItem(error)); + + } +} 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/balancerepository/src/test/resources/robolectric.properties b/balancerepository/src/test/resources/robolectric.properties new file mode 100644 index 000000000..89a6c8b4c --- /dev/null +++ b/balancerepository/src/test/resources/robolectric.properties @@ -0,0 +1 @@ +sdk=28 \ No newline at end of file diff --git a/balancerepository/src/test/resources/user_balances.json b/balancerepository/src/test/resources/user_balances.json new file mode 100644 index 000000000..b06520582 --- /dev/null +++ b/balancerepository/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 diff --git a/publish.gradle b/publish.gradle index 3d64f68a6..edc52460d 100644 --- a/publish.gradle +++ b/publish.gradle @@ -46,7 +46,8 @@ publishing { "transfermethodui", "transferrepository", "transferui", - "userrepository" + "userrepository", + "balancerepository" ]) { dependencyNode.appendNode('groupId', "com.hyperwallet.android.ui") } else { diff --git a/settings.gradle b/settings.gradle index 5936c0594..b85db0844 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,5 @@ include ':commonui', ':transferrepository', ':transferui', ':userrepository', + ':balancerepository', ':testutils' diff --git a/transferui/build.gradle b/transferui/build.gradle index bf96374a1..a640d1ce2 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(":balancerepository") implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" 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 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..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 @@ -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(); @@ -282,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(); @@ -311,6 +331,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 +358,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 +411,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 +513,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 +590,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 +664,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 +738,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 +851,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 +965,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 +984,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 +1006,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 +1026,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 +1056,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 +1084,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 +1113,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 +1141,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 +1171,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 @@ -1107,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"))); @@ -1135,6 +1225,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 +1298,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(); @@ -1229,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)) @@ -1244,6 +1346,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 +1377,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(); @@ -1355,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/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..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; @@ -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..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 @@ -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"; @@ -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/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..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 @@ -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,10 +42,12 @@ 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; 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; @@ -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<>(); @@ -119,17 +123,20 @@ 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 User balance repository for making user balance calls to Hyperwallet */ 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(); @@ -141,15 +148,18 @@ public class CreateTransferViewModel extends ViewModel { * @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 User balance repository for making user balance calls to Hyperwallet */ 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,7 +453,7 @@ public void onUserLoaded(@NonNull User user) { sourceWrapperForAvailableFunds.setToken(user.getToken()); sourceWrapperForAvailableFunds.setType(BANK_ACCOUNT); sources.add(sourceWrapperForAvailableFunds); - loadPrepaidCardList(sources); + loadUserBalance(sources, false); } @Override @@ -457,6 +467,28 @@ public void onError(@NonNull Errors errors) { } } + 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(getCurrencyCodes(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); + } + } + }); + } + @VisibleForTesting void loadTransferDestination(@NonNull final String sourceToken) { mIsLoading.postValue(Boolean.TRUE); @@ -627,6 +659,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); @@ -646,6 +679,16 @@ private boolean hasTransferAmountChanged(@Nullable final Transfer transfer) { transfer.getDestinationAmount(), mTransferAmount.getValue()); } + 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) { + currencyCodes.add(balance.getCurrency()); + } + } + return currencyCodes.size() > 0 ? TextUtils.join(COMMA_SEPARATOR, currencyCodes) : ""; + } + public ProgramModel getProgramModel() { getHyperwallet().getConfiguration(new HyperwalletListener() { @Override @@ -696,28 +739,33 @@ 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 +774,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/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"> 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..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 @@ -34,11 +34,14 @@ 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; 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; @@ -95,12 +98,15 @@ public class CreateTransferViewModelTest { private TransferRepository mTransferRepository; @Mock private PrepaidCardRepository mPrepaidCardRepository; + @Mock + private UserBalanceRepository mUserBalanceRepository; private Transfer mTransfer; private TransferSource mTransferSource; private TransferMethod mTransferMethod; private PrepaidCard mPrepaidCard; private List mPrepaidCardList; + private List mUserBalanceList; @Mock private Hyperwallet mHyperwallet; @@ -135,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); @@ -162,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); @@ -187,6 +199,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) { @@ -258,7 +279,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 +319,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 +357,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 +394,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 +468,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 +505,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 +551,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 +595,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 +636,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 +667,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 +691,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 +716,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 +753,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 +789,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 +826,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 +863,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 +895,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 +925,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 +943,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 +960,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 +1002,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 +1043,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 +1088,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 +1148,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 +1163,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 +1177,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 +1192,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 +1208,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 +1231,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 +1260,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 +1273,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 +1297,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 +1309,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 +1324,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 +1340,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 +1366,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 +1392,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 +1416,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/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 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