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