feat: add event filtering logic, TypeFilter enum, AuthSettings, and OAuthClient interface
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
package ch.parano.myice.auth
|
||||
|
||||
import ch.parano.myice.network.AuthTokenHolder
|
||||
import com.russhwolf.settings.Settings
|
||||
|
||||
class AuthSettings(private val settings: Settings) {
|
||||
|
||||
companion object {
|
||||
private const val TOKEN_KEY = "access_token"
|
||||
private const val ACCOUNT_KEY = "selected_account"
|
||||
}
|
||||
|
||||
fun getStoredToken(): String? = settings.getStringOrNull(TOKEN_KEY)
|
||||
|
||||
fun setToken(token: String?) {
|
||||
if (token != null) {
|
||||
settings.putString(TOKEN_KEY, token)
|
||||
} else {
|
||||
settings.remove(TOKEN_KEY)
|
||||
}
|
||||
AuthTokenHolder.token = token
|
||||
}
|
||||
|
||||
fun getStoredAccount(): String? = settings.getStringOrNull(ACCOUNT_KEY)
|
||||
|
||||
fun setAccount(account: String) {
|
||||
settings.putString(ACCOUNT_KEY, account)
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
settings.remove(TOKEN_KEY)
|
||||
settings.remove(ACCOUNT_KEY)
|
||||
AuthTokenHolder.token = null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.parano.myice.auth
|
||||
|
||||
interface OAuthClient {
|
||||
suspend fun authenticate(loginUrl: String): String?
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package ch.parano.myice.filter
|
||||
|
||||
import ch.parano.myice.models.Event
|
||||
|
||||
fun extractSubgroup(name: String): String {
|
||||
val parts = name.split(" - ")
|
||||
return if (parts.size > 1) parts.dropLast(1).joinToString(" - ") else name
|
||||
}
|
||||
|
||||
fun filterEvents(
|
||||
events: List<Event>,
|
||||
agegroup: String?,
|
||||
subgroup: String?,
|
||||
typeFilter: TypeFilter,
|
||||
): List<Event> = events.filter { event ->
|
||||
val typeMatches = when (typeFilter) {
|
||||
TypeFilter.ALL -> true
|
||||
TypeFilter.GAMES -> event.eventType == "Jeu"
|
||||
TypeFilter.PRACTICES -> event.eventType != "Jeu"
|
||||
}
|
||||
if (!typeMatches) return@filter false
|
||||
|
||||
if (agegroup != null && event.agegroup != agegroup) return@filter false
|
||||
|
||||
if (subgroup != null) {
|
||||
val eventSubgroup = extractSubgroup(event.name)
|
||||
if (eventSubgroup != subgroup) return@filter false
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fun List<Event>.distinctAgegroups(): List<String> =
|
||||
map { it.agegroup }.toSet().sorted()
|
||||
|
||||
fun List<Event>.distinctSubgroups(): List<String> =
|
||||
map { extractSubgroup(it.name) }.toSet().sorted()
|
||||
@@ -0,0 +1,9 @@
|
||||
package ch.parano.myice.filter
|
||||
|
||||
enum class TypeFilter {
|
||||
ALL, GAMES, PRACTICES;
|
||||
|
||||
companion object {
|
||||
val DEFAULT = GAMES
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
package ch.parano.myice.filter
|
||||
|
||||
import ch.parano.myice.models.Event
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class EventFilterTest {
|
||||
|
||||
private fun event(
|
||||
id: String = "1",
|
||||
agegroup: String = "U13 (Elite)",
|
||||
name: String = "U13 Elite - HC Ajoie",
|
||||
eventType: String = "Jeu",
|
||||
) = Event(
|
||||
idEvent = id,
|
||||
agegroup = agegroup,
|
||||
name = name,
|
||||
title = "Title",
|
||||
opponent = "Opp",
|
||||
place = "Place",
|
||||
start = "2024-11-10T14:00:00",
|
||||
end = "2024-11-10T16:15:00",
|
||||
color = "#e4222e",
|
||||
eventType = eventType,
|
||||
)
|
||||
|
||||
@Test
|
||||
fun testExtractSubgroupWithSeparator() {
|
||||
assertEquals("U13 Elite", extractSubgroup("U13 Elite - HC Ajoie"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testExtractSubgroupMultipleSeparators() {
|
||||
assertEquals("U13 Elite - Group A", extractSubgroup("U13 Elite - Group A - HC Ajoie"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testExtractSubgroupNoSeparator() {
|
||||
assertEquals("U13 Elite", extractSubgroup("U13 Elite"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testExtractSubgroupEmptyString() {
|
||||
assertEquals("", extractSubgroup(""))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterGamesOnly() {
|
||||
val events = listOf(
|
||||
event(id = "1", eventType = "Jeu"),
|
||||
event(id = "2", eventType = ""),
|
||||
event(id = "3", eventType = "Jeu"),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = null, subgroup = null, typeFilter = TypeFilter.GAMES)
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("1", result[0].idEvent)
|
||||
assertEquals("3", result[1].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterPracticesOnly() {
|
||||
val events = listOf(
|
||||
event(id = "1", eventType = "Jeu"),
|
||||
event(id = "2", eventType = ""),
|
||||
event(id = "3", eventType = ""),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = null, subgroup = null, typeFilter = TypeFilter.PRACTICES)
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("2", result[0].idEvent)
|
||||
assertEquals("3", result[1].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterAll() {
|
||||
val events = listOf(
|
||||
event(id = "1", eventType = "Jeu"),
|
||||
event(id = "2", eventType = ""),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = null, subgroup = null, typeFilter = TypeFilter.ALL)
|
||||
assertEquals(2, result.size)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterByAgegroup() {
|
||||
val events = listOf(
|
||||
event(id = "1", agegroup = "U13 (Elite)"),
|
||||
event(id = "2", agegroup = "U15"),
|
||||
event(id = "3", agegroup = "U13 (Elite)"),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = "U13 (Elite)", subgroup = null, typeFilter = TypeFilter.ALL)
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("1", result[0].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterBySubgroup() {
|
||||
val events = listOf(
|
||||
event(id = "1", name = "U13 Elite - HC Ajoie"),
|
||||
event(id = "2", name = "U13 Top - HC Geneva"),
|
||||
event(id = "3", name = "U13 Elite - HC Lausanne"),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = null, subgroup = "U13 Elite", typeFilter = TypeFilter.ALL)
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("1", result[0].idEvent)
|
||||
assertEquals("3", result[1].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterCombinedAgegroupAndSubgroup() {
|
||||
val events = listOf(
|
||||
event(id = "1", agegroup = "U13 (Elite)", name = "U13 Elite - HC Ajoie"),
|
||||
event(id = "2", agegroup = "U13 (Elite)", name = "U13 Top - HC Geneva"),
|
||||
event(id = "3", agegroup = "U15", name = "U13 Elite - HC Lausanne"),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = "U13 (Elite)", subgroup = "U13 Elite", typeFilter = TypeFilter.ALL)
|
||||
assertEquals(1, result.size)
|
||||
assertEquals("1", result[0].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFilterGamesAndAgegroup() {
|
||||
val events = listOf(
|
||||
event(id = "1", agegroup = "U13 (Elite)", eventType = "Jeu"),
|
||||
event(id = "2", agegroup = "U13 (Elite)", eventType = ""),
|
||||
event(id = "3", agegroup = "U15", eventType = "Jeu"),
|
||||
)
|
||||
val result = filterEvents(events, agegroup = "U13 (Elite)", subgroup = null, typeFilter = TypeFilter.GAMES)
|
||||
assertEquals(1, result.size)
|
||||
assertEquals("1", result[0].idEvent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testDistinctAgegroups() {
|
||||
val events = listOf(
|
||||
event(agegroup = "U15"),
|
||||
event(agegroup = "U13 (Elite)"),
|
||||
event(agegroup = "U15"),
|
||||
)
|
||||
val result = events.distinctAgegroups()
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("U13 (Elite)", result[0])
|
||||
assertEquals("U15", result[1])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testDistinctSubgroups() {
|
||||
val events = listOf(
|
||||
event(name = "U13 Elite - HC Ajoie"),
|
||||
event(name = "U13 Top - HC Geneva"),
|
||||
event(name = "U13 Elite - HC Lausanne"),
|
||||
)
|
||||
val result = events.distinctSubgroups()
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("U13 Elite", result[0])
|
||||
assertEquals("U13 Top", result[1])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user