Benoit Marty
4 months ago
2 changed files with 203 additions and 3 deletions
@ -0,0 +1,197 @@ |
|||||||
|
/* |
||||||
|
* 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.libraries.push.impl |
||||||
|
|
||||||
|
import com.google.common.truth.Truth.assertThat |
||||||
|
import io.element.android.appconfig.PushConfig |
||||||
|
import io.element.android.libraries.core.meta.BuildMeta |
||||||
|
import io.element.android.libraries.matrix.api.pusher.SetHttpPusherData |
||||||
|
import io.element.android.libraries.matrix.api.pusher.UnsetHttpPusherData |
||||||
|
import io.element.android.libraries.matrix.test.AN_EXCEPTION |
||||||
|
import io.element.android.libraries.matrix.test.A_SECRET |
||||||
|
import io.element.android.libraries.matrix.test.FakeMatrixClient |
||||||
|
import io.element.android.libraries.matrix.test.core.aBuildMeta |
||||||
|
import io.element.android.libraries.matrix.test.pushers.FakePushersService |
||||||
|
import io.element.android.libraries.pushstore.api.UserPushStoreFactory |
||||||
|
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.FakeUserPushStoreFactory |
||||||
|
import io.element.android.libraries.pushstore.test.userpushstore.clientsecret.FakePushClientSecret |
||||||
|
import io.element.android.tests.testutils.lambda.lambdaRecorder |
||||||
|
import io.element.android.tests.testutils.lambda.value |
||||||
|
import kotlinx.coroutines.test.runTest |
||||||
|
import org.junit.Test |
||||||
|
|
||||||
|
class DefaultPusherSubscriberTest { |
||||||
|
@Test |
||||||
|
fun `test register pusher OK`() = runTest { |
||||||
|
testRegisterPusher( |
||||||
|
currentPushKey = null, |
||||||
|
registerResult = Result.success(Unit), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `test re-register pusher OK`() = runTest { |
||||||
|
testRegisterPusher( |
||||||
|
currentPushKey = "aPushKey", |
||||||
|
registerResult = Result.success(Unit), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `test register pusher error`() = runTest { |
||||||
|
testRegisterPusher( |
||||||
|
currentPushKey = null, |
||||||
|
registerResult = Result.failure(AN_EXCEPTION), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `test re-register pusher error`() = runTest { |
||||||
|
testRegisterPusher( |
||||||
|
currentPushKey = "aPushKey", |
||||||
|
registerResult = Result.failure(AN_EXCEPTION), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
private suspend fun testRegisterPusher( |
||||||
|
currentPushKey: String?, |
||||||
|
registerResult: Result<Unit>, |
||||||
|
) { |
||||||
|
val setHttpPusherResult = lambdaRecorder<SetHttpPusherData, Result<Unit>> { registerResult } |
||||||
|
val userPushStore = FakeUserPushStore().apply { |
||||||
|
setCurrentRegisteredPushKey(currentPushKey) |
||||||
|
} |
||||||
|
assertThat(userPushStore.getCurrentRegisteredPushKey()).isEqualTo(currentPushKey) |
||||||
|
|
||||||
|
val matrixClient = FakeMatrixClient( |
||||||
|
pushersService = FakePushersService( |
||||||
|
setHttpPusherResult = setHttpPusherResult, |
||||||
|
), |
||||||
|
) |
||||||
|
val defaultPusherSubscriber = createDefaultPusherSubscriber( |
||||||
|
pushClientSecret = FakePushClientSecret( |
||||||
|
getSecretForUserResult = { A_SECRET }, |
||||||
|
), |
||||||
|
userPushStoreFactory = FakeUserPushStoreFactory( |
||||||
|
userPushStore = userPushStore, |
||||||
|
), |
||||||
|
) |
||||||
|
val result = defaultPusherSubscriber.registerPusher( |
||||||
|
matrixClient = matrixClient, |
||||||
|
pushKey = "aPushKey", |
||||||
|
gateway = "aGateway", |
||||||
|
) |
||||||
|
assertThat(result).isEqualTo(registerResult) |
||||||
|
setHttpPusherResult.assertions() |
||||||
|
.isCalledExactly(1) |
||||||
|
.withSequence( |
||||||
|
listOf( |
||||||
|
value( |
||||||
|
SetHttpPusherData( |
||||||
|
pushKey = "aPushKey", |
||||||
|
appId = PushConfig.PUSHER_APP_ID, |
||||||
|
url = "aGateway", |
||||||
|
appDisplayName = "MyApp", |
||||||
|
deviceDisplayName = "MyDevice", |
||||||
|
profileTag = DEFAULT_PUSHER_FILE_TAG + "_", |
||||||
|
lang = "en", |
||||||
|
defaultPayload = "{\"cs\":\"$A_SECRET\"}", |
||||||
|
), |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
assertThat(userPushStore.getCurrentRegisteredPushKey()).isEqualTo( |
||||||
|
if (registerResult.isSuccess) "aPushKey" else currentPushKey |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `test unregister pusher OK`() = runTest { |
||||||
|
testUnregisterPusher( |
||||||
|
currentPushKey = "aPushKey", |
||||||
|
unregisterResult = Result.success(Unit), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `test unregister pusher error`() = runTest { |
||||||
|
testUnregisterPusher( |
||||||
|
currentPushKey = "aPushKey", |
||||||
|
unregisterResult = Result.failure(AN_EXCEPTION), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
private suspend fun testUnregisterPusher( |
||||||
|
currentPushKey: String?, |
||||||
|
unregisterResult: Result<Unit>, |
||||||
|
) { |
||||||
|
val unsetHttpPusherResult = lambdaRecorder<UnsetHttpPusherData, Result<Unit>> { unregisterResult } |
||||||
|
val userPushStore = FakeUserPushStore().apply { |
||||||
|
setCurrentRegisteredPushKey(currentPushKey) |
||||||
|
} |
||||||
|
assertThat(userPushStore.getCurrentRegisteredPushKey()).isEqualTo(currentPushKey) |
||||||
|
|
||||||
|
val matrixClient = FakeMatrixClient( |
||||||
|
pushersService = FakePushersService( |
||||||
|
unsetHttpPusherResult = unsetHttpPusherResult, |
||||||
|
), |
||||||
|
) |
||||||
|
val defaultPusherSubscriber = createDefaultPusherSubscriber( |
||||||
|
pushClientSecret = FakePushClientSecret( |
||||||
|
getSecretForUserResult = { A_SECRET }, |
||||||
|
), |
||||||
|
userPushStoreFactory = FakeUserPushStoreFactory( |
||||||
|
userPushStore = userPushStore, |
||||||
|
), |
||||||
|
) |
||||||
|
val result = defaultPusherSubscriber.unregisterPusher( |
||||||
|
matrixClient = matrixClient, |
||||||
|
pushKey = "aPushKey", |
||||||
|
gateway = "aGateway", |
||||||
|
) |
||||||
|
assertThat(result).isEqualTo(unregisterResult) |
||||||
|
unsetHttpPusherResult.assertions() |
||||||
|
.isCalledExactly(1) |
||||||
|
.withSequence( |
||||||
|
listOf( |
||||||
|
value( |
||||||
|
UnsetHttpPusherData( |
||||||
|
pushKey = "aPushKey", |
||||||
|
appId = PushConfig.PUSHER_APP_ID, |
||||||
|
), |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
assertThat(userPushStore.getCurrentRegisteredPushKey()).isEqualTo( |
||||||
|
if (unregisterResult.isSuccess) null else currentPushKey |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
private fun createDefaultPusherSubscriber( |
||||||
|
buildMeta: BuildMeta = aBuildMeta(applicationName = "MyApp"), |
||||||
|
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(), |
||||||
|
pushClientSecret: PushClientSecret = FakePushClientSecret(), |
||||||
|
): DefaultPusherSubscriber { |
||||||
|
return DefaultPusherSubscriber( |
||||||
|
buildMeta = buildMeta, |
||||||
|
pushClientSecret = pushClientSecret, |
||||||
|
userPushStoreFactory = userPushStoreFactory, |
||||||
|
) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue