44import static org .junit .Assert .assertNotNull ;
55import static org .junit .Assert .assertTrue ;
66
7+ import android .content .Intent ;
8+ import android .net .Uri ;
9+
710import androidx .arch .core .executor .testing .InstantTaskExecutorRule ;
811
912import com .d4rk .androidtutorials .java .data .model .PromotedApp ;
1619import org .junit .Rule ;
1720import org .junit .Test ;
1821
22+ import java .util .ArrayList ;
23+ import java .util .HashMap ;
1924import java .util .List ;
25+ import java .util .Map ;
2026
2127
2228public class HomeViewModelTest {
@@ -28,12 +34,7 @@ public class HomeViewModelTest {
2834 public void uiStateUpdatesWithData () {
2935 List <PromotedApp > promoted = List .of (new PromotedApp ("App" , "pkg" , "icon" ));
3036 FakeHomeRepository repo = new FakeHomeRepository (promoted );
31- HomeViewModel viewModel = new HomeViewModel (
32- new GetDailyTipUseCase (repo ),
33- new GetPromotedAppsUseCase (repo ),
34- new GetPlayStoreUrlUseCase (repo ),
35- new GetAppPlayStoreUrlUseCase (repo )
36- );
37+ HomeViewModel viewModel = createViewModel (repo );
3738 viewModel .setAnnouncements ("Title" , "Subtitle" );
3839
3940 HomeUiState state = viewModel .getUiState ().getValue ();
@@ -47,39 +48,118 @@ public void uiStateUpdatesWithData() {
4748 @ Test
4849 public void uiStateHandlesEmptyPromotedApps () {
4950 FakeHomeRepository repo = new FakeHomeRepository (List .of ());
50- HomeViewModel viewModel = new HomeViewModel (
51- new GetDailyTipUseCase (repo ),
52- new GetPromotedAppsUseCase (repo ),
53- new GetPlayStoreUrlUseCase (repo ),
54- new GetAppPlayStoreUrlUseCase (repo )
55- );
51+ HomeViewModel viewModel = createViewModel (repo );
5652 viewModel .setAnnouncements ("Title" , "Subtitle" );
5753
5854 HomeUiState state = viewModel .getUiState ().getValue ();
5955 assertNotNull (state );
6056 assertTrue (state .promotedApps ().isEmpty ());
6157 }
6258
63- record FakeHomeRepository (List <PromotedApp > apps ) implements HomeRepository {
59+ @ Test
60+ public void promotedAppsLimitedToAtMostFour () {
61+ List <PromotedApp > promoted = List .of (
62+ new PromotedApp ("App1" , "pkg1" , "icon1" ),
63+ new PromotedApp ("App2" , "pkg2" , "icon2" ),
64+ new PromotedApp ("App3" , "pkg3" , "icon3" ),
65+ new PromotedApp ("App4" , "pkg4" , "icon4" ),
66+ new PromotedApp ("App5" , "pkg5" , "icon5" )
67+ );
68+ FakeHomeRepository repo = new FakeHomeRepository (promoted );
69+ HomeViewModel viewModel = createViewModel (repo );
70+
71+ HomeUiState state = viewModel .getUiState ().getValue ();
72+ assertNotNull (state );
73+ assertTrue (state .promotedApps ().size () <= 4 );
74+ }
75+
76+ @ Test
77+ public void getOpenPlayStoreIntent_buildsViewIntent () {
78+ FakeHomeRepository repo = new FakeHomeRepository (List .of ());
79+ String expectedUrl = "https://play.google.com/store/apps/details?id=com.example" ;
80+ repo .setPlayStoreUrl (expectedUrl );
81+ HomeViewModel viewModel = createViewModel (repo );
82+
83+ Intent intent = viewModel .getOpenPlayStoreIntent ();
84+
85+ assertEquals (Intent .ACTION_VIEW , intent .getAction ());
86+ assertEquals (Uri .parse (expectedUrl ), intent .getData ());
87+ }
88+
89+ @ Test
90+ public void getPromotedAppIntent_buildsViewIntent () {
91+ FakeHomeRepository repo = new FakeHomeRepository (List .of ());
92+ String packageName = "pkg" ;
93+ String expectedUrl = "https://play.google.com/store/apps/details?id=" + packageName ;
94+ repo .setAppUrl (packageName , expectedUrl );
95+ HomeViewModel viewModel = createViewModel (repo );
96+
97+ Intent intent = viewModel .getPromotedAppIntent (packageName );
98+
99+ assertEquals (Intent .ACTION_VIEW , intent .getAction ());
100+ assertEquals (Uri .parse (expectedUrl ), intent .getData ());
101+ }
102+
103+ @ Test
104+ public void getLearnMoreIntent_targetsAndroidDevelopers () {
105+ FakeHomeRepository repo = new FakeHomeRepository (List .of ());
106+ HomeViewModel viewModel = createViewModel (repo );
107+
108+ Intent intent = viewModel .getLearnMoreIntent ();
109+
110+ assertEquals (Intent .ACTION_VIEW , intent .getAction ());
111+ assertEquals (Uri .parse ("https://developer.android.com" ), intent .getData ());
112+ }
113+
114+ private HomeViewModel createViewModel (FakeHomeRepository repo ) {
115+ return new HomeViewModel (
116+ new GetDailyTipUseCase (repo ),
117+ new GetPromotedAppsUseCase (repo ),
118+ new GetPlayStoreUrlUseCase (repo ),
119+ new GetAppPlayStoreUrlUseCase (repo )
120+ );
121+ }
122+
123+ private static final class FakeHomeRepository implements HomeRepository {
124+ private final List <PromotedApp > promotedApps ;
125+ private String dailyTip = "tip" ;
126+ private String playStoreUrl = "https://play.google.com/store/apps/details?id=default" ;
127+ private final Map <String , String > appUrls = new HashMap <>();
128+
129+ FakeHomeRepository (List <PromotedApp > promotedApps ) {
130+ this .promotedApps = new ArrayList <>(promotedApps );
131+ }
132+
133+ void setDailyTip (String dailyTip ) {
134+ this .dailyTip = dailyTip ;
135+ }
136+
137+ void setPlayStoreUrl (String playStoreUrl ) {
138+ this .playStoreUrl = playStoreUrl ;
139+ }
140+
141+ void setAppUrl (String packageName , String url ) {
142+ appUrls .put (packageName , url );
143+ }
64144
65145 @ Override
66146 public String dailyTip () {
67- return "tip" ;
147+ return dailyTip ;
68148 }
69149
70150 @ Override
71151 public String getPlayStoreUrl () {
72- return "" ;
152+ return playStoreUrl ;
73153 }
74154
75155 @ Override
76156 public String getAppPlayStoreUrl (String packageName ) {
77- return "" ;
157+ return appUrls . getOrDefault ( packageName , "" ) ;
78158 }
79159
80160 @ Override
81161 public void fetchPromotedApps (PromotedAppsCallback callback ) {
82- callback .onResult (apps );
162+ callback .onResult (promotedApps );
83163 }
84164 }
85165}
0 commit comments