summaryrefslogtreecommitdiff
path: root/android-app/app/src/androidTest/kotlin
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-25 18:23:54 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-25 18:23:54 +0000
commite68212991935d33a4baca77d88cd20a82fbcf6a6 (patch)
treebcb7e08ccd8b777a09f9699fe2f19d00b010d070 /android-app/app/src/androidTest/kotlin
parentea5cdac728263fdc48b480460f3362a7f5fe221d (diff)
refactor: address simplify review findingsmain
TrackRepository.addPoint() now returns Boolean (true if point was added). MainViewModel.addGpsPoint() only updates _trackPoints StateFlow when a point is actually appended — eliminates ~3,600 no-op flow emissions per hour when not recording. MainActivity: loadedStyle promoted from nullable field to MutableStateFlow<Style?>; trackPoints observer uses filterNotNull + combine so no track points are silently dropped if the style loads after the first GPS fix. Smoke tests: replaced 11× ActivityScenario.launch().use{} with a single @get:Rule ActivityScenarioRule — same isolation, less boilerplate. CI: removed redundant app-debug artifact upload (app-debug.apk is already included inside the test-apks artifact). Removed stale/placeholder comments from MainActivity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/androidTest/kotlin')
-rw-r--r--android-app/app/src/androidTest/kotlin/org/terst/nav/MainActivitySmokeTest.kt86
1 files changed, 34 insertions, 52 deletions
diff --git a/android-app/app/src/androidTest/kotlin/org/terst/nav/MainActivitySmokeTest.kt b/android-app/app/src/androidTest/kotlin/org/terst/nav/MainActivitySmokeTest.kt
index a13ef7f..fecd9cc 100644
--- a/android-app/app/src/androidTest/kotlin/org/terst/nav/MainActivitySmokeTest.kt
+++ b/android-app/app/src/androidTest/kotlin/org/terst/nav/MainActivitySmokeTest.kt
@@ -1,6 +1,5 @@
package org.terst.nav
-import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
@@ -8,21 +7,26 @@ import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Smoke tests: verify the main UI surfaces launch and respond correctly.
- * These run on an emulator without GPS permission, so no LocationService.
+ * Run without GPS permission — LocationService is not started.
*
- * Run locally: ./gradlew connectedDebugAndroidTest
- * In CI: smoke-test job via android-emulator-runner
+ * Locally: ./gradlew connectedDebugAndroidTest
+ * CI: smoke-test job via android-emulator-runner
*/
@RunWith(AndroidJUnit4::class)
class MainActivitySmokeTest {
+ @get:Rule
+ val activityRule = ActivityScenarioRule(MainActivity::class.java)
+
@Before
fun setup() {
NavApplication.isTesting = true
@@ -32,10 +36,8 @@ class MainActivitySmokeTest {
@Test
fun mainActivity_launches_withoutCrash() {
- ActivityScenario.launch(MainActivity::class.java).use { scenario ->
- scenario.onActivity { activity ->
- assert(!activity.isFinishing) { "MainActivity finished immediately after launch" }
- }
+ activityRule.scenario.onActivity { activity ->
+ assert(!activity.isFinishing) { "MainActivity finished immediately after launch" }
}
}
@@ -43,89 +45,69 @@ class MainActivitySmokeTest {
@Test
fun bottomNav_allFourTabs_areDisplayed() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Map")).check(matches(isDisplayed()))
- onView(withText("Instruments")).check(matches(isDisplayed()))
- onView(withText("Log")).check(matches(isDisplayed()))
- onView(withText("Safety")).check(matches(isDisplayed()))
- }
+ onView(withText("Map")).check(matches(isDisplayed()))
+ onView(withText("Instruments")).check(matches(isDisplayed()))
+ onView(withText("Log")).check(matches(isDisplayed()))
+ onView(withText("Safety")).check(matches(isDisplayed()))
}
@Test
fun bottomNav_safetyTab_showsSafetyDashboard() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Safety")).perform(click())
- onView(withText("Safety Dashboard")).check(matches(isDisplayed()))
- onView(withText("ACTIVATE MOB")).check(matches(isDisplayed()))
- onView(withText("ANCHOR WATCH")).check(matches(isDisplayed()))
- }
+ onView(withText("Safety")).perform(click())
+ onView(withText("Safety Dashboard")).check(matches(isDisplayed()))
+ onView(withText("ACTIVATE MOB")).check(matches(isDisplayed()))
+ onView(withText("ANCHOR WATCH")).check(matches(isDisplayed()))
}
@Test
fun bottomNav_logTab_showsVoiceLogUi() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Log")).perform(click())
- onView(withContentDescription("Start voice recognition")).check(matches(isDisplayed()))
- }
+ onView(withText("Log")).perform(click())
+ onView(withContentDescription("Start voice recognition")).check(matches(isDisplayed()))
}
@Test
fun bottomNav_instrumentsTab_isSelectable() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Instruments")).perform(click())
- onView(withId(R.id.instrument_bottom_sheet)).check(matches(isDisplayed()))
- }
+ onView(withText("Instruments")).perform(click())
+ onView(withId(R.id.instrument_bottom_sheet)).check(matches(isDisplayed()))
}
@Test
fun bottomNav_mapTab_returnsFromOverlay() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Safety")).perform(click())
- onView(withText("Map")).perform(click())
- onView(withId(R.id.mapView)).check(matches(isDisplayed()))
- }
+ onView(withText("Safety")).perform(click())
+ onView(withText("Map")).perform(click())
+ onView(withId(R.id.mapView)).check(matches(isDisplayed()))
}
// ── Persistent FABs ────────────────────────────────────────────────────
@Test
fun fabMob_isAlwaysVisible() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withContentDescription("Man Overboard")).check(matches(isDisplayed()))
- }
+ onView(withContentDescription("Man Overboard")).check(matches(isDisplayed()))
}
@Test
fun fabMob_remainsVisibleOnSafetyTab() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withText("Safety")).perform(click())
- onView(withContentDescription("Man Overboard")).check(matches(isDisplayed()))
- }
+ onView(withText("Safety")).perform(click())
+ onView(withContentDescription("Man Overboard")).check(matches(isDisplayed()))
}
// ── Track recording ────────────────────────────────────────────────────
@Test
fun fabRecordTrack_isDisplayedWithRecordDescription() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withContentDescription("Record Track")).check(matches(isDisplayed()))
- }
+ onView(withContentDescription("Record Track")).check(matches(isDisplayed()))
}
@Test
fun fabRecordTrack_togglesToStopRecording_onFirstClick() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withContentDescription("Record Track")).perform(click())
- onView(withContentDescription("Stop Recording")).check(matches(isDisplayed()))
- }
+ onView(withContentDescription("Record Track")).perform(click())
+ onView(withContentDescription("Stop Recording")).check(matches(isDisplayed()))
}
@Test
fun fabRecordTrack_togglesBackToRecord_onSecondClick() {
- ActivityScenario.launch(MainActivity::class.java).use {
- onView(withContentDescription("Record Track")).perform(click())
- onView(withContentDescription("Stop Recording")).perform(click())
- onView(withContentDescription("Record Track")).check(matches(isDisplayed()))
- }
+ onView(withContentDescription("Record Track")).perform(click())
+ onView(withContentDescription("Stop Recording")).perform(click())
+ onView(withContentDescription("Record Track")).check(matches(isDisplayed()))
}
}