Skip to content

Commit cb75679

Browse files
Add repository tests for data layer
1 parent 31e7acb commit cb75679

File tree

6 files changed

+919
-0
lines changed

6 files changed

+919
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.d4rk.androidtutorials.java.data.repository;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.mockito.Mockito.verify;
5+
import static org.mockito.Mockito.when;
6+
7+
import android.content.Context;
8+
9+
import com.d4rk.androidtutorials.java.BuildConfig;
10+
import com.d4rk.androidtutorials.java.R;
11+
import com.d4rk.androidtutorials.java.ui.screens.about.repository.AboutRepository;
12+
13+
import org.junit.Test;
14+
15+
import java.text.SimpleDateFormat;
16+
import java.util.Calendar;
17+
import java.util.Locale;
18+
19+
public class AboutRepositoryTest {
20+
21+
@Test
22+
public void getVersionString_formatsFromContextTemplate() {
23+
Context context = org.mockito.Mockito.mock(Context.class);
24+
when(context.getApplicationContext()).thenReturn(context);
25+
when(context.getString(R.string.app_version)).thenReturn("v%s (%d)");
26+
27+
AboutRepository repository = new AboutRepository(context);
28+
29+
String expected = String.format("v%s (%d)", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE);
30+
assertEquals(expected, repository.getVersionString());
31+
32+
verify(context).getString(R.string.app_version);
33+
}
34+
35+
@Test
36+
public void getCurrentYear_returnsFormattedYear() {
37+
Context context = org.mockito.Mockito.mock(Context.class);
38+
when(context.getApplicationContext()).thenReturn(context);
39+
40+
AboutRepository repository = new AboutRepository(context);
41+
42+
String expected = new SimpleDateFormat("yyyy", Locale.getDefault())
43+
.format(Calendar.getInstance().getTime());
44+
45+
assertEquals(expected, repository.getCurrentYear());
46+
}
47+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.d4rk.androidtutorials.java.data.repository;
2+
3+
import static org.mockito.ArgumentMatchers.any;
4+
import static org.mockito.Mockito.mock;
5+
import static org.mockito.Mockito.verify;
6+
import static org.mockito.Mockito.when;
7+
8+
import android.app.Activity;
9+
import android.content.Context;
10+
11+
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
12+
import com.google.android.play.core.review.ReviewInfo;
13+
import com.google.android.play.core.review.ReviewManager;
14+
import com.google.android.play.core.review.ReviewManagerFactory;
15+
import com.google.android.gms.tasks.OnFailureListener;
16+
import com.google.android.gms.tasks.OnSuccessListener;
17+
import com.google.android.gms.tasks.Task;
18+
19+
import org.junit.Test;
20+
import org.mockito.MockedStatic;
21+
import org.mockito.Mockito;
22+
23+
public class HelpRepositoryTest {
24+
25+
@SuppressWarnings("unchecked")
26+
@Test
27+
public void requestReviewFlow_notifiesSuccessListener() {
28+
Context context = mock(Context.class);
29+
ReviewManager reviewManager = mock(ReviewManager.class);
30+
Task<ReviewInfo> task = mock(Task.class);
31+
ReviewInfo reviewInfo = mock(ReviewInfo.class);
32+
com.d4rk.androidtutorials.java.data.repository.HelpRepository.OnReviewInfoListener listener =
33+
mock(com.d4rk.androidtutorials.java.data.repository.HelpRepository.OnReviewInfoListener.class);
34+
35+
try (MockedStatic<ReviewManagerFactory> reviewManagerFactoryMockedStatic = Mockito.mockStatic(ReviewManagerFactory.class)) {
36+
reviewManagerFactoryMockedStatic.when(() -> ReviewManagerFactory.create(context)).thenReturn(reviewManager);
37+
when(reviewManager.requestReviewFlow()).thenReturn(task);
38+
when(task.addOnSuccessListener(any(OnSuccessListener.class))).thenAnswer(invocation -> {
39+
OnSuccessListener<ReviewInfo> onSuccessListener = invocation.getArgument(0);
40+
onSuccessListener.onSuccess(reviewInfo);
41+
return task;
42+
});
43+
when(task.addOnFailureListener(any(OnFailureListener.class))).thenReturn(task);
44+
45+
HelpRepository repository = new HelpRepository(context);
46+
47+
repository.requestReviewFlow(listener);
48+
49+
verify(listener).onSuccess(reviewInfo);
50+
}
51+
}
52+
53+
@SuppressWarnings("unchecked")
54+
@Test
55+
public void requestReviewFlow_notifiesFailureListener() {
56+
Context context = mock(Context.class);
57+
ReviewManager reviewManager = mock(ReviewManager.class);
58+
Task<ReviewInfo> task = mock(Task.class);
59+
Exception error = new Exception("failure");
60+
com.d4rk.androidtutorials.java.data.repository.HelpRepository.OnReviewInfoListener listener =
61+
mock(com.d4rk.androidtutorials.java.data.repository.HelpRepository.OnReviewInfoListener.class);
62+
63+
try (MockedStatic<ReviewManagerFactory> reviewManagerFactoryMockedStatic = Mockito.mockStatic(ReviewManagerFactory.class)) {
64+
reviewManagerFactoryMockedStatic.when(() -> ReviewManagerFactory.create(context)).thenReturn(reviewManager);
65+
when(reviewManager.requestReviewFlow()).thenReturn(task);
66+
when(task.addOnSuccessListener(any(OnSuccessListener.class))).thenReturn(task);
67+
when(task.addOnFailureListener(any(OnFailureListener.class))).thenAnswer(invocation -> {
68+
OnFailureListener onFailureListener = invocation.getArgument(0);
69+
onFailureListener.onFailure(error);
70+
return task;
71+
});
72+
73+
HelpRepository repository = new HelpRepository(context);
74+
75+
repository.requestReviewFlow(listener);
76+
77+
verify(listener).onFailure(error);
78+
}
79+
}
80+
81+
@Test
82+
public void launchReviewFlow_forwardsToManager() {
83+
Context context = mock(Context.class);
84+
Activity activity = mock(Activity.class);
85+
ReviewManager reviewManager = mock(ReviewManager.class);
86+
ReviewInfo reviewInfo = mock(ReviewInfo.class);
87+
88+
try (MockedStatic<ReviewManagerFactory> reviewManagerFactoryMockedStatic = Mockito.mockStatic(ReviewManagerFactory.class)) {
89+
reviewManagerFactoryMockedStatic.when(() -> ReviewManagerFactory.create(context)).thenReturn(reviewManager);
90+
HelpRepository repository = new HelpRepository(context);
91+
92+
repository.launchReviewFlow(activity, reviewInfo);
93+
94+
verify(reviewManager).launchReviewFlow(activity, reviewInfo);
95+
}
96+
}
97+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.d4rk.androidtutorials.java.data.repository;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertThrows;
5+
6+
import com.d4rk.androidtutorials.java.R;
7+
8+
import org.junit.Test;
9+
10+
public class LessonRepositoryTest {
11+
12+
private final com.d4rk.androidtutorials.java.ui.screens.android.repository.LessonRepository repository =
13+
new com.d4rk.androidtutorials.java.ui.screens.android.repository.LessonRepository();
14+
15+
@Test
16+
public void getLesson_knownLessonReturnsRecord() {
17+
LessonRepository.Lesson expected = new LessonRepository.Lesson(
18+
R.string.alert_dialog,
19+
R.raw.text_alertdialog_java,
20+
R.raw.text_center_button_xml
21+
);
22+
23+
LessonRepository.Lesson result = repository.getLesson("AlertDialog");
24+
25+
assertEquals(expected, result);
26+
}
27+
28+
@Test
29+
public void getLesson_emptyNameThrows() {
30+
IllegalArgumentException exception = assertThrows(
31+
IllegalArgumentException.class,
32+
() -> repository.getLesson("")
33+
);
34+
assertEquals("Unknown lesson: ", exception.getMessage());
35+
}
36+
37+
@Test
38+
public void getLesson_unknownLessonThrows() {
39+
IllegalArgumentException exception = assertThrows(
40+
IllegalArgumentException.class,
41+
() -> repository.getLesson("Unknown")
42+
);
43+
assertEquals("Unknown lesson: Unknown", exception.getMessage());
44+
}
45+
}

0 commit comments

Comments
 (0)