summaryrefslogtreecommitdiff
path: root/android-app/app/src/test/kotlin
diff options
context:
space:
mode:
authorClaudomator Agent <agent@claudomator>2026-03-14 00:50:17 +0000
committerClaudomator Agent <agent@claudomator>2026-03-14 00:50:17 +0000
commit0923c55af5c63539055933509302233ee3f4b26a (patch)
treec0f7e24dff920872e43659f2d0552bd252921744 /android-app/app/src/test/kotlin
parent51f86cff118f9532783c4e61724e07173ec029d7 (diff)
feat: add LocationPermissionHandler with 7 unit tests for permission flows
Extract location permission decision logic from MainActivity into a testable LocationPermissionHandler class. Covers: permission already granted, needs request, fine-only granted, coarse-only granted, both granted, both denied, and never-ask-again (empty grants) scenarios. All permissions (INTERNET, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION) were already declared in AndroidManifest.xml; no manifest changes needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/test/kotlin')
-rw-r--r--android-app/app/src/test/kotlin/com/example/androidapp/ui/LocationPermissionHandlerTest.kt110
1 files changed, 110 insertions, 0 deletions
diff --git a/android-app/app/src/test/kotlin/com/example/androidapp/ui/LocationPermissionHandlerTest.kt b/android-app/app/src/test/kotlin/com/example/androidapp/ui/LocationPermissionHandlerTest.kt
new file mode 100644
index 0000000..54afc26
--- /dev/null
+++ b/android-app/app/src/test/kotlin/com/example/androidapp/ui/LocationPermissionHandlerTest.kt
@@ -0,0 +1,110 @@
+package com.example.androidapp.ui
+
+import org.junit.Assert.*
+import org.junit.Test
+
+class LocationPermissionHandlerTest {
+
+ // Convenience factory — callers override only the lambdas they care about.
+ private fun makeHandler(
+ checkGranted: () -> Boolean = { false },
+ onGranted: () -> Unit = {},
+ onDenied: () -> Unit = {},
+ requestPermissions: () -> Unit = {}
+ ) = LocationPermissionHandler(checkGranted, onGranted, onDenied, requestPermissions)
+
+ // ── start() ──────────────────────────────────────────────────────────────
+
+ @Test
+ fun `start - permission already granted - calls onGranted without requesting`() {
+ var onGrantedCalled = false
+ var requestCalled = false
+ makeHandler(
+ checkGranted = { true },
+ onGranted = { onGrantedCalled = true },
+ requestPermissions = { requestCalled = true }
+ ).start()
+
+ assertTrue("onGranted should be called", onGrantedCalled)
+ assertFalse("requestPermissions should NOT be called", requestCalled)
+ }
+
+ @Test
+ fun `start - permission not granted - calls requestPermissions without calling onGranted`() {
+ var onGrantedCalled = false
+ var requestCalled = false
+ makeHandler(
+ checkGranted = { false },
+ onGranted = { onGrantedCalled = true },
+ requestPermissions = { requestCalled = true }
+ ).start()
+
+ assertFalse("onGranted should NOT be called", onGrantedCalled)
+ assertTrue("requestPermissions should be called", requestCalled)
+ }
+
+ // ── onResult() ───────────────────────────────────────────────────────────
+
+ @Test
+ fun `onResult - fine location granted - calls onGranted`() {
+ var onGrantedCalled = false
+ makeHandler(onGranted = { onGrantedCalled = true }).onResult(
+ mapOf(
+ "android.permission.ACCESS_FINE_LOCATION" to true,
+ "android.permission.ACCESS_COARSE_LOCATION" to false
+ )
+ )
+ assertTrue("onGranted should be called when fine location is granted", onGrantedCalled)
+ }
+
+ @Test
+ fun `onResult - coarse location granted - calls onGranted`() {
+ var onGrantedCalled = false
+ makeHandler(onGranted = { onGrantedCalled = true }).onResult(
+ mapOf(
+ "android.permission.ACCESS_FINE_LOCATION" to false,
+ "android.permission.ACCESS_COARSE_LOCATION" to true
+ )
+ )
+ assertTrue("onGranted should be called when coarse location is granted", onGrantedCalled)
+ }
+
+ @Test
+ fun `onResult - both permissions granted - calls onGranted`() {
+ var onGrantedCalled = false
+ makeHandler(onGranted = { onGrantedCalled = true }).onResult(
+ mapOf(
+ "android.permission.ACCESS_FINE_LOCATION" to true,
+ "android.permission.ACCESS_COARSE_LOCATION" to true
+ )
+ )
+ assertTrue(onGrantedCalled)
+ }
+
+ @Test
+ fun `onResult - all permissions denied - calls onDenied not onGranted`() {
+ var onGrantedCalled = false
+ var onDeniedCalled = false
+ makeHandler(
+ onGranted = { onGrantedCalled = true },
+ onDenied = { onDeniedCalled = true }
+ ).onResult(
+ mapOf(
+ "android.permission.ACCESS_FINE_LOCATION" to false,
+ "android.permission.ACCESS_COARSE_LOCATION" to false
+ )
+ )
+ assertFalse("onGranted should NOT be called", onGrantedCalled)
+ assertTrue("onDenied should be called", onDeniedCalled)
+ }
+
+ @Test
+ fun `onResult - empty grants (never ask again scenario) - calls onDenied`() {
+ var onDeniedCalled = false
+ makeHandler(onDenied = { onDeniedCalled = true }).onResult(emptyMap())
+ assertTrue(
+ "onDenied should be called for empty grants (never-ask-again)",
+ onDeniedCalled
+ )
+ }
+}