Benoit Marty
4 months ago
2 changed files with 203 additions and 3 deletions
@ -0,0 +1,197 @@
@@ -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