Browse Source

Add test on PushGatewayNotifyRequest

pull/2899/head
Benoit Marty 4 months ago
parent
commit
dc6e62a324
  1. 2
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayAPI.kt
  2. 36
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayApiFactory.kt
  3. 2
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayDevice.kt
  4. 2
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotification.kt
  5. 2
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyBody.kt
  6. 9
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyRequest.kt
  7. 2
      libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyResponse.kt
  8. 37
      libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/FakePushGatewayApiFactory.kt
  9. 102
      libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyRequestTest.kt

2
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayAPI.kt

@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.pushgateway @@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.pushgateway
import retrofit2.http.Body
import retrofit2.http.POST
internal interface PushGatewayAPI {
interface PushGatewayAPI {
/**
* Ask the Push Gateway to send a push to the current device.
*

36
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayApiFactory.kt

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
/*
* 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.pushgateway
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.network.RetrofitFactory
import javax.inject.Inject
interface PushGatewayApiFactory {
fun create(baseUrl: String): PushGatewayAPI
}
@ContributesBinding(AppScope::class)
class DefaultPushGatewayApiFactory @Inject constructor(
private val retrofitFactory: RetrofitFactory,
) : PushGatewayApiFactory {
override fun create(baseUrl: String): PushGatewayAPI {
return retrofitFactory.create(baseUrl)
.create(PushGatewayAPI::class.java)
}
}

2
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayDevice.kt

@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName @@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
internal data class PushGatewayDevice(
data class PushGatewayDevice(
/**
* Required. The app_id given when the pusher was created.
*/

2
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotification.kt

@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName @@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
internal data class PushGatewayNotification(
data class PushGatewayNotification(
@SerialName("event_id")
val eventId: String,
@SerialName("room_id")

2
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyBody.kt

@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName @@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
internal data class PushGatewayNotifyBody(
data class PushGatewayNotifyBody(
/**
* Required. Information about the push notification
*/

9
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyRequest.kt

@ -17,12 +17,11 @@ package io.element.android.libraries.push.impl.pushgateway @@ -17,12 +17,11 @@ package io.element.android.libraries.push.impl.pushgateway
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.network.RetrofitFactory
import io.element.android.libraries.push.api.gateway.PushGatewayFailure
import javax.inject.Inject
class PushGatewayNotifyRequest @Inject constructor(
private val retrofitFactory: RetrofitFactory,
private val pushGatewayApiFactory: PushGatewayApiFactory,
) {
data class Params(
val url: String,
@ -33,12 +32,10 @@ class PushGatewayNotifyRequest @Inject constructor( @@ -33,12 +32,10 @@ class PushGatewayNotifyRequest @Inject constructor(
)
suspend fun execute(params: Params) {
val sygnalApi = retrofitFactory.create(
val pushGatewayApi = pushGatewayApiFactory.create(
params.url.substringBefore(PushGatewayConfig.URI_PUSH_GATEWAY_PREFIX_PATH)
)
.create(PushGatewayAPI::class.java)
val response = sygnalApi.notify(
val response = pushGatewayApi.notify(
PushGatewayNotifyBody(
PushGatewayNotification(
eventId = params.eventId.value,

2
libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyResponse.kt

@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName @@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
internal data class PushGatewayNotifyResponse(
data class PushGatewayNotifyResponse(
@SerialName("rejected")
val rejectedPushKeys: List<String>
)

37
libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/FakePushGatewayApiFactory.kt

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
/*
* 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.pushgateway
class FakePushGatewayApiFactory(
private val notifyResponse: () -> PushGatewayNotifyResponse
) : PushGatewayApiFactory {
var baseUrlParameter: String? = null
private set
override fun create(baseUrl: String): PushGatewayAPI {
baseUrlParameter = baseUrl
return FakePushGatewayAPI(notifyResponse)
}
}
class FakePushGatewayAPI(
private val notifyResponse: () -> PushGatewayNotifyResponse
) : PushGatewayAPI {
override suspend fun notify(body: PushGatewayNotifyBody): PushGatewayNotifyResponse {
return notifyResponse()
}
}

102
libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyRequestTest.kt

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
/*
* 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.pushgateway
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.push.api.gateway.PushGatewayFailure
import io.element.android.libraries.push.impl.test.DefaultTestPush
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertThrows
import org.junit.Test
class PushGatewayNotifyRequestTest {
@Test
fun `notify success`() = runTest {
val factory = FakePushGatewayApiFactory(
notifyResponse = {
PushGatewayNotifyResponse(
rejectedPushKeys = emptyList()
)
}
)
val pushGatewayNotifyRequest = PushGatewayNotifyRequest(
pushGatewayApiFactory = factory,
)
pushGatewayNotifyRequest.execute(
PushGatewayNotifyRequest.Params(
url = "aUrl",
appId = "anAppId",
pushKey = "aPushKey",
eventId = DefaultTestPush.TEST_EVENT_ID,
roomId = DefaultTestPush.TEST_ROOM_ID,
)
)
assertThat(factory.baseUrlParameter).isEqualTo("aUrl")
}
@Test
fun `notify success, url is stripped`() = runTest {
val factory = FakePushGatewayApiFactory(
notifyResponse = {
PushGatewayNotifyResponse(
rejectedPushKeys = emptyList()
)
}
)
val pushGatewayNotifyRequest = PushGatewayNotifyRequest(
pushGatewayApiFactory = factory,
)
pushGatewayNotifyRequest.execute(
PushGatewayNotifyRequest.Params(
url = "aUrl" + PushGatewayConfig.URI_PUSH_GATEWAY_PREFIX_PATH,
appId = "anAppId",
pushKey = "aPushKey",
eventId = DefaultTestPush.TEST_EVENT_ID,
roomId = DefaultTestPush.TEST_ROOM_ID,
)
)
assertThat(factory.baseUrlParameter).isEqualTo("aUrl")
}
@Test
fun `notify with rejected push key should throw expected Exception`() {
val factory = FakePushGatewayApiFactory(
notifyResponse = {
PushGatewayNotifyResponse(
rejectedPushKeys = listOf("aPushKey")
)
}
)
val pushGatewayNotifyRequest = PushGatewayNotifyRequest(
pushGatewayApiFactory = factory,
)
assertThrows(PushGatewayFailure.PusherRejected::class.java) {
runTest {
pushGatewayNotifyRequest.execute(
PushGatewayNotifyRequest.Params(
url = "aUrl",
appId = "anAppId",
pushKey = "aPushKey",
eventId = DefaultTestPush.TEST_EVENT_ID,
roomId = DefaultTestPush.TEST_ROOM_ID,
)
)
}
}
assertThat(factory.baseUrlParameter).isEqualTo("aUrl")
}
}
Loading…
Cancel
Save