Add test on PushGatewayNotifyRequest
This commit is contained in:
parent
20880b01da
commit
dc6e62a324
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.POST
|
||||
|
||||
internal interface PushGatewayAPI {
|
||||
interface PushGatewayAPI {
|
||||
/**
|
||||
* 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
|
||||
|
||||
@Serializable
|
||||
internal data class PushGatewayDevice(
|
||||
data class PushGatewayDevice(
|
||||
/**
|
||||
* Required. The app_id given when the pusher was created.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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(
|
|||
)
|
||||
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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