Add test on PushGatewayNotifyRequest
This commit is contained in:
parent
fd8734859a
commit
851887b115
9 changed files with 183 additions and 11 deletions
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.pushgateway
|
||||||
import retrofit2.http.Body
|
import retrofit2.http.Body
|
||||||
import retrofit2.http.POST
|
import retrofit2.http.POST
|
||||||
|
|
||||||
internal interface PushGatewayAPI {
|
interface PushGatewayAPI {
|
||||||
/**
|
/**
|
||||||
* Ask the Push Gateway to send a push to the current device.
|
* Ask the Push Gateway to send a push to the current device.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
internal data class PushGatewayDevice(
|
data class PushGatewayDevice(
|
||||||
/**
|
/**
|
||||||
* Required. The app_id given when the pusher was created.
|
* Required. The app_id given when the pusher was created.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
internal data class PushGatewayNotification(
|
data class PushGatewayNotification(
|
||||||
@SerialName("event_id")
|
@SerialName("event_id")
|
||||||
val eventId: String,
|
val eventId: String,
|
||||||
@SerialName("room_id")
|
@SerialName("room_id")
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
internal data class PushGatewayNotifyBody(
|
data class PushGatewayNotifyBody(
|
||||||
/**
|
/**
|
||||||
* Required. Information about the push notification
|
* Required. Information about the push notification
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
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 io.element.android.libraries.push.api.gateway.PushGatewayFailure
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class PushGatewayNotifyRequest @Inject constructor(
|
class PushGatewayNotifyRequest @Inject constructor(
|
||||||
private val retrofitFactory: RetrofitFactory,
|
private val pushGatewayApiFactory: PushGatewayApiFactory,
|
||||||
) {
|
) {
|
||||||
data class Params(
|
data class Params(
|
||||||
val url: String,
|
val url: String,
|
||||||
|
|
@ -33,12 +32,10 @@ class PushGatewayNotifyRequest @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
suspend fun execute(params: Params) {
|
suspend fun execute(params: Params) {
|
||||||
val sygnalApi = retrofitFactory.create(
|
val pushGatewayApi = pushGatewayApiFactory.create(
|
||||||
params.url.substringBefore(PushGatewayConfig.URI_PUSH_GATEWAY_PREFIX_PATH)
|
params.url.substringBefore(PushGatewayConfig.URI_PUSH_GATEWAY_PREFIX_PATH)
|
||||||
)
|
)
|
||||||
.create(PushGatewayAPI::class.java)
|
val response = pushGatewayApi.notify(
|
||||||
|
|
||||||
val response = sygnalApi.notify(
|
|
||||||
PushGatewayNotifyBody(
|
PushGatewayNotifyBody(
|
||||||
PushGatewayNotification(
|
PushGatewayNotification(
|
||||||
eventId = params.eventId.value,
|
eventId = params.eventId.value,
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
internal data class PushGatewayNotifyResponse(
|
data class PushGatewayNotifyResponse(
|
||||||
@SerialName("rejected")
|
@SerialName("rejected")
|
||||||
val rejectedPushKeys: List<String>
|
val rejectedPushKeys: List<String>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue