OXYGENHUB
# 62429abe5869 oxygenhub-android / app / src / test / java / io / oxygenhub / android / auth / SessionManagerTest.kt
3.0 KiB · last changed The hub's API and device sign-in, the token in the Keystore (refs #2) 11 days ago source blame history raw
1
package io.oxygenhub.android.auth
2
3
import io.oxygenhub.android.FakeHubApi
4
import io.oxygenhub.android.api.HubException
5
import kotlinx.coroutines.test.runTest
6
import org.junit.Assert.assertEquals
7
import org.junit.Assert.assertFalse
8
import org.junit.Assert.assertNotNull
9
import org.junit.Assert.assertNull
10
import org.junit.Assert.assertSame
11
import org.junit.Test
12
import java.io.IOException
13
14
class SessionManagerTest {
15
    private val session = Session("https://oxygenhub.io", "andymccall", "oxy_secret", listOf("repo:read", "user:read"))
16
    private val fake = FakeHubApi()
17
    private var onUnauthorized: () -> Unit = {}
18
19
    private fun manager(store: SessionStore = MemorySessionStore()) = SessionManager(store) { _, cb ->
20
        onUnauthorized = cb
21
        fake
22
    }
23
24
    @Test
25
    fun signingInSavesTheSession() {
26
        val store = MemorySessionStore()
27
        val m = manager(store)
28
        assertNull(m.session.value)
29
        assertNull(m.api())
30
        m.signedIn(session)
31
        assertEquals(session, store.load())
32
        assertEquals(session, m.session.value)
33
        assertSame(m.api(), m.api())
34
    }
35
36
    @Test
37
    fun aSavedSessionIsThereAtStart() {
38
        val m = manager(MemorySessionStore(session))
39
        assertEquals(session, m.session.value)
40
        assertNotNull(m.api())
41
    }
42
43
    @Test
44
    fun signingOutRevokesTheToken() = runTest {
45
        val store = MemorySessionStore(session)
46
        val m = manager(store)
47
        assertEquals(SignOutResult.Revoked, m.signOut())
48
        assertEquals(listOf("revoke"), fake.calls)
49
        assertNull(store.load())
50
        assertNull(m.session.value)
51
        assertNull(m.ended.value)
52
    }
53
54
    @Test
55
    fun aTokenTheHubNoLongerKnows() = runTest {
56
        fake.revoke = { throw HubException.Http(401, "unknown or expired token") }
57
        val m = manager(MemorySessionStore(session))
58
        assertEquals(SignOutResult.AlreadyGone, m.signOut())
59
        assertNull(m.session.value)
60
    }
61
62
    @Test
63
    fun signingOutOfflineStillForgetsTheTokenAndSaysSo() = runTest {
64
        fake.revoke = { throw HubException.Network(IOException("no route")) }
65
        val store = MemorySessionStore(session)
66
        val m = manager(store)
67
        assertEquals(SignOutResult.NotRevoked, m.signOut())
68
        assertNull(store.load())
69
        assertNull(m.session.value)
70
        assertNotNull(m.ended.value)
71
    }
72
73
    @Test
74
    fun aRefusedTokenEndsTheSession() {
75
        val store = MemorySessionStore(session)
76
        val m = manager(store)
77
        m.api()
78
        onUnauthorized()
79
        assertNull(m.session.value)
80
        assertNull(store.load())
81
        assertEquals(true, m.ended.value?.contains("has ended"))
82
        m.dismissEnded()
83
        assertNull(m.ended.value)
84
    }
85
86
    @Test
87
    fun theLastHubIsRemembered() {
88
        val store = MemorySessionStore()
89
        val m = manager(store)
90
        m.rememberHub("https://hub.example")
91
        assertEquals("https://hub.example", m.lastHub)
92
    }
93
94
    @Test
95
    fun theTokenIsNotInToString() {
96
        assertFalse(session.toString().contains("oxy_secret"))
97
    }
98
}