Diary: ergänze Mapper-Tests für Assignments und Predefined Activities

This commit is contained in:
Torsten Schulz (local)
2026-03-05 23:54:00 +01:00
parent e4e7f521e2
commit 05ab872f77

View File

@@ -0,0 +1,335 @@
package de.trainingstagebuch.app.repository
import kotlinx.serialization.json.Json
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Test
class RepositoryMappersTest {
@Test
fun `mapClubsToHomeData maps count and names`() {
val clubsJson = Json.parseToJsonElement(
"""
[
{"id":"1","name":"Club A"},
{"id":"2","name":"Club B"},
{"id":"3"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapClubsToHomeData(clubsJson)
assertEquals(3, result.clubCount)
assertEquals(listOf("Club A", "Club B"), result.clubNames)
}
@Test
fun `parseErrorPayload parses backend error format`() {
val error = RepositoryMappers.parseErrorPayload(
"""{"success":false,"code":"ERROR_UNAUTHORIZED","error":"Nicht autorisiert"}"""
)
assertNotNull(error)
assertEquals("ERROR_UNAUTHORIZED", error?.code)
assertEquals("Nicht autorisiert", error?.message)
}
@Test
fun `parseErrorPayload returns null for invalid json`() {
val error = RepositoryMappers.parseErrorPayload("not-json")
assertNull(error)
}
@Test
fun `mapMembersToMemberItems maps display names and flags`() {
val membersJson = Json.parseToJsonElement(
"""
[
{"id":"1","firstName":"Max","lastName":"Mustermann","active":true,"testMembership":false},
{"id":"2","firstName":"Eva","lastName":"Muster","active":false,"testMembership":true}
]
""".trimIndent()
)
val result = RepositoryMappers.mapMembersToMemberItems(membersJson)
assertEquals(2, result.size)
assertEquals("Max", result[0].firstName)
assertEquals("Mustermann", result[0].lastName)
assertEquals("Max Mustermann", result[0].displayName)
assertEquals(true, result[0].active)
assertEquals(false, result[0].testMembership)
assertEquals("Eva Muster", result[1].displayName)
assertEquals(false, result[1].active)
assertEquals(true, result[1].testMembership)
}
@Test
fun `mapMemberGalleryImages filters by member and primary first`() {
val galleryJson = Json.parseToJsonElement(
"""
[
{"imageId":"img-2","memberId":"2","url":"b.jpg","isPrimary":false},
{"imageId":"img-1","memberId":"2","url":"a.jpg","isPrimary":true},
{"imageId":"img-x","memberId":"3","url":"x.jpg","isPrimary":true}
]
""".trimIndent()
)
val result = RepositoryMappers.mapMemberGalleryImages(galleryJson, memberId = "2")
assertEquals(2, result.size)
assertEquals("img-1", result[0].imageId)
assertEquals(true, result[0].isPrimary)
assertEquals("img-2", result[1].imageId)
}
@Test
fun `mapMemberNotes maps notes with fallback fields`() {
val notesJson = Json.parseToJsonElement(
"""
[
{"id":"n1","content":"Erste Notiz","createdAt":"2025-01-01"},
{"_id":"n2","text":"Zweite Notiz"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapMemberNotes(notesJson)
assertEquals(2, result.size)
assertEquals("n1", result[0].id)
assertEquals("Erste Notiz", result[0].content)
assertEquals("n2", result[1].id)
assertEquals("Zweite Notiz", result[1].content)
}
@Test
fun `mapDiaryDates maps required diary fields`() {
val diaryJson = Json.parseToJsonElement(
"""
[
{"id":"d1","date":"2026-03-01","trainingStart":"18:00","trainingEnd":"20:00","diaryTags":[{"id":"t1","name":"Kondition"}]},
{"_id":"d2","date":"2026-03-02"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapDiaryDates(diaryJson)
assertEquals(2, result.size)
assertEquals("d1", result[0].id)
assertEquals("2026-03-01", result[0].date)
assertEquals("18:00", result[0].trainingStart)
assertEquals("20:00", result[0].trainingEnd)
assertEquals(1, result[0].tags.size)
assertEquals("t1", result[0].tags[0].id)
assertEquals("d2", result[1].id)
assertEquals("2026-03-02", result[1].date)
}
@Test
fun `mapDiaryParticipants maps participant and member ids`() {
val participantsJson = Json.parseToJsonElement(
"""
[
{"id":"p1","memberId":"m1","groupId":"g1"},
{"_id":"p2","memberId":"m2"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapDiaryParticipants(participantsJson)
assertEquals(2, result.size)
assertEquals("p1", result[0].id)
assertEquals("m1", result[0].memberId)
assertEquals("g1", result[0].groupId)
assertEquals("p2", result[1].id)
assertEquals("m2", result[1].memberId)
}
@Test
fun `mapDiaryActivities maps id and description`() {
val activitiesJson = Json.parseToJsonElement(
"""
[
{"id":"a1","description":"Aufschlagtraining"},
{"_id":"a2","activity":"Beinarbeit"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapDiaryActivities(activitiesJson)
assertEquals(2, result.size)
assertEquals("a1", result[0].id)
assertEquals("Aufschlagtraining", result[0].description)
assertEquals("a2", result[1].id)
assertEquals("Beinarbeit", result[1].description)
}
@Test
fun `mapTags supports root and nested tag objects`() {
val tagsJson = Json.parseToJsonElement(
"""
[
{"id":"t1","name":"Technik"},
{"tag":{"id":"t2","label":"Ausdauer"}}
]
""".trimIndent()
)
val result = RepositoryMappers.mapTags(tagsJson)
assertEquals(2, result.size)
assertEquals("t1", result[0].id)
assertEquals("Technik", result[0].name)
assertEquals("t2", result[1].id)
assertEquals("Ausdauer", result[1].name)
}
@Test
fun `mapDiaryPlanItems maps activity and timeblock`() {
val planJson = Json.parseToJsonElement(
"""
[
{"id":"p1","activity":"Einspielen","isTimeblock":false},
{"_id":"p2","isTimeblock":true}
]
""".trimIndent()
)
val result = RepositoryMappers.mapDiaryPlanItems(planJson)
assertEquals(2, result.size)
assertEquals("p1", result[0].id)
assertEquals("Einspielen", result[0].activity)
assertEquals(false, result[0].isTimeblock)
assertEquals("p2", result[1].id)
assertEquals(true, result[1].isTimeblock)
}
@Test
fun `mapDiaryGroups maps id and name`() {
val groupsJson = Json.parseToJsonElement(
"""
[
{"id":"g1","name":"Gruppe A"},
{"_id":"g2"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapDiaryGroups(groupsJson)
assertEquals(2, result.size)
assertEquals("g1", result[0].id)
assertEquals("Gruppe A", result[0].name)
assertEquals("g2", result[1].id)
}
@Test
fun `mapParticipantIds maps assignment ids`() {
val json = Json.parseToJsonElement(
"""
[
{"participantId":"p1"},
{"participantId":"p2"},
{"participantId":"p1"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapParticipantIds(json)
assertEquals(setOf("p1", "p2"), result)
}
@Test
fun `mapPredefinedActivities maps id name and optional fields`() {
val json = Json.parseToJsonElement(
"""
[
{"id":"a1","name":"Topspin VH","code":"TS-VH","duration":"20","durationText":"4x5"},
{"_id":"a2","name":"Aufschlag"}
]
""".trimIndent()
)
val result = RepositoryMappers.mapPredefinedActivities(json)
assertEquals(2, result.size)
assertEquals("a1", result[0].id)
assertEquals("Topspin VH", result[0].name)
assertEquals("TS-VH", result[0].code)
assertEquals("20", result[0].duration)
assertEquals("4x5", result[0].durationText)
assertEquals("a2", result[1].id)
assertEquals("Aufschlag", result[1].name)
}
@Test
fun `mapMemberTransferConfig maps login credentials and defaults`() {
val configJson = Json.parseToJsonElement(
"""
{
"id":"cfg-1",
"server":"https://example.org",
"loginEndpoint":"/auth/login",
"loginCredentials":{"username":"u1","password":"p1","tenant":"abc"},
"transferEndpoint":"/transfer",
"transferTemplate":"{\"id\":\"{{id}}\"}",
"useBulkMode":true
}
""".trimIndent()
).let { it as kotlinx.serialization.json.JsonObject }
val result = RepositoryMappers.mapMemberTransferConfig(configJson)
assertEquals("cfg-1", result.id)
assertEquals("https://example.org", result.server)
assertEquals("/auth/login", result.loginEndpoint)
assertEquals("json", result.loginFormat)
assertEquals("u1", result.loginUsername)
assertEquals("tenant:abc", result.loginAdditionalField1)
assertEquals("/transfer", result.transferEndpoint)
assertEquals("POST", result.transferMethod)
assertEquals("json", result.transferFormat)
assertEquals(true, result.useBulkMode)
}
@Test
fun `mapMemberTransferSummary supports numeric and string counts`() {
val summaryJson = Json.parseToJsonElement(
"""
{
"success": false,
"message": "teilweise fehlgeschlagen",
"transferred": 2,
"total": "4",
"invalidMembers": [
{"member":{"firstName":"Max","lastName":"Mustermann"}},
{"member":{"id":"m-2"}}
],
"errors": [
{"member":"m-2","error":"timeout"},
"generic error"
]
}
""".trimIndent()
).let { it as kotlinx.serialization.json.JsonObject }
val result = RepositoryMappers.mapMemberTransferSummary(summaryJson)
assertEquals(false, result.success)
assertEquals("teilweise fehlgeschlagen", result.message)
assertEquals(2, result.transferred)
assertEquals(4, result.total)
assertEquals(listOf("Max Mustermann", "m-2"), result.invalidMembers)
assertEquals(listOf("m-2: timeout", "generic error"), result.errors)
}
}