Inject SentryDsn the same way we do with SentrySdkDsn so we can fake it for tests

This commit is contained in:
Jorge Martín 2025-12-17 10:16:17 +01:00 committed by Jorge Martin Espinosa
parent de694cecdb
commit b5d6843725
7 changed files with 26 additions and 6 deletions

View file

@ -17,7 +17,7 @@ import io.element.android.features.lockscreen.api.LockScreenService
import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
import io.element.android.libraries.di.annotations.SentrySdkDsn import io.element.android.libraries.di.identifiers.SentrySdkDsn
import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.matrix.api.platform.InitPlatformService import io.element.android.libraries.matrix.api.platform.InitPlatformService
import io.element.android.libraries.matrix.api.tracing.TracingService import io.element.android.libraries.matrix.api.tracing.TracingService

View file

@ -0,0 +1,11 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.di.identifiers
@JvmInline
value class SentryDsn(val value: String)

View file

@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details. * Please see LICENSE files in the repository root for full details.
*/ */
package io.element.android.libraries.di.annotations package io.element.android.libraries.di.identifiers
@JvmInline @JvmInline
value class SentrySdkDsn(val value: String) value class SentrySdkDsn(val value: String)

View file

@ -11,7 +11,7 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides import dev.zacsweers.metro.Provides
import io.element.android.libraries.di.annotations.SentrySdkDsn import io.element.android.libraries.di.identifiers.SentrySdkDsn
@BindingContainer @BindingContainer
@ContributesTo(AppScope::class) @ContributesTo(AppScope::class)

View file

@ -21,6 +21,7 @@ import io.element.android.libraries.core.data.ByteUnit
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.core.meta.BuildType
import io.element.android.libraries.di.annotations.ApplicationContext import io.element.android.libraries.di.annotations.ApplicationContext
import io.element.android.libraries.di.identifiers.SentryDsn
import io.element.android.libraries.matrix.api.analytics.GetDatabaseSizesUseCase import io.element.android.libraries.matrix.api.analytics.GetDatabaseSizesUseCase
import io.element.android.services.analyticsproviders.api.AnalyticsProvider import io.element.android.services.analyticsproviders.api.AnalyticsProvider
import io.element.android.services.analyticsproviders.api.AnalyticsTransaction import io.element.android.services.analyticsproviders.api.AnalyticsTransaction
@ -40,6 +41,7 @@ import timber.log.Timber
@Inject @Inject
class SentryAnalyticsProvider( class SentryAnalyticsProvider(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val sentryDsn: SentryDsn?,
private val buildMeta: BuildMeta, private val buildMeta: BuildMeta,
private val getDatabaseSizesUseCase: GetDatabaseSizesUseCase, private val getDatabaseSizesUseCase: GetDatabaseSizesUseCase,
private val appNavigationStateService: AppNavigationStateService, private val appNavigationStateService: AppNavigationStateService,
@ -50,7 +52,7 @@ class SentryAnalyticsProvider(
Timber.tag(analyticsTag.value).d("Initializing Sentry") Timber.tag(analyticsTag.value).d("Initializing Sentry")
if (Sentry.isEnabled()) return if (Sentry.isEnabled()) return
val dsn = SentryConfig.DSN.ifBlank { val dsn = sentryDsn?.value ?: run {
Timber.w("No Sentry DSN provided, Sentry will not be initialized") Timber.w("No Sentry DSN provided, Sentry will not be initialized")
return return
} }

View file

@ -11,12 +11,16 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides import dev.zacsweers.metro.Provides
import io.element.android.libraries.di.annotations.SentrySdkDsn import io.element.android.libraries.di.identifiers.SentryDsn
import io.element.android.libraries.di.identifiers.SentrySdkDsn
import io.element.android.services.analyticsproviders.sentry.SentryConfig import io.element.android.services.analyticsproviders.sentry.SentryConfig
@BindingContainer @BindingContainer
@ContributesTo(AppScope::class) @ContributesTo(AppScope::class)
object SentryModule { object SentryModule {
@Provides @Provides
fun provideSentrySdkDsn(): SentrySdkDsn? = SentrySdkDsn(SentryConfig.SDK_DSN) fun provideSentryDsn(): SentryDsn? = SentryConfig.DSN.takeIf { it.isNotBlank() }?.let(::SentryDsn)
@Provides
fun provideSentrySdkDsn(): SentrySdkDsn? = SentryConfig.SDK_DSN.takeIf { it.isNotBlank() }?.let(::SentrySdkDsn)
} }

View file

@ -16,6 +16,7 @@ import im.vector.app.features.analytics.plan.SuperProperties
import im.vector.app.features.analytics.plan.UserProperties import im.vector.app.features.analytics.plan.UserProperties
import io.element.android.libraries.core.data.megaBytes import io.element.android.libraries.core.data.megaBytes
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.di.identifiers.SentryDsn
import io.element.android.libraries.matrix.api.analytics.GetDatabaseSizesUseCase import io.element.android.libraries.matrix.api.analytics.GetDatabaseSizesUseCase
import io.element.android.libraries.matrix.api.analytics.SdkStoreSizes import io.element.android.libraries.matrix.api.analytics.SdkStoreSizes
import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_SESSION_ID
@ -161,11 +162,13 @@ class SentryAnalyticsProviderTest {
} }
private fun createSentryAnalyticsProvider( private fun createSentryAnalyticsProvider(
sentryDsn: SentryDsn? = SentryDsn("https://1234@sentry.com/a"),
buildMeta: BuildMeta = aBuildMeta(), buildMeta: BuildMeta = aBuildMeta(),
getDatabaseSizesUseCase: GetDatabaseSizesUseCase = GetDatabaseSizesUseCase { Result.success(SdkStoreSizes(null, null, null, null)) }, getDatabaseSizesUseCase: GetDatabaseSizesUseCase = GetDatabaseSizesUseCase { Result.success(SdkStoreSizes(null, null, null, null)) },
appNavigationStateService: FakeAppNavigationStateService = FakeAppNavigationStateService(), appNavigationStateService: FakeAppNavigationStateService = FakeAppNavigationStateService(),
) = SentryAnalyticsProvider( ) = SentryAnalyticsProvider(
context = InstrumentationRegistry.getInstrumentation().targetContext, context = InstrumentationRegistry.getInstrumentation().targetContext,
sentryDsn = sentryDsn,
buildMeta = buildMeta, buildMeta = buildMeta,
getDatabaseSizesUseCase = getDatabaseSizesUseCase, getDatabaseSizesUseCase = getDatabaseSizesUseCase,
appNavigationStateService = appNavigationStateService, appNavigationStateService = appNavigationStateService,