Skip to content

Commit

Permalink
KasperskyLab#310 separate compose module
Browse files Browse the repository at this point in the history
  • Loading branch information
matzuk committed Nov 22, 2021
1 parent a6fba5a commit 780a2f8
Show file tree
Hide file tree
Showing 29 changed files with 138 additions and 240 deletions.
16 changes: 16 additions & 0 deletions compose-support/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
id("convention.android-library")
id("convention.publication-android-lib")
}

publish {
artifactId.set("kaspresso-compose-support")
}

dependencies {
api(libs.kakaoCompose)
api(libs.composeUiTest)

implementation(projects.kaspresso)
implementation(libs.kotlinStdlib)
}
1 change: 1 addition & 0 deletions compose-support/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<manifest package="com.kaspersky.components.composesupport" />
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.kaspersky.components.composesupport

import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.tolibrary.ComposeSemanticsInterceptor
import com.kaspersky.components.composesupport.interceptors.watcher.SemanticsWatcherInterceptor
import io.github.kakaocup.compose.KakaoCompose

object ComposeInterceptorsInjector {

fun injectKaspressoInKakaoCompose(
semanticsBehaviorInterceptors: List<SemanticsBehaviorInterceptor>,
semanticsWatcherInterceptors: List<SemanticsWatcherInterceptor>
) {
val composeInterceptor =
ComposeSemanticsInterceptor(
semanticsBehaviorInterceptors,
semanticsWatcherInterceptors
)

KakaoCompose.intercept {
onComposeInteraction {
onCheck(isOverride = true, interceptor = composeInterceptor::interceptCheck)
onPerform(isOverride = true, interceptor = composeInterceptor::interceptPerform)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.kaspersky.components.composesupport

import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.impl.autoscroll.AutoScrollSemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.impl.elementloader.ElementLoaderSemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.impl.failure.FailureLoggingSemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.impl.flakysafety.FlakySafeSemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.impl.systemsafety.SystemDialogSafetySemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.watcher.SemanticsWatcherInterceptor
import com.kaspersky.components.composesupport.interceptors.watcher.impl.LoggingSemanticsWatcherInterceptor
import com.kaspersky.kaspresso.interceptors.behavior.impl.systemsafety.SystemDialogSafetyViewBehaviorInterceptor
import com.kaspersky.kaspresso.kaspresso.Kaspresso

/**
* Kaspresso Builder that includes all appropriate interceptors to support Jetpack Compose.
*/
fun Kaspresso.Builder.Companion.withComposeSupport(
customize: Kaspresso.Builder.() -> Unit = {}
): Kaspresso.Builder = simple(customize).addComposeSupport()

/**
* Kaspresso Builder that includes all appropriate interceptors to support Jetpack Compose.
*/
fun Kaspresso.Builder.addComposeSupport(): Kaspresso.Builder = apply {
val semanticsWatcherInterceptors: List<SemanticsWatcherInterceptor> = listOf(
LoggingSemanticsWatcherInterceptor(libLogger)
)

val semanticsBehaviorInterceptors: List<SemanticsBehaviorInterceptor> =
if (isAndroidRuntime) {
listOf(
AutoScrollSemanticsBehaviorInterceptor(libLogger, autoScrollParams),
SystemDialogSafetySemanticsBehaviorInterceptor(
libLogger,
instrumentalDependencyProviderFactory.getInterceptorProvider<SystemDialogSafetySemanticsBehaviorInterceptor>(instrumentation),
adbServer
),
ElementLoaderSemanticsBehaviorInterceptor(libLogger, elementLoaderParams),
FlakySafeSemanticsBehaviorInterceptor(flakySafetyParams, libLogger),
FailureLoggingSemanticsBehaviorInterceptor(libLogger)
)
} else {
listOf(
AutoScrollSemanticsBehaviorInterceptor(libLogger, autoScrollParams),
ElementLoaderSemanticsBehaviorInterceptor(libLogger, elementLoaderParams),
FlakySafeSemanticsBehaviorInterceptor(flakySafetyParams, libLogger),
FailureLoggingSemanticsBehaviorInterceptor(libLogger)
)
}

ComposeInterceptorsInjector.injectKaspressoInKakaoCompose(
semanticsBehaviorInterceptors,
semanticsWatcherInterceptors
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kaspersky.kaspresso.autoscroll
package com.kaspersky.components.composesupport.autoscroll

import androidx.compose.ui.test.performScrollTo
import com.kaspersky.kaspresso.autoscroll.AutoScrollProvider
import com.kaspersky.kaspresso.internal.extensions.other.isAllowed
import com.kaspersky.kaspresso.logger.UiTestLogger
import com.kaspersky.kaspresso.params.AutoScrollParams
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose
package com.kaspersky.components.composesupport.interceptors.behavior

interface ComposeBehaviorInterceptor<Interaction, Assertion, Action> {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose
package com.kaspersky.components.composesupport.interceptors.behavior

import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
import io.github.kakaocup.compose.intercept.operation.ComposeAction
Expand All @@ -9,4 +9,4 @@ import io.github.kakaocup.compose.intercept.operation.ComposeAssertion
* [ComposeInteraction.check] behavior.
*/
interface SemanticsBehaviorInterceptor :
ComposeBehaviorInterceptor<ComposeInteraction, ComposeAssertion, ComposeAction>
ComposeBehaviorInterceptor<ComposeInteraction, ComposeAssertion, ComposeAction>
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.autoscroll
package com.kaspersky.components.composesupport.interceptors.behavior.impl.autoscroll

import com.kaspersky.kaspresso.autoscroll.AutoScrollProvider
import com.kaspersky.kaspresso.autoscroll.SemanticsAutoScrollProviderImpl
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.autoscroll.SemanticsAutoScrollProviderImpl
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import com.kaspersky.kaspresso.params.AutoScrollParams
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.elementloader
package com.kaspersky.components.composesupport.interceptors.behavior.impl.elementloader

import com.kaspersky.kaspresso.elementloader.ElementLoaderProvider
import com.kaspersky.kaspresso.elementloader.ElementLoaderProviderImpl
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import com.kaspersky.kaspresso.params.ElementLoaderParams
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.failure
package com.kaspersky.components.composesupport.interceptors.behavior.impl.failure

import com.kaspersky.kaspresso.failure.FailureLoggingProvider
import com.kaspersky.kaspresso.failure.FailureLoggingProviderImpl
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
import io.github.kakaocup.compose.intercept.operation.ComposeAction
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.flakysafety
package com.kaspersky.components.composesupport.interceptors.behavior.impl.flakysafety

import com.kaspersky.kaspresso.flakysafety.FlakySafetyProvider
import com.kaspersky.kaspresso.flakysafety.FlakySafetyProviderSimpleImpl
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import com.kaspersky.kaspresso.params.FlakySafetyParams
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.systemsafety
package com.kaspersky.components.composesupport.interceptors.behavior.impl.systemsafety

import com.kaspersky.kaspresso.device.server.AdbServer
import com.kaspersky.kaspresso.instrumental.InstrumentalDependencyProvider
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import com.kaspersky.kaspresso.systemsafety.SystemDialogSafetyProvider
import com.kaspersky.kaspresso.systemsafety.SystemDialogSafetyProviderImpl
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.kaspersky.kaspresso.interceptors.tolibrary.compose
package com.kaspersky.components.composesupport.interceptors.tolibrary

import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.behavior.SemanticsBehaviorInterceptor
import com.kaspersky.components.composesupport.interceptors.watcher.SemanticsWatcherInterceptor
import com.kaspersky.kaspresso.interceptors.tolibrary.LibraryInterceptor
import com.kaspersky.kaspresso.interceptors.watcher.compose.SemanticsWatcherInterceptor
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
import io.github.kakaocup.compose.intercept.operation.ComposeAction
import io.github.kakaocup.compose.intercept.operation.ComposeAssertion
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kaspersky.kaspresso.interceptors.watcher.compose
package com.kaspersky.components.composesupport.interceptors.watcher

import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.kaspersky.kaspresso.interceptors.watcher.compose
package com.kaspersky.components.composesupport.interceptors.watcher

import com.kaspersky.kaspresso.interceptors.watcher.kautomator.KautomatorWatcherInterceptor
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
import io.github.kakaocup.compose.intercept.operation.ComposeAction
import io.github.kakaocup.compose.intercept.operation.ComposeAssertion
Expand All @@ -10,4 +9,4 @@ import io.github.kakaocup.compose.intercept.operation.ComposeAssertion
* [ComposeInteraction.check] behavior.
*/
interface SemanticsWatcherInterceptor :
KautomatorWatcherInterceptor<ComposeInteraction, ComposeAssertion, ComposeAction>
ComposeWatcherInterceptor<ComposeInteraction, ComposeAssertion, ComposeAction>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kaspersky.kaspresso.interceptors.watcher.compose.impl.logging
package com.kaspersky.components.composesupport.interceptors.watcher.impl

import com.kaspersky.kaspresso.interceptors.watcher.compose.SemanticsWatcherInterceptor
import com.kaspersky.components.composesupport.interceptors.watcher.SemanticsWatcherInterceptor
import com.kaspersky.kaspresso.logger.UiTestLogger
import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction
import io.github.kakaocup.compose.intercept.operation.ComposeAction
Expand Down
2 changes: 0 additions & 2 deletions kaspresso/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,10 @@ publish {
dependencies {
api(projects.kautomator)
api(libs.kakao)
api(libs.kakaoCompose)
api(libs.bundles.espresso)
api(libs.uiAutomator)
api(libs.androidXCore)
api(libs.androidXTestRules)
api(libs.composeUiTest)

implementation(libs.kotlinStdlib)
implementation(libs.gson)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@ import com.kaspersky.components.kautomator.intercept.operation.UiObjectAction
import com.kaspersky.components.kautomator.intercept.operation.UiObjectAssertion
import com.kaspersky.kaspresso.compose.pack.branch.ComplexComposeBranch
import com.kaspersky.kaspresso.compose.pack.branch.ComplexComposeBranchBuilder
import io.github.kakaocup.compose.intercept.delegate.ComposeInterceptable
import io.github.kakaocup.compose.node.action.NodeActions
import io.github.kakaocup.compose.node.action.TextActions
import io.github.kakaocup.compose.node.assertion.NodeAssertions

/**
* The builder class for parameters of [com.kaspersky.kaspresso.compose.ComposeProvider.compose] method.
Expand Down Expand Up @@ -54,20 +50,6 @@ class ActionsOnElementsPack {
.also { complexComposeBranchBuilders += it }
}

/**
* Adds the [element] of type [Type] and the [action] to [complexComposeBranchBuilders] and [action] for future composing
* where [Type] is bounding by UiBaseView (Kautomator)
*
* @param element the interacted view.
* @param action actions or assertions on the interacted view.
*/
fun <Type> or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder<Type>
where Type : NodeActions, Type : NodeAssertions,
Type : TextActions, Type : ComposeInterceptable {
return ComplexComposeBranchBuilder(element, { action.invoke(element) })
.also { complexComposeBranchBuilders += it }
}

/**
* @return the built parameters for [com.kaspersky.kaspresso.compose.ComposeProvider.compose] method.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@ import com.kaspersky.kaspresso.interceptors.behavior.WebBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behavior.impl.flakysafety.FlakySafeDataBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behavior.impl.flakysafety.FlakySafeViewBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behavior.impl.flakysafety.FlakySafeWebBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorcompose.SemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorcompose.impl.flakysafety.FlakySafeSemanticsBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorkautomator.DeviceBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorkautomator.ObjectBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorkautomator.impl.flakysafety.FlakySafeDeviceBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.behaviorkautomator.impl.flakysafety.FlakySafeObjectBehaviorInterceptor
import com.kaspersky.kaspresso.interceptors.tolibrary.LibraryInterceptorsInjector.injectKaspressoInKakao
import com.kaspersky.kaspresso.interceptors.tolibrary.LibraryInterceptorsInjector.injectKaspressoInKakaoCompose
import com.kaspersky.kaspresso.interceptors.tolibrary.LibraryInterceptorsInjector.injectKaspressoInKautomator
import com.kaspersky.kaspresso.kaspresso.Kaspresso

Expand All @@ -33,7 +30,6 @@ internal class FlakySafeInterceptorScalpel(
actionToTakeScalp = {
scalpKakaoInterceptors()
scalpKautomatorInterceptors()
scalpComposeInterceptors()
}
)
}
Expand All @@ -43,8 +39,7 @@ internal class FlakySafeInterceptorScalpel(
kaspresso.dataBehaviorInterceptors.filterIsInstance<FlakySafeDataBehaviorInterceptor>().isNotEmpty() ||
kaspresso.webBehaviorInterceptors.filterIsInstance<FlakySafeWebBehaviorInterceptor>().isNotEmpty() ||
kaspresso.objectBehaviorInterceptors.filterIsInstance<FlakySafeObjectBehaviorInterceptor>().isNotEmpty() ||
kaspresso.deviceBehaviorInterceptors.filterIsInstance<FlakySafeDeviceBehaviorInterceptor>().isNotEmpty() ||
kaspresso.semanticsBehaviorInterceptors.filterIsInstance<FlakySafeSemanticsBehaviorInterceptor>().isNotEmpty()
kaspresso.deviceBehaviorInterceptors.filterIsInstance<FlakySafeDeviceBehaviorInterceptor>().isNotEmpty()

private fun scalpKakaoInterceptors() {
val scalpedViewBehaviorInterceptors: List<ViewBehaviorInterceptor> =
Expand Down Expand Up @@ -89,17 +84,6 @@ internal class FlakySafeInterceptorScalpel(
)
}

private fun scalpComposeInterceptors() {
val scalpedSemanticsBehaviorInterceptors: List<SemanticsBehaviorInterceptor> =
kaspresso.semanticsBehaviorInterceptors.filter {
it !is FlakySafeSemanticsBehaviorInterceptor
}
injectKaspressoInKakaoCompose(
scalpedSemanticsBehaviorInterceptors,
kaspresso.semanticsWatcherInterceptors
)
}

fun restoreScalpToLibs() {
scalpelSwitcher.attemptRestoreScalp {
injectKaspressoInKakao(
Expand All @@ -118,11 +102,6 @@ internal class FlakySafeInterceptorScalpel(
kaspresso.objectWatcherInterceptors,
kaspresso.deviceWatcherInterceptors
)

injectKaspressoInKakaoCompose(
kaspresso.semanticsBehaviorInterceptors,
kaspresso.semanticsWatcherInterceptors
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.kaspersky.kaspresso.instrumental

import android.app.Instrumentation

internal class InstrumentalDependencyProviderFactory {
class InstrumentalDependencyProviderFactory {

inline fun <reified T : Any> getComponentProvider(instrumentation: Instrumentation): InstrumentalDependencyProvider =
InstrumentalDependencyProviderImpl(InstrumentalUsage.ComponentLocation(T::class.java.name), instrumentation)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.kaspersky.components.kautomator.common.Environment
import com.kaspersky.components.kautomator.common.environment
import com.kaspersky.kaspresso.instrumental.exception.NotSupportedInstrumentalTestException

internal class InstrumentalDependencyProviderImpl(
class InstrumentalDependencyProviderImpl(
private val location: InstrumentalUsage,
private val instrumentation: Instrumentation
) : InstrumentalDependencyProvider {
Expand Down Expand Up @@ -37,7 +37,7 @@ internal class InstrumentalDependencyProviderImpl(
else throw NotSupportedInstrumentalTestException(location, "UiAutomation")
}

internal sealed class InstrumentalUsage {
sealed class InstrumentalUsage {
data class ComponentLocation(val componentName: String) : InstrumentalUsage()
data class InterceptorLocation(val interceptorName: String) : InstrumentalUsage()
object TestLocation : InstrumentalUsage()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.kaspersky.kaspresso.interceptors.tolibrary
/**
* The base class of libraries interceptors (Kakao/UiAutomator/Kakao-Compose) for Kaspresso's implementations
*/
internal interface LibraryInterceptor<Interaction, Assertion, Action> {
interface LibraryInterceptor<Interaction, Assertion, Action> {

fun interceptCheck(interaction: Interaction, assertion: Assertion)

Expand Down
Loading

0 comments on commit 780a2f8

Please sign in to comment.