diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 894c0b4ec..48a935db8 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -53,7 +53,7 @@ android { targetSdk = 34 // targetSdkPreview = "VanillaIceCream" applicationId = "org.isoron.uhabits" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunner = "com.kaspersky.kaspresso.runner.KaspressoRunner" } signingConfigs { @@ -117,6 +117,9 @@ dependencies { androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0") androidTestImplementation("androidx.test:rules:1.5.0") androidTestImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") + androidTestImplementation("com.kaspersky.android-components:kaspresso:1.5.1") + androidTestImplementation("com.kaspersky.android-components:kaspresso-allure-support:1.5.1") + androidTestImplementation("com.kaspersky.android-components:kaspresso-compose-support:1.5.1") compileOnly("javax.annotation:jsr250-api:1.0") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") implementation("com.github.AppIntro:AppIntro:6.3.1") diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/AboutScreen.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/AboutScreen.kt new file mode 100644 index 000000000..a72e9c0fc --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/AboutScreen.kt @@ -0,0 +1,20 @@ +package org.isoron.uhabits.otus + +import com.kaspersky.kaspresso.screens.KScreen +import org.isoron.uhabits.R +import io.github.kakaocup.kakao.text.KTextView + + + +object AboutScreen : KScreen() { + override val layoutId: Int? = null + override val viewClass: Class<*>? = null + val tvVersion = KTextView { withId(R.id.tvVersion) } + val tvRate = KTextView { withId(R.id.tvRate) } + val tvFeedback = KTextView { withId(R.id.tvFeedback) } + val tvTranslate = KTextView { withId(R.id.tvTranslate) } + val tvSource = KTextView { withId(R.id.tvSource) } + val tvPrivacy = KTextView { withId(R.id.tvPrivacy) } +} + + diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/IntroScreen.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/IntroScreen.kt new file mode 100644 index 000000000..b8c33232a --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/IntroScreen.kt @@ -0,0 +1,30 @@ +package org.isoron.uhabits.otus + +import com.kaspersky.kaspresso.screens.KScreen +import org.isoron.uhabits.R +import io.github.kakaocup.kakao.text.KTextView +import io.github.kakaocup.kakao.bottomnav.KBottomNavigationView +import io.github.kakaocup.kakao.image.KImageView +import io.github.kakaocup.kakao.text.KButton + + +object IntroScreen : KScreen() { + override val layoutId: Int? = null + override val viewClass: Class<*>? = null + val bottom = KBottomNavigationView { withId(R.id.bottom) } + val back = KButton { withId(R.id.back) } + val done = KButton { withId(R.id.done) } + val next = KButton { withId(R.id.next) } + val skip = KButton { withId(R.id.skip) } +} + + + + + + + + + + + diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusIntroTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusIntroTest.kt new file mode 100644 index 000000000..a938b706d --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusIntroTest.kt @@ -0,0 +1,111 @@ +package org.isoron.uhabits.otus + +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import com.kaspersky.components.alluresupport.interceptors.step.AllureMapperStepInterceptor +import com.kaspersky.components.alluresupport.interceptors.testrun.DumpLogcatTestInterceptor +import com.kaspersky.kaspresso.kaspresso.Kaspresso +import com.kaspersky.kaspresso.testcases.api.testcase.TestCase +import org.isoron.uhabits.activities.intro.IntroActivity +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class OtusIntroTest: TestCase(kaspressoBuilder = Kaspresso.Builder.simple( + customize = { + if (isAndroidRuntime) { + UiDevice + .getInstance(instrumentation) + .executeShellCommand("appops set --uid ${InstrumentationRegistry.getInstrumentation().targetContext.packageName} MANAGE_EXTERNAL_STORAGE allow") + } + } +).apply { + stepWatcherInterceptors.addAll( + listOf( + AllureMapperStepInterceptor() + ) + ) + testRunWatcherInterceptors.addAll ( + listOf( + DumpLogcatTestInterceptor(logcatDumper) + ) + ) +} +) { + + @get:Rule + val activityScenarioRule = ActivityScenarioRule(IntroActivity::class.java) + + @Test + fun test_checkElementsOnAllIntroScreens() = run { + step("Проверка 1 интро и переход на 2") { + IntroScreen { + bottom.isVisible() + skip.isVisible() + back.isInvisible() + done.isInvisible() + next.isVisible() + next.click() + } + } + step("Проверка 2 интро и переход на 3") { + IntroScreen { + bottom.isVisible() + skip.isVisible() + back.isInvisible() + done.isInvisible() + next.isVisible() + next.click() + } + } + step("Проверка 3 интро") { + IntroScreen { + bottom.isVisible() + skip.isInvisible() + back.isInvisible() + next.isInvisible() + done.isVisible() + done.click() + } + } + } + @Test + fun test_skipFromFirstIntro() = run { + step("Проверка отображения элементов на 1 интро и скип") { + IntroScreen { + bottom.isVisible() + skip.isVisible() + back.isInvisible() + done.isInvisible() + next.isVisible() + skip.click() + } + } + } + @Test + fun test_skipFromSecondIntro() = run { + step("Проверка отображения элеметов на 1 интро и переход ко 2") { + IntroScreen { + bottom.isVisible() + skip.isVisible() + back.isInvisible() + done.isInvisible() + next.isVisible() + next.click() + } + } + step("Проверка отображения элементов на 2 интро и скип") { + IntroScreen { + bottom.isVisible() + skip.isVisible() + back.isInvisible() + done.isInvisible() + next.isVisible() + skip.click() + } + } + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusSettingTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusSettingTest.kt new file mode 100644 index 000000000..4daba9f3c --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/OtusSettingTest.kt @@ -0,0 +1,59 @@ +package org.isoron.uhabits.otus + +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.rule.GrantPermissionRule +import androidx.test.uiautomator.UiDevice +import com.kaspersky.components.alluresupport.interceptors.step.AllureMapperStepInterceptor +import com.kaspersky.components.alluresupport.interceptors.testrun.DumpLogcatTestInterceptor +import com.kaspersky.kaspresso.kaspresso.Kaspresso +import com.kaspersky.kaspresso.testcases.api.testcase.TestCase +import org.isoron.uhabits.activities.settings.SettingsActivity +import org.junit.Assert +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) + +class OtusSettingTest: TestCase(kaspressoBuilder = Kaspresso.Builder.simple( + customize = { + if (isAndroidRuntime) { + UiDevice + .getInstance(instrumentation) + .executeShellCommand("appops set --uid ${InstrumentationRegistry.getInstrumentation().targetContext.packageName} MANAGE_EXTERNAL_STORAGE allow") + } +} +).apply { + stepWatcherInterceptors.addAll( + listOf( + AllureMapperStepInterceptor() + ) + ) + testRunWatcherInterceptors.addAll ( + listOf( + DumpLogcatTestInterceptor(logcatDumper) + ) + ) +} +) { + + @get:Rule + val activityScenarioRule = ActivityScenarioRule(SettingsActivity::class.java) + + @Test + fun test_checkToolbarAndCountElements() = run { + step("1") { + SettingScreen { + Assert.assertEquals(23, recyclerView.getSize()) + } + } + step("2") { + SettingScreen { + toolbarSettings.isVisible() + } + } + } +} + diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/SettingScreen.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/SettingScreen.kt new file mode 100644 index 000000000..74e1de34d --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/otus/SettingScreen.kt @@ -0,0 +1,26 @@ +package org.isoron.uhabits.otus + +import org.isoron.uhabits.R +import io.github.kakaocup.kakao.toolbar.KToolbar +import org.hamcrest.Matcher +import android.view.View +import com.kaspersky.kaspresso.screens.KScreen +import io.github.kakaocup.kakao.recycler.KRecyclerItem +import io.github.kakaocup.kakao.recycler.KRecyclerView + +object SettingScreen: KScreen() { + override val layoutId: Int? = null + override val viewClass: Class<*>? = null + val toolbarSettings = KToolbar { withId(R.id.toolbar) } + val recyclerView = KRecyclerView( + builder = { withId(R.id.recycler_view) }, + itemTypeBuilder = { itemType(::NoteSettingScreen) } + ) + class NoteSettingScreen(matcher: Matcher) : KRecyclerItem(matcher) { + } +} + + + + +