domain: add pure-Kotlin models (CalendarSource, EventInstance, EventDetail, …)
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package de.jeanlucmakiola.calendula.domain
|
||||
|
||||
import kotlin.time.Instant
|
||||
|
||||
data class CalendarSource(
|
||||
val id: Long,
|
||||
val displayName: String,
|
||||
val accountName: String,
|
||||
val accountType: String,
|
||||
val color: Int,
|
||||
val isVisibleInSystem: Boolean,
|
||||
)
|
||||
|
||||
data class EventInstance(
|
||||
val instanceId: Long,
|
||||
val eventId: Long,
|
||||
val calendarId: Long,
|
||||
val title: String,
|
||||
val start: Instant,
|
||||
val end: Instant,
|
||||
val isAllDay: Boolean,
|
||||
val color: Int,
|
||||
val location: String?,
|
||||
)
|
||||
|
||||
data class EventDetail(
|
||||
val instance: EventInstance,
|
||||
val description: String?,
|
||||
val organizer: String?,
|
||||
val attendees: List<Attendee>,
|
||||
val rrule: String?,
|
||||
)
|
||||
|
||||
data class Attendee(
|
||||
val name: String,
|
||||
val email: String?,
|
||||
val status: AttendeeStatus,
|
||||
)
|
||||
|
||||
enum class AttendeeStatus {
|
||||
Accepted,
|
||||
Declined,
|
||||
Tentative,
|
||||
NeedsAction,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
enum class FailureReason {
|
||||
PermissionRevoked,
|
||||
NoCalendarsConfigured,
|
||||
ProviderUnavailable,
|
||||
EventNotFound,
|
||||
Unknown,
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package de.jeanlucmakiola.calendula.domain
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlin.time.Instant
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class ModelsTest {
|
||||
|
||||
@Test
|
||||
fun `CalendarSource is a data class with structural equality`() {
|
||||
val a = CalendarSource(1L, "Work", "x@y", "com.google", 0xFF112233.toInt(), true)
|
||||
val b = CalendarSource(1L, "Work", "x@y", "com.google", 0xFF112233.toInt(), true)
|
||||
assertThat(a).isEqualTo(b)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `EventInstance is a data class with structural equality`() {
|
||||
val start = Instant.fromEpochMilliseconds(0L)
|
||||
val end = Instant.fromEpochMilliseconds(3_600_000L)
|
||||
val a = EventInstance(10L, 1L, 1L, "Meet", start, end, false, 0xFF000000.toInt(), null)
|
||||
val b = EventInstance(10L, 1L, 1L, "Meet", start, end, false, 0xFF000000.toInt(), null)
|
||||
assertThat(a).isEqualTo(b)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AttendeeStatus enum has all five variants`() {
|
||||
assertThat(AttendeeStatus.values().toSet()).isEqualTo(
|
||||
setOf(
|
||||
AttendeeStatus.Accepted,
|
||||
AttendeeStatus.Declined,
|
||||
AttendeeStatus.Tentative,
|
||||
AttendeeStatus.NeedsAction,
|
||||
AttendeeStatus.Unknown,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `FailureReason enum has all five variants`() {
|
||||
assertThat(FailureReason.values().toSet()).isEqualTo(
|
||||
setOf(
|
||||
FailureReason.PermissionRevoked,
|
||||
FailureReason.NoCalendarsConfigured,
|
||||
FailureReason.ProviderUnavailable,
|
||||
FailureReason.EventNotFound,
|
||||
FailureReason.Unknown,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `EventDetail composes EventInstance plus extras`() {
|
||||
val instance = EventInstance(
|
||||
instanceId = 10L,
|
||||
eventId = 1L,
|
||||
calendarId = 1L,
|
||||
title = "Meet",
|
||||
start = Instant.fromEpochMilliseconds(0L),
|
||||
end = Instant.fromEpochMilliseconds(60_000L),
|
||||
isAllDay = false,
|
||||
color = 0xFFAABBCC.toInt(),
|
||||
location = null,
|
||||
)
|
||||
val detail = EventDetail(
|
||||
instance = instance,
|
||||
description = "Brief description",
|
||||
organizer = "x@y",
|
||||
attendees = listOf(Attendee("Alice", "alice@x", AttendeeStatus.Accepted)),
|
||||
rrule = "FREQ=WEEKLY",
|
||||
)
|
||||
assertThat(detail.instance.title).isEqualTo("Meet")
|
||||
assertThat(detail.attendees).hasSize(1)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user