From 227334fb442ffc6b17e3066bae3a0c839d5ae5b9 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Thu, 7 Mar 2024 15:41:39 -0500 Subject: [PATCH] switch to kotest-extensions-android Move off our custom patched kotest-extensions-robolectric to the kotest-extensions-android library. This is a newly released library based off the patches we shared with the original developer. Switching over to kotest-extensions-android means we can remove this complexity from our project and can easily update the library to get fixes. We had to bump our minSdkVersion to 21 (Android 5.0) to use this library however we only officially supported Android 5.0 and newer since v5 of our SDK anyway. --- Examples/OneSignalDemo/app/build.gradle | 4 +- OneSignalSDK/build.gradle | 2 +- OneSignalSDK/onesignal/core/build.gradle | 2 + .../application/ApplicationServiceTests.kt | 2 +- .../core/internal/database/OSDatabaseTests.kt | 2 +- .../preferences/PreferencesServiceTests.kt | 2 +- .../onesignal/selftest/JSONObjectEnvTest.kt | 2 +- .../outcomes/OutcomeEventsRepositoryTests.kt | 2 +- .../LoginUserOperationExecutorTests.kt | 2 +- .../SubscriptionOperationExecutorTests.kt | 2 +- .../onesignal/in-app-messages/build.gradle | 2 + .../InAppMessagePreviewHandlerTests.kt | 2 +- OneSignalSDK/onesignal/location/build.gradle | 2 + .../LocationBackgroundServiceTests.kt | 2 +- .../controller/GmsLocationControllerTests.kt | 2 +- .../LocationPermissionControllerTests.kt | 2 +- .../onesignal/notifications/build.gradle | 2 + .../NotificationChannelManagerTests.kt | 2 +- .../NotificationGenerationProcessorTests.kt | 2 +- .../limiting/NotificationLimitManagerTests.kt | 2 +- .../NotificationSummaryManagerTests.kt | 2 +- .../onesignal/testhelpers/build.gradle | 6 - .../extensions/ContainedRobolectricRunner.kt | 70 ---------- .../extensions/RobolectricExtension.kt | 130 ------------------ 24 files changed, 26 insertions(+), 224 deletions(-) delete mode 100644 OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/ContainedRobolectricRunner.kt delete mode 100644 OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/RobolectricExtension.kt diff --git a/Examples/OneSignalDemo/app/build.gradle b/Examples/OneSignalDemo/app/build.gradle index 75755cbfd2..49a7f1b040 100644 --- a/Examples/OneSignalDemo/app/build.gradle +++ b/Examples/OneSignalDemo/app/build.gradle @@ -5,7 +5,7 @@ plugins { android { compileSdkVersion 33 defaultConfig { - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion 33 versionCode 1 versionName "1.0" @@ -33,7 +33,7 @@ android { } huawei { dimension "default" - minSdkVersion 19 + minSdkVersion 21 applicationId "com.onesignal.sdktest" } } diff --git a/OneSignalSDK/build.gradle b/OneSignalSDK/build.gradle index 25ec6c0eb2..6ce6d76119 100644 --- a/OneSignalSDK/build.gradle +++ b/OneSignalSDK/build.gradle @@ -6,7 +6,7 @@ buildscript { buildVersions = [ compileSdkVersion: 34, targetSdkVersion: 34, - minSdkVersion: 19 + minSdkVersion: 21 ] androidGradlePluginVersion = '7.2.0' googleServicesGradlePluginVersion = '4.3.10' diff --git a/OneSignalSDK/onesignal/core/build.gradle b/OneSignalSDK/onesignal/core/build.gradle index b7987587c9..ee4183f6ec 100644 --- a/OneSignalSDK/onesignal/core/build.gradle +++ b/OneSignalSDK/onesignal/core/build.gradle @@ -88,6 +88,8 @@ dependencies { testImplementation("io.kotest:kotest-assertions-core:$kotestVersion") testImplementation("io.kotest:kotest-property:$kotestVersion") testImplementation("org.robolectric:robolectric:4.8.1") + // kotest-extensions-android allows Robolectric to work with Kotest via @RobolectricTest + testImplementation("br.com.colman:kotest-extensions-android:0.1.1") testImplementation("androidx.test:core-ktx:1.4.0") testImplementation("androidx.test:core:1.4.0") testImplementation("io.mockk:mockk:1.13.2") diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/application/ApplicationServiceTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/application/ApplicationServiceTests.kt index f9509c93aa..39ae8251ce 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/application/ApplicationServiceTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/application/ApplicationServiceTests.kt @@ -3,12 +3,12 @@ package com.onesignal.core.internal.application import android.app.Activity import android.content.Context import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.common.threading.WaiterWithValue import com.onesignal.common.threading.suspendifyOnThread import com.onesignal.core.internal.application.impl.ApplicationService import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.spyk diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/database/OSDatabaseTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/database/OSDatabaseTests.kt index 88ee9a08d9..edea19dd43 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/database/OSDatabaseTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/database/OSDatabaseTests.kt @@ -2,12 +2,12 @@ package com.onesignal.core.internal.database import android.content.ContentValues import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.core.internal.database.impl.OSDatabase import com.onesignal.core.internal.database.impl.OneSignalDbContract import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.session.internal.outcomes.impl.OutcomeTableProvider -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.mockk diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/preferences/PreferencesServiceTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/preferences/PreferencesServiceTests.kt index 6eab29d57c..52b07f8423 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/preferences/PreferencesServiceTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/preferences/PreferencesServiceTests.kt @@ -2,12 +2,12 @@ package com.onesignal.core.internal.preferences import android.content.Context import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.core.internal.preferences.impl.PreferencesService import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper import com.onesignal.mocks.MockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.assertions.throwables.shouldThrowUnit import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/selftest/JSONObjectEnvTest.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/selftest/JSONObjectEnvTest.kt index a0849c7811..1e64f28d31 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/selftest/JSONObjectEnvTest.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/selftest/JSONObjectEnvTest.kt @@ -1,7 +1,7 @@ package com.onesignal.selftest +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.common.toMap -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.core.spec.style.funSpec import io.kotest.matchers.shouldBe diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/outcomes/OutcomeEventsRepositoryTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/outcomes/OutcomeEventsRepositoryTests.kt index a25d4ac01d..e7fad98ac3 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/outcomes/OutcomeEventsRepositoryTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/outcomes/OutcomeEventsRepositoryTests.kt @@ -1,5 +1,6 @@ package com.onesignal.session.internal.outcomes +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.DatabaseMockHelper @@ -12,7 +13,6 @@ import com.onesignal.session.internal.outcomes.impl.OutcomeEventsRepository import com.onesignal.session.internal.outcomes.impl.OutcomeEventsTable import com.onesignal.session.internal.outcomes.impl.OutcomeSource import com.onesignal.session.internal.outcomes.impl.OutcomeSourceBody -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/LoginUserOperationExecutorTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/LoginUserOperationExecutorTests.kt index 25118c53bf..92db84b767 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/LoginUserOperationExecutorTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/LoginUserOperationExecutorTests.kt @@ -1,12 +1,12 @@ package com.onesignal.user.internal.operations +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.common.exceptions.BackendException import com.onesignal.core.internal.operations.ExecutionResponse import com.onesignal.core.internal.operations.ExecutionResult import com.onesignal.core.internal.operations.Operation import com.onesignal.mocks.AndroidMockHelper import com.onesignal.mocks.MockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import com.onesignal.user.internal.backend.CreateUserResponse import com.onesignal.user.internal.backend.IUserBackendService import com.onesignal.user.internal.backend.IdentityConstants diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/SubscriptionOperationExecutorTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/SubscriptionOperationExecutorTests.kt index e7153eda09..1b235738b8 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/SubscriptionOperationExecutorTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/SubscriptionOperationExecutorTests.kt @@ -1,11 +1,11 @@ package com.onesignal.user.internal.operations +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.common.exceptions.BackendException import com.onesignal.core.internal.operations.ExecutionResult import com.onesignal.core.internal.operations.Operation import com.onesignal.mocks.AndroidMockHelper import com.onesignal.mocks.MockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import com.onesignal.user.internal.backend.ISubscriptionBackendService import com.onesignal.user.internal.backend.IdentityConstants import com.onesignal.user.internal.backend.SubscriptionObjectType diff --git a/OneSignalSDK/onesignal/in-app-messages/build.gradle b/OneSignalSDK/onesignal/in-app-messages/build.gradle index 04b6ab3a46..b2543d1297 100644 --- a/OneSignalSDK/onesignal/in-app-messages/build.gradle +++ b/OneSignalSDK/onesignal/in-app-messages/build.gradle @@ -88,6 +88,8 @@ dependencies { testImplementation("io.kotest:kotest-assertions-core:$kotestVersion") testImplementation("io.kotest:kotest-property:$kotestVersion") testImplementation("org.robolectric:robolectric:4.8.1") + // kotest-extensions-android allows Robolectric to work with Kotest via @RobolectricTest + testImplementation("br.com.colman:kotest-extensions-android:0.1.1") testImplementation("androidx.test:core-ktx:1.4.0") testImplementation("androidx.test:core:1.4.0") testImplementation("io.mockk:mockk:1.13.2") diff --git a/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/preview/InAppMessagePreviewHandlerTests.kt b/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/preview/InAppMessagePreviewHandlerTests.kt index a2db28ecce..b7e1967e70 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/preview/InAppMessagePreviewHandlerTests.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/preview/InAppMessagePreviewHandlerTests.kt @@ -1,6 +1,7 @@ package com.onesignal.inAppMessages.internal.preview import android.app.Activity +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.inAppMessages.internal.display.IInAppDisplayer @@ -9,7 +10,6 @@ import com.onesignal.mocks.MockHelper import com.onesignal.notifications.internal.INotificationActivityOpener import com.onesignal.notifications.internal.display.INotificationDisplayer import com.onesignal.notifications.internal.lifecycle.INotificationLifecycleService -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.coEvery diff --git a/OneSignalSDK/onesignal/location/build.gradle b/OneSignalSDK/onesignal/location/build.gradle index 8e029e151d..22b8c754cd 100644 --- a/OneSignalSDK/onesignal/location/build.gradle +++ b/OneSignalSDK/onesignal/location/build.gradle @@ -87,6 +87,8 @@ dependencies { testImplementation("io.kotest:kotest-assertions-core:$kotestVersion") testImplementation("io.kotest:kotest-property:$kotestVersion") testImplementation("org.robolectric:robolectric:4.8.1") + // kotest-extensions-android allows Robolectric to work with Kotest via @RobolectricTest + testImplementation("br.com.colman:kotest-extensions-android:0.1.1") testImplementation("androidx.test:core-ktx:1.4.0") testImplementation("androidx.test:core:1.4.0") testImplementation("io.mockk:mockk:1.13.2") diff --git a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/background/LocationBackgroundServiceTests.kt b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/background/LocationBackgroundServiceTests.kt index 64b35d7b76..09852888f0 100644 --- a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/background/LocationBackgroundServiceTests.kt +++ b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/background/LocationBackgroundServiceTests.kt @@ -3,6 +3,7 @@ package com.onesignal.location.internal.background import android.Manifest import android.app.Application import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.location.ILocationManager @@ -11,7 +12,6 @@ import com.onesignal.location.internal.common.LocationConstants import com.onesignal.location.internal.preferences.ILocationPreferencesService import com.onesignal.mocks.AndroidMockHelper import com.onesignal.mocks.MockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.every diff --git a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/controller/GmsLocationControllerTests.kt b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/controller/GmsLocationControllerTests.kt index fa390ba7c1..8ccc114419 100644 --- a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/controller/GmsLocationControllerTests.kt +++ b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/controller/GmsLocationControllerTests.kt @@ -1,6 +1,7 @@ package com.onesignal.location.internal.controller import android.location.Location +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.location.internal.controller.impl.GmsLocationController @@ -8,7 +9,6 @@ import com.onesignal.location.mocks.FusedLocationApiWrapperMock import com.onesignal.location.shadows.ShadowGoogleApiClient import com.onesignal.location.shadows.ShadowGoogleApiClientBuilder import com.onesignal.mocks.AndroidMockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe diff --git a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/permissions/LocationPermissionControllerTests.kt b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/permissions/LocationPermissionControllerTests.kt index bff20cb741..770e5d6f6d 100644 --- a/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/permissions/LocationPermissionControllerTests.kt +++ b/OneSignalSDK/onesignal/location/src/test/java/com/onesignal/location/internal/permissions/LocationPermissionControllerTests.kt @@ -1,10 +1,10 @@ package com.onesignal.location.internal.permissions +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.core.internal.permissions.IRequestPermissionService import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.longs.shouldBeGreaterThan import io.kotest.matchers.shouldBe diff --git a/OneSignalSDK/onesignal/notifications/build.gradle b/OneSignalSDK/onesignal/notifications/build.gradle index e7282436ac..dbe68239ed 100644 --- a/OneSignalSDK/onesignal/notifications/build.gradle +++ b/OneSignalSDK/onesignal/notifications/build.gradle @@ -100,6 +100,8 @@ dependencies { testImplementation("io.kotest:kotest-assertions-core:$kotestVersion") testImplementation("io.kotest:kotest-property:$kotestVersion") testImplementation("org.robolectric:robolectric:4.8.1") + // kotest-extensions-android allows Robolectric to work with Kotest via @RobolectricTest + testImplementation("br.com.colman:kotest-extensions-android:0.1.1") testImplementation("androidx.test:core-ktx:1.4.0") testImplementation("androidx.test:core:1.4.0") testImplementation("io.mockk:mockk:1.13.2") diff --git a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/channels/NotificationChannelManagerTests.kt b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/channels/NotificationChannelManagerTests.kt index 93db723e4a..6636094989 100644 --- a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/channels/NotificationChannelManagerTests.kt +++ b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/channels/NotificationChannelManagerTests.kt @@ -5,6 +5,7 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper @@ -12,7 +13,6 @@ import com.onesignal.mocks.MockHelper import com.onesignal.notifications.internal.channels.impl.NotificationChannelManager import com.onesignal.notifications.internal.common.NotificationGenerationJob import com.onesignal.notifications.shadows.ShadowRoboNotificationManager -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe diff --git a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/generation/NotificationGenerationProcessorTests.kt b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/generation/NotificationGenerationProcessorTests.kt index 627116792a..c7471deb43 100644 --- a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/generation/NotificationGenerationProcessorTests.kt +++ b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/generation/NotificationGenerationProcessorTests.kt @@ -2,6 +2,7 @@ package com.onesignal.notifications.internal.generation import android.content.Context import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper @@ -13,7 +14,6 @@ import com.onesignal.notifications.internal.display.INotificationDisplayer import com.onesignal.notifications.internal.generation.impl.NotificationGenerationProcessor import com.onesignal.notifications.internal.lifecycle.INotificationLifecycleService import com.onesignal.notifications.internal.summary.INotificationSummaryManager -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.coEvery diff --git a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/limiting/NotificationLimitManagerTests.kt b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/limiting/NotificationLimitManagerTests.kt index 7e31d2f02d..e3a1919be3 100644 --- a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/limiting/NotificationLimitManagerTests.kt +++ b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/limiting/NotificationLimitManagerTests.kt @@ -4,13 +4,13 @@ import android.content.Context import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.test.core.app.ApplicationProvider +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper import com.onesignal.notifications.internal.data.INotificationRepository import com.onesignal.notifications.internal.limiting.impl.NotificationLimitManager import com.onesignal.notifications.internal.summary.INotificationSummaryManager -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.mockk.coEvery import io.mockk.coVerify diff --git a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/summary/NotificationSummaryManagerTests.kt b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/summary/NotificationSummaryManagerTests.kt index d630c4b20a..75bf2aa479 100644 --- a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/summary/NotificationSummaryManagerTests.kt +++ b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/summary/NotificationSummaryManagerTests.kt @@ -1,5 +1,6 @@ package com.onesignal.notifications.internal.summary +import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging import com.onesignal.mocks.AndroidMockHelper @@ -9,7 +10,6 @@ import com.onesignal.notifications.internal.display.ISummaryNotificationDisplaye import com.onesignal.notifications.internal.restoration.INotificationRestoreProcessor import com.onesignal.notifications.internal.summary.impl.NotificationSummaryManager import com.onesignal.notifications.shadows.ShadowRoboNotificationManager -import com.onesignal.testhelpers.extensions.RobolectricTest import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe import io.mockk.coEvery diff --git a/OneSignalSDK/onesignal/testhelpers/build.gradle b/OneSignalSDK/onesignal/testhelpers/build.gradle index 6e7b7bb75b..82f7c6e736 100644 --- a/OneSignalSDK/onesignal/testhelpers/build.gradle +++ b/OneSignalSDK/onesignal/testhelpers/build.gradle @@ -38,14 +38,8 @@ android { dependencies { implementation(project(':OneSignal:core')) - // Only use for RobolectricExtension.kt, - // to bridge Robolectric's JUnit4 usage to Kotest's Junit 5 - implementation("junit:junit:4.13.2") - implementation("io.kotest:kotest-runner-junit5:$kotestVersion") implementation("io.kotest:kotest-runner-junit5-jvm:$kotestVersion") - implementation("org.robolectric:robolectric:4.8.1") - implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") implementation("io.mockk:mockk:1.13.2") implementation("androidx.test:core-ktx:1.5.0") } diff --git a/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/ContainedRobolectricRunner.kt b/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/ContainedRobolectricRunner.kt deleted file mode 100644 index ab8d352e2c..0000000000 --- a/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/ContainedRobolectricRunner.kt +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Code taken from https://github.com/kotest/kotest-extensions-robolectric with no changes. - * - * LICENSE: https://github.com/kotest/kotest-extensions-robolectric/blob/master/LICENSE - */ -package com.onesignal.testhelpers.extensions - -import org.junit.runners.model.FrameworkMethod -import org.robolectric.RobolectricTestRunner -import org.robolectric.annotation.Config -import org.robolectric.internal.bytecode.InstrumentationConfiguration -import org.robolectric.pluginapi.config.ConfigurationStrategy -import org.robolectric.plugins.ConfigConfigurer -import java.lang.reflect.Method - -class ContainedRobolectricRunner( - private val config: Config?, -) : RobolectricTestRunner(PlaceholderTest::class.java, injector) { - private val placeHolderMethod: FrameworkMethod = children[0] - val sdkEnvironment = - getSandbox(placeHolderMethod).also { - configureSandbox(it, placeHolderMethod) - } - private val bootStrapMethod = - sdkEnvironment.bootstrappedClass(testClass.javaClass) - .getMethod(PlaceholderTest::bootStrapMethod.name) - - fun containedBefore() { - Thread.currentThread().contextClassLoader = sdkEnvironment.robolectricClassLoader - super.beforeTest(sdkEnvironment, placeHolderMethod, bootStrapMethod) - } - - fun containedAfter() { - super.afterTest(placeHolderMethod, bootStrapMethod) - super.finallyAfterTest(placeHolderMethod) - Thread.currentThread().contextClassLoader = ContainedRobolectricRunner::class.java.classLoader - } - - override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration { - return InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method)) - .doNotAcquirePackage("io.kotest") - .build() - } - - override fun getConfig(method: Method?): Config { - val defaultConfiguration = - injector.getInstance(ConfigurationStrategy::class.java) - .getConfig(testClass.javaClass, method) - - if (config != null) { - val configConfigurer = injector.getInstance(ConfigConfigurer::class.java) - return configConfigurer.merge(defaultConfiguration[Config::class.java], config) - } - - return super.getConfig(method) - } - - class PlaceholderTest { - @org.junit.Test - fun testPlaceholder() { - } - - fun bootStrapMethod() { - } - } - - companion object { - private val injector = defaultInjector().build() - } -} diff --git a/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/RobolectricExtension.kt b/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/RobolectricExtension.kt deleted file mode 100644 index e6ea8cf0a0..0000000000 --- a/OneSignalSDK/onesignal/testhelpers/src/main/java/com/onesignal/testhelpers/extensions/RobolectricExtension.kt +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Code taken from https://github.com/kotest/kotest-extensions-robolectric with a - * fix in the intercept method. - * - * LICENSE: https://github.com/kotest/kotest-extensions-robolectric/blob/master/LICENSE - */ -package com.onesignal.testhelpers.extensions - -import android.app.Application -import io.kotest.common.runBlocking -import io.kotest.core.extensions.ConstructorExtension -import io.kotest.core.extensions.TestCaseExtension -import io.kotest.core.spec.AutoScan -import io.kotest.core.spec.Spec -import io.kotest.core.test.TestCase -import io.kotest.core.test.TestResult -import org.robolectric.annotation.Config -import java.util.concurrent.Callable -import kotlin.reflect.KClass -import kotlin.reflect.full.findAnnotation -import kotlin.time.Duration - -/** - * We override TestCaseExtension to configure the Robolectric environment because TestCase intercept - * occurs on the same thread the test is run. This is unfortunate because it is run for every test, - * rather than every spec. But the SpecExtension intercept is run on a different thread. - */ -@AutoScan -class RobolectricExtension : ConstructorExtension, TestCaseExtension { - private fun Class<*>.getParentClass(): List> { - if (superclass == null) return listOf() - return listOf(superclass) + superclass.getParentClass() - } - - private fun KClass<*>.getConfig(): Config { - val configAnnotations = - listOf(this.java).plus(this.java.getParentClass()) - .mapNotNull { it.kotlin.findAnnotation() } - .asSequence() - - val configAnnotation = configAnnotations.firstOrNull() - - if (configAnnotation != null) { - return Config.Builder(configAnnotation).build() - } - - val robolectricTestAnnotations = - listOf(this.java).plus(this.java.getParentClass()) - .mapNotNull { it.kotlin.findAnnotation() } - .asSequence() - - val application: KClass? = - robolectricTestAnnotations - .firstOrNull { it.application != KotestDefaultApplication::class }?.application - val sdk: Int? = robolectricTestAnnotations.firstOrNull { it.sdk != -1 }?.takeUnless { it.sdk == -1 }?.sdk - - return Config.Builder() - .also { builder -> - if (application != null) { - builder.setApplication(application.java) - } - - if (sdk != null) { - builder.setSdk(sdk) - } - }.build() - } - - override fun instantiate(clazz: KClass): Spec? { - clazz.findAnnotation() ?: return null - - return ContainedRobolectricRunner(clazz.getConfig()) - .sdkEnvironment.bootstrappedClass(clazz.java).newInstance() - } - - override suspend fun intercept( - testCase: TestCase, - execute: suspend (TestCase) -> TestResult, - ): TestResult { - return try { - runTest(testCase, execute) - } catch (t: Throwable) { - // Without this the whole test class will be silently be skipped - // if something throws - TestResult.Error(Duration.ZERO, t) - } - } - - private suspend fun runTest( - testCase: TestCase, - execute: suspend (TestCase) -> TestResult, - ): TestResult { - // FIXED: Updated code based on https://github.com/kotest/kotest/issues/2717 - val hasRobolectricAnnotation = - testCase.spec::class.annotations.any { annotation -> - annotation.annotationClass.qualifiedName == RobolectricTest::class.qualifiedName - } - - return if (hasRobolectricAnnotation) { - runTestRobolectric(testCase, execute) - } else { - execute(testCase) - } - } - - private suspend fun runTestRobolectric( - testCase: TestCase, - execute: suspend (TestCase) -> TestResult, - ): TestResult { - val containedRobolectricRunner = - ContainedRobolectricRunner(testCase.spec::class.getConfig()) - // sdkEnvironment.runOnMainThread is important to ensure Robolectric's - // looper state doesn't carry over to the next test class. - return containedRobolectricRunner.sdkEnvironment.runOnMainThread( - Callable { - containedRobolectricRunner.containedBefore() - val result = runBlocking { execute(testCase) } - containedRobolectricRunner.containedAfter() - result - }, - ) - } -} - -internal class KotestDefaultApplication : Application() - -annotation class RobolectricTest( - val application: KClass = KotestDefaultApplication::class, - val sdk: Int = -1, -)