Skip to content

Commit f8944eb

Browse files
committed
Ach Presenter Test update
requeryTx_onSuccess_onRequerySuccessfulCalled verifyRequeryResponseStatus_transactionUnsuccessful_onPaymentFailedCalled verifyRequeryResponseStatus_transactionSuccessful_onPaymentSuccessfulCalled onFeeConfirmed_showWebViewCalled init_inValidAmount_showRedirectMessageFalse onPayButtonClicked_inValidAmount_showAmountError_onValidationSuccessfulCalled init_validAmount_showRedirectMessageTrue chargeAccount_onError_onPaymentErrorCalled_messageReturned onPayButtonClicked_validAmount_showAmountError_onValidationSuccessfulCalled chargeAccount_onSuccess_nullChargeResponseReturned_onPaymentErrorCalled_noResponseMessage processTransaction_createBankPayloadCalled_assertParameters processTransaction_chargeAccountCalled_createBankPayloadCalled_assertParameters processTransaction_setPaymentPlanCalled_assertPaymentPlan chargeAccount_noDisplayFee_onSuccess_validResponseReturned_showWebViewCalled requeryTx_onError_onPaymentFailedCalled chargeAccount_onSuccess_inValidResponseReturned_onPaymentErrorCalled_noAuthUrlMessage chargeAccount_displayFee_chargeCard_onSuccess_saveFlwRef_validResponseReturned_showFeeCalled processTransaction_setAmountCalled_assertParameters PayloadToJson extracted to class from Utils GetEncryptedData extracted to class from Utils PayloadBuilder mocked AchPresenter mocked RavePayInitializer mocked
1 parent c6b0a29 commit f8944eb

File tree

5 files changed

+231
-6
lines changed

5 files changed

