From cb0379f70bb833102baa4afd5540419ab76eb11d Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Mon, 15 Jan 2024 19:59:37 +0530 Subject: [PATCH] fix: remove connected checks for onboarding activity --- .github/workflows/build.yml | 1 + ...boardingActivityPermissionsBehaviorTest.kt | 132 ------------- .../OnboardingActivityStatesTest.kt | 182 ------------------ .../androidide/activities/onboardingUtils.kt | 103 ---------- 4 files changed, 1 insertion(+), 417 deletions(-) delete mode 100644 app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityPermissionsBehaviorTest.kt delete mode 100644 app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityStatesTest.kt delete mode 100644 app/src/androidTest/java/com/itsaky/androidide/activities/onboardingUtils.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d2b43e66..e0af6290f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -176,6 +176,7 @@ jobs: run_connected_checks: name: Run connected checks runs-on: macos-latest + if: false strategy: matrix: api-level: [ 26, 32 ] diff --git a/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityPermissionsBehaviorTest.kt b/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityPermissionsBehaviorTest.kt deleted file mode 100644 index e664ab48e..000000000 --- a/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityPermissionsBehaviorTest.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.activities - -import android.widget.Button -import androidx.annotation.StringRes -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.uiautomator.By -import com.adevinta.android.barista.rule.cleardata.ClearDatabaseRule -import com.adevinta.android.barista.rule.cleardata.ClearFilesRule -import com.adevinta.android.barista.rule.cleardata.ClearPreferencesRule -import com.google.common.truth.Truth.assertThat -import com.itsaky.androidide.R -import com.itsaky.androidide.buildinfo.BuildInfo -import com.itsaky.androidide.testing.android.clickAndWaitForNewWindow -import com.itsaky.androidide.testing.android.clickAndWaitForWindowUpdate -import com.itsaky.androidide.testing.android.getObjectWithText -import com.itsaky.androidide.testing.android.launchAndroidIDE -import com.itsaky.androidide.utils.isAtLeastR -import org.junit.FixMethodOrder -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.MethodSorters - -/** - * @author Akash Yadav - */ -@Suppress("TestFunctionName") -@RunWith(AndroidJUnit4::class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -class OnboardingActivityPermissionsBehaviorTest { - - /** - * Clear shared preferences after tests. - */ - @JvmField - @Rule - val clearPrefsRule = ClearPreferencesRule() - - /** - * Clear databases after tests. - */ - @JvmField - @Rule - val clearDBsRule = ClearDatabaseRule() - - /** - * Delete private data files after each test. - */ - @JvmField - @Rule - val clearFilesRule = ClearFilesRule() - - @Test - fun A_testOnboarding_permissionScreen_storagePermissionBehavior() { - checkPermissionsBehavior(R.string.permission_desc_storage) - } - - @Test - fun B_testOnboarding_permissionScreen_installPackagesPermissionBehavior() { - checkPermissionsBehavior(R.string.permission_desc_install_packages) - } - - private fun checkPermissionsBehavior(@StringRes permissionDesc: Int) { - val device = launchAndroidIDE(fromLauncher = true, clearTasks = true) - - device.nextButton().clickAndWaitForWindowUpdate(device) - device.nextButton().clickAndWaitForWindowUpdate(device) - - var grantButton = device.getObjectWithText(permissionDesc) - .parent!! - .parent!! - .findObject(By.clazz(Button::class.java)) - - // verify that clicking the 'Grant' button next to storage navigates requests the permissions - grantButton.clickAndWaitForNewWindow() - - // check permission denied behavior - if (permissionDesc == R.string.permission_desc_install_packages || isAtLeastR()) { - device.handlePermissionInSettings(false) - } else { - device.getObjectWithText("DENY").clickAndWaitForWindowUpdate(device) - } - - grantButton = device.getObjectWithText(permissionDesc) - .parent!! - .parent!! - .findObject(By.clazz(Button::class.java)) - - // verify button state after permission was not granted - assertThat(grantButton).isNotNull() - assertThat(grantButton.text).isNotNull() - - // navigate to the permission page again - grantButton.clickAndWaitForNewWindow() - - // check permission granted behavior - if (permissionDesc == R.string.permission_desc_install_packages || isAtLeastR()) { - device.handlePermissionInSettings(true) - } else { - device.getObjectWithText("ALLOW").clickAndWaitForWindowUpdate(device) - } - - grantButton = device.getObjectWithText(permissionDesc) - .parent!! - .parent!! - .findObject(By.clazz(Button::class.java)) - - // verify AndroidIDE is visible - assertThat(device.currentPackageName).isEqualTo(BuildInfo.PACKAGE_NAME) - - // verify button state after permission was granted - assertThat(grantButton).isNotNull() - assertThat(grantButton.text).isNull() - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityStatesTest.kt b/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityStatesTest.kt deleted file mode 100644 index 1d0826464..000000000 --- a/app/src/androidTest/java/com/itsaky/androidide/activities/OnboardingActivityStatesTest.kt +++ /dev/null @@ -1,182 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.activities - -import android.Manifest -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.provider.Settings -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.rule.GrantPermissionRule -import androidx.test.runner.permission.PermissionRequester -import androidx.test.uiautomator.UiDevice -import androidx.test.uiautomator.Until -import com.adevinta.android.barista.assertion.BaristaCheckedAssertions.assertChecked -import com.adevinta.android.barista.assertion.BaristaCheckedAssertions.assertUnchecked -import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertDisabled -import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertEnabled -import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertDisplayed -import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertNotDisplayed -import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickBack -import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn -import com.adevinta.android.barista.rule.BaristaRule -import com.google.common.truth.Truth.assertThat -import com.itsaky.androidide.R -import com.itsaky.androidide.preferences.internal.statOptIn -import com.itsaky.androidide.testing.android.LAUNCH_TIMEOUT -import com.itsaky.androidide.testing.android.getApplicationContext -import com.itsaky.androidide.testing.android.stringRes -import com.itsaky.androidide.utils.isAtLeastT -import org.junit.FixMethodOrder -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.MethodSorters - - -/** - * @author Akash Yadav - */ -@Suppress("TestFunctionName") -@RunWith(AndroidJUnit4::class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -class OnboardingActivityStatesTest { - - @JvmField - @Rule - val baristaActivityRule = BaristaRule.create(OnboardingActivity::class.java) - - @JvmField - @Rule - val grantPermissionsRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE) - - @Test - fun A_testOnboarding_welcomeScreen() { - baristaActivityRule.launchActivity() - - assertDisplayed(stringRes(R.string.greeting_title)) - assertDisplayed(stringRes(R.string.greeting_subtitle)) - assertDisplayed(R.id.next) - assertNotDisplayed(R.id.back) - } - - @Test - fun B_testOnboarding_statConsentScreen() { - tryGrantPermissions() - - baristaActivityRule.launchActivity() - - clickOn(R.id.next) - - assertDisplayed(R.id.next) - assertDisplayed(stringRes(R.string.title_androidide_statistics)) - assertDisplayed(stringRes(R.string.idepref_stats_optIn_summary)) - assertDisplayed(stringRes(R.string.msg_androidide_statistics)) - - assertDisplayed(R.id.stat_opt_in, stringRes(R.string.title_androidide_statistics)) - - assertThat(statOptIn).isTrue() - assertChecked(R.id.stat_opt_in) - - // disable and navigate to next screen, then verify - clickOn(R.id.stat_opt_in) - clickOn(R.id.next) - assertThat(statOptIn).isFalse() - assertUnchecked(R.id.stat_opt_in) - - // Navigate back (statistics) - clickBack() - - // enable again and navigate to next screen, then verify - clickOn(R.id.stat_opt_in) - clickOn(R.id.next) - assertThat(statOptIn).isTrue() - assertChecked(R.id.stat_opt_in) - } - - @Test - fun F_testOnboarding_toolsSetup() { - - tryGrantPermissions() - - baristaActivityRule.launchActivity() - - clickOn(R.id.next) - clickOn(R.id.next) - - assertDisplayed(stringRes(R.string.title_install_tools)) - assertDisplayed(stringRes(R.string.subtitle_install_tools)) - assertDisplayed(R.id.auto_install_switch) - assertDisplayed(R.id.sdk_version_layout) - assertDisplayed(R.id.jdk_version_layout) - assertDisplayed(R.id.install_git) - assertDisplayed(R.id.install_openssh) - - assertEnabled(R.id.install_git) - assertEnabled(R.id.install_openssh) - assertEnabled(R.id.sdk_version_layout) - assertEnabled(R.id.jdk_version_layout) - - assertChecked(R.id.auto_install_switch) - assertChecked(R.id.install_git) - assertChecked(R.id.install_openssh) - - // switch to manual install - clickOn(R.id.auto_install_switch) - - // check that the auto-install related fields are disabled - assertUnchecked(R.id.auto_install_switch) - assertDisabled(R.id.install_git) - assertDisabled(R.id.install_openssh) - assertDisabled(R.id.sdk_version_layout) - assertDisabled(R.id.jdk_version_layout) - - // switch back to auto-install - clickOn(R.id.auto_install_switch) - - // check that the auto-instal related fields are enabled again - assertChecked(R.id.auto_install_switch) - assertEnabled(R.id.install_git) - assertEnabled(R.id.install_openssh) - assertEnabled(R.id.sdk_version_layout) - assertEnabled(R.id.jdk_version_layout) - } - - private fun tryGrantPermissions() { - if (isAtLeastT()) { - PermissionRequester().apply { - addPermissions(Manifest.permission.POST_NOTIFICATIONS) - requestPermissions() - } - } - - val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - val context = getApplicationContext() - - device.performActionAndWait({ - val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, - Uri.parse("package:${context.packageName}")) - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - context.startActivity(intent) - }, Until.newWindow(), LAUNCH_TIMEOUT) - - device.handlePermissionInSettings(true) - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/itsaky/androidide/activities/onboardingUtils.kt b/app/src/androidTest/java/com/itsaky/androidide/activities/onboardingUtils.kt deleted file mode 100644 index aa42e9f8b..000000000 --- a/app/src/androidTest/java/com/itsaky/androidide/activities/onboardingUtils.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.activities - -import android.widget.Button -import android.widget.Switch -import androidx.test.uiautomator.By -import androidx.test.uiautomator.UiDevice -import androidx.test.uiautomator.UiObject2 -import com.google.common.truth.Truth.assertThat -import com.itsaky.androidide.R -import com.itsaky.androidide.testing.android.clickAndWaitForNewWindow -import com.itsaky.androidide.testing.android.clickAndWaitForWindowUpdate -import com.itsaky.androidide.testing.android.getObjectWithText -import com.itsaky.androidide.testing.android.hasObjectWithText -import com.itsaky.androidide.utils.isAtLeastR - -/** - * @author Akash Yadav - */ - -fun UiDevice.grantAndroidIDEPermissions() { - nextButton().clickAndWaitForWindowUpdate(this) - - if (hasObjectWithText(R.string.title_androidide_statistics)) { - // If we haven't opted-in for statistics yet... - nextButton().clickAndWaitForWindowUpdate(this) - } - - if (hasObjectWithText(R.string.onboarding_title_permissions)) { - // If the permissions are not granted, grant them - for (desc in arrayOf(R.string.permission_desc_storage, - R.string.permission_desc_install_packages)) { - val grantButton = getObjectWithText(desc) - .parent!! - .parent!! - .findObject(By.clazz(Button::class.java)) - - if (grantButton.text != null) { - if (desc == R.string.permission_desc_install_packages || isAtLeastR()) { - grantButton.clickAndWaitForNewWindow() - handlePermissionInSettings(allowPermission = true) - } else { - getObjectWithText("ALLOW").clickAndWaitForWindowUpdate(this) - } - } - } - - nextButton().clickAndWaitForWindowUpdate(this) - } -} - -fun UiDevice.nextButton(): UiObject2 { - return findObject(By.desc("NEXT"))!! -} - -fun UiDevice.handlePermissionInSettings( - allowPermission: Boolean = true, -) { - assertThat(currentPackageName).startsWith("com.android.") - assertThat(hasObjectWithText(R.string.app_name)).isTrue() - - val switch = findObject(By.clazz(Switch::class.java)) - assertThat(switch).isNotNull() - - // verify initial state - assertThat(switch.isCheckable).isTrue() - assertThat(switch.isEnabled).isTrue() - - if (allowPermission) { - if (!switch.isChecked) { - // enable permission - switch.click() - } - - // verify changed state - assertThat(switch.isChecked).isTrue() - } else if (switch.isChecked) { - // disable permission - switch.click() - - // verify changed state - assertThat(switch.isChecked).isFalse() - } - - // navigate back without enabling the permission - pressBack() -} \ No newline at end of file