Repository: CleverTap/clevertap-android-sdk
Pull request #806: Remove redundant test libraries
Author: login: vasct
Created: 2025-05-19T09:44:58Z | Merged: 2025-05-20T18:47:42Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **Tests**
  - Updated test assertion methods and imports for improved consistency and alignment with Kotlin and JUnit 4 conventions.
  - Removed several example and template test files from multiple modules.
  - Refactored test code formatting and JSON handling in select tests.
  - Deleted outdated or redundant test dependencies from build configurations.
- **Chores**
  - Cleaned up dependency declarations by removing unused testing and utility libraries from configuration files.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/clevertap-core/build.gradle b/clevertap-core/build.gradle
index ac87926ff..1732a9dca 100644
--- a/clevertap-core/build.gradle
+++ b/clevertap-core/build.gradle
@@ -56,20 +56,8 @@ dependencies {
 
     // Unit testing dependencies
     testImplementation(project(":test_shared"))
-    testImplementation(libs.test.robolectric)
     testImplementation(libs.firebase.messaging)
-    testImplementation(libs.test.mockk)
     testImplementation(libs.test.coroutines)
-
-    androidTestImplementation(libs.test.work.testing)
-    androidTestImplementation(libs.test.runner)
-    androidTestImplementation(libs.test.rules)
-    // Optional -- UI testing with Espresso
-    androidTestImplementation(libs.test.espresso.core)
-    // Optional -- UI testing with UI Automator
-    androidTestImplementation(libs.test.uiautomator)
-    // Optional -- UI testing with Compose
-    androidTestImplementation(libs.test.ext.junit)
 }
 
 sonarqube {
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt
index 5eb851f93..2a989c44a 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt
@@ -53,7 +53,6 @@ import com.google.firebase.messaging.RemoteMessage
 import org.json.JSONArray
 import org.json.JSONObject
 import org.junit.*
-import org.junit.jupiter.api.assertAll
 import org.junit.runner.*
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.Shadows
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt
index 376d154b5..86cfbd55e 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt
@@ -6,7 +6,6 @@ import com.clevertap.android.shared.test.BaseTestCase
 import org.json.JSONObject
 import org.junit.*
 import org.junit.Test
-import org.junit.jupiter.api.*
 import org.junit.runner.*
 import org.robolectric.RobolectricTestRunner
 import java.util.concurrent.TimeUnit
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt
index f220e6d45..e7ffe0e27 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt
@@ -4,8 +4,8 @@ import com.clevertap.android.sdk.inapp.customtemplates.CustomTemplate.FunctionBu
 import com.clevertap.android.sdk.inapp.customtemplates.CustomTemplate.TemplateBuilder
 import io.mockk.*
 import org.junit.Test
-import org.junit.jupiter.api.*
 import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
 
 class CustomTemplateTest {
 
@@ -17,7 +17,7 @@ class CustomTemplateTest {
         template {
             name("template")
             presenter(mockTemplatePresenter)
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 mapArgument("emptyMap", mapOf())
             }
         }
@@ -25,23 +25,23 @@ class CustomTemplateTest {
 
     @Test
     fun `builder should throw if name is not set when build is called`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             TemplateBuilder().presenter(mockTemplatePresenter).build()
         }
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             FunctionBuilder(isVisual = false).presenter(mockFunctionPresenter).build()
         }
     }
 
     @Test
     fun `builder should throw when name is blank or empty`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("")
                 presenter(mockTemplatePresenter)
             }
         }
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("  ")
                 presenter(mockTemplatePresenter)
@@ -51,34 +51,27 @@ class CustomTemplateTest {
 
     @Test
     fun `builder should throw when arg name has invalid dots`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("template")
                 actionArgument(".name")
                 presenter(mockTemplatePresenter)
             }
         }
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("template")
                 fileArgument("name.")
                 presenter(mockTemplatePresenter)
             }
         }
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("template")
                 fileArgument("na..me")
                 presenter(mockTemplatePresenter)
             }
         }
-        assertDoesNotThrow {
-            template {
-                name("template")
-                intArgument("na.me", 0)
-                presenter(mockTemplatePresenter)
-            }
-        }
     }
 
     @Test
@@ -86,10 +79,10 @@ class CustomTemplateTest {
         template {
             name("template")
             presenter(mockTemplatePresenter)
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("", "")
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 intArgument("  ", 1)
             }
         }
@@ -97,7 +90,7 @@ class CustomTemplateTest {
 
     @Test
     fun `builder should throw when no presenter if provided`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             template {
                 name("template")
             }
@@ -140,7 +133,7 @@ class CustomTemplateTest {
         template {
             name(name)
             presenter(mockTemplatePresenter)
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 name(name)
             }
         }
@@ -151,14 +144,14 @@ class CustomTemplateTest {
         template {
             name("template")
             presenter(mockTemplatePresenter)
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 mapArgument(
                     "map",
                     mapOf("a" to Unit)
                 )
             }
 
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 mapArgument(
                     "map",
                     mapOf(
@@ -169,7 +162,7 @@ class CustomTemplateTest {
                 )
             }
 
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 mapArgument(
                     "map",
                     mapOf("" to "string")
@@ -184,28 +177,28 @@ class CustomTemplateTest {
             name("function")
             presenter(mockFunctionPresenter)
             stringArgument("arg", "default")
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 intArgument("arg", 0)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 booleanArgument("arg", false)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 longArgument("arg", 0)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 shortArgument("arg", 0)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 byteArgument("arg", 0)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 floatArgument("arg", 0f)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 doubleArgument("arg", 0.0)
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 fileArgument("arg")
             }
         }
@@ -214,7 +207,7 @@ class CustomTemplateTest {
             name("template")
             presenter(mockTemplatePresenter)
             actionArgument("arg")
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 mapArgument("arg", mapOf("asd" to 5))
             }
         }
@@ -226,10 +219,10 @@ class CustomTemplateTest {
             name("template")
             presenter(mockTemplatePresenter)
             stringArgument("a.b", "")
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a", "")
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a.b", "")
             }
         }
@@ -238,10 +231,10 @@ class CustomTemplateTest {
             name("template")
             presenter(mockTemplatePresenter)
             stringArgument("a.b.c.d", "")
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a", "")
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a.b", "")
             }
         }
