Skip to content

Commit 1537b1d

Browse files
Add unit tests for ReviewHelper in-app review logic
1 parent a82cdd8 commit 1537b1d

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.d4rk.androidtutorials.java.utils;
2+
3+
import static org.mockito.Mockito.doAnswer;
4+
import static org.mockito.Mockito.mock;
5+
import static org.mockito.Mockito.mockStatic;
6+
import static org.mockito.Mockito.times;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.verifyNoInteractions;
9+
import static org.mockito.Mockito.when;
10+
11+
import android.app.Activity;
12+
13+
import com.google.android.gms.tasks.OnCompleteListener;
14+
import com.google.android.gms.tasks.Task;
15+
import com.google.android.play.core.review.ReviewInfo;
16+
import com.google.android.play.core.review.ReviewManager;
17+
import com.google.android.play.core.review.ReviewManagerFactory;
18+
19+
import org.junit.Test;
20+
import org.mockito.ArgumentMatchers;
21+
import org.mockito.MockedStatic;
22+
23+
public class ReviewHelperTest {
24+
25+
@Test
26+
public void launchInAppReviewIfEligible_launchesReviewWhenEligible() {
27+
Activity activity = mock(Activity.class);
28+
ReviewManager reviewManager = mock(ReviewManager.class);
29+
Task<ReviewInfo> reviewInfoTask = mock(Task.class);
30+
Task<Void> flowTask = mock(Task.class);
31+
ReviewInfo reviewInfo = mock(ReviewInfo.class);
32+
Runnable callback = mock(Runnable.class);
33+
34+
when(reviewManager.requestReviewFlow()).thenReturn(reviewInfoTask);
35+
when(reviewInfoTask.isSuccessful()).thenReturn(true);
36+
when(reviewInfoTask.getResult()).thenReturn(reviewInfo);
37+
when(reviewManager.launchReviewFlow(activity, reviewInfo)).thenReturn(flowTask);
38+
39+
doAnswer(invocation -> {
40+
OnCompleteListener<ReviewInfo> listener = invocation.getArgument(0);
41+
listener.onComplete(reviewInfoTask);
42+
return reviewInfoTask;
43+
}).when(reviewInfoTask).addOnCompleteListener(ArgumentMatchers.<OnCompleteListener<ReviewInfo>>any());
44+
45+
doAnswer(invocation -> {
46+
OnCompleteListener<Void> listener = invocation.getArgument(0);
47+
listener.onComplete(flowTask);
48+
return flowTask;
49+
}).when(flowTask).addOnCompleteListener(ArgumentMatchers.<OnCompleteListener<Void>>any());
50+
51+
try (MockedStatic<ReviewManagerFactory> factory = mockStatic(ReviewManagerFactory.class)) {
52+
factory.when(() -> ReviewManagerFactory.create(activity)).thenReturn(reviewManager);
53+
54+
ReviewHelper.launchInAppReviewIfEligible(activity, 3, false, callback);
55+
56+
factory.verify(times(1), () -> ReviewManagerFactory.create(activity));
57+
}
58+
59+
verify(reviewManager).requestReviewFlow();
60+
verify(reviewManager).launchReviewFlow(activity, reviewInfo);
61+
verify(callback, times(1)).run();
62+
}
63+
64+
@Test
65+
public void launchInAppReviewIfEligible_doesNotLaunchWhenBelowThreshold() {
66+
Activity activity = mock(Activity.class);
67+
Runnable callback = mock(Runnable.class);
68+
69+
try (MockedStatic<ReviewManagerFactory> factory = mockStatic(ReviewManagerFactory.class)) {
70+
ReviewHelper.launchInAppReviewIfEligible(activity, 2, false, callback);
71+
72+
factory.verifyNoInteractions();
73+
}
74+
75+
verifyNoInteractions(callback);
76+
}
77+
78+
@Test
79+
public void launchInAppReviewIfEligible_doesNotLaunchWhenAlreadyPrompted() {
80+
Activity activity = mock(Activity.class);
81+
Runnable callback = mock(Runnable.class);
82+
83+
try (MockedStatic<ReviewManagerFactory> factory = mockStatic(ReviewManagerFactory.class)) {
84+
ReviewHelper.launchInAppReviewIfEligible(activity, 5, true, callback);
85+
86+
factory.verifyNoInteractions();
87+
}
88+
89+
verifyNoInteractions(callback);
90+
}
91+
}

0 commit comments

Comments
 (0)