+231
-6
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.flutterwave.raveandroid;
2+
3+
import javax.inject.Inject;
4+
import javax.inject.Singleton;
5+
6+
import static com.scottyab.aescrypt.AESCrypt.encrypt;
7+
8+
@Singleton
9+
public class GetEncryptedData {
10+
11+
@Inject
12+
public GetEncryptedData() {
13+
}
14+
15+
public String getEncryptedData(String unEncryptedString, String encryptionKey) {
16+
17+
if (unEncryptedString != null && encryptionKey != null) {
18+
try {
19+
return encrypt(unEncryptedString, encryptionKey);
20+
} catch (Exception e) {
21+
e.printStackTrace();
22+
}
23+
}
24+
return "";
25+
}
26+
27+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.flutterwave.raveandroid;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.reflect.TypeToken;
5+
6+
import java.lang.reflect.Type;
7+
8+
import javax.inject.Inject;
9+
import javax.inject.Singleton;
10+
11+
@Singleton
12+
public class PayloadToJson {
13+
14+
public Gson gson;
15+
16+
@Inject
17+
public PayloadToJson(Gson gson) {
18+
this.gson = gson;
19+
}
20+
21+
public String convertChargeRequestPayloadToJson(Payload body) {
22+
23+
Type type = new TypeToken<Payload>() {
24+
}.getType();
25+
return gson.toJson(body, type);
26+
}
27+
28+
}

raveandroid/src/main/java/com/flutterwave/raveandroid/ach/AchPresenter.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import android.content.Context;
44

55
import com.flutterwave.raveandroid.DeviceIdGetter;
6+
import com.flutterwave.raveandroid.GetEncryptedData;
67
import com.flutterwave.raveandroid.Payload;
78
import com.flutterwave.raveandroid.PayloadBuilder;
9+
import com.flutterwave.raveandroid.PayloadToJson;
810
import com.flutterwave.raveandroid.RaveConstants;
911
import com.flutterwave.raveandroid.RavePayInitializer;
1012
import com.flutterwave.raveandroid.TransactionStatusChecker;
11-
import com.flutterwave.raveandroid.Utils;
1213
import com.flutterwave.raveandroid.card.ChargeRequestBody;
1314
import com.flutterwave.raveandroid.data.Callbacks;
1415
import com.flutterwave.raveandroid.data.NetworkRequestImpl;
@@ -37,6 +38,10 @@ public class AchPresenter implements AchContract.UserActionsListener {
3738
TransactionStatusChecker transactionStatusChecker;
3839
@Inject
3940
DeviceIdGetter deviceIdGetter;
41+
@Inject
42+
PayloadToJson payloadToJson;
43+
@Inject
44+
GetEncryptedData getEncryptedData;
4045

4146
@Inject
4247
public AchPresenter(Context context, AchContract.View mView) {
@@ -107,8 +112,8 @@ public void processTransaction(String amount, RavePayInitializer ravePayInitiali
107112
@Override
108113
public void chargeAccount(Payload payload, String encryptionKey, final boolean isDisplayFee) {
109114

110-
String requestBodyAsString = Utils.convertChargeRequestPayloadToJson(payload);
111-
String accountRequestBody = Utils.getEncryptedData(requestBodyAsString, encryptionKey);
115+
String requestBodyAsString = payloadToJson.convertChargeRequestPayloadToJson(payload);
116+
String accountRequestBody = getEncryptedData.getEncryptedData(requestBodyAsString, encryptionKey);
112117

113118
final ChargeRequestBody body = new ChargeRequestBody();
114119
body.setAlg("3DES-24");

raveandroid/src/test/java/com/flutterwave/raveandroid/ach/AchPresenterTest.java

Lines changed: 154 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import android.content.Context;
44

55
import com.flutterwave.raveandroid.DeviceIdGetter;
6+
import com.flutterwave.raveandroid.GetEncryptedData;
67
import com.flutterwave.raveandroid.Meta;
78
import com.flutterwave.raveandroid.Payload;
9+
import com.flutterwave.raveandroid.PayloadBuilder;
10+
import com.flutterwave.raveandroid.PayloadToJson;
811
import com.flutterwave.raveandroid.RaveConstants;
912
import com.flutterwave.raveandroid.RavePayInitializer;
1013
import com.flutterwave.raveandroid.TransactionStatusChecker;
@@ -35,6 +38,7 @@
3538

3639
import javax.inject.Inject;
3740

41+
import static org.junit.Assert.assertEquals;
3842
import static org.mockito.ArgumentMatchers.any;
3943
import static org.mockito.ArgumentMatchers.anyObject;
4044
import static org.mockito.ArgumentMatchers.anyString;
@@ -51,18 +55,30 @@ public class AchPresenterTest {
5155
AmountValidator amountValidator;
5256
@Inject
5357
RavePayInitializer ravePayInitializer;
58+
@Mock
59+
RavePayInitializer ravePayInitializerMock;
5460
@Inject
5561
DeviceIdGetter deviceIdGetter;
5662
@Inject
63+
PayloadToJson payloadToJson;
64+
@Inject
65+
GetEncryptedData getEncryptedData;
66+
@Inject
5767
NetworkRequestImpl networkRequest;
5868
@Inject
5969
SharedPrefsRequestImpl sharedPrefsRequest;
6070
@Inject
6171
TransactionStatusChecker transactionStatusChecker;
72+
6273
private AchPresenter achPresenter;
74+
@Mock
75+
AchPresenter achPresenterMock;
76+
@Mock
77+
PayloadBuilder payloadBuilderMock;
6378

6479
@Before
6580
public void setUp() {
81+
6682
MockitoAnnotations.initMocks(this);
6783
achPresenter = new AchPresenter(context, view);
6884

@@ -85,6 +101,7 @@ public void init_validAmount_showRedirectMessageTrue() {
85101

86102
achPresenter.init(ravePayInitializer);
87103

104+
verify(view).showAmountField(false);
88105
verify(view).showRedirectMessage(true);
89106

90107
}
@@ -96,32 +113,119 @@ public void init_inValidAmount_showRedirectMessageFalse() {
96113
when(amountValidator.isAmountValid(amount)).thenReturn(false);
97114

98115
achPresenter.init(ravePayInitializer);
116+
117+
verify(view).showAmountField(true);
99118
verify(view).showRedirectMessage(false);
100119

101120
}
102121

103122

104123
@Test
105-
public void processTransaction_chargeAccountCalled() {
124+
public void processTransaction_chargeAccountCalled_createBankPayloadCalled_assertParameters() {
106125
//arrange
107126
String amount = generateRandomString();
108127
when(deviceIdGetter.getDeviceId()).thenReturn(generateRandomString());
128+
109129
Payload payload = generatePayload();
110130
payload.setPBFPubKey(generateRandomString());
131+
String encryptionKey = generateRandomString();
132+
boolean isDisplayFee = true;
133+
111134
//act
112135
achPresenter.processTransaction(amount, ravePayInitializer);
136+
137+
achPresenterMock.chargeAccount(payload, encryptionKey, isDisplayFee);
138+
139+
ArgumentCaptor<Payload> captorPayload = ArgumentCaptor.forClass(Payload.class);
140+
ArgumentCaptor<String> captorEncryptionKey = ArgumentCaptor.forClass(String.class);
141+
ArgumentCaptor<Boolean> captorIsDisplayFee = ArgumentCaptor.forClass(Boolean.class);
142+
143+
verify(achPresenterMock).chargeAccount(captorPayload.capture(), captorEncryptionKey.capture(), captorIsDisplayFee.capture());
144+
113145
//assert
146+
assertEquals(payload, captorPayload.getValue());
147+
assertEquals(encryptionKey, captorEncryptionKey.getValue());
148+
assertEquals(isDisplayFee, captorIsDisplayFee.getValue());
149+
150+
}
151+
152+
153+
@Test
154+
public void processTransaction_setAmountCalled_assertParameters() {
155+
//arrange
156+
String amount = generateRandomString();
157+
when(deviceIdGetter.getDeviceId()).thenReturn(generateRandomString());
158+
Payload payload = generatePayload();
159+
payload.setPBFPubKey(generateRandomString());
160+
161+
Double amountDouble = 10.0;
162+
//act
163+
achPresenter.processTransaction(amount, ravePayInitializer);
164+
165+
ravePayInitializerMock.setAmount(amountDouble);
166+
167+
ArgumentCaptor<Double> captorAmount = ArgumentCaptor.forClass(Double.class);
168+
169+
verify(ravePayInitializerMock).setAmount(captorAmount.capture());
170+
assertEquals(amountDouble, captorAmount.getValue());
171+
}
172+
173+
@Test
174+
public void processTransaction_createBankPayloadCalled_assertParameters() {
175+
//arrange
176+
String amount = generateRandomString();
177+
when(deviceIdGetter.getDeviceId()).thenReturn(generateRandomString());
178+
Payload payload = generatePayload();
179+
payload.setPBFPubKey(generateRandomString());
180+
181+
//act
182+
achPresenter.processTransaction(amount, ravePayInitializer);
183+
184+
payloadBuilderMock.createBankPayload();
185+
186+
187+
verify(payloadBuilderMock).createBankPayload();
188+
}
189+
190+
191+
@Test
192+
public void processTransaction_setPaymentPlanCalled_assertPaymentPlan() {
193+
//arrange
194+
String amount = generateRandomString();
195+
196+
ravePayInitializer.setPayment_plan(generateRandomString());
197+
when(deviceIdGetter.getDeviceId()).thenReturn(generateRandomString());
198+
Payload payload = generatePayload();
199+
payload.setPBFPubKey(generateRandomString());
200+
201+
String paymentPlan = generateRandomString();
202+
//act
203+
achPresenter.processTransaction(amount, ravePayInitializer);
204+
205+
PayloadBuilder payloadBuilder = generatePayloadBuilder();
206+
payloadBuilder.setPaymentPlan(ravePayInitializer.getPayment_plan());
207+
208+
payloadBuilderMock.setPaymentPlan(paymentPlan);
209+
210+
ArgumentCaptor<String> captorString = ArgumentCaptor.forClass(String.class);
114211

115-
achPresenter
116-
.chargeAccount(payload, generateRandomString(), false);
212+
verify(payloadBuilderMock).setPaymentPlan(captorString.capture());
213+
214+
//assert
215+
assertEquals(paymentPlan, captorString.getValue());
117216
}
118217

119218
@Test
120219
public void chargeAccount_noDisplayFee_onSuccess_validResponseReturned_showWebViewCalled() {
121220

122221
Payload payload = generatePayload();
222+
123223
payload.setPBFPubKey(generateRandomString());
124224

225+
when(payloadToJson.convertChargeRequestPayloadToJson(any(Payload.class))).thenReturn(generateRandomString());
226+
when(getEncryptedData.getEncryptedData(any(String.class), any(String.class))).thenReturn(generateRandomString());
227+
228+
125229
achPresenter.chargeAccount(payload, generateRandomString(), false);
126230
verify(view).showProgressIndicator(true);
127231

@@ -143,7 +247,11 @@ public void chargeAccount_displayFee_chargeCard_onSuccess_saveFlwRef_validRespon
143247
Payload payload = generatePayload();
144248
payload.setPBFPubKey(generateRandomString());
145249

250+
when(payloadToJson.convertChargeRequestPayloadToJson(any(Payload.class))).thenReturn(generateRandomString());
251+
when(getEncryptedData.getEncryptedData(any(String.class), any(String.class))).thenReturn(generateRandomString());
252+
146253
achPresenter.chargeAccount(payload, generateRandomString(), true);
254+
147255
verify(view).showProgressIndicator(true);
148256

149257
ArgumentCaptor<Callbacks.OnChargeRequestComplete> captor = ArgumentCaptor.forClass(Callbacks.OnChargeRequestComplete.class);
@@ -165,7 +273,11 @@ public void chargeAccount_onSuccess_nullChargeResponseReturned_onPaymentErrorCal
165273
Payload payload = generatePayload();
166274
payload.setPBFPubKey(generateRandomString());
167275

276+
when(payloadToJson.convertChargeRequestPayloadToJson(any(Payload.class))).thenReturn(generateRandomString());
277+
when(getEncryptedData.getEncryptedData(any(String.class), any(String.class))).thenReturn(generateRandomString());
278+
168279
achPresenter.chargeAccount(payload, generateRandomString(), true);
280+
169281
verify(view).showProgressIndicator(true);
170282
ArgumentCaptor<Callbacks.OnChargeRequestComplete> captor = ArgumentCaptor.forClass(Callbacks.OnChargeRequestComplete.class);
171283

@@ -183,8 +295,14 @@ public void chargeAccount_onSuccess_inValidResponseReturned_onPaymentErrorCalled
183295

184296
Payload payload = generatePayload();
185297
payload.setPBFPubKey(generateRandomString());
298+
299+
when(payloadToJson.convertChargeRequestPayloadToJson(any(Payload.class))).thenReturn(generateRandomString());
300+
when(getEncryptedData.getEncryptedData(any(String.class), any(String.class))).thenReturn(generateRandomString());
301+
186302
achPresenter.chargeAccount(payload, generateRandomString(), true);
303+
187304
verify(view).showProgressIndicator(true);
305+
188306
ArgumentCaptor<Callbacks.OnChargeRequestComplete> captor = ArgumentCaptor.forClass(Callbacks.OnChargeRequestComplete.class);
189307

190308
verify(networkRequest).chargeCard(any(ChargeRequestBody.class), captor.capture());
@@ -196,6 +314,30 @@ public void chargeAccount_onSuccess_inValidResponseReturned_onPaymentErrorCalled
196314

197315
}
198316

317+
@Test
318+
public void chargeAccount_onError_onPaymentErrorCalled_messageReturned() {
319+
320+
Payload payload = generatePayload();
321+
payload.setPBFPubKey(generateRandomString());
322+
323+
String message = generateRandomString();
324+
325+
when(payloadToJson.convertChargeRequestPayloadToJson(any(Payload.class))).thenReturn(generateRandomString());
326+
when(getEncryptedData.getEncryptedData(any(String.class), any(String.class))).thenReturn(generateRandomString());
327+
328+
achPresenter.chargeAccount(payload, generateRandomString(), true);
329+
verify(view).showProgressIndicator(true);
330+
ArgumentCaptor<Callbacks.OnChargeRequestComplete> captor = ArgumentCaptor.forClass(Callbacks.OnChargeRequestComplete.class);
331+
332+
verify(networkRequest).chargeCard(any(ChargeRequestBody.class), captor.capture());
333+
334+
captor.getAllValues().get(0).onError(message, generateRandomString());
335+
336+
verify(view).showProgressIndicator(false);
337+
verify(view).onPaymentError(message);
338+
339+
}
340+
199341
@Test
200342
public void onFeeConfirmed_showWebViewCalled() {
201343
achPresenter.onFeeConfirmed(anyString(), anyString());
@@ -206,10 +348,13 @@ public void onFeeConfirmed_showWebViewCalled() {
206348
public void requeryTx_onSuccess_onRequerySuccessfulCalled() {
207349
when(sharedPrefsRequest.fetchFlwRef()).thenReturn(generateRandomString());
208350
achPresenter.requeryTx(generateRandomString());
351+
209352
verify(view).showProgressIndicator(true);
210353
ArgumentCaptor<Callbacks.OnRequeryRequestComplete> captor = ArgumentCaptor.forClass(Callbacks.OnRequeryRequestComplete.class);
211354
verify(networkRequest).requeryTx(any(RequeryRequestBody.class), captor.capture());
212355
captor.getAllValues().get(0).onSuccess(generateRequerySuccessful(), generateRandomString());
356+
357+
verify(view).showProgressIndicator(false);
213358
verify(view).onRequerySuccessful(any(RequeryResponse.class), anyString(), anyString());
214359

215360
}
@@ -288,6 +433,12 @@ private ChargeResponse generateNullChargeResponse() {
288433
return chargeResponse;
289434
}
290435

436+
private PayloadBuilder generatePayloadBuilder() {
437+
PayloadBuilder payloadBuilder = new PayloadBuilder();
438+
payloadBuilder.setPaymentPlan(generateRandomString());
439+
return payloadBuilder;
440+
}
441+
291442
private ChargeResponse generateRandomChargeResponse() {
292443
ChargeResponse chargeResponse = new ChargeResponse();
293444
chargeResponse.setData(new ChargeResponse.Data());

raveandroid/src/test/java/com/flutterwave/raveandroid/di/TestAndroidModule.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.test.mock.MockContext;
55

66
import com.flutterwave.raveandroid.DeviceIdGetter;
7+
import com.flutterwave.raveandroid.GetEncryptedData;
8+
import com.flutterwave.raveandroid.PayloadToJson;
79
import com.flutterwave.raveandroid.RavePayInitializer;
810
import com.flutterwave.raveandroid.TransactionStatusChecker;
911
import com.flutterwave.raveandroid.data.SharedPrefsRequestImpl;
@@ -137,5 +139,17 @@ public DeviceIdGetter providesDeviceIdGetter() {
137139
return Mockito.mock(DeviceIdGetter.class);
138140
}
139141

142+
@Provides
143+
@Singleton
144+
public PayloadToJson providesPayloadToJson() {
145+
return Mockito.mock(PayloadToJson.class);
146+
}
147+
148+
@Provides
149+
@Singleton
150+
public GetEncryptedData providesGetEncryptedData() {
151+
return Mockito.mock(GetEncryptedData.class);
152+
}
153+
140154

141155
}

0 commit comments

Comments
 (0)