Skip to content

Commit 5011ae4

Browse files
Merge pull request #184 from MihaiCristianCondrea/codex/create-mainviewmodeltest-with-mocks-and-assertions
Add MainViewModel unit tests
2 parents 55d0eb3 + 4991962 commit 5011ae4

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package com.d4rk.androidtutorials.java.ui.screens.main;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotNull;
5+
import static org.junit.Assert.assertTrue;
6+
7+
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
8+
9+
import com.d4rk.androidtutorials.java.R;
10+
import com.d4rk.androidtutorials.java.domain.main.ApplyLanguageSettingsUseCase;
11+
import com.d4rk.androidtutorials.java.domain.main.ApplyThemeSettingsUseCase;
12+
import com.d4rk.androidtutorials.java.domain.main.GetAppUpdateManagerUseCase;
13+
import com.d4rk.androidtutorials.java.domain.main.GetBottomNavLabelVisibilityUseCase;
14+
import com.d4rk.androidtutorials.java.domain.main.GetDefaultTabPreferenceUseCase;
15+
import com.d4rk.androidtutorials.java.domain.main.MarkStartupScreenShownUseCase;
16+
import com.d4rk.androidtutorials.java.domain.main.ShouldShowStartupScreenUseCase;
17+
import com.google.android.material.navigation.NavigationBarView;
18+
19+
import org.junit.Before;
20+
import org.junit.Rule;
21+
import org.junit.Test;
22+
import org.mockito.Mockito;
23+
24+
import java.lang.reflect.Method;
25+
import java.util.ArrayList;
26+
import java.util.List;
27+
28+
public class MainViewModelTest {
29+
30+
@Rule
31+
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
32+
33+
private ApplyThemeSettingsUseCase applyThemeSettingsUseCase;
34+
private GetBottomNavLabelVisibilityUseCase getBottomNavLabelVisibilityUseCase;
35+
private GetDefaultTabPreferenceUseCase getDefaultTabPreferenceUseCase;
36+
private ApplyLanguageSettingsUseCase applyLanguageSettingsUseCase;
37+
private ShouldShowStartupScreenUseCase shouldShowStartupScreenUseCase;
38+
private MarkStartupScreenShownUseCase markStartupScreenShownUseCase;
39+
private GetAppUpdateManagerUseCase getAppUpdateManagerUseCase;
40+
41+
private final String[] themeValues = {"MODE_NIGHT_FOLLOW_SYSTEM", "MODE_NIGHT_NO", "MODE_NIGHT_YES"};
42+
private final String[] bottomNavBarLabelsValues = {"labeled", "selected", "unlabeled"};
43+
private final String[] defaultTabValues = {"home", "android_studio", "about"};
44+
45+
@Before
46+
public void setUp() {
47+
applyThemeSettingsUseCase = Mockito.mock(ApplyThemeSettingsUseCase.class);
48+
getBottomNavLabelVisibilityUseCase = Mockito.mock(GetBottomNavLabelVisibilityUseCase.class);
49+
getDefaultTabPreferenceUseCase = Mockito.mock(GetDefaultTabPreferenceUseCase.class);
50+
applyLanguageSettingsUseCase = Mockito.mock(ApplyLanguageSettingsUseCase.class);
51+
shouldShowStartupScreenUseCase = Mockito.mock(ShouldShowStartupScreenUseCase.class);
52+
markStartupScreenShownUseCase = Mockito.mock(MarkStartupScreenShownUseCase.class);
53+
getAppUpdateManagerUseCase = Mockito.mock(GetAppUpdateManagerUseCase.class);
54+
}
55+
56+
@Test
57+
public void applySettingsUpdatesUiStateForLabeledHome() {
58+
Mockito.when(applyThemeSettingsUseCase.invoke(themeValues)).thenReturn(true);
59+
Mockito.when(getBottomNavLabelVisibilityUseCase.invoke()).thenReturn("labeled");
60+
Mockito.when(getDefaultTabPreferenceUseCase.invoke()).thenReturn("home");
61+
62+
MainViewModel viewModel = new MainViewModel(
63+
applyThemeSettingsUseCase,
64+
getBottomNavLabelVisibilityUseCase,
65+
getDefaultTabPreferenceUseCase,
66+
applyLanguageSettingsUseCase,
67+
shouldShowStartupScreenUseCase,
68+
markStartupScreenShownUseCase,
69+
getAppUpdateManagerUseCase
70+
);
71+
72+
List<Boolean> loading = new ArrayList<>();
73+
viewModel.getLoadingState().observeForever(loading::add);
74+
75+
viewModel.applySettings(themeValues, bottomNavBarLabelsValues, defaultTabValues);
76+
77+
assertEquals(List.of(false, true, false), loading);
78+
79+
MainUiState state = viewModel.getUiState().getValue();
80+
assertNotNull(state);
81+
assertEquals(NavigationBarView.LABEL_VISIBILITY_LABELED, state.bottomNavVisibility());
82+
assertEquals(R.id.navigation_home, state.defaultNavDestination());
83+
assertTrue(state.themeChanged());
84+
}
85+
86+
@Test
87+
public void applySettingsUpdatesUiStateForSelectedAndroidStudio() {
88+
Mockito.when(applyThemeSettingsUseCase.invoke(themeValues)).thenReturn(false);
89+
Mockito.when(getBottomNavLabelVisibilityUseCase.invoke()).thenReturn("selected");
90+
Mockito.when(getDefaultTabPreferenceUseCase.invoke()).thenReturn("android_studio");
91+
92+
MainViewModel viewModel = new MainViewModel(
93+
applyThemeSettingsUseCase,
94+
getBottomNavLabelVisibilityUseCase,
95+
getDefaultTabPreferenceUseCase,
96+
applyLanguageSettingsUseCase,
97+
shouldShowStartupScreenUseCase,
98+
markStartupScreenShownUseCase,
99+
getAppUpdateManagerUseCase
100+
);
101+
102+
List<Boolean> loading = new ArrayList<>();
103+
viewModel.getLoadingState().observeForever(loading::add);
104+
105+
viewModel.applySettings(themeValues, bottomNavBarLabelsValues, defaultTabValues);
106+
107+
assertEquals(List.of(false, true, false), loading);
108+
109+
MainUiState state = viewModel.getUiState().getValue();
110+
assertNotNull(state);
111+
assertEquals(NavigationBarView.LABEL_VISIBILITY_SELECTED, state.bottomNavVisibility());
112+
assertEquals(R.id.navigation_android_studio, state.defaultNavDestination());
113+
assertTrue(!state.themeChanged());
114+
}
115+
116+
@Test
117+
public void applySettingsUpdatesUiStateForUnlabeledAbout() {
118+
Mockito.when(applyThemeSettingsUseCase.invoke(themeValues)).thenReturn(true);
119+
Mockito.when(getBottomNavLabelVisibilityUseCase.invoke()).thenReturn("unlabeled");
120+
Mockito.when(getDefaultTabPreferenceUseCase.invoke()).thenReturn("about");
121+
122+
MainViewModel viewModel = new MainViewModel(
123+
applyThemeSettingsUseCase,
124+
getBottomNavLabelVisibilityUseCase,
125+
getDefaultTabPreferenceUseCase,
126+
applyLanguageSettingsUseCase,
127+
shouldShowStartupScreenUseCase,
128+
markStartupScreenShownUseCase,
129+
getAppUpdateManagerUseCase
130+
);
131+
132+
List<Boolean> loading = new ArrayList<>();
133+
viewModel.getLoadingState().observeForever(loading::add);
134+
135+
viewModel.applySettings(themeValues, bottomNavBarLabelsValues, defaultTabValues);
136+
137+
assertEquals(List.of(false, true, false), loading);
138+
139+
MainUiState state = viewModel.getUiState().getValue();
140+
assertNotNull(state);
141+
assertEquals(NavigationBarView.LABEL_VISIBILITY_UNLABELED, state.bottomNavVisibility());
142+
assertEquals(R.id.navigation_about, state.defaultNavDestination());
143+
assertTrue(state.themeChanged());
144+
}
145+
146+
private int callVisibilityMode(String value) throws Exception {
147+
Method method = MainViewModel.class.getDeclaredMethod(
148+
"getVisibilityMode", String.class, String[].class);
149+
method.setAccessible(true);
150+
return (Integer) method.invoke(null, value, bottomNavBarLabelsValues);
151+
}
152+
153+
@Test
154+
public void getVisibilityModeReturnsLabeled() throws Exception {
155+
assertEquals(NavigationBarView.LABEL_VISIBILITY_LABELED, callVisibilityMode("labeled"));
156+
}
157+
158+
@Test
159+
public void getVisibilityModeReturnsSelected() throws Exception {
160+
assertEquals(NavigationBarView.LABEL_VISIBILITY_SELECTED, callVisibilityMode("selected"));
161+
}
162+
163+
@Test
164+
public void getVisibilityModeReturnsUnlabeled() throws Exception {
165+
assertEquals(NavigationBarView.LABEL_VISIBILITY_UNLABELED, callVisibilityMode("unlabeled"));
166+
}
167+
168+
@Test
169+
public void getVisibilityModeReturnsAutoForUnknown() throws Exception {
170+
assertEquals(NavigationBarView.LABEL_VISIBILITY_AUTO, callVisibilityMode("other"));
171+
}
172+
}
173+

0 commit comments

Comments
 (0)