Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tech sanity tests #452

Merged
merged 36 commits into from
Aug 2, 2023
Merged
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5b54cb0
TECH: add view autoscroll sanity tests
Areyana Dec 7, 2022
68d2099
TECH: add compose autoscroll sanity tests
Areyana Dec 8, 2022
e5a5e5c
TECH: add ui automator autoscroll sanity tests
Areyana Dec 8, 2022
1b12d98
TECH: add device screenshots sanity test
Areyana Dec 12, 2022
f4d52c0
TECH: add flaky view/compose sanity tests
Areyana Dec 13, 2022
4e34b55
TECH: add flaky object sanity tests, system dialog wip
Areyana Dec 13, 2022
4cb9f39
TECH: move autoscroll sanity tests to upper package
Areyana Dec 18, 2022
a2a8e2c
TECH: refactor sanity tests
Areyana Dec 18, 2022
1e24ca6
TECH: move interceptor sanity test
Areyana Dec 19, 2022
2e017fe
TECH: merge master
Areyana Dec 19, 2022
f465a64
TECH: fix cyclic dependencies
Areyana Dec 19, 2022
b9bfc84
TECH: remove system dialogs
Areyana Dec 20, 2022
5ef1407
Revert "TECH: remove system dialogs"
Areyana Dec 20, 2022
491aea0
TECH: merge master
Areyana Dec 21, 2022
dc83825
TECH: add system dialogs sanity for view
Areyana Dec 21, 2022
3e8bfd8
TECH: add system dialogs sanity for object
Areyana Dec 21, 2022
b2e77a0
TECH: fix activity main layout for sanity test
Areyana Dec 21, 2022
a29422b
Merge branch 'master' into TECH-sanity-tests
Areyana Jun 27, 2023
de43ded
TECH: fix system dialogs sanity tests
Areyana Jun 28, 2023
a529c1a
TECH: rearrange buttons on main
Areyana Jun 28, 2023
25d052d
TECH: fix flaky on system dialogs sanity test
Areyana Jun 28, 2023
6f4bd42
TECH: fix system dialog safety for permissions on api23
Areyana Jun 28, 2023
c51e79b
TECH: ignore dialog tests on api 21
Areyana Jul 24, 2023
8afafc1
TECH: try to fix tests on A13
Areyana Jul 24, 2023
ce62df2
TECH: try to fix tests on A10-A13
Areyana Jul 25, 2023
f56329c
TECH: try to fix tests on Api30
Areyana Jul 25, 2023
08e9475
TECH: try to fix tests on Api33
Areyana Jul 25, 2023
cdc6042
TECH: try to fix tests on Api30
Areyana Jul 26, 2023
21560bb
TECH: try to fix tests on Api30
Areyana Jul 26, 2023
9481f65
TECH: try to fix tests on Api30
Areyana Jul 26, 2023
5635468
TECH: try to fix tests on Api30
Areyana Jul 27, 2023
a52cfcb
TECH: try to fix tests on Api30
Areyana Jul 27, 2023
525a5e6
TECH: try to fix tests on Api30
Areyana Jul 31, 2023
189cd5d
TECH: rearrange system dialog actions
Areyana Jul 31, 2023
8ce9375
TECH: rename system dialog related classes
Areyana Jul 31, 2023
7983503
TECH: remove window flags
Areyana Aug 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.kaspersky.kaspresso.systemsafety

import java.util.regex.Pattern

