Add persistence for a user's "last active time" (#601)

This commit is contained in:
Brian Yencho
2024-01-13 11:47:39 -06:00
committed by GitHub
parent c98f51e719
commit 2ea16b180e
4 changed files with 103 additions and 0 deletions

View File

@@ -16,7 +16,9 @@ import kotlinx.coroutines.test.runTest
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.encodeToJsonElement
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class AuthDiskSourceTest {
@@ -116,6 +118,63 @@ class AuthDiskSourceTest {
}
}
@Test
fun `getLastActiveTimeMillis should pull from SharedPreferences`() {
val lastActiveTimeBaseKey = "bwPreferencesStorage:lastActiveTime"
val mockUserId = "mockUserId"
val mockLastActiveTime = 123456789L
fakeSharedPreferences
.edit()
.putLong(
"${lastActiveTimeBaseKey}_$mockUserId",
mockLastActiveTime,
)
.apply()
val actual = authDiskSource.getLastActiveTimeMillis(userId = mockUserId)
assertEquals(
mockLastActiveTime,
actual,
)
}
@Test
fun `storeLastActiveTimeMillis for non-null values should update SharedPreferences`() {
val lastActiveTimeBaseKey = "bwPreferencesStorage:lastActiveTime"
val mockUserId = "mockUserId"
val mockLastActiveTime = 123456789L
authDiskSource.storeLastActiveTimeMillis(
userId = mockUserId,
lastActiveTimeMillis = mockLastActiveTime,
)
val actual = fakeSharedPreferences
.getLong(
"${lastActiveTimeBaseKey}_$mockUserId",
0L,
)
assertEquals(
mockLastActiveTime,
actual,
)
}
@Test
fun `storeLastActiveTimeMillis for null values should clear SharedPreferences`() {
val lastActiveTimeBaseKey = "bwPreferencesStorage:lastActiveTime"
val mockUserId = "mockUserId"
val mockLastActiveTime = 123456789L
val lastActiveTimeKey = "${lastActiveTimeBaseKey}_$mockUserId"
fakeSharedPreferences
.edit()
.putLong(lastActiveTimeKey, mockLastActiveTime)
.apply()
assertTrue(fakeSharedPreferences.contains(lastActiveTimeKey))
authDiskSource.storeLastActiveTimeMillis(
userId = mockUserId,
lastActiveTimeMillis = null,
)
assertFalse(fakeSharedPreferences.contains(lastActiveTimeKey))
}
@Test
fun `getUserKey should pull from SharedPreferences`() {
val userKeyBaseKey = "bwPreferencesStorage:masterKeyEncryptedUserKey"

View File

@@ -19,6 +19,7 @@ class FakeAuthDiskSource : AuthDiskSource {
mutableMapOf<String, MutableSharedFlow<List<SyncResponseJson.Profile.Organization>?>>()
private val mutableUserStateFlow = bufferedMutableSharedFlow<UserStateJson?>(replay = 1)
private val storedLastActiveTimeMillis = mutableMapOf<String, Long?>()
private val storedUserKeys = mutableMapOf<String, String?>()
private val storedPrivateKeys = mutableMapOf<String, String?>()
private val storedUserAutoUnlockKeys = mutableMapOf<String, String?>()
@@ -35,6 +36,16 @@ class FakeAuthDiskSource : AuthDiskSource {
override val userStateFlow: Flow<UserStateJson?>
get() = mutableUserStateFlow.onSubscription { emit(userState) }
override fun getLastActiveTimeMillis(userId: String): Long? =
storedLastActiveTimeMillis[userId]
override fun storeLastActiveTimeMillis(
userId: String,
lastActiveTimeMillis: Long?,
) {
storedLastActiveTimeMillis[userId] = lastActiveTimeMillis
}
override fun getUserKey(userId: String): String? = storedUserKeys[userId]
override fun storeUserKey(userId: String, userKey: String?) {