From ee738fc0b8d805c7aa5119af75a875b63fa9b1ca Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Sun, 14 Sep 2025 09:36:02 +0300 Subject: [PATCH 1/3] test: add remote data source parsing tests --- .../DefaultHomeRemoteDataSourceTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java diff --git a/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java new file mode 100644 index 00000000..eb8cd776 --- /dev/null +++ b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java @@ -0,0 +1,62 @@ +package com.d4rk.androidtutorials.java.data.source; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import android.os.Looper; + +import com.android.volley.RequestQueue; +import com.d4rk.androidtutorials.java.data.model.PromotedApp; + +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.List; + +public class DefaultHomeRemoteDataSourceTest { + + private DefaultHomeRemoteDataSource dataSource; + private Method parseMethod; + + @Before + public void setUp() throws Exception { + if (Looper.getMainLooper() == null) { + try { + Method prepareMainLooper = Looper.class.getDeclaredMethod("prepareMainLooper"); + prepareMainLooper.setAccessible(true); + prepareMainLooper.invoke(null); + } catch (Exception ignored) { + Looper.prepare(); + } + } + RequestQueue queue = mock(RequestQueue.class); + dataSource = new DefaultHomeRemoteDataSource(queue, "https://example.com"); + parseMethod = DefaultHomeRemoteDataSource.class.getDeclaredMethod("parseResponse", JSONObject.class); + parseMethod.setAccessible(true); + } + + @SuppressWarnings("unchecked") + private List invokeParse(JSONObject json) throws Exception { + return (List) parseMethod.invoke(dataSource, json); + } + + @Test + public void parseResponseFiltersOwnPackages() throws Exception { + String json = "{\"data\":{\"apps\":[" + + "{\"name\":\"App1\",\"packageName\":\"com.example.app1\",\"iconLogo\":\"logo1\"}," + + "{\"name\":\"App2\",\"packageName\":\"com.d4rk.androidtutorials.sample\",\"iconLogo\":\"logo2\"}]}}"; + List result = invokeParse(new JSONObject(json)); + assertEquals(1, result.size()); + assertEquals("com.example.app1", result.get(0).getPackageName()); + } + + @Test + public void parseResponseMalformedJsonReturnsEmptyList() throws Exception { + String json = "{\"data\":{}}"; + List result = invokeParse(new JSONObject(json)); + assertTrue(result.isEmpty()); + } +} From 73062d1835d354932fff605e5152b7c9e42421d0 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Sun, 14 Sep 2025 09:43:13 +0300 Subject: [PATCH 2/3] test: fix record access in remote data source test --- .../java/data/source/DefaultHomeRemoteDataSourceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java index eb8cd776..a9bc4c27 100644 --- a/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java +++ b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java @@ -50,7 +50,7 @@ public void parseResponseFiltersOwnPackages() throws Exception { "{\"name\":\"App2\",\"packageName\":\"com.d4rk.androidtutorials.sample\",\"iconLogo\":\"logo2\"}]}}"; List result = invokeParse(new JSONObject(json)); assertEquals(1, result.size()); - assertEquals("com.example.app1", result.get(0).getPackageName()); + assertEquals("com.example.app1", result.get(0).packageName()); } @Test From b0ccb7fec30ec4708fe82be8a768672cea996860 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Sun, 14 Sep 2025 09:53:05 +0300 Subject: [PATCH 3/3] test: fix remote data source tests --- .../DefaultHomeRemoteDataSourceTest.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java index a9bc4c27..d89989b8 100644 --- a/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java +++ b/app/src/test/java/com/d4rk/androidtutorials/java/data/source/DefaultHomeRemoteDataSourceTest.java @@ -4,8 +4,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; -import android.os.Looper; - import com.android.volley.RequestQueue; import com.d4rk.androidtutorials.java.data.model.PromotedApp; @@ -13,6 +11,7 @@ import org.junit.Before; import org.junit.Test; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; @@ -23,17 +22,13 @@ public class DefaultHomeRemoteDataSourceTest { @Before public void setUp() throws Exception { - if (Looper.getMainLooper() == null) { - try { - Method prepareMainLooper = Looper.class.getDeclaredMethod("prepareMainLooper"); - prepareMainLooper.setAccessible(true); - prepareMainLooper.invoke(null); - } catch (Exception ignored) { - Looper.prepare(); - } - } - RequestQueue queue = mock(RequestQueue.class); - dataSource = new DefaultHomeRemoteDataSource(queue, "https://example.com"); + dataSource = mock(DefaultHomeRemoteDataSource.class); + Field queueField = DefaultHomeRemoteDataSource.class.getDeclaredField("requestQueue"); + queueField.setAccessible(true); + queueField.set(dataSource, mock(RequestQueue.class)); + Field urlField = DefaultHomeRemoteDataSource.class.getDeclaredField("apiUrl"); + urlField.setAccessible(true); + urlField.set(dataSource, "https://example.com"); parseMethod = DefaultHomeRemoteDataSource.class.getDeclaredMethod("parseResponse", JSONObject.class); parseMethod.setAccessible(true); }