Skip to content

Commit

Permalink
Refactoring android tests to use utils/android. (#393)
Browse files Browse the repository at this point in the history
  • Loading branch information
Laimiux authored Sep 19, 2024
1 parent 94da8d2 commit 5eac8aa
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 140 deletions.
21 changes: 0 additions & 21 deletions formula-android-tests/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,5 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.instacart.formula.ActivityUpdateTest$TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.instacart.formula.ActivityLifecycleEventTest$TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.instacart.formula.ActivityUpdateTimingTest$TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,24 @@ package com.instacart.formula
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Lifecycle.State.*
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.instacart.formula.android.ActivityStore
import com.instacart.formula.android.FormulaAppCompatActivity
import org.junit.Before
import com.instacart.testutils.android.TestFormulaActivity
import com.instacart.testutils.android.activity
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class ActivityLifecycleEventTest {

class TestActivity : FormulaAppCompatActivity()

private lateinit var events: MutableList<Lifecycle.State>

private val formulaRule = TestFormulaRule(
@get:Rule
val rule = TestFormulaRule(
initFormula = { app ->
FormulaAndroid.init(app) {
activity<TestActivity> {
activity<TestFormulaActivity> {
events = mutableListOf()
ActivityStore(
streams = {
Expand All @@ -37,18 +33,9 @@ class ActivityLifecycleEventTest {
}
})

private val activityRule = ActivityScenarioRule(TestActivity::class.java)

@get:Rule
val rule = RuleChain.outerRule(formulaRule).around(activityRule)
lateinit var scenario: ActivityScenario<TestActivity>

@Before
fun setup() {
scenario = activityRule.scenario
}

@Test fun `full lifecycle`() {
@Test
fun `full lifecycle`() {
val scenario = ActivityScenario.launch(TestFormulaActivity::class.java)
scenario.recreate()
scenario.close()

Expand All @@ -58,11 +45,13 @@ class ActivityLifecycleEventTest {
assertThat(events).containsExactlyElementsIn(expected).inOrder()
}

@Test fun `calling onPreCreate() twice will throw an exception`() {
@Test
fun `calling onPreCreate() twice will throw an exception`() {
val scenario = ActivityScenario.launch(TestFormulaActivity::class.java)
val activity = scenario.activity()
val result = runCatching { FormulaAndroid.onPreCreate(activity, null) }
assertThat(result.exceptionOrNull()).hasMessageThat().contains(
"Activity TestActivity was already initialized. Did you call FormulaAndroid.onPreCreate() twice?"
"Activity TestFormulaActivity was already initialized. Did you call FormulaAndroid.onPreCreate() twice?"
)
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.instacart.formula

import android.os.Bundle
import android.app.Activity
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.instacart.formula.android.ActivityStore
import com.instacart.formula.android.FormulaAppCompatActivity
import com.instacart.testutils.android.TestFormulaActivity
import com.instacart.testutils.android.get
import com.jakewharton.rxrelay3.PublishRelay
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
Expand All @@ -17,43 +19,37 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ActivityUpdateTest {

class TestActivity : FormulaAppCompatActivity() {
val updates = mutableListOf<String>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.test_activity)
}

fun applyUpdate(update: String) {
updates.add(update)
}
}

private val updates = mutableListOf<Pair<Activity, String>>()
private val updateRelay = PublishRelay.create<String>()

private val formulaRule = TestFormulaRule(
initFormula = { app ->
FormulaAndroid.init(app) {
activity<TestActivity> {
activity<TestFormulaActivity> {
ActivityStore(
streams = {
update(updateRelay, TestActivity::applyUpdate)
update(updateRelay) { activity, state ->
updates.add(activity to state)
}
}
)
}
}
})

private val activityRule = ActivityScenarioRule(TestActivity::class.java)
private val activityRule = ActivityScenarioRule(TestFormulaActivity::class.java)

@get:Rule val rule = RuleChain.outerRule(formulaRule).around(activityRule)
lateinit var scenario: ActivityScenario<TestActivity>
lateinit var scenario: ActivityScenario<TestFormulaActivity>

@Before fun setup() {
scenario = activityRule.scenario
}

@After fun cleanup() {
updates.clear()
}

@Test fun `basic updates`() {
updateRelay.accept("update-1")
updateRelay.accept("update-2")
Expand All @@ -78,5 +74,7 @@ class ActivityUpdateTest {
assertThat(updateRelay.hasObservers()).isFalse()
}

private fun updates() = scenario.get { updates }
private fun updates() = scenario.get {
updates.filter { it.first == this }.map { it.second }
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.instacart.formula

import android.os.Bundle
import android.app.Activity
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.instacart.formula.android.ActivityStore
import com.instacart.formula.android.FormulaAppCompatActivity
import com.instacart.testutils.android.TestFormulaActivity
import com.instacart.testutils.android.get
import io.reactivex.rxjava3.core.Observable
import org.junit.Before
import org.junit.Rule
Expand All @@ -17,48 +18,37 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ActivityUpdateTimingTest {

class TestActivity : FormulaAppCompatActivity() {
lateinit var updates: MutableList<String>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.test_activity)

// we delay initialization after super.onCreate() to check that Formula timing doesn't break.
updates = mutableListOf()
}

fun applyUpdate(update: String) {
updates.add(update)
}
}

private val updates = mutableListOf<Pair<Activity, String>>()
private val updateRelay = Observable.just("update-1", "update-2")

private val formulaRule = TestFormulaRule(
initFormula = { app ->
FormulaAndroid.init(app) {
activity<TestActivity> {
activity<TestFormulaActivity> {
ActivityStore(
streams = {
update(updateRelay, TestActivity::applyUpdate)
update(updateRelay) { activity, state ->
updates.add(activity to state)
}
}
)
}
}
})

private val activityRule = ActivityScenarioRule(TestActivity::class.java)
private val activityRule = ActivityScenarioRule(TestFormulaActivity::class.java)

@get:Rule val rule = RuleChain.outerRule(formulaRule).around(activityRule)
lateinit var scenario: ActivityScenario<TestActivity>
lateinit var scenario: ActivityScenario<TestFormulaActivity>

@Before fun setup() {
scenario = activityRule.scenario
}

@Test fun `last update arrives`() {
val updates = scenario.get { updates }
val updates = scenario.get {
updates.filter { it.first == this }.map { it.second }
}
assertThat(updates).containsExactly("update-2").inOrder()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.lifecycle.Lifecycle
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth
import com.google.common.truth.Truth.assertThat
import com.instacart.formula.android.ActivityStore
import com.instacart.formula.android.FragmentState
Expand All @@ -21,6 +20,8 @@ import com.instacart.formula.test.TestKey
import com.instacart.formula.test.TestKeyWithId
import com.instacart.formula.test.TestFragmentActivity
import com.instacart.formula.test.TestLifecycleKey
import com.instacart.testutils.android.activity
import com.instacart.testutils.android.get
import com.jakewharton.rxrelay3.PublishRelay
import io.reactivex.rxjava3.core.Observable
import org.junit.Before
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.instacart.formula.android.ViewFactory
import com.instacart.formula.android.events.ActivityResult
import com.instacart.formula.test.TestFragmentActivity
import com.instacart.formula.test.TestLifecycleKey
import com.instacart.testutils.android.activity
import io.reactivex.rxjava3.core.Observable
import org.junit.Before
import org.junit.Rule
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package com.instacart.formula

import android.app.Activity
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.instacart.testutils.android.TestActivity
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.runner.RunWith

/**
Expand All @@ -17,25 +13,16 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class NonBoundActivityTest {

private val formulaRule = TestFormulaRule(
@get:Rule
val rule = TestFormulaRule(
initFormula = { app ->
FormulaAndroid.init(app) {}
}
)

private val activityRule = ActivityScenarioRule(TestActivity::class.java)

@get:Rule
val rule = RuleChain.outerRule(formulaRule).around(activityRule)
lateinit var scenario: ActivityScenario<TestActivity>

@Before
fun setup() {
scenario = activityRule.scenario
}

@Test
fun `full lifecycle`() {
val scenario = ActivityScenario.launch(TestActivity::class.java)
scenario.recreate()
scenario.close()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,28 @@
package com.instacart.formula

import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.instacart.testutils.android.TestFragmentActivity
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.runner.RunWith

/**
* Tests that formula-android module handles non-bound fragment activities gracefully.
*/
@RunWith(AndroidJUnit4::class)
class NonBoundFragmentActivityTest {
private val formulaRule = TestFormulaRule(

@get:Rule
val rule = TestFormulaRule(
initFormula = { app ->
FormulaAndroid.init(app) {}
}
)

private val activityRule = ActivityScenarioRule(TestFragmentActivity::class.java)

@get:Rule
val rule = RuleChain.outerRule(formulaRule).around(activityRule)
lateinit var scenario: ActivityScenario<TestFragmentActivity>

@Before
fun setup() {
scenario = activityRule.scenario
}

@Test
fun `full lifecycle`() {
val scenario = ActivityScenario.launch(TestFragmentActivity::class.java)
scenario.recreate()
scenario.close()
}
Expand Down

This file was deleted.

Loading

0 comments on commit 5eac8aa

Please sign in to comment.