Skip to content

Commit dea8146

Browse files
committed
Fix missing DeviceId in tests
1 parent 15ba358 commit dea8146

5 files changed

Lines changed: 48 additions & 11 deletions

File tree

app/src/test/kotlin/io/homeassistant/companion/android/onboarding/BaseOnboardingNavigationTest.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package io.homeassistant.companion.android.onboarding
22

33
import android.content.Context
44
import android.content.pm.PackageManager
5-
import android.provider.Settings
65
import androidx.activity.compose.LocalActivityResultRegistryOwner
76
import androidx.activity.result.ActivityResultRegistry
87
import androidx.activity.result.ActivityResultRegistryOwner
@@ -18,6 +17,7 @@ import androidx.navigation.testing.TestNavHostController
1817
import androidx.test.core.app.ApplicationProvider
1918
import dagger.hilt.android.testing.HiltAndroidRule
2019
import io.homeassistant.companion.android.HiltComponentActivity
20+
import io.homeassistant.companion.android.testing.unit.seedFakeAndroidId
2121
import io.homeassistant.companion.android.util.FakePermissionResultRegistry
2222
import io.homeassistant.companion.android.util.compose.navigateToUri
2323
import io.mockk.Runs
@@ -29,10 +29,6 @@ import kotlinx.coroutines.test.runTest
2929
import org.junit.Before
3030
import org.junit.Rule
3131

32-
// Robolectric leaves Settings.Secure.ANDROID_ID null, but the integration graph injects it as a
33-
// non-null @NamedDeviceId, so we seed a value to avoid a null-from-@Provides crash during DI.
34-
private const val FAKE_ANDROID_ID = "robolectric-android-id"
35-
3632
/**
3733
* Base class for onboarding navigation tests providing shared setup, mocks, and utilities.
3834
*
@@ -53,11 +49,7 @@ internal abstract class BaseOnboardingNavigationTest {
5349

5450
@Before
5551
fun baseSetup() {
56-
Settings.Secure.putString(
57-
ApplicationProvider.getApplicationContext<Context>().contentResolver,
58-
Settings.Secure.ANDROID_ID,
59-
FAKE_ANDROID_ID,
60-
)
52+
ApplicationProvider.getApplicationContext<Context>().seedFakeAndroidId()
6153
mockkStatic(NavController::navigateToUri)
6254
coEvery { any<NavController>().navigateToUri(any(), any()) } just Runs
6355
}

app/src/test/kotlin/io/homeassistant/companion/android/sensors/SensorManagerCompletenessTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package io.homeassistant.companion.android.sensors
22

3+
import android.content.Context
4+
import androidx.test.core.app.ApplicationProvider
35
import dagger.hilt.android.testing.HiltAndroidRule
46
import dagger.hilt.android.testing.HiltAndroidTest
57
import dagger.hilt.android.testing.HiltTestApplication
68
import io.github.classgraph.ClassGraph
79
import io.homeassistant.companion.android.common.sensors.SensorManager
10+
import io.homeassistant.companion.android.testing.unit.seedFakeAndroidId
811
import javax.inject.Inject
912
import org.junit.Assert.assertEquals
1013
import org.junit.Assert.assertTrue
14+
import org.junit.Before
1115
import org.junit.Rule
1216
import org.junit.Test
1317
import org.junit.runner.RunWith
@@ -31,6 +35,11 @@ class SensorManagerCompletenessTest {
3135
@Inject
3236
lateinit var managers: Set<@JvmSuppressWildcards SensorManager>
3337

38+
@Before
39+
fun setup() {
40+
ApplicationProvider.getApplicationContext<Context>().seedFakeAndroidId()
41+
}
42+
3443
@Test
3544
fun `Given every SensorManager on the classpath then each is bound into the injected set`() {
3645
hilt.inject()

common/src/test/kotlin/io/homeassistant/companion/android/sensors/SensorManagerCompletenessTest.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
package io.homeassistant.companion.android.sensors
22

3+
import android.content.Context
4+
import androidx.test.core.app.ApplicationProvider
35
import dagger.hilt.android.testing.HiltAndroidRule
46
import dagger.hilt.android.testing.HiltAndroidTest
57
import dagger.hilt.android.testing.HiltTestApplication
68
import io.github.classgraph.ClassGraph
79
import io.homeassistant.companion.android.common.sensors.SensorManager
10+
import io.homeassistant.companion.android.testing.unit.seedFakeAndroidId
811
import javax.inject.Inject
912
import org.junit.Assert.assertEquals
1013
import org.junit.Assert.assertTrue
14+
import org.junit.Before
1115
import org.junit.Rule
1216
import org.junit.Test
1317
import org.junit.runner.RunWith
1418
import org.robolectric.RobolectricTestRunner
1519
import org.robolectric.annotation.Config
1620

1721
/**
18-
* Guards against forgetting a `@Binds @IntoSet` for a new wear [SensorManager]: every concrete
22+
* Guards against forgetting a `@Binds @IntoSet` for a new [SensorManager]: every concrete
1923
* implementation on the classpath must be present in the Hilt-injected `Set<SensorManager>`.
2024
* ClassGraph is used because neither Hilt nor reflection can enumerate an interface's
2125
* implementations — only a classpath scan can.
@@ -30,6 +34,11 @@ class SensorManagerCompletenessTest {
3034
@Inject
3135
lateinit var managers: Set<@JvmSuppressWildcards SensorManager>
3236

37+
@Before
38+
fun setup() {
39+
ApplicationProvider.getApplicationContext<Context>().seedFakeAndroidId()
40+
}
41+
3342
@Test
3443
fun `Given every SensorManager on the classpath then each is bound into the injected set`() {
3544
hilt.inject()
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.homeassistant.companion.android.testing.unit
2+
3+
import android.content.Context
4+
import android.provider.Settings
5+
6+
/** Fake `Settings.Secure.ANDROID_ID` seeded by [seedFakeAndroidId]. */
7+
const val FAKE_ANDROID_ID = "robolectric-android-id"
8+
9+
/**
10+
* Seeds [Settings.Secure.ANDROID_ID] with [FAKE_ANDROID_ID] on this context.
11+
*
12+
* Robolectric leaves the value null, but the integration graph injects it as a non-null
13+
* `@NamedDeviceId`, so any test that builds that graph must seed it first to avoid a
14+
* null-from-`@Provides` crash during dependency injection.
15+
*/
16+
fun Context.seedFakeAndroidId() {
17+
Settings.Secure.putString(contentResolver, Settings.Secure.ANDROID_ID, FAKE_ANDROID_ID)
18+
}