enum class SystemDialogSafetyPattern(val pattern: Pattern) {
Areyana marked this conversation as resolved.
Show resolved Hide resolved
PERMISSION_API23(Pattern.compile("\\S*android.packageinstaller\\S*")),
PERMISSION_API30(Pattern.compile("\\S*android.permissioncontroller\\S*")),
OTHER(Pattern.compile("\\S*google.android\\S*"))
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class SystemDialogSafetyProviderImpl(
{ uiDevice, _ -> uiDevice.wait(Until.findObject(By.res("android:id/button1")), DEFAULT_TIMEOUT).click() },
{ uiDevice, _ -> uiDevice.wait(Until.findObject(By.res("android:id/closeButton")), DEFAULT_TIMEOUT).click() },
{ uiDevice, _ -> uiDevice.wait(Until.findObject(By.res("com.android.internal:id/aerr_close")), DEFAULT_TIMEOUT).click() },
{ uiDevice, _ -> uiDevice.wait(Until.findObject(By.res("com.android.packageinstaller:id/permission_deny_button")), DEFAULT_TIMEOUT).click() },
{ uiDevice, _ -> uiDevice.wait(Until.findObject(By.res("com.android.permissioncontroller:id/permission_deny_button")), DEFAULT_TIMEOUT).click() },
{ uiDevice, _ -> uiDevice.pressBack() }
)

Expand Down Expand Up @@ -108,7 +110,7 @@ class SystemDialogSafetyProviderImpl(
*/
private fun isAndroidSystemDetected(): Boolean {
with(uiDevice) {
var isSystemDialogVisible = isVisible(By.pkg(Pattern.compile("\\S*google.android\\S*")).clazz(FrameLayout::class.java))
var isSystemDialogVisible = SystemDialogSafetyPattern.values().any { isVisible(By.pkg(it.pattern).clazz(FrameLayout::class.java)) }

if (systemDialogsSafetyParams.shouldIgnoreKeyboard) {
val isKeyboardVisible = isVisible(By.pkg(Pattern.compile("\\S*google.android.inputmethod\\S*")).clazz(FrameLayout::class.java))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.kaspersky.kaspresso.composesupport.kaspresso.sanity.autoscroll

import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.composesupport.sample.MainActivity
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeScrollScreen
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.compose.node.element.ComposeScreen
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.lang.AssertionError

@RunWith(AndroidJUnit4::class)
class AutoScrollSemanticsDisabledSanityTest : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport(
lateComposeCustomize = { composeBuilder ->
composeBuilder.semanticsBehaviorInterceptors = mutableListOf()
}
)
) {

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Test
fun test() = run {
step("Open Flaky screen") {
ComposeScreen.onComposeScreen<ComposeMainScreen>(composeTestRule) {
scrollButton {
performClick()
}
}
}

step("Click on the First button") {
ComposeScreen.onComposeScreen<ComposeScrollScreen>(composeTestRule) {
firstButton {
assertIsDisplayed()
performClick()
}
}
}

step("Click on the Last button") {
ComposeScreen.onComposeScreen<ComposeScrollScreen>(composeTestRule) {
Assert.assertThrows(null, AssertionError::class.java) {
lastButton {
assertIsDisplayed()
performClick()
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.kaspersky.kaspresso.composesupport.kaspresso.sanity.autoscroll

import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.components.composesupport.interceptors.behavior.impl.autoscroll.AutoScrollSemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.composesupport.sample.MainActivity
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeScrollScreen
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.logger.UiTestLoggerImpl
import com.kaspersky.kaspresso.params.AutoScrollParams
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.compose.node.element.ComposeScreen
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class AutoScrollSemanticsEnabledSanityTest : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport(
lateComposeCustomize = { composeBuilder ->
composeBuilder.semanticsBehaviorInterceptors = mutableListOf(AutoScrollSemanticsBehaviorInterceptor(UiTestLoggerImpl(Kaspresso.DEFAULT_TEST_LOGGER_TAG), AutoScrollParams.default()))
}
)
) {

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Test
fun test() = run {
step("Open Flaky screen") {
ComposeScreen.onComposeScreen<ComposeMainScreen>(composeTestRule) {
scrollButton {
performClick()
}
}
}

step("Click on the First button") {
ComposeScreen.onComposeScreen<ComposeScrollScreen>(composeTestRule) {
firstButton {
assertIsDisplayed()
performClick()
}
}
}

step("Click on the Last button") {
ComposeScreen.onComposeScreen<ComposeScrollScreen>(composeTestRule) {
lastButton {
assertIsDisplayed()
performClick()
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.kaspersky.kaspresso.composesupport.kaspresso.sanity.flaky

import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.composesupport.sample.MainActivity
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeSanityFlakyScreen
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.compose.node.element.ComposeScreen
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class FlakyComposeDisabledSanityTest : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport(
lateComposeCustomize = { composeBuilder ->
composeBuilder.semanticsBehaviorInterceptors = mutableListOf()
}
)
) {

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Test
fun test() = run {
step("Open Flaky screen") {
ComposeScreen.onComposeScreen<ComposeMainScreen>(composeTestRule) {
sanityFlakyButton {
performClick()
}
}
}

step("Click on the First button") {
ComposeScreen.onComposeScreen<ComposeSanityFlakyScreen>(composeTestRule) {
firstButton {
assertIsDisplayed()
performClick()
}
}
}

step("Click on the Second button") {
ComposeScreen.onComposeScreen<ComposeSanityFlakyScreen>(composeTestRule) {
secondButton {
Assert.assertThrows(null, AssertionError::class.java) {
assertIsDisplayed()
performClick()
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.kaspersky.kaspresso.composesupport.kaspresso.sanity.flaky

import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.components.composesupport.interceptors.behavior.impl.flakysafety.FlakySafeSemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.composesupport.sample.MainActivity
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeSanityFlakyScreen
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.logger.UiTestLoggerImpl
import com.kaspersky.kaspresso.params.FlakySafetyParams
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.compose.node.element.ComposeScreen
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class FlakyComposeEnabledSanityTest : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport(
lateComposeCustomize = { composeBuilder ->
composeBuilder.semanticsBehaviorInterceptors = mutableListOf(FlakySafeSemanticsBehaviorInterceptor(FlakySafetyParams.default(), UiTestLoggerImpl(Kaspresso.DEFAULT_TEST_LOGGER_TAG)))
}
)
) {

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Test
fun test() = run {
step("Open Flaky screen") {
ComposeScreen.onComposeScreen<ComposeMainScreen>(composeTestRule) {
sanityFlakyButton {
performClick()
}
}
}

step("Click on the First button") {
ComposeScreen.onComposeScreen<ComposeSanityFlakyScreen>(composeTestRule) {
firstButton {
assertIsDisplayed()
performClick()
}
}
}

step("Click on the Second button") {
ComposeScreen.onComposeScreen<ComposeSanityFlakyScreen>(composeTestRule) {
secondButton {
assertIsDisplayed()
performClick()
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,12 @@ class ComposeMainScreen(semanticsProvider: SemanticsNodeInteractionsProvider) :
val simpleFlakyButton: KNode = child {
hasTestTag(C.Tag.main_screen_simple_flaky_button)
}

val sanityFlakyButton: KNode = child {
hasTestTag(C.Tag.main_screen_sanity_flaky_button)
}

val scrollButton: KNode = child {
hasTestTag(C.Tag.main_screen_scroll_button)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.kaspersky.kaspresso.composesupport.sample.screen

import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.kaspersky.kaspresso.composesupport.sample.resources.C
import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.compose.node.element.KNode

class ComposeSanityFlakyScreen(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<ComposeSanityFlakyScreen>(
semanticsProvider = semanticsProvider,
viewBuilderAction = { hasTestTag(C.Tag.sanity_flaky_screen_container) }
) {

val firstButton: KNode = child {
hasTestTag(C.Tag.sanity_flaky_screen_simple_first_button)
}

val secondButton: KNode = child {
hasTestTag(C.Tag.sanity_flaky_screen_simple_second_button)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.kaspersky.kaspresso.composesupport.sample.screen

import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.kaspersky.kaspresso.composesupport.sample.resources.C
import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.compose.node.element.KNode

class ComposeScrollScreen(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<ComposeScrollScreen>(
semanticsProvider = semanticsProvider,
viewBuilderAction = { hasTestTag(C.Tag.scroll_screen_container) }
) {

val firstButton: KNode = child {
hasTestTag(C.Tag.scroll_screen_buttons[0])
}

val lastButton: KNode = child {
hasTestTag(C.Tag.scroll_screen_buttons.last())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,15 @@ import androidx.navigation.compose.rememberNavController
import com.kaspersky.kaspresso.composesupport.sample.features.flaky.SimpleFlakyScreen
import com.kaspersky.kaspresso.composesupport.sample.features.flaky.SimpleFlakyViewModel
import com.kaspersky.kaspresso.composesupport.sample.features.main.MainScreen
import com.kaspersky.kaspresso.composesupport.sample.features.sanityflaky.SanityFlakyScreen
import com.kaspersky.kaspresso.composesupport.sample.features.sanityflaky.SanityFlakyViewModel
import com.kaspersky.kaspresso.composesupport.sample.features.scroll.ScrollScreen
import com.kaspersky.kaspresso.composesupport.sample.resources.C

class MainActivity : AppCompatActivity() {

private val simpleFlakyViewModel: SimpleFlakyViewModel by viewModels()
private val sanityFlakyViewModel: SanityFlakyViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -30,7 +34,9 @@ class MainActivity : AppCompatActivity() {
NavHost(navController = navController, startDestination = C.Screen.main_screen) {
composable(C.Screen.main_screen) {
MainScreen(
simpleFlakyClick = { navController.navigate(C.Screen.simple_flaky_screen) }
simpleFlakyClick = { navController.navigate(C.Screen.simple_flaky_screen) },
sanityFlakyClick = { navController.navigate(C.Screen.sanity_flaky_screen) },
scrollClick = { navController.navigate(C.Screen.scroll_screen) }
)
}

Expand All @@ -42,6 +48,15 @@ class MainActivity : AppCompatActivity() {
editTextChange = { simpleFlakyViewModel.editTextChange(it) }
)
}

composable(C.Screen.scroll_screen) {
ScrollScreen()
}

composable(C.Screen.sanity_flaky_screen) {
SanityFlakyScreen(sanityFlakyStateLiveData =
sanityFlakyViewModel.sanityFlakyStateLiveData, firstButtonClick = { sanityFlakyViewModel.firstButtonClick() })
}
}
}
}
Loading
Loading