Adds PushersManagerTest
This commit is contained in:
parent
1f28a2acae
commit
40c2e95a54
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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 im.vector.app
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
|
||||||
|
object AppBuildConfig {
|
||||||
|
|
||||||
|
fun getModel(): String {
|
||||||
|
return Build.MODEL
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package im.vector.app.core.pushers
|
package im.vector.app.core.pushers
|
||||||
|
|
||||||
|
import im.vector.app.AppBuildConfig
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.resources.AppNameProvider
|
import im.vector.app.core.resources.AppNameProvider
|
||||||
|
@ -26,7 +27,7 @@ import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
private const val DEFAULT_PUSHER_FILE_TAG = "mobile"
|
internal const val DEFAULT_PUSHER_FILE_TAG = "mobile"
|
||||||
|
|
||||||
class PushersManager @Inject constructor(
|
class PushersManager @Inject constructor(
|
||||||
private val unifiedPushHelper: UnifiedPushHelper,
|
private val unifiedPushHelper: UnifiedPushHelper,
|
||||||
|
@ -64,11 +65,11 @@ class PushersManager @Inject constructor(
|
||||||
gateway: String
|
gateway: String
|
||||||
) = HttpPusher(
|
) = HttpPusher(
|
||||||
pushKey,
|
pushKey,
|
||||||
stringProvider.getString(R.string.pusher_app_id),
|
appId = stringProvider.getString(R.string.pusher_app_id),
|
||||||
profileTag = DEFAULT_PUSHER_FILE_TAG + "_" + abs(activeSessionHolder.getActiveSession().myUserId.hashCode()),
|
profileTag = DEFAULT_PUSHER_FILE_TAG + "_" + abs(activeSessionHolder.getActiveSession().myUserId.hashCode()),
|
||||||
lang = localeProvider.current().language,
|
lang = localeProvider.current().language,
|
||||||
appDisplayName = appNameProvider.getAppName(),
|
appDisplayName = appNameProvider.getAppName(),
|
||||||
deviceDisplayName = android.os.Build.MODEL,
|
deviceDisplayName = AppBuildConfig.getModel(),
|
||||||
url = gateway,
|
url = gateway,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
deviceId = activeSessionHolder.getActiveSession().sessionParams.deviceId ?: "MOBILE",
|
deviceId = activeSessionHolder.getActiveSession().sessionParams.deviceId ?: "MOBILE",
|
||||||
|
|
|
@ -21,9 +21,14 @@ import im.vector.app.core.utils.getApplicationLabel
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class AppNameProvider @Inject constructor(private val context: Context) {
|
interface AppNameProvider {
|
||||||
|
|
||||||
fun getAppName(): String {
|
fun getAppName(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
class DefaultAppNameProvider @Inject constructor(private val context: Context) : AppNameProvider {
|
||||||
|
|
||||||
|
override fun getAppName(): String {
|
||||||
return try {
|
return try {
|
||||||
val appPackageName = context.applicationContext.packageName
|
val appPackageName = context.applicationContext.packageName
|
||||||
var appName = context.getApplicationLabel(appPackageName)
|
var appName = context.getApplicationLabel(appPackageName)
|
||||||
|
|
|
@ -23,9 +23,14 @@ import androidx.core.os.ConfigurationCompat
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class LocaleProvider @Inject constructor(private val resources: Resources) {
|
interface LocaleProvider {
|
||||||
|
|
||||||
fun current(): Locale {
|
fun current(): Locale
|
||||||
|
}
|
||||||
|
|
||||||
|
class DefaultLocaleProvider @Inject constructor(private val resources: Resources) : LocaleProvider {
|
||||||
|
|
||||||
|
override fun current(): Locale {
|
||||||
return ConfigurationCompat.getLocales(resources.configuration).get(0) ?: Locale.getDefault()
|
return ConfigurationCompat.getLocales(resources.configuration).get(0) ?: Locale.getDefault()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ import androidx.core.view.marginEnd
|
||||||
import androidx.core.view.marginStart
|
import androidx.core.view.marginStart
|
||||||
import androidx.core.view.marginTop
|
import androidx.core.view.marginTop
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.resources.LocaleProvider
|
import im.vector.app.core.resources.DefaultLocaleProvider
|
||||||
import im.vector.app.core.resources.getLayoutDirectionFromCurrentLocale
|
import im.vector.app.core.resources.getLayoutDirectionFromCurrentLocale
|
||||||
|
|
||||||
class MessageBubbleContentLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
|
class MessageBubbleContentLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
|
||||||
|
@ -53,7 +53,7 @@ class MessageBubbleContentLayout @JvmOverloads constructor(context: Context, att
|
||||||
textViewStub.setOnInflateListener(null)
|
textViewStub.setOnInflateListener(null)
|
||||||
messageTextView = inflated.findViewById(R.id.messageTextView)
|
messageTextView = inflated.findViewById(R.id.messageTextView)
|
||||||
}
|
}
|
||||||
localeLayoutDirection = LocaleProvider(resources).getLayoutDirectionFromCurrentLocale()
|
localeLayoutDirection = DefaultLocaleProvider(resources).getLayoutDirectionFromCurrentLocale()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.resources.LocaleProvider
|
import im.vector.app.core.resources.DefaultLocaleProvider
|
||||||
import im.vector.app.core.resources.getLayoutDirectionFromCurrentLocale
|
import im.vector.app.core.resources.getLayoutDirectionFromCurrentLocale
|
||||||
import im.vector.app.core.utils.DimensionConverter
|
import im.vector.app.core.utils.DimensionConverter
|
||||||
import im.vector.app.databinding.ViewMessageBubbleBinding
|
import im.vector.app.databinding.ViewMessageBubbleBinding
|
||||||
|
@ -67,7 +67,7 @@ class MessageBubbleView @JvmOverloads constructor(
|
||||||
override fun onFinishInflate() {
|
override fun onFinishInflate() {
|
||||||
super.onFinishInflate()
|
super.onFinishInflate()
|
||||||
views = ViewMessageBubbleBinding.bind(this)
|
views = ViewMessageBubbleBinding.bind(this)
|
||||||
val currentLayoutDirection = LocaleProvider(resources).getLayoutDirectionFromCurrentLocale()
|
val currentLayoutDirection = DefaultLocaleProvider(resources).getLayoutDirectionFromCurrentLocale()
|
||||||
val layoutDirectionToSet = if (isIncoming) {
|
val layoutDirectionToSet = if (isIncoming) {
|
||||||
currentLayoutDirection
|
currentLayoutDirection
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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 im.vector.app.core.pushers
|
||||||
|
|
||||||
|
import im.vector.app.AppBuildConfig
|
||||||
|
import im.vector.app.R
|
||||||
|
import im.vector.app.test.fakes.FakeActiveSessionHolder
|
||||||
|
import im.vector.app.test.fakes.FakeAppNameProvider
|
||||||
|
import im.vector.app.test.fakes.FakeLocaleProvider
|
||||||
|
import im.vector.app.test.fakes.FakePushersService
|
||||||
|
import im.vector.app.test.fakes.FakeSession
|
||||||
|
import im.vector.app.test.fakes.FakeStringProvider
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import io.mockk.mockkObject
|
||||||
|
import org.amshove.kluent.shouldBeEqualTo
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import java.util.Locale
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class PushersManagerTest {
|
||||||
|
|
||||||
|
private val pushersService = FakePushersService()
|
||||||
|
private val session = FakeSession(fakePushersService = pushersService)
|
||||||
|
private val activeSessionHolder = FakeActiveSessionHolder(session)
|
||||||
|
private val stringProvider = FakeStringProvider()
|
||||||
|
private val localeProvider = FakeLocaleProvider()
|
||||||
|
private val appNameProvider = FakeAppNameProvider()
|
||||||
|
|
||||||
|
private val pushersManager = PushersManager(
|
||||||
|
mockk(),
|
||||||
|
activeSessionHolder.instance,
|
||||||
|
localeProvider,
|
||||||
|
stringProvider.instance,
|
||||||
|
appNameProvider,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
mockkObject(AppBuildConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when enqueueRegisterPusher, then HttpPusher created and enqueued`() {
|
||||||
|
val pushKey = "abc"
|
||||||
|
val gateway = "123"
|
||||||
|
val pusherAppId = "app-id"
|
||||||
|
val appName = "element"
|
||||||
|
val deviceDisplayName = "iPhone Lollipop"
|
||||||
|
stringProvider.given(R.string.pusher_app_id, pusherAppId)
|
||||||
|
localeProvider.givenCurrent(Locale.UK)
|
||||||
|
appNameProvider.givenAppName(appName)
|
||||||
|
every { AppBuildConfig.getModel() } returns deviceDisplayName
|
||||||
|
|
||||||
|
pushersManager.enqueueRegisterPusher(pushKey, gateway)
|
||||||
|
|
||||||
|
val httpPusher = pushersService.verifyEnqueueAddHttpPusher()
|
||||||
|
httpPusher.pushkey shouldBeEqualTo pushKey
|
||||||
|
httpPusher.appId shouldBeEqualTo pusherAppId
|
||||||
|
httpPusher.profileTag shouldBeEqualTo DEFAULT_PUSHER_FILE_TAG + "_" + abs(session.myUserId.hashCode())
|
||||||
|
httpPusher.lang shouldBeEqualTo Locale.UK.language
|
||||||
|
httpPusher.appDisplayName shouldBeEqualTo appName
|
||||||
|
httpPusher.deviceDisplayName shouldBeEqualTo deviceDisplayName
|
||||||
|
httpPusher.enabled shouldBeEqualTo true
|
||||||
|
httpPusher.deviceId shouldBeEqualTo session.sessionParams.deviceId
|
||||||
|
httpPusher.append shouldBeEqualTo false
|
||||||
|
httpPusher.withEventIdOnly shouldBeEqualTo true
|
||||||
|
httpPusher.url shouldBeEqualTo gateway
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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 im.vector.app.test.fakes
|
||||||
|
|
||||||
|
import im.vector.app.core.resources.AppNameProvider
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
|
||||||
|
class FakeAppNameProvider : AppNameProvider by mockk() {
|
||||||
|
|
||||||
|
fun givenAppName(appName: String) {
|
||||||
|
every { getAppName() } returns appName
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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 im.vector.app.test.fakes
|
||||||
|
|
||||||
|
import im.vector.app.core.resources.LocaleProvider
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FakeLocaleProvider : LocaleProvider by mockk() {
|
||||||
|
|
||||||
|
fun givenCurrent(locale: Locale) {
|
||||||
|
every { current() } returns locale
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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 im.vector.app.test.fakes
|
||||||
|
|
||||||
|
import io.mockk.mockk
|
||||||
|
import io.mockk.slot
|
||||||
|
import io.mockk.verify
|
||||||
|
import org.matrix.android.sdk.api.session.pushers.HttpPusher
|
||||||
|
import org.matrix.android.sdk.api.session.pushers.PushersService
|
||||||
|
|
||||||
|
class FakePushersService : PushersService by mockk(relaxed = true) {
|
||||||
|
|
||||||
|
fun verifyEnqueueAddHttpPusher(): HttpPusher {
|
||||||
|
val httpPusherSlot = slot<HttpPusher>()
|
||||||
|
verify { enqueueAddHttpPusher(capture(httpPusherSlot)) }
|
||||||
|
return httpPusherSlot.captured
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,6 +41,7 @@ class FakeSession(
|
||||||
val fakeHomeServerCapabilitiesService: FakeHomeServerCapabilitiesService = FakeHomeServerCapabilitiesService(),
|
val fakeHomeServerCapabilitiesService: FakeHomeServerCapabilitiesService = FakeHomeServerCapabilitiesService(),
|
||||||
val fakeSharedSecretStorageService: FakeSharedSecretStorageService = FakeSharedSecretStorageService(),
|
val fakeSharedSecretStorageService: FakeSharedSecretStorageService = FakeSharedSecretStorageService(),
|
||||||
val fakeRoomService: FakeRoomService = FakeRoomService(),
|
val fakeRoomService: FakeRoomService = FakeRoomService(),
|
||||||
|
val fakePushersService: FakePushersService = FakePushersService(),
|
||||||
private val fakeEventService: FakeEventService = FakeEventService(),
|
private val fakeEventService: FakeEventService = FakeEventService(),
|
||||||
) : Session by mockk(relaxed = true) {
|
) : Session by mockk(relaxed = true) {
|
||||||
|
|
||||||
|
@ -58,6 +59,7 @@ class FakeSession(
|
||||||
override fun sharedSecretStorageService() = fakeSharedSecretStorageService
|
override fun sharedSecretStorageService() = fakeSharedSecretStorageService
|
||||||
override fun roomService() = fakeRoomService
|
override fun roomService() = fakeRoomService
|
||||||
override fun eventService() = fakeEventService
|
override fun eventService() = fakeEventService
|
||||||
|
override fun pushersService() = fakePushersService
|
||||||
|
|
||||||
fun givenVectorStore(vectorSessionStore: VectorSessionStore) {
|
fun givenVectorStore(vectorSessionStore: VectorSessionStore) {
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
Loading…
Reference in New Issue