@@ -251,13 +244,13 @@ class CustomTemplateTest {
             presenter(mockTemplatePresenter)
             stringArgument("a.a.a", "")
             stringArgument("a.a.b", "")
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a.a.a.d", "")
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a", "")
             }
-            assertThrows<CustomTemplateException> {
+            assertFailsWith<CustomTemplateException> {
                 stringArgument("a.a", "")
             }
         }
@@ -267,7 +260,20 @@ class CustomTemplateTest {
     fun `builder should merge and sort hierarchical args and maintain order for other args`() {
 
         val expectedOrder = listOf(
-            "b", "c", "d", "e.f.a", "e.f.c", "e.f.d", "e.f.e", "e.g", "e.h", "e.w", "l", "k", "a.m", "a.n"
+            "b",
+            "c",
+            "d",
+            "e.f.a",
+            "e.f.c",
+            "e.f.d",
+            "e.f.e",
+            "e.g",
+            "e.h",
+            "e.w",
+            "l",
+            "k",
+            "a.m",
+            "a.n"
         )
 
         val template = template {
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt
index 51e85ad6d..54e88ab11 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt
@@ -2,9 +2,8 @@ package com.clevertap.android.sdk.inapp.customtemplates
 
 import io.mockk.mockk
 import org.junit.Test
-import org.junit.jupiter.api.assertThrows
 import kotlin.test.assertEquals
-
+import kotlin.test.assertFailsWith
 
 class JsonTemplatesProducerTest {
 
@@ -62,7 +61,7 @@ class JsonTemplatesProducerTest {
 
     @Test
     fun `producer should throw exception when an invalid json is provided`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer("[]", templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -70,11 +69,11 @@ class JsonTemplatesProducerTest {
 
     @Test
     fun `producer should throw when appropriate presenter is not provided`() {
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer("{$template1}", null, functionPresenter)
                 .defineTemplates(mockk())
         }
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer("{$function1}", templatesPresenter, null)
                 .defineTemplates(mockk())
         }
@@ -95,7 +94,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidTemplateTypeJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -114,7 +113,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidArgumentTypeJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -132,7 +131,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidFileValueJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -149,7 +148,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(
                 invalidFunctionFileValueJson,
                 templatesPresenter,
@@ -171,7 +170,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidActionValueJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -189,7 +188,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidFunctionActionJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
@@ -211,7 +210,7 @@ class JsonTemplatesProducerTest {
                 }
             }
         """.trimIndent()
-        assertThrows<CustomTemplateException> {
+        assertFailsWith<CustomTemplateException> {
             JsonTemplatesProducer(invalidNestedFileJson, templatesPresenter, functionPresenter)
                 .defineTemplates(mockk())
         }
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt
index e3858e183..8039535b6 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt
@@ -5,7 +5,6 @@ import android.graphics.Bitmap
 import com.clevertap.android.sdk.TestLogger
 import com.clevertap.android.sdk.inapp.data.CtCacheType
 import com.clevertap.android.sdk.inapp.images.FileResourceProvider
-import com.google.common.truth.Truth.assertThat
 import io.mockk.every
 import io.mockk.mockk
 import io.mockk.verify
@@ -42,25 +41,29 @@ class FilePreloaderCoroutineTest {
     @Test
     fun `preload image fetches images from all urls`() = testScheduler.run {
 
-        val urls = mutableListOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k").map { Pair(it,
-                                                                                                   CtCacheType.IMAGE) }
+        val urls = mutableListOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k").map {
+            Pair(
+                it,
+                CtCacheType.IMAGE
+            )
+        }
         val successUrls = mutableListOf<String>()
 
-        urls.forEach{
+        urls.forEach {
             every {
                 mFileResourceProvider.fetchInAppImageV1(it.first)
             } returns mockBitmap
         }
 
-        val func = fun (url: Pair<String, CtCacheType>) {
+        val func = fun(url: Pair<String, CtCacheType>) {
             // dummy func
             successUrls.add(url.first)
         }
 
-        filePreloaderCoroutine.preloadFilesAndCache(urls, func,{},{},{})
+        filePreloaderCoroutine.preloadFilesAndCache(urls, func, {}, {}, {})
         advanceUntilIdle()
 
-        urls.forEach{
+        urls.forEach {
             verify {
                 mFileResourceProvider.fetchInAppImageV1(it.first)
             }
@@ -75,21 +78,21 @@ class FilePreloaderCoroutineTest {
             .map { Pair(it, CtCacheType.GIF) }
         val successUrls = mutableListOf<String>()
 
-        urls.forEach{
+        urls.forEach {
             every {
                 mFileResourceProvider.fetchInAppGifV1(it.first)
             } returns byteArray
         }
 
-        val func = fun (url: Pair<String, CtCacheType>) {
+        val func = fun(url: Pair<String, CtCacheType>) {
             // dummy func
             successUrls.add(url.first)
         }
 
-        filePreloaderCoroutine.preloadFilesAndCache(urls, func,{},{},{})
+        filePreloaderCoroutine.preloadFilesAndCache(urls, func, {}, {}, {})
         advanceUntilIdle()
 
-        urls.forEach{
+        urls.forEach {
             verify {
                 mFileResourceProvider.fetchInAppGifV1(it.first)
             }
@@ -104,7 +107,7 @@ class FilePreloaderCoroutineTest {
         val successUrls = mutableListOf<String>()
 
         // replace with forEach
-        urls.forEach{
+        urls.forEach {
             every {
                 mFileResourceProvider.fetchFile(it.first)
             } returns byteArray
@@ -112,7 +115,7 @@ class FilePreloaderCoroutineTest {
 
         filePreloaderCoroutine.preloadFilesAndCache(urls, { url ->
             successUrls.add(url.first)
-        },{},{},{})
+        }, {}, {}, {})
         advanceUntilIdle()
 
         urls.forEach {
@@ -180,6 +183,7 @@ class FilePreloaderCoroutineTest {
         assertEquals(mapOf("x" to true, "y" to false, "z" to true), finishedStatus)
 
     }
+
     @Test
     fun `preloadFilesAndCache invokes all callbacks for files`() = testScheduler.run {
         val urls = listOf("p", "q", "r").map { Pair(it, CtCacheType.FILES) }
@@ -271,9 +275,9 @@ class FilePreloaderCoroutineTest {
         advanceUntilIdle()
 
         // Assertions :
-        assertThat(successfulExpected).containsExactlyElementsIn(successUrls)
-        assertThat(failedExpected).containsExactlyElementsIn(failedUrls)
-        assertThat(startedExpected).containsExactlyElementsIn(completedUrls)
+        assertEquals(successfulExpected, successUrls)
+        assertEquals(failedExpected, failedUrls)
+        assertEquals(startedExpected, completedUrls)
         assertEquals(
             expected = finishedExpected,
             actual = finishedStatus
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt
index 15086a586..e72a24f01 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt
@@ -4,11 +4,11 @@ import com.clevertap.android.sdk.CoreMetaData
 import com.clevertap.android.sdk.DeviceInfo
 import com.clevertap.android.sdk.MockDeviceInfo
 import com.clevertap.android.shared.test.BaseTestCase
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertNotNull
 import org.junit.Before
 import org.junit.Test
-import org.junit.jupiter.api.Assertions.assertEquals
-import org.junit.jupiter.api.Assertions.assertNotEquals
-import org.junit.jupiter.api.Assertions.assertNotNull
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 
diff --git a/clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt b/clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt
index 55937cc40..dd2f9cf9e 100644
--- a/clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt
+++ b/clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt
@@ -1,7 +1,6 @@
 package com.clevertap.android.sdk.product_config
 
 import org.junit.*
-import org.junit.jupiter.api.Test
 
 class ProductConfigUtilTest {
     @Test
diff --git a/clevertap-geofence/build.gradle b/clevertap-geofence/build.gradle
index fe5bf5d9b..2bdcd1620 100644
--- a/clevertap-geofence/build.gradle
+++ b/clevertap-geofence/build.gradle
@@ -30,12 +30,7 @@ dependencies {
     compileOnly (libs.androidx.work.runtime)
     compileOnly (libs.androidx.concurrent.futures)
 
-    testRuntimeOnly (libs.test.junit.jupiter.engine)
-
     // Unit testing dependencies
-    testImplementation (libs.test.junit.platform.runner)
-    testImplementation (libs.test.junit.jupiter.api)
-
     testImplementation (libs.test.mockito.core)
     testImplementation (libs.test.robolectric)
 
@@ -44,7 +39,6 @@ dependencies {
     testImplementation (libs.androidx.appcompat)
     testImplementation (libs.firebase.messaging)
 
-    testImplementation (libs.catch.exception)
     testImplementation (project(":clevertap-core"))
 
     testImplementation (libs.installreferrer)
@@ -55,9 +49,4 @@ dependencies {
     testImplementation (libs.androidx.concurrent.futures)
     testImplementation (libs.androidx.core.ktx)
     testImplementation (libs.kotlin.stdlib.jdk7)
-
-    // AndroidJUnitRunner and JUnit Rules
-    androidTestImplementation (libs.test.runner)
-    androidTestImplementation (libs.test.rules)
-    androidTestImplementation (libs.test.espresso.core)
 }
\ No newline at end of file
diff --git a/clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt b/clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt
index b9d59b589..60d1ca1b8 100644
--- a/clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt
+++ b/clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt
@@ -2,18 +2,15 @@ package com.clevertap.android.hms
 
 import com.clevertap.android.sdk.Constants
 import com.clevertap.android.shared.test.BaseTestCase
-import com.clevertap.android.shared.test.TestApplication
-import com.google.gson.GsonBuilder
 import com.huawei.hms.push.RemoteMessage
 import io.mockk.every
 import io.mockk.mockk
+import org.json.JSONObject
 import org.junit.*
 import org.junit.runner.*
 import org.robolectric.RobolectricTestRunner
-import org.robolectric.annotation.Config
 
 @RunWith(RobolectricTestRunner::class)
-@Config(sdk = [28], application = TestApplication::class)
 class HuaweiNotificationParserTest : BaseTestCase() {
 
     private lateinit var parser: HmsNotificationParser
@@ -31,19 +28,19 @@ class HuaweiNotificationParserTest : BaseTestCase() {
         every { message.data } returns null
         val returnedBundle = parser.toBundle(message)
         Assert.assertNotNull(returnedBundle)
-        Assert.assertEquals(0,returnedBundle.keySet().size)
+        Assert.assertEquals(0, returnedBundle.keySet().size)
     }
 
     @Test
     fun testToBundle_Message_Outside_CleverTap_Return_AssocBundle() {
-        val mockJson= getMockJsonStringOutsideNetwork()
+        val mockJson = getMockJsonStringOutsideNetwork()
         every { message.data } returns mockJson
 
         val returnedBundle = parser.toBundle(message)
         Assert.assertNotNull(returnedBundle)
-        Assert.assertEquals(2,returnedBundle.keySet().size)
-        Assert.assertEquals("Sample Title",returnedBundle.getString("Title"))
-        Assert.assertEquals("Sample Message Title",returnedBundle.getString("Message"))
+        Assert.assertEquals(2, returnedBundle.keySet().size)
+        Assert.assertEquals("Sample Title", returnedBundle.getString("Title"))
+        Assert.assertEquals("Sample Message Title", returnedBundle.getString("Message"))
 
     }
 
@@ -54,17 +51,17 @@ class HuaweiNotificationParserTest : BaseTestCase() {
     }
 
     private fun getMockJsonStringOutsideNetwork(): String? {
-        val hashMap = HashMap<String, String>()
-        hashMap.put("Title", "Sample Title")
-        hashMap.put("Message", "Sample Message Title")
-        return GsonBuilder().create().toJson(hashMap)
+        val json = JSONObject()
+        json.put("Title", "Sample Title")
+        json.put("Message", "Sample Message Title")
+        return json.toString()
     }
 
     private fun getMockJsonStringClevertapNetwork(): String? {
-        val hashMap = HashMap<String, String>()
-        hashMap.put("Title", "Sample Title")
-        hashMap.put("Message", "Sample Message Title")
-        hashMap.put(Constants.NOTIFICATION_TAG, "some value")
-        return GsonBuilder().create().toJson(hashMap)
+        val json = JSONObject()
+        json.put("Title", "Sample Title")
+        json.put("Message", "Sample Message Title")
+        json.put(Constants.NOTIFICATION_TAG, "some value")
+        return json.toString()
     }
 }
\ No newline at end of file
diff --git a/clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt b/clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt
deleted file mode 100644
index 1d0d65cd6..000000000
--- a/clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.clevertap.android.pushtemplates
-
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-import org.junit.Test
-import org.junit.runner.RunWith
-
-import org.junit.Assert.*
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
-    @Test
-    fun useAppContext() {
-        // Context of the app under test.
-        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
-        assertEquals("com.clevertap.android.pushtemplates.test", appContext.packageName)
-    }
-}
\ No newline at end of file
diff --git a/clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt b/clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt
deleted file mode 100644
index 20f3d5df6..000000000
--- a/clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.clevertap.android.pushtemplates
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
-    @Test
-    fun addition_isCorrect() {
-        assertEquals(4, 2 + 2)
-    }
-}
\ No newline at end of file
diff --git a/gradle-scripts/commons.gradle b/gradle-scripts/commons.gradle
index 324eb0f26..85330d9f2 100644
--- a/gradle-scripts/commons.gradle
+++ b/gradle-scripts/commons.gradle
@@ -42,7 +42,6 @@ android {
         buildConfigField ("int", "VERSION_CODE", "$versionCode")
         buildConfigField ("String", "VERSION_NAME", "\"$versionName\"")
 
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles 'consumer-rules.pro'
     }
 
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 7171f8498..011ef43f7 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -29,26 +29,18 @@ material = "1.12.0"
 espresso_core = "3.6.1"
 test_ext_junit = "1.2.1"
 test_core = "1.6.1"
-test_rules = "1.6.1"
-test_runner = "1.6.2"
 work_testing = "2.9.1"
-truth = "1.1.3"
 junit = "4.13.2"
 awaitility = "4.1.0"
 kotlin_stdlib_jdk7 = "1.9.20" #check with kotlin_gradle_plugin
 kotlin_test = "1.7.20" #check with kotlin_gradle_plugin
-junit_jupiter_api = "5.8.2"
-junit_jupiter_engine = "5.8.2"
-junit_platform_runner = "1.8.2"
-mockito_kotlin = "3.2.0"
 mockito_core = "5.9.0"
-opentest4j = "1.2.0"
 robolectric = "4.9"
 jsonassert = "1.5.0"
-xmlpull = "1.1.3.1"
 mockk = "1.14.2"
 uiautomator = "2.3.0"
 coroutines_test = "1.7.3"
+hamcrest = "3.0"
 
 #Install Referrer
 installreferrer = "2.2"
@@ -76,9 +68,6 @@ play_services_ads = "23.6.0"
 play_services_location = "21.3.0"
 play_review = "2.0.2"
 
-#Gson
-gson = "2.10.1"
-
 #FCM
 firebase_messaging = "24.0.0"
 
@@ -89,10 +78,6 @@ google_services = "4.4.2"
 agcp = "1.9.1.301"
 push = "6.11.0.300"
 
-#Catch Exception
-catch_exception = "2.0"
-
-
 [libraries]
 # Project
 android_gradle_plugin = { module = "com.android.tools.build:gradle", version.ref = "android_gradle_plugin" }
@@ -121,26 +106,17 @@ android_material = { module = "com.google.android.material:material", version.re
 test_espresso_core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso_core" }
 test_ext_junit = { module = "androidx.test.ext:junit", version.ref = "test_ext_junit" }
 test_core = { module = "androidx.test:core", version.ref = "test_core" }
-test_rules = { module = "androidx.test:rules", version.ref = "test_rules" }
-test_runner = { module = "androidx.test:runner", version.ref = "test_runner" }
 test_work_testing = { module = "androidx.work:work-testing", version.ref = "work_testing" }
-test_truth = { module = "com.google.truth:truth", version.ref = "truth" }
 test_junit = { module = "junit:junit", version.ref = "junit" }
 test_awaitility = { module = "org.awaitility:awaitility", version.ref = "awaitility" }
 test_kotlin_test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin_test" }
-test_junit_jupiter_api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit_jupiter_api" }
-test_junit_jupiter_engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit_jupiter_engine" }
-test_junit_platform_runner = { module = "org.junit.platform:junit-platform-runner", version.ref = "junit_platform_runner" }
 test_mockito_core = { module = "org.mockito:mockito-core", version.ref = "mockito_core" }
-test_mockito_kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockito_kotlin" }
-test_mockito_inline = { module = "org.mockito:mockito-inline", version.ref = "mockito_core" }
-test_opentest4j = { module = "org.opentest4j:opentest4j", version.ref = "opentest4j" }
 test_robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
 test_jsonassert = { module = "org.skyscreamer:jsonassert", version.ref = "jsonassert" }
-test_xmlpull = { module = "xmlpull:xmlpull", version.ref = "xmlpull" }
 test_mockk = { module = "io.mockk:mockk", version.ref="mockk"}
 test_uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref="uiautomator"}
 test_coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref="coroutines_test"}
+test_hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" }
 
 #Kotlin Stdlib
 kotlin_stdlib_jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin_stdlib_jdk7" }
@@ -174,9 +150,6 @@ play_services_ads = { module = "com.google.android.gms:play-services-ads", versi
 play_services_location = { module = "com.google.android.gms:play-services-location", version.ref = "play_services_location" }
 play_review = { module = "com.google.android.play:review", version.ref = "play_review" }
 
-#Gson
-gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
-
 #FCM
 firebase_messaging = { module = "com.google.firebase:firebase-messaging", version.ref = "firebase_messaging" }
 
@@ -187,9 +160,6 @@ google_services = { module = "com.google.gms:google-services", version.ref = "go
 huawei_agcp_plugin = { module = "com.huawei.agconnect:agcp", version.ref = "agcp" }
 huawei_push = { module = "com.huawei.hms:push", version.ref = "push" }
 
-#Catch Exception
-catch_exception = { module = "eu.codearte.catch-exception:catch-exception", version.ref = "catch_exception" }
-
 [bundles]
 exoplayer = ["exoplayer_exoplayer", "exoplayer_hls", "exoplayer_ui"]
 media3 = ["media3_exoplayer", "media3_hls", "media3_ui"]
diff --git a/instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt b/instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt
deleted file mode 100644
index dd7177777..000000000
--- a/instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.clevertap.demo
-
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-import org.junit.Test
-import org.junit.runner.RunWith
-
-import org.junit.Assert.*
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
-    @Test
-    fun useAppContext() {
-        // Context of the app under test.
-        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
-        assertEquals("com.clevertap.demo", appContext.packageName)
-    }
-}
\ No newline at end of file
diff --git a/instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt b/instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt
deleted file mode 100644
index f20838569..000000000
--- a/instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.clevertap.demo
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
-    @Test
-    fun addition_isCorrect() {
-        assertEquals(4, 2 + 2)
-    }
-}
\ No newline at end of file
diff --git a/sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java b/sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java
deleted file mode 100644
index 98a88064e..000000000
--- a/sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.clevertap.demo;
-
-import static org.junit.Assert.*;
-
-import org.junit.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-public class ExampleUnitTest {
-
-    @Test
-    public void addition_isCorrect() {
-        assertEquals(4, 2 + 2);
-    }
-}
\ No newline at end of file
diff --git a/test_shared/build.gradle b/test_shared/build.gradle
index 0e4246744..23d8d6e75 100644
--- a/test_shared/build.gradle
+++ b/test_shared/build.gradle
@@ -9,7 +9,6 @@ android {
     defaultConfig {
         minSdkVersion libs.versions.android.minSdk.get().toInteger()
 
-//        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
         multiDexEnabled true
     }
@@ -39,33 +38,14 @@ android {
 }
 
 dependencies {
-    api project(':clevertap-core')
-    // Unit ing dependencies
-    api (libs.test.junit.platform.runner)
-    api (libs.test.junit.jupiter.api)
-    api (libs.test.junit.jupiter.engine)
-    api (libs.kotlin.stdlib.jdk7)
-    api (libs.test.jsonassert)
-    api (libs.gson)
-    api (libs.test.mockk)
-    api (libs.test.robolectric)
-    api (libs.test.opentest4j)
-
-    api (libs.test.core)
-    api (libs.test.ext.junit)
-
-    api (libs.androidx.fragment)
-    // AndroidJUnitRunner and JUnit Rules
-    api (libs.test.runner)
-    api (libs.test.rules)
-    api (libs.test.espresso.core)
-
-    api (libs.catch.exception)
-    api (libs.androidx.core.core)
-
-    api (libs.test.kotlin.test)
-    api (libs.test.truth)
-
-    api (libs.test.xmlpull)
-
-}
\ No newline at end of file
+    api(project(':clevertap-core'))
+    api(libs.kotlin.stdlib.jdk7)
+    api(libs.test.jsonassert)
+    api(libs.test.mockk)
+    api(libs.test.robolectric)
+    api(libs.test.core)
+    api(libs.test.ext.junit)
+    api(libs.androidx.core.core)
+    api(libs.test.kotlin.test)
+    api(libs.test.hamcrest)
+}
diff --git a/test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java b/test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java
deleted file mode 100644
index 5e0770746..000000000
--- a/test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.clevertap.test_shared_1;
-
-import static org.junit.Assert.*;
-
-import android.content.Context;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
-import org.junit.*;
-import org.junit.runner.*;
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
-
-    @Test
-    public void useAppContext() {
-        // Context of the app under test.
-        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        assertEquals("com.clevertap.test_shared_1.test", appContext.getPackageName());
-    }
-}
\ No newline at end of file
diff --git a/test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt b/test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt
index 874439818..f499fabbc 100644
--- a/test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt
+++ b/test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt
@@ -2,8 +2,4 @@ package com.clevertap.android.shared.test
 
 import android.app.Activity
 
-class TestActivity:Activity() {
-
-
-
-}
\ No newline at end of file
+class TestActivity : Activity()


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (7)</summary><blockquote>

<details>
<summary>clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt (2)</summary><blockquote>

`30-32`: **Verify empty‐data handling**  
The assertion `Assert.assertEquals(0, returnedBundle.keySet().size)` correctly validates that an empty bundle is produced when `message.data` is `null`. Consider adding an explanatory message on failure for better diagnostics.

---

`60-66`: **Helper: build Clevertap-network JSON**  
Identical feedback: the method correctly sets up the JSON payload including `Constants.NOTIFICATION_TAG`. Consider merging common logic with the other helper to reduce duplication.

</blockquote></details>
<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt (5)</summary><blockquote>

`16-23`: **Empty map argument exception**  
The test now properly uses `assertFailsWith<CustomTemplateException>` to verify that `mapArgument("emptyMap", mapOf())` fails as designed. Adding a custom failure message (e.g., `"Expected exception for empty map"`) could improve test diagnostics.

---

`77-85`: **Invalid argument-name format**  
Using `assertFailsWith` for `.name`, `name.`, and `na..me` invalid formats ensures these cases are caught. Consider parameterizing these scenarios to reduce repetition and ease future additions.

---

`142-172`: **Unsupported map-value type checks**  
All three nested `assertFailsWith` tests cover direct `Unit` values and nested unsupported types correctly. Excellent edge-case coverage; consider extracting a helper method to generate these nested scenarios.

---

`174-214`: **Prevent duplicate argument names**  
The sequence of `assertFailsWith` calls for each primitive and file argument type ensures duplicates are disallowed. Very thorough – a parameterized or data-driven test could make maintenance simpler.

---

`216-241`: **Parent–child naming conflicts**  
Tests for both shallow and deep parent/child key conflicts correctly use `assertFailsWith`. This is comprehensive; you might consolidate repeated builder blocks using a helper to reduce boilerplate.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 7fbe668af6e9be057812c95e321bcb4087aaa6f5 and f31e92ea996d7f81271cb39b8e2cc7e40754cc95.

</details>

<details>
<summary>📒 Files selected for processing (18)</summary>

* `clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt` (0 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt` (0 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt` (12 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt` (9 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt` (5 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt` (1 hunks)
* `clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt` (0 hunks)
* `clevertap-geofence/build.gradle` (0 hunks)
* `clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt` (3 hunks)
* `clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt` (0 hunks)
* `clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt` (0 hunks)
* `gradle/libs.versions.toml` (0 hunks)
* `instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt` (0 hunks)
* `instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt` (0 hunks)
* `sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java` (0 hunks)
* `test_shared/build.gradle` (1 hunks)
* `test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java` (0 hunks)
* `test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (11)</summary>

* clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt
* clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt
* clevertap-geofence/build.gradle
* clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt
* sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java
* clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt
* instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt
* instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt
* test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java
* clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt
* gradle/libs.versions.toml

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt (1)</summary><blockquote>

<details>
<summary>clevertap-core/src/main/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplate.kt (12)</summary>

* `mapArgument` (209-232)
* `presenter` (239-242)
* `actionArgument` (86-89)
* `fileArgument` (197-200)
* `stringArgument` (157-160)
* `intArgument` (177-180)
* `booleanArgument` (162-165)
* `longArgument` (182-185)
* `shortArgument` (172-175)
* `byteArgument` (167-170)
* `floatArgument` (187-190)
* `doubleArgument` (192-195)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (34)</summary><blockquote>

<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt (1)</summary>

`7-9`: **Library migration looks good.**

The imports have been successfully migrated from JUnit Jupiter (JUnit 5) to JUnit 4, aligning with the PR objective to remove redundant test libraries. The test functionality remains unchanged.

</details>
<details>
<summary>test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt (1)</summary>

`5-5`: **Simplified class declaration looks good.**

The class declaration has been simplified to a more concise form without empty braces, which is the preferred Kotlin style for classes without a body.

</details>
<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt (12)</summary>

`44-49`: **Code formatting improvement looks good.**

The code has been reformatted to improve readability, with better indentation for the list creation and mapping operation.

---

`52-56`: **Lambda formatting improvement looks good.**

The lambda expression has been reformatted for better readability and consistency.

---

`58-61`: **Function declaration formatting looks good.**

The anonymous function declaration has been formatted more consistently.

---

`63-63`: **Consistent lambda parameter spacing looks good.**

Empty lambda arguments now have consistent spacing.

---

`66-70`: **Lambda formatting improvement looks good.**

The formatting of the lambda expression has been improved for better readability.

---

`81-85`: **Lambda formatting improvement looks good.**

The lambda expression has been improved for better readability and consistency.

---

`87-90`: **Function declaration formatting looks good.**

The anonymous function declaration has been formatted more consistently.

---

`92-92`: **Consistent lambda parameter spacing looks good.**

Empty lambda arguments now have consistent spacing.

---

`95-99`: **Lambda formatting improvement looks good.**

The lambda expression has been improved for better readability and consistency.

---

`110-114`: **Changed forEach implementation looks good.**

The comment "replace with forEach" has been implemented correctly.

---

`118-118`: **Lambda formatting improvement looks good.**

The lambda format has been improved with consistent spacing.

---

`278-280`: **Assertion library change looks good.**

The assertions have been changed from Truth's `assertThat().isEqualTo()` to Kotlin's `assertEquals()` to align with the removal of the Google Truth library dependency.

</details>
<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt (10)</summary>

`6-6`: **Library migration looks good.**

The import for Kotlin test's `assertFailsWith` has been added to replace JUnit Jupiter's `assertThrows`.

---

`64-68`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`72-80`: **Exception assertion library migration looks good.**

Successfully migrated multiple assertions from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`97-100`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`116-119`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`134-138`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`151-158`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`173-176`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`191-194`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

---

`213-216`: **Exception assertion library migration looks good.**

Successfully migrated from JUnit Jupiter's `assertThrows` to Kotlin's `assertFailsWith` while maintaining the same test logic.

</details>
<details>
<summary>test_shared/build.gradle (1)</summary>

`41-57`: **Streamline test dependencies**  
The `test_shared` module’s Gradle file now consolidates test libraries on a core set (JUnit4 via `ext.junit`, Kotlin test, MockK, Robolectric, etc.) and removes JUnit Jupiter, Gson, Truth, Catch Exception, and other outdated test dependencies. Please run a full test suite to confirm there are no missing transitive dependencies or stale imports in existing test code.

</details>
<details>
<summary>clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt (3)</summary>

`8-8`: **Approve JSON library switch**  
Replacing the deprecated Gson usage with `org.json.JSONObject` is aligned with the removal of the Gson dependency. The import is correct and necessary for the new helper methods.

---

`39-44`: **Enhance parsing assertions**  
The new checks for bundle size and specific keys (`Title`, `Message`) validate the parser’s behavior for out-of-network payloads. Well targeted – no further changes needed.

---

`53-58`: **Helper: build outside-network JSON**  
The `getMockJsonStringOutsideNetwork()` method correctly constructs and returns a JSON string. For readability, you could inline or extract a shared JSON-building utility across tests, but this is acceptable.

</details>
<details>
<summary>clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt (6)</summary>

`8-8`: **Use Kotlin’s `assertFailsWith`**  
Swapping out JUnit Jupiter’s `assertThrows` for `kotlin.test.assertFailsWith` removes the JUnit 5 dependency and aligns with the project’s Kotlin‐native testing approach.

---

`27-33`: **Missing name enforcement**  
Both `TemplateBuilder` and `FunctionBuilder` are covered with `assertFailsWith`, ensuring a missing `name()` call triggers the correct exception. Good coverage of both builder variants.

---

`36-43`: **Reject blank or whitespace names**  
The two `assertFailsWith` blocks confirm that empty (`""`) and whitespace‐only (`"  "`) names throw `CustomTemplateException`. This accurately enforces name validation.

---

`92-99`: **Presenter-omission error**  
Verifying that omitting `presenter()` causes a `CustomTemplateException` is crucial. This `assertFailsWith` block is well placed.

---

`130-139`: **Duplicate name detection**  
The added assertion within the builder block ensures calling `name()` twice fails appropriately. This guards against silent overwrites.

---

`260-277`: **Align expected hierarchical order**  
The updated `expectedOrder` list reflects the builder’s new sorting logic for hierarchical keys. Please verify that the implementation produces this exact sequence to avoid test flakiness.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T09:55:27Z
user: login: CTLalit
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-20T11:21:12Z
user: login: CTLalit
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-20T11:21:22Z
user: login: vasct
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T17:42:31Z

Review comments:
path: test_shared/build.gradle
user: login: CTLalit
body: do we have any espresso tests to have the dependency? also curious why we have fragment and xml pull as dependency.
created_at: 2025-05-20T11:21:12Z
author_association: COLLABORATOR
path: test_shared/build.gradle
user: login: vasct
body: Removed all of those in a next commit.
created_at: 2025-05-20T17:42:31Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-19T09:45:04Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: skip review by coderabbit.ai -->

> [!IMPORTANT]
> ## Review skipped
> 
> Auto reviews are disabled on base/target branches other than the default branch.
> 
> <details>
> <summary>🗂️ Base branches to auto review (1)</summary>
> 
> * \b(master|main|develop)(_\w*)?
> 
> </details>
> 
> Please check the settings in the CodeRabbit UI or the `.coderabbit.yaml` file in this repository. To trigger a single review, invoke the `@coderabbitai review` command.
> 
> You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file.

<!-- end of auto-generated comment: skip review by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This change set primarily removes dependencies, imports, and files related to JUnit Jupiter (JUnit 5), Truth, Gson, and other test libraries, transitioning test code to use JUnit 4 and Kotlin-native assertions where necessary. Several example and template test files are deleted across modules. Minor refactoring and formatting are applied to remaining test code to ensure consistency and compatibility with the updated dependency set.

## Changes

| File(s) / Path(s)                                                                                           | Change Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `clevertap-core/src/test/java/com/clevertap/android/sdk/UtilsTest.kt`<br>`clevertap-core/src/test/java/com/clevertap/android/sdk/db/DBAdapterTest.kt`<br>`clevertap-core/src/test/java/com/clevertap/android/sdk/product_config/ProductConfigUtilTest.kt` | Removed import statements for JUnit Jupiter APIs; no changes to test logic.                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/CustomTemplateTest.kt`<br>`clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/customtemplates/JsonTemplatesProducerTest.kt` | Replaced `assertThrows<CustomTemplateException>` with Kotlin-native `assertFailsWith<CustomTemplateException>`, removed JUnit Jupiter imports, and adjusted formatting for readability; no functional changes.                                                                                                                                                                                                                                                                               |
| `clevertap-core/src/test/java/com/clevertap/android/sdk/inapp/images/preload/FilePreloaderCoroutineTest.kt` | Refactored for style: replaced Truth assertions with `assertEquals`, reformatted lambdas and collections for consistency, and removed unnecessary imports; no logic changes.                                                                                                                                                                                                                                                                                                                  |
| `clevertap-core/src/test/java/com/clevertap/android/sdk/network/api/CtApiWrapperTest.kt`                   | Changed assertion imports from JUnit Jupiter to JUnit 4; no changes to test logic or behavior.                                                                                                                                                                                                                                                                                                                                                                                               |
| `clevertap-geofence/build.gradle`<br>`test_shared/build.gradle`                                             | Removed dependencies on JUnit Jupiter, Truth, Gson, OpenTest4J, Catch Exception, and related test libraries from build files.                                                                                                                                                                                                                                                                                                                                                                |
| `gradle/libs.versions.toml`                                                                                | Deleted version and library entries for Truth, JUnit Jupiter, JUnit Platform Runner, Mockito Kotlin, OpenTest4J, Gson, and Catch Exception.                                                                                                                                                                                                                                                                                                                                                  |
| `clevertap-hms/src/test/java/com/clevertap/android/hms/HuaweiNotificationParserTest.kt`                     | Replaced Gson-based JSON serialization with `org.json.JSONObject`, removed dependency on Gson, and made minor formatting adjustments; no logic changes.                                                                                                                                                                                                                                                                                                                                      |
| `clevertap-pushtemplates/src/androidTest/java/com/clevertap/android/pushtemplates/ExampleInstrumentedTest.kt`<br>`instantapp/src/androidTest/java/com/clevertap/demo/ExampleInstrumentedTest.kt`<br>`test_shared/src/androidTest/java/com/clevertap/test_shared_1/ExampleInstrumentedTest.java` | Deleted example instrumented test files that verified app context; removed associated classes and methods.                                                                                                                                                                                                                                                                                                                                            |
| `clevertap-pushtemplates/src/test/java/com/clevertap/android/pushtemplates/ExampleUnitTest.kt`<br>`instantapp/src/test/java/com/clevertap/demo/ExampleUnitTest.kt`<br>`sample/src/test/java/com/clevertap/demo/ExampleUnitTest.java`                | Deleted example unit test files containing simple arithmetic assertions; removed associated classes and methods.                                                                                                                                                                                                                                                                                                                                      |
| `test_shared/src/main/java/com/clevertap/android/shared/test/TestActivity.kt`                               | Simplified class declaration by removing unnecessary braces and whitespace; no functional changes.                                                                                                                                                                                                                                                                                                                                                                                           |

## Sequence Diagram(s)

*No sequence diagrams are generated, as the changes are limited to dependency removals, test code refactoring, and deletion of example tests, without introducing or modifying application control flow or features.*

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=CleverTap/clevertap-android-sdk&utm_content=806):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: vasct
created_at: 2025-05-19T09:49:22Z
body: @coderabbitai review
author_association: CONTRIBUTOR
user: login: coderabbitai[bot]
created_at: 2025-05-19T09:49:27Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>✅ Actions performed</summary>

Review triggered.

> Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

</details>
author_association: CONTRIBUTOR