wear/src/test/kotlin/io/homeassistant/companion/android/sensors/SensorManagerCompletenessTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package io.homeassistant.companion.android.sensors
22

3+
import android.content.Context
4+
import androidx.test.core.app.ApplicationProvider
35
import dagger.hilt.android.testing.HiltAndroidRule
46
import dagger.hilt.android.testing.HiltAndroidTest
57
import dagger.hilt.android.testing.HiltTestApplication
68
import io.github.classgraph.ClassGraph
79
import io.homeassistant.companion.android.common.sensors.SensorManager
10+
import io.homeassistant.companion.android.testing.unit.seedFakeAndroidId
811
import javax.inject.Inject
912
import org.junit.Assert.assertEquals
1013
import org.junit.Assert.assertTrue
14+
import org.junit.Before
1115
import org.junit.Rule
1216
import org.junit.Test
1317
import org.junit.runner.RunWith
@@ -30,6 +34,11 @@ class SensorManagerCompletenessTest {
3034
@Inject
3135
lateinit var managers: Set<@JvmSuppressWildcards SensorManager>
3236

37+
@Before
38+
fun setup() {
39+
ApplicationProvider.getApplicationContext<Context>().seedFakeAndroidId()
40+
}
41+
3342
@Test
3443
fun `Given every SensorManager on the classpath then each is bound into the injected set`() {
3544
hilt.inject()

0 commit comments

Comments
 (0)