Skip to content

Commit

Permalink
tests: add functional test for validating correct behavior on app on …
Browse files Browse the repository at this point in the history
…stop

I had to use UI Automator as I couldn't find any other way to make the test app go to ON_STOP state.
  • Loading branch information
wzieba committed Nov 7, 2023
1 parent b9c449d commit 433a69e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
1 change: 1 addition & 0 deletions parsely/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ dependencies {
androidTestImplementation "org.assertj:assertj-core:$assertJVersion"
androidTestImplementation "com.squareup.okhttp3:mockwebserver:$mockWebServerVersion"
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
androidTestUtil 'androidx.test:orchestrator:1.4.2'
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package com.parsely.parselyandroid
import android.app.Activity
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiSelector
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.core.type.TypeReference
Expand All @@ -12,7 +15,10 @@ import java.io.FileInputStream
import java.io.ObjectInputStream
import java.lang.reflect.Field
import java.nio.file.Path
import java.util.concurrent.TimeUnit
import kotlin.io.path.Path
import kotlin.time.Duration
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.runBlocking
Expand Down Expand Up @@ -70,6 +76,38 @@ class FunctionalTests {
}
}

/**
* In this scenario, the consumer application goes to the background, re-launches the app,
* and moves to the background again. It asserts, that only one payload has been sent.
*/
@Test
fun appSendsEventsWhenMovedToBackgroundAndDoesntSendDuplicatedRequestWhenItsMovedToBackgroundAgainQuickly() {
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
ActivityScenario.launch(SampleActivity::class.java).use { scenario ->
scenario.onActivity { activity: Activity ->
beforeEach(activity)
server.enqueue(MockResponse().setResponseCode(200))
server.enqueue(MockResponse().setResponseCode(200))
parselyTracker = initializeTracker(activity, flushInterval = 1.hours)

repeat(20) {
parselyTracker.trackPageview("url", null, null, null)
}
}

device.pressHome()
device.pressRecentApps()
device.findObject(UiSelector().descriptionContains("com.parsely")).click()
device.pressHome()

val firstRequest = server.takeRequest(10000, TimeUnit.MILLISECONDS)?.toMap()
val secondRequest = server.takeRequest(10000, TimeUnit.MILLISECONDS)?.toMap()

assertThat(firstRequest!!["events"]).hasSize(20)
assertThat(secondRequest).isNull()
}
}

private fun RecordedRequest.toMap(): Map<String, List<Event>> {
val listType: TypeReference<Map<String, List<Event>>> =
object : TypeReference<Map<String, List<Event>>>() {}
Expand All @@ -80,6 +118,7 @@ class FunctionalTests {
@JsonIgnoreProperties(ignoreUnknown = true)
data class Event(
@JsonProperty("idsite") var idsite: String,
@JsonProperty("pvid") var pvid: String,
)

private val locallyStoredEvents
Expand All @@ -90,7 +129,10 @@ class FunctionalTests {
}
}

private fun initializeTracker(activity: Activity): ParselyTracker {
private fun initializeTracker(
activity: Activity,
flushInterval: Duration = defaultFlushInterval
): ParselyTracker {
return ParselyTracker.sharedInstance(
siteId, flushInterval.inWholeSeconds.toInt(), activity.application
).apply {
Expand All @@ -103,7 +145,7 @@ class FunctionalTests {
private companion object {
const val siteId = "123"
const val localStorageFileName = "parsely-events.ser"
val flushInterval = 10.seconds
val defaultFlushInterval = 10.seconds
}

class SampleActivity : Activity()
Expand Down

0 comments on commit 433a69e

Please sign in to comment.