From cbff7a340c2b35f52ce6707c246b4706c128ec9f Mon Sep 17 00:00:00 2001 From: Iu Date: Tue, 13 Oct 2026 22:13:39 +0300 Subject: [PATCH] test(android): grant media permissions before UI E2E and dismiss all-files prompt E2EFlowTest failed because the system media-permission dialog stole focus and left no compose hierarchy (orchestrator clears package data between tests). Grant media access in an outer rule before the activity launches, and dismiss the all-files access prompt so it does not block taps. --- .../java/com/galo/android/E2EFlowTest.kt | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/android/app/src/androidTest/java/com/galo/android/E2EFlowTest.kt b/android/app/src/androidTest/java/com/galo/android/E2EFlowTest.kt index 1cb7762..df2b1ac 100644 --- a/android/app/src/androidTest/java/com/galo/android/E2EFlowTest.kt +++ b/android/app/src/androidTest/java/com/galo/android/E2EFlowTest.kt @@ -3,6 +3,7 @@ package com.galo.android import android.graphics.Bitmap import android.graphics.Color import android.net.Uri +import android.os.Build import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onAllNodesWithTag @@ -13,10 +14,13 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry import com.galo.android.data.network.GaloJson import com.galo.android.data.network.dto.AlbumEnvelopeDto +import com.galo.android.domain.media.MediaPermissions import com.galo.android.domain.model.UploadStatus import com.galo.android.ui.MainActivity +import com.galo.android.ui.TAG_ALL_FILES_PROMPT_DIALOG import com.galo.android.ui.album.TAG_ALBUM_GRID import com.galo.android.ui.album.TAG_PHOTO_PREFIX import com.galo.android.ui.albums.TAG_ALBUM_CARD_PREFIX @@ -38,7 +42,11 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.junit.Rule import org.junit.Test +import org.junit.rules.RuleChain +import org.junit.rules.TestRule +import org.junit.runner.Description import org.junit.runner.RunWith +import org.junit.runners.model.Statement import java.io.File /** @@ -51,8 +59,26 @@ import java.io.File @RunWith(AndroidJUnit4::class) class E2EFlowTest { + private val mediaPermissionRule: TestRule = object : TestRule { + override fun apply(base: Statement, description: Description): Statement = object : Statement() { + override fun evaluate() { + // Grant media access before the activity launches, otherwise the + // system permission dialog steals focus and no compose hierarchy + // is found (orchestrator clears package data between tests). + val instrumentation = InstrumentationRegistry.getInstrumentation() + val pkg = instrumentation.targetContext.packageName + MediaPermissions.required(Build.VERSION.SDK_INT).forEach { permission -> + runCatching { instrumentation.uiAutomation.grantRuntimePermission(pkg, permission) } + } + base.evaluate() + } + } + } + + private val compose = createAndroidComposeRule() + @get:Rule - val compose = createAndroidComposeRule() + val rules: TestRule = RuleChain.outerRule(mediaPermissionRule).around(compose) private val baseUrl = "http://10.0.2.2:8088" private val client = OkHttpClient() @@ -88,6 +114,11 @@ class E2EFlowTest { compose.onAllNodesWithText("Пока нет альбомов").fetchSemanticsNodes().isNotEmpty() } + // Dismiss the "all files" access prompt if shown, so it does not block taps. + if (compose.onAllNodesWithTag(TAG_ALL_FILES_PROMPT_DIALOG).fetchSemanticsNodes().isNotEmpty()) { + compose.onNodeWithText("Позже").performClick() + } + // Seed an album (the client has no album-creation UI in v1). val token = app().container.tokenStore.accessToken() ?: error("expected a stored access token after registration")