Introduce lambdaError instead of using TODO, to handle error when a lambda is invoked and it should not.

This commit is contained in:
Benoit Marty 2024-05-23 09:12:40 +02:00
parent 955b4308ce
commit 4fc3c6f889
21 changed files with 77 additions and 33 deletions

View file

@ -18,9 +18,10 @@ package io.element.android.libraries.matrix.test.permalink
import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
import io.element.android.tests.testutils.lambda.lambdaError
class FakePermalinkParser( class FakePermalinkParser(
private var result: () -> PermalinkData = { TODO("Not implemented") } private var result: () -> PermalinkData = { lambdaError() }
) : PermalinkParser { ) : PermalinkParser {
fun givenResult(result: PermalinkData) { fun givenResult(result: PermalinkData) {
this.result = { result } this.result = { result }

View file

@ -19,10 +19,11 @@ package io.element.android.libraries.matrix.test.pushers
import io.element.android.libraries.matrix.api.pusher.PushersService import io.element.android.libraries.matrix.api.pusher.PushersService
import io.element.android.libraries.matrix.api.pusher.SetHttpPusherData import io.element.android.libraries.matrix.api.pusher.SetHttpPusherData
import io.element.android.libraries.matrix.api.pusher.UnsetHttpPusherData import io.element.android.libraries.matrix.api.pusher.UnsetHttpPusherData
import io.element.android.tests.testutils.lambda.lambdaError
class FakePushersService( class FakePushersService(
private val setHttpPusherResult: (SetHttpPusherData) -> Result<Unit> = { TODO() }, private val setHttpPusherResult: (SetHttpPusherData) -> Result<Unit> = { lambdaError() },
private val unsetHttpPusherResult: (UnsetHttpPusherData) -> Result<Unit> = { TODO() }, private val unsetHttpPusherResult: (UnsetHttpPusherData) -> Result<Unit> = { lambdaError() },
) : PushersService { ) : PushersService {
override suspend fun setHttpPusher(setHttpPusherData: SetHttpPusherData) = setHttpPusherResult(setHttpPusherData) override suspend fun setHttpPusher(setHttpPusherData: SetHttpPusherData) = setHttpPusherResult(setHttpPusherData)
override suspend fun unsetHttpPusher(unsetHttpPusherData: UnsetHttpPusherData): Result<Unit> = unsetHttpPusherResult(unsetHttpPusherData) override suspend fun unsetHttpPusher(unsetHttpPusherData: UnsetHttpPusherData): Result<Unit> = unsetHttpPusherResult(unsetHttpPusherData)

View file

@ -20,9 +20,10 @@ import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
import io.element.android.tests.testutils.lambda.lambdaError
class FakeNotifiableEventResolver( class FakeNotifiableEventResolver(
private val notifiableEventResult: (SessionId, RoomId, EventId) -> NotifiableEvent? = { _, _, _ -> TODO() } private val notifiableEventResult: (SessionId, RoomId, EventId) -> NotifiableEvent? = { _, _, _ -> lambdaError() }
) : NotifiableEventResolver { ) : NotifiableEventResolver {
override suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent? { override suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent? {
return notifiableEventResult(sessionId, roomId, eventId) return notifiableEventResult(sessionId, roomId, eventId)

View file

@ -41,6 +41,7 @@ import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
import io.element.android.libraries.pushstore.test.userpushstore.FakeUserPushStore import io.element.android.libraries.pushstore.test.userpushstore.FakeUserPushStore
import io.element.android.libraries.pushstore.test.userpushstore.FakeUserPushStoreFactory import io.element.android.libraries.pushstore.test.userpushstore.FakeUserPushStoreFactory
import io.element.android.libraries.pushstore.test.userpushstore.clientsecret.FakePushClientSecret import io.element.android.libraries.pushstore.test.userpushstore.clientsecret.FakePushClientSecret
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.lambda.value
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -240,9 +241,9 @@ class DefaultPushHandlerTest {
} }
private fun createDefaultPushHandler( private fun createDefaultPushHandler(
onNotifiableEventReceived: (NotifiableEvent) -> Unit = { TODO() }, onNotifiableEventReceived: (NotifiableEvent) -> Unit = { lambdaError() },
notifiableEventResult: (SessionId, RoomId, EventId) -> NotifiableEvent? = { _, _, _ -> TODO() }, notifiableEventResult: (SessionId, RoomId, EventId) -> NotifiableEvent? = { _, _, _ -> lambdaError() },
incrementPushCounterResult: () -> Unit = { TODO() }, incrementPushCounterResult: () -> Unit = { lambdaError() },
userPushStore: UserPushStore = FakeUserPushStore(), userPushStore: UserPushStore = FakeUserPushStore(),
pushClientSecret: PushClientSecret = FakePushClientSecret(), pushClientSecret: PushClientSecret = FakePushClientSecret(),
buildMeta: BuildMeta = aBuildMeta(), buildMeta: BuildMeta = aBuildMeta(),

View file

@ -17,9 +17,10 @@
package io.element.android.libraries.push.impl.test package io.element.android.libraries.push.impl.test
import io.element.android.libraries.push.impl.pushgateway.PushGatewayNotifyRequest import io.element.android.libraries.push.impl.pushgateway.PushGatewayNotifyRequest
import io.element.android.tests.testutils.lambda.lambdaError
class FakePushGatewayNotifyRequest( class FakePushGatewayNotifyRequest(
private val executeResult: (PushGatewayNotifyRequest.Params) -> Unit = { TODO() } private val executeResult: (PushGatewayNotifyRequest.Params) -> Unit = { lambdaError() }
) : PushGatewayNotifyRequest { ) : PushGatewayNotifyRequest {
override suspend fun execute(params: PushGatewayNotifyRequest.Params) { override suspend fun execute(params: PushGatewayNotifyRequest.Params) {
executeResult(params) executeResult(params)

View file

@ -17,9 +17,10 @@
package io.element.android.libraries.push.impl.test package io.element.android.libraries.push.impl.test
import io.element.android.libraries.pushproviders.api.CurrentUserPushConfig import io.element.android.libraries.pushproviders.api.CurrentUserPushConfig
import io.element.android.tests.testutils.lambda.lambdaError
class FakeTestPush( class FakeTestPush(
private val executeResult: (CurrentUserPushConfig) -> Unit = { TODO() } private val executeResult: (CurrentUserPushConfig) -> Unit = { lambdaError() }
) : TestPush { ) : TestPush {
override suspend fun execute(config: CurrentUserPushConfig) { override suspend fun execute(config: CurrentUserPushConfig) {
executeResult(config) executeResult(config)

View file

@ -18,10 +18,11 @@ package io.element.android.libraries.push.test
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.pushproviders.api.PusherSubscriber import io.element.android.libraries.pushproviders.api.PusherSubscriber
import io.element.android.tests.testutils.lambda.lambdaError
class FakePusherSubscriber( class FakePusherSubscriber(
private val registerPusherResult: (MatrixClient, String, String) -> Result<Unit> = { _, _, _ -> TODO() }, private val registerPusherResult: (MatrixClient, String, String) -> Result<Unit> = { _, _, _ -> lambdaError() },
private val unregisterPusherResult: (MatrixClient, String, String) -> Result<Unit> = { _, _, _ -> TODO() }, private val unregisterPusherResult: (MatrixClient, String, String) -> Result<Unit> = { _, _, _ -> lambdaError() },
) : PusherSubscriber { ) : PusherSubscriber {
override suspend fun registerPusher(matrixClient: MatrixClient, pushKey: String, gateway: String): Result<Unit> { override suspend fun registerPusher(matrixClient: MatrixClient, pushKey: String, gateway: String): Result<Unit> {
return registerPusherResult(matrixClient, pushKey, gateway) return registerPusherResult(matrixClient, pushKey, gateway)

View file

@ -18,9 +18,10 @@ package io.element.android.libraries.push.test.test
import io.element.android.libraries.pushproviders.api.PushData import io.element.android.libraries.pushproviders.api.PushData
import io.element.android.libraries.pushproviders.api.PushHandler import io.element.android.libraries.pushproviders.api.PushHandler
import io.element.android.tests.testutils.lambda.lambdaError
class FakePushHandler( class FakePushHandler(
private val handleResult: (PushData) -> Unit = { TODO() } private val handleResult: (PushData) -> Unit = { lambdaError() }
) : PushHandler { ) : PushHandler {
override suspend fun handle(pushData: PushData) { override suspend fun handle(pushData: PushData) {
handleResult(pushData) handleResult(pushData)

View file

@ -16,8 +16,10 @@
package io.element.android.libraries.pushproviders.firebase package io.element.android.libraries.pushproviders.firebase
import io.element.android.tests.testutils.lambda.lambdaError
class FakeFirebaseNewTokenHandler( class FakeFirebaseNewTokenHandler(
private val handleResult: (String) -> Unit = { TODO() } private val handleResult: (String) -> Unit = { lambdaError() }
) : FirebaseNewTokenHandler { ) : FirebaseNewTokenHandler {
override suspend fun handle(firebaseToken: String) { override suspend fun handle(firebaseToken: String) {
handleResult(firebaseToken) handleResult(firebaseToken)

View file

@ -24,4 +24,5 @@ android {
dependencies { dependencies {
implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrix.api)
implementation(projects.libraries.pushproviders.api) implementation(projects.libraries.pushproviders.api)
implementation(projects.tests.testutils)
} }

View file

@ -27,8 +27,8 @@ class FakePushProvider(
private val isAvailable: Boolean = true, private val isAvailable: Boolean = true,
private val distributors: List<Distributor> = listOf(Distributor("aDistributorValue", "aDistributorName")), private val distributors: List<Distributor> = listOf(Distributor("aDistributorValue", "aDistributorName")),
private val currentUserPushConfig: CurrentUserPushConfig? = null, private val currentUserPushConfig: CurrentUserPushConfig? = null,
private val registerWithResult: (MatrixClient, Distributor) -> Result<Unit> = { _, _ -> TODO() }, private val registerWithResult: (MatrixClient, Distributor) -> Result<Unit> = { _, _ -> lambdaError() },
private val unregisterWithResult: (MatrixClient) -> Result<Unit> = { TODO() }, private val unregisterWithResult: (MatrixClient) -> Result<Unit> = { lambdaError() },
) : PushProvider { ) : PushProvider {
override fun isAvailable(): Boolean = isAvailable override fun isAvailable(): Boolean = isAvailable

View file

@ -17,9 +17,10 @@
package io.element.android.libraries.pushproviders.unifiedpush package io.element.android.libraries.pushproviders.unifiedpush
import io.element.android.libraries.pushproviders.api.Distributor import io.element.android.libraries.pushproviders.api.Distributor
import io.element.android.tests.testutils.lambda.lambdaError
class FakeRegisterUnifiedPushUseCase( class FakeRegisterUnifiedPushUseCase(
private val result: (Distributor, String) -> Result<Unit> = { _, _ -> TODO("Not yet implemented") } private val result: (Distributor, String) -> Result<Unit> = { _, _ -> lambdaError() }
) : RegisterUnifiedPushUseCase { ) : RegisterUnifiedPushUseCase {
override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> { override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> {
return result(distributor, clientSecret) return result(distributor, clientSecret)

View file

@ -16,8 +16,10 @@
package io.element.android.libraries.pushproviders.unifiedpush package io.element.android.libraries.pushproviders.unifiedpush
import io.element.android.tests.testutils.lambda.lambdaError
class FakeUnifiedPushGatewayResolver( class FakeUnifiedPushGatewayResolver(
private val getGatewayResult: (String) -> String = { TODO() }, private val getGatewayResult: (String) -> String = { lambdaError() },
) : UnifiedPushGatewayResolver { ) : UnifiedPushGatewayResolver {
override suspend fun getGateway(endpoint: String): String { override suspend fun getGateway(endpoint: String): String {
return getGatewayResult(endpoint) return getGatewayResult(endpoint)

View file

@ -16,8 +16,10 @@
package io.element.android.libraries.pushproviders.unifiedpush package io.element.android.libraries.pushproviders.unifiedpush
import io.element.android.tests.testutils.lambda.lambdaError
class FakeUnifiedPushNewGatewayHandler( class FakeUnifiedPushNewGatewayHandler(
private val handleResult: suspend (String, String, String) -> Result<Unit> = { _, _, _ -> TODO() }, private val handleResult: suspend (String, String, String) -> Result<Unit> = { _, _, _ -> lambdaError() },
) : UnifiedPushNewGatewayHandler { ) : UnifiedPushNewGatewayHandler {
override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> { override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> {
return handleResult(endpoint, pushGateway, clientSecret) return handleResult(endpoint, pushGateway, clientSecret)

View file

@ -17,14 +17,15 @@
package io.element.android.libraries.pushproviders.unifiedpush package io.element.android.libraries.pushproviders.unifiedpush
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.tests.testutils.lambda.lambdaError
class FakeUnifiedPushStore( class FakeUnifiedPushStore(
private val getEndpointResult: (String) -> String? = { TODO() }, private val getEndpointResult: (String) -> String? = { lambdaError() },
private val storeUpEndpointResult: (String, String?) -> Unit = { _, _ -> TODO() }, private val storeUpEndpointResult: (String, String?) -> Unit = { _, _ -> lambdaError() },
private val getPushGatewayResult: (String) -> String? = { TODO() }, private val getPushGatewayResult: (String) -> String? = { lambdaError() },
private val storePushGatewayResult: (String, String?) -> Unit = { _, _ -> TODO() }, private val storePushGatewayResult: (String, String?) -> Unit = { _, _ -> lambdaError() },
private val getDistributorValueResult: (UserId) -> String? = { TODO() }, private val getDistributorValueResult: (UserId) -> String? = { lambdaError() },
private val setDistributorValueResult: (UserId, String) -> Unit = { _, _ -> TODO() }, private val setDistributorValueResult: (UserId, String) -> Unit = { _, _ -> lambdaError() },
) : UnifiedPushStore { ) : UnifiedPushStore {
override fun getEndpoint(clientSecret: String): String? { override fun getEndpoint(clientSecret: String): String? {
return getEndpointResult(clientSecret) return getEndpointResult(clientSecret)

View file

@ -17,9 +17,10 @@
package io.element.android.libraries.pushproviders.unifiedpush package io.element.android.libraries.pushproviders.unifiedpush
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.tests.testutils.lambda.lambdaError
class FakeUnregisterUnifiedPushUseCase( class FakeUnregisterUnifiedPushUseCase(
private val result: (MatrixClient, String) -> Result<Unit> = { _, _ -> TODO("Not yet implemented") } private val result: (MatrixClient, String) -> Result<Unit> = { _, _ -> lambdaError() }
) : UnregisterUnifiedPushUseCase { ) : UnregisterUnifiedPushUseCase {
override suspend fun execute(matrixClient: MatrixClient, clientSecret: String): Result<Unit> { override suspend fun execute(matrixClient: MatrixClient, clientSecret: String): Result<Unit> {
return result(matrixClient, clientSecret) return result(matrixClient, clientSecret)

View file

@ -18,10 +18,11 @@ package io.element.android.libraries.pushstore.test.userpushstore.clientsecret
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
import io.element.android.tests.testutils.lambda.lambdaError
class FakePushClientSecret( class FakePushClientSecret(
private val getSecretForUserResult: (SessionId) -> String = { TODO() }, private val getSecretForUserResult: (SessionId) -> String = { lambdaError() },
private val getUserIdFromSecretResult: (String) -> SessionId? = { TODO() } private val getUserIdFromSecretResult: (String) -> SessionId? = { lambdaError() }
) : PushClientSecret { ) : PushClientSecret {
override suspend fun getSecretForUser(userId: SessionId): String { override suspend fun getSecretForUser(userId: SessionId): String {
return getSecretForUserResult(userId) return getSecretForUserResult(userId)

View file

@ -164,7 +164,7 @@ internal fun MentionSpanPreview() {
eventId = null, eventId = null,
viaParameters = persistentListOf(), viaParameters = persistentListOf(),
) )
else -> TODO() else -> throw AssertionError("Unexpected value $uriString")
} }
} }
}, },

View file

@ -16,26 +16,28 @@
package io.element.android.tests.testutils package io.element.android.tests.testutils
import io.element.android.tests.testutils.lambda.lambdaError
class EnsureNeverCalled : () -> Unit { class EnsureNeverCalled : () -> Unit {
override fun invoke() { override fun invoke() {
throw AssertionError("Should not be called") lambdaError()
} }
} }
class EnsureNeverCalledWithParam<T> : (T) -> Unit { class EnsureNeverCalledWithParam<T> : (T) -> Unit {
override fun invoke(p1: T) { override fun invoke(p1: T) {
throw AssertionError("Should not be called and is called with $p1") lambdaError("Should not be called and is called with $p1")
} }
} }
class EnsureNeverCalledWithParamAndResult<T, R> : (T) -> R { class EnsureNeverCalledWithParamAndResult<T, R> : (T) -> R {
override fun invoke(p1: T): R { override fun invoke(p1: T): R {
throw AssertionError("Should not be called and is called with $p1") lambdaError("Should not be called and is called with $p1")
} }
} }
class EnsureNeverCalledWithTwoParams<T, U> : (T, U) -> Unit { class EnsureNeverCalledWithTwoParams<T, U> : (T, U) -> Unit {
override fun invoke(p1: T, p2: U) { override fun invoke(p1: T, p2: U) {
throw AssertionError("Should not be called and is called with $p1 and $p2") lambdaError("Should not be called and is called with $p1 and $p2")
} }
} }

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.tests.testutils.lambda
fun lambdaError(
message: String = "This lambda should never be called."
): Nothing {
throw AssertionError(message)
}

View file

@ -26,7 +26,7 @@ abstract class LambdaRecorder internal constructor(
internal fun onInvoke(vararg params: Any?) { internal fun onInvoke(vararg params: Any?) {
if (assertNoInvocation) { if (assertNoInvocation) {
throw AssertionError("This lambda should never be called.") lambdaError()
} }
parametersSequence.add(params.toList()) parametersSequence.add(params.toList())
} }