diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationFactoryTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationFactoryTest.kt index e9f0516aa2..ca41fcc15a 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationFactoryTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationFactoryTest.kt @@ -31,12 +31,15 @@ import io.element.android.libraries.push.impl.notifications.fixtures.aSimpleNoti import io.element.android.libraries.push.impl.notifications.fixtures.anInviteNotifiableEvent import kotlinx.coroutines.test.runTest import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner private val MY_AVATAR_URL: String? = null private val AN_INVITATION_EVENT = anInviteNotifiableEvent(roomId = A_ROOM_ID) private val A_SIMPLE_EVENT = aSimpleNotifiableEvent(eventId = AN_EVENT_ID) private val A_MESSAGE_EVENT = aNotifiableMessageEvent(eventId = AN_EVENT_ID, roomId = A_ROOM_ID) +@RunWith(RobolectricTestRunner::class) class NotificationFactoryTest { private val androidNotificationFactory = FakeAndroidNotificationFactory() @@ -131,12 +134,14 @@ class NotificationFactoryTest { ) val roomWithMessage = mapOf(A_ROOM_ID to listOf(ProcessedEvent(ProcessedEvent.Type.KEEP, A_MESSAGE_EVENT))) + val fakeImageLoader = FakeImageLoader() val result = roomWithMessage.toNotifications( currentUser = MatrixUser(A_SESSION_ID, A_SESSION_ID.value, MY_AVATAR_URL), - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) assertThat(result).isEqualTo(listOf(expectedNotification)) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test @@ -144,9 +149,10 @@ class NotificationFactoryTest { val events = listOf(ProcessedEvent(ProcessedEvent.Type.REMOVE, A_MESSAGE_EVENT)) val emptyRoom = mapOf(A_ROOM_ID to events) + val fakeImageLoader = FakeImageLoader() val result = emptyRoom.toNotifications( currentUser = MatrixUser(A_SESSION_ID, A_SESSION_ID.value, MY_AVATAR_URL), - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) assertThat(result).isEqualTo( @@ -156,15 +162,17 @@ class NotificationFactoryTest { ) ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test fun `given a room with only redacted events when mapping to notification then is Empty`() = testWith(notificationFactory) { val redactedRoom = mapOf(A_ROOM_ID to listOf(ProcessedEvent(ProcessedEvent.Type.KEEP, A_MESSAGE_EVENT.copy(isRedacted = true)))) + val fakeImageLoader = FakeImageLoader() val result = redactedRoom.toNotifications( currentUser = MatrixUser(A_SESSION_ID, A_SESSION_ID.value, MY_AVATAR_URL), - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) assertThat(result).isEqualTo( @@ -174,6 +182,7 @@ class NotificationFactoryTest { ) ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test @@ -193,12 +202,14 @@ class NotificationFactoryTest { A_ROOM_ID, ) + val fakeImageLoader = FakeImageLoader() val result = roomWithRedactedMessage.toNotifications( currentUser = MatrixUser(A_SESSION_ID, A_SESSION_ID.value, MY_AVATAR_URL), - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) assertThat(result).isEqualTo(listOf(expectedNotification)) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt index 46dcc0035f..18f2266b87 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt @@ -28,6 +28,8 @@ import io.element.android.libraries.push.impl.notifications.model.NotifiableEven import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner private const val MY_USER_DISPLAY_NAME = "display-name" private const val MY_USER_AVATAR_URL = "avatar-url" @@ -43,6 +45,7 @@ private val MESSAGE_META = RoomNotification.Message.Meta( ) private val ONE_SHOT_META = OneShotNotification.Append.Meta(key = "ignored", summaryLine = "ignored", isNoisy = false, timestamp = -1) +@RunWith(RobolectricTestRunner::class) class NotificationRendererTest { private val notificationDisplayer = FakeNotificationDisplayer() @@ -199,7 +202,7 @@ class NotificationRendererTest { MatrixUser(A_SESSION_ID, MY_USER_DISPLAY_NAME, MY_USER_AVATAR_URL), useCompleteNotificationFormat = USE_COMPLETE_NOTIFICATION_FORMAT, eventsToProcess = AN_EVENT_LIST, - imageLoader = FakeImageLoader(), + imageLoader = FakeImageLoader().getImageLoader(), ) } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreatorTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreatorTest.kt index cb25e14c40..399b0fc4b3 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreatorTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreatorTest.kt @@ -17,13 +17,8 @@ package io.element.android.libraries.push.impl.notifications import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.os.Build -import coil.Coil -import coil.ImageLoader import coil.annotation.ExperimentalCoilApi -import coil.test.FakeImageLoaderEngine import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -51,6 +46,7 @@ class RoomGroupMessageCreatorTest { @Test fun `test createRoomMessage with one Event`() = runTest { val sut = createRoomGroupMessageCreator() + val fakeImageLoader = FakeImageLoader() val result = sut.createRoomMessage( currentUser = aMatrixUser(), events = listOf( @@ -59,7 +55,7 @@ class RoomGroupMessageCreatorTest { ) ), roomId = A_ROOM_ID, - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -73,11 +69,13 @@ class RoomGroupMessageCreatorTest { shouldBing = false, ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test fun `test createRoomMessage with one noisy Event`() = runTest { val sut = createRoomGroupMessageCreator() + val fakeImageLoader = FakeImageLoader() val result = sut.createRoomMessage( currentUser = aMatrixUser(), events = listOf( @@ -86,7 +84,7 @@ class RoomGroupMessageCreatorTest { ) ), roomId = A_ROOM_ID, - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -100,6 +98,7 @@ class RoomGroupMessageCreatorTest { shouldBing = true, ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test @@ -144,20 +143,7 @@ class RoomGroupMessageCreatorTest { api: Int, expectedCoilRequests: List, ) = runTest { - val coilRequests = mutableListOf() - val engine = FakeImageLoaderEngine.Builder() - .intercept( - predicate = { - coilRequests.add(it) - true - }, - drawable = ColorDrawable(Color.BLUE) - ) - .build() - val imageLoader = ImageLoader.Builder(RuntimeEnvironment.getApplication()) - .components { add(engine) } - .build() - Coil.setImageLoader(imageLoader) + val fakeImageLoader = FakeImageLoader() val sut = createRoomGroupMessageCreator( sdkIntProvider = FakeBuildVersionSdkIntProvider(api) ) @@ -173,7 +159,7 @@ class RoomGroupMessageCreatorTest { ) ), roomId = A_ROOM_ID, - imageLoader = imageLoader, + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -187,12 +173,13 @@ class RoomGroupMessageCreatorTest { shouldBing = false, ) ) - assertThat(coilRequests.toList()).isEqualTo(expectedCoilRequests) + assertThat(fakeImageLoader.getCoilRequests()).isEqualTo(expectedCoilRequests) } @Test fun `test createRoomMessage with two Events`() = runTest { val sut = createRoomGroupMessageCreator() + val fakeImageLoader = FakeImageLoader() val result = sut.createRoomMessage( currentUser = aMatrixUser(), events = listOf( @@ -200,7 +187,7 @@ class RoomGroupMessageCreatorTest { aNotifiableMessageEvent(timestamp = A_TIMESTAMP + 10), ), roomId = A_ROOM_ID, - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -214,11 +201,13 @@ class RoomGroupMessageCreatorTest { shouldBing = false, ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test fun `test createRoomMessage with smart reply error`() = runTest { val sut = createRoomGroupMessageCreator() + val fakeImageLoader = FakeImageLoader() val result = sut.createRoomMessage( currentUser = aMatrixUser(), events = listOf( @@ -228,7 +217,7 @@ class RoomGroupMessageCreatorTest { ), ), roomId = A_ROOM_ID, - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -242,11 +231,13 @@ class RoomGroupMessageCreatorTest { shouldBing = false, ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } @Test fun `test createRoomMessage for direct room`() = runTest { val sut = createRoomGroupMessageCreator() + val fakeImageLoader = FakeImageLoader() val result = sut.createRoomMessage( currentUser = aMatrixUser(), events = listOf( @@ -255,7 +246,7 @@ class RoomGroupMessageCreatorTest { ), ), roomId = A_ROOM_ID, - imageLoader = FakeImageLoader(), + imageLoader = fakeImageLoader.getImageLoader(), ) val resultMetaWithoutFormatting = result.meta.copy( summaryLine = result.meta.summaryLine.toString() @@ -269,6 +260,7 @@ class RoomGroupMessageCreatorTest { shouldBing = false, ) ) + assertThat(fakeImageLoader.getCoilRequests().size).isEqualTo(0) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt index 2467d15232..5c747b45e2 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt @@ -16,32 +16,40 @@ package io.element.android.libraries.push.impl.notifications.fake -import coil.ComponentRegistry +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import coil.ImageLoader -import coil.disk.DiskCache -import coil.memory.MemoryCache -import coil.request.DefaultRequestOptions -import coil.request.Disposable -import coil.request.ImageRequest -import coil.request.ImageResult +import coil.annotation.ExperimentalCoilApi +import coil.test.FakeImageLoaderEngine +import org.robolectric.RuntimeEnvironment -class FakeImageLoader : ImageLoader { - override val components: ComponentRegistry = error("Fake class") - override val defaults: DefaultRequestOptions = error("Fake class") - override val diskCache: DiskCache? = null - override val memoryCache: MemoryCache? = null +@OptIn(ExperimentalCoilApi::class) +class FakeImageLoader { + private val coilRequests = mutableListOf() - override fun enqueue(request: ImageRequest): Disposable { - error("Fake class") + private var cache: ImageLoader? = null + + fun getImageLoader(): ImageLoader { + return cache ?: ImageLoader.Builder(RuntimeEnvironment.getApplication()) + .components { + val engine = FakeImageLoaderEngine.Builder() + .intercept( + predicate = { + coilRequests.add(it) + true + }, + drawable = ColorDrawable(Color.BLUE) + ) + .build() + add(engine) + } + .build() + .also { + cache = it + } } - override suspend fun execute(request: ImageRequest): ImageResult { - error("Fake class") + fun getCoilRequests(): List { + return coilRequests.toList() } - - override fun newBuilder(): ImageLoader.Builder { - error("Fake class") - } - - override fun shutdown() = Unit } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt index 8c1f28e10d..0e18036e94 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt @@ -21,7 +21,8 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder class FakeImageLoaderHolder : ImageLoaderHolder { + private val fakeImageLoader = FakeImageLoader() override fun get(client: MatrixClient): ImageLoader { - return FakeImageLoader() + return fakeImageLoader.getImageLoader() } }