Skip to content
This repository was archived by the owner on Feb 17, 2020. It is now read-only.

Commit 655f2d0

Browse files
authored
Merge pull request #513 from squanchy-dev/fix_days_rendering
Fix timezones not being applied at LocalDateTime/LocalDate creation
2 parents c924b8b + 9b5214a commit 655f2d0

7 files changed

Lines changed: 136 additions & 109 deletions

File tree

app/src/main/java/net/squanchy/schedule/ScheduleService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,6 @@ class FirestoreScheduleService(
9999
.sortedBy(SchedulePage::date)
100100

101101
private fun FirestoreSchedulePage.toSortedDomainSchedulePage(checksum: Checksum, timeZone: DateTimeZone): SchedulePage =
102-
SchedulePage(day.id, LocalDate(day.date), events.map { it.toEvent(checksum, timeZone) }
102+
SchedulePage(day.id, LocalDate(day.date, timeZone), events.map { it.toEvent(checksum, timeZone) }
103103
.sortedBy(Event::startTime))
104104
}

app/src/main/java/net/squanchy/service/firebase/FirestoreMappers.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ fun FirestoreVenue.toVenue() = Venue(
4949
timeZone = DateTimeZone.forID(timezone)
5050
)
5151

52-
fun FirestoreEvent.toEvent(checksum: Checksum, dateTime: DateTimeZone, isFavorite: Boolean = false) = Event(
52+
fun FirestoreEvent.toEvent(checksum: Checksum, timeZone: DateTimeZone, isFavorite: Boolean = false) = Event(
5353
id = id,
5454
numericId = checksum.getChecksumOf(id),
55-
startTime = LocalDateTime(startTime),
56-
endTime = LocalDateTime(endTime),
55+
startTime = LocalDateTime(startTime, timeZone),
56+
endTime = LocalDateTime(endTime, timeZone),
5757
title = title,
5858
place = place?.toPlace().optional(),
5959
experienceLevel = experienceLevel.toExperienceLevel(),
@@ -62,7 +62,7 @@ fun FirestoreEvent.toEvent(checksum: Checksum, dateTime: DateTimeZone, isFavorit
6262
favorited = isFavorite,
6363
description = description.optional(),
6464
track = track?.toTrack(checksum).optional(),
65-
timeZone = dateTime
65+
timeZone = timeZone
6666
)
6767

6868
private fun String?.toExperienceLevel() = ExperienceLevel.tryParsingFrom(this)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.squanchy
2+
3+
import org.joda.time.DateTime
4+
import org.joda.time.DateTimeZone
5+
6+
val A_DATE = DateTime("2018-04-19T02:20:00Z")
7+
val A_TIMEZONE = DateTimeZone.forID("Europe/Rome")!!

app/src/test/java/net/squanchy/schedule/FirestoreScheduleServiceTest.kt

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package net.squanchy.schedule
33
import io.reactivex.Observable
44
import io.reactivex.schedulers.Schedulers
55
import io.reactivex.subjects.BehaviorSubject
6+
import net.squanchy.A_DATE
7+
import net.squanchy.A_TIMEZONE
68
import net.squanchy.schedule.domain.view.Track
79
import net.squanchy.schedule.domain.view.aSchedule
810
import net.squanchy.schedule.domain.view.aSchedulePage
@@ -19,28 +21,21 @@ import net.squanchy.service.firebase.aFirestoreTrack
1921
import net.squanchy.service.firebase.model.schedule.FirestoreFavorite
2022
import net.squanchy.support.checksum.Checksum
2123
import net.squanchy.support.lang.Optional
22-
import org.joda.time.LocalDate
23-
import org.joda.time.LocalDateTime
2424
import org.junit.Before
2525
import org.junit.Rule
2626
import org.junit.Test
2727
import org.mockito.Mock
2828
import org.mockito.Mockito.`when`
2929
import org.mockito.junit.MockitoJUnit
3030
import org.mockito.junit.MockitoRule
31-
import java.util.Calendar
32-
import java.util.Date
33-
import java.util.TimeZone
3431

3532
class FirestoreScheduleServiceTest {
3633

3734
companion object {
38-
private val CALENDAR = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome"))
39-
40-
private val A_START_TIME = Date(123456)
41-
private val AN_END_TIME = Date(123999)
42-
private val A_LATER_START_TIME = Date(124000)
43-
private val A_LATER_END_TIME = Date(124999)
35+
private val A_START_TIME = A_DATE
36+
private val AN_END_TIME = A_START_TIME.plusMinutes(1)
37+
private val A_LATER_START_TIME = A_START_TIME.plusMinutes(10)
38+
private val A_LATER_END_TIME = A_LATER_START_TIME.plusMinutes(1)
4439
}
4540

4641
@Rule
@@ -64,14 +59,14 @@ class FirestoreScheduleServiceTest {
6459
@Before
6560
fun init() {
6661
scheduleService = FirestoreScheduleService(authService, dbService, tracksFilter, checksum)
67-
`when`(dbService.timezone()).thenReturn(Observable.just(aSchedule().timeZone))
62+
`when`(dbService.timezone()).thenReturn(Observable.just(A_TIMEZONE))
6863
`when`(checksum.getChecksumOf(aFirestoreSpeaker().id)).thenReturn(5466)
6964
}
7065

7166
@Test
7267
fun `should sort schedule pages by date`() {
73-
val firstDaySchedulePage = aFirestoreSchedulePage(day = aFirestoreDay(id = "1", date = A_START_TIME.dateOnly()))
74-
val secondDaySchedulePage = aFirestoreSchedulePage(day = aFirestoreDay(id = "2", date = A_START_TIME.plusOneDay().dateOnly()))
68+
val firstDaySchedulePage = aFirestoreSchedulePage(day = aFirestoreDay(id = "1", date = A_START_TIME.toDate()))
69+
val secondDaySchedulePage = aFirestoreSchedulePage(day = aFirestoreDay(id = "2", date = A_START_TIME.plusDays(1).toDate()))
7570
`when`(dbService.scheduleView()).thenReturn(Observable.just(listOf(firstDaySchedulePage, secondDaySchedulePage)))
7671
val allowedTracks = setOf(aTrack())
7772
`when`(tracksFilter.selectedTracks).thenReturn(BehaviorSubject.createDefault(allowedTracks))
@@ -81,9 +76,9 @@ class FirestoreScheduleServiceTest {
8176
.test()
8277
.assertValue(
8378
aSchedule(
84-
listOf(
85-
aSchedulePage(dayId = "1", date = LocalDate(A_START_TIME.dateOnly())),
86-
aSchedulePage(dayId = "2", date = LocalDate(A_START_TIME.plusOneDay().dateOnly()))
79+
pages = listOf(
80+
aSchedulePage(dayId = "1", date = A_START_TIME.toDateTime(A_TIMEZONE).toLocalDate()),
81+
aSchedulePage(dayId = "2", date = A_START_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDate())
8782
)
8883
)
8984
)
@@ -92,19 +87,31 @@ class FirestoreScheduleServiceTest {
9287
@Test
9388
fun `should sort events in each schedule page by start time`() {
9489
val firstDaySchedulePage = aFirestoreSchedulePage(
95-
day = aFirestoreDay(id = "1", date = A_START_TIME.dateOnly()),
90+
day = aFirestoreDay(id = "1", date = A_START_TIME.toDate()),
9691
events = listOf(
97-
aFirestoreEvent(id = "1", startTime = A_START_TIME, endTime = AN_END_TIME),
98-
aFirestoreEvent(id = "2", startTime = A_LATER_START_TIME, endTime = A_LATER_END_TIME),
99-
aFirestoreEvent(id = "3", startTime = A_START_TIME, endTime = AN_END_TIME)
92+
aFirestoreEvent(id = "1", startTime = A_START_TIME.toDate(), endTime = AN_END_TIME.toDate()),
93+
aFirestoreEvent(id = "2", startTime = A_LATER_START_TIME.toDate(), endTime = A_LATER_END_TIME.toDate()),
94+
aFirestoreEvent(id = "3", startTime = A_START_TIME.toDate(), endTime = AN_END_TIME.toDate())
10095
)
10196
)
10297
val secondDaySchedulePage = aFirestoreSchedulePage(
103-
day = aFirestoreDay(id = "2", date = A_START_TIME.plusOneDay().dateOnly()),
98+
day = aFirestoreDay(id = "2", date = A_START_TIME.plusDays(1).toDate()),
10499
events = listOf(
105-
aFirestoreEvent(id = "4", startTime = A_START_TIME.plusOneDay(), endTime = AN_END_TIME.plusOneDay()),
106-
aFirestoreEvent(id = "6", startTime = A_LATER_START_TIME.plusOneDay(), endTime = A_LATER_END_TIME.plusOneDay()),
107-
aFirestoreEvent(id = "5", startTime = A_START_TIME.plusOneDay(), endTime = AN_END_TIME.plusOneDay())
100+
aFirestoreEvent(
101+
id = "4",
102+
startTime = A_START_TIME.plusDays(1).toDate(),
103+
endTime = AN_END_TIME.plusDays(1).toDate()
104+
),
105+
aFirestoreEvent(
106+
id = "6",
107+
startTime = A_LATER_START_TIME.plusDays(1).toDate(),
108+
endTime = A_LATER_END_TIME.plusDays(1).toDate()
109+
),
110+
aFirestoreEvent(
111+
id = "5",
112+
startTime = A_START_TIME.plusDays(1).toDate(),
113+
endTime = AN_END_TIME.plusDays(1).toDate()
114+
)
108115
)
109116
)
110117
`when`(dbService.scheduleView()).thenReturn(Observable.just(listOf(firstDaySchedulePage, secondDaySchedulePage)))
@@ -121,42 +128,52 @@ class FirestoreScheduleServiceTest {
121128
.test()
122129
.assertValue(
123130
aSchedule(
124-
listOf(
131+
pages = listOf(
125132
aSchedulePage(
126133
dayId = "1",
127-
date = LocalDate(A_START_TIME.dateOnly()),
134+
date = A_START_TIME.toDateTime(A_TIMEZONE).toLocalDate(),
128135
events = listOf(
129-
anEvent(id = "1", numericId = 1, startTime = A_START_TIME.toLocalDateTime(), endTime = AN_END_TIME.toLocalDateTime()),
130-
anEvent(id = "3", numericId = 3, startTime = A_START_TIME.toLocalDateTime(), endTime = AN_END_TIME.toLocalDateTime()),
136+
anEvent(
137+
id = "1",
138+
numericId = 1,
139+
startTime = A_START_TIME.toDateTime(A_TIMEZONE).toLocalDateTime(),
140+
endTime = AN_END_TIME.toDateTime(A_TIMEZONE).toLocalDateTime()
141+
),
142+
anEvent(
143+
id = "3",
144+
numericId = 3,
145+
startTime = A_START_TIME.toDateTime(A_TIMEZONE).toLocalDateTime(),
146+
endTime = AN_END_TIME.toDateTime(A_TIMEZONE).toLocalDateTime()
147+
),
131148
anEvent(
132149
id = "2",
133150
numericId = 2,
134-
startTime = A_LATER_START_TIME.toLocalDateTime(),
135-
endTime = A_LATER_END_TIME.toLocalDateTime()
151+
startTime = A_LATER_START_TIME.toDateTime(A_TIMEZONE).toLocalDateTime(),
152+
endTime = A_LATER_END_TIME.toDateTime(A_TIMEZONE).toLocalDateTime()
136153
)
137154
)
138155
),
139156
aSchedulePage(
140157
dayId = "2",
141-
date = LocalDate(A_START_TIME.plusOneDay().dateOnly()),
158+
date = A_START_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDate(),
142159
events = listOf(
143160
anEvent(
144161
id = "4",
145162
numericId = 4,
146-
startTime = A_START_TIME.plusOneDay().toLocalDateTime(),
147-
endTime = AN_END_TIME.plusOneDay().toLocalDateTime()
163+
startTime = A_START_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime(),
164+
endTime = AN_END_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime()
148165
),
149166
anEvent(
150167
id = "5",
151168
numericId = 5,
152-
startTime = A_START_TIME.plusOneDay().toLocalDateTime(),
153-
endTime = AN_END_TIME.plusOneDay().toLocalDateTime()
169+
startTime = A_START_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime(),
170+
endTime = AN_END_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime()
154171
),
155172
anEvent(
156173
id = "6",
157174
numericId = 6,
158-
startTime = A_LATER_START_TIME.plusOneDay().toLocalDateTime(),
159-
endTime = A_LATER_END_TIME.plusOneDay().toLocalDateTime()
175+
startTime = A_LATER_START_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime(),
176+
endTime = A_LATER_END_TIME.plusDays(1).toDateTime(A_TIMEZONE).toLocalDateTime()
160177
)
161178
)
162179
)
@@ -185,7 +202,7 @@ class FirestoreScheduleServiceTest {
185202
.test()
186203
.assertValue(
187204
aSchedule(
188-
listOf(
205+
pages = listOf(
189206
aSchedulePage(
190207
events = listOf(
191208
anEvent(id = "1", numericId = 1, track = Optional.absent()),
@@ -218,7 +235,7 @@ class FirestoreScheduleServiceTest {
218235
.test()
219236
.assertValue(
220237
aSchedule(
221-
listOf(
238+
pages = listOf(
222239
aSchedulePage(
223240
events = listOf(
224241
anEvent(id = "A", numericId = 0)
@@ -246,7 +263,7 @@ class FirestoreScheduleServiceTest {
246263
.test()
247264
.assertValue(
248265
aSchedule(
249-
listOf(
266+
pages = listOf(
250267
aSchedulePage(
251268
events = listOf(
252269
anEvent(track = Optional.absent(), numericId = 1),
@@ -275,7 +292,7 @@ class FirestoreScheduleServiceTest {
275292
.test()
276293
.assertValue(
277294
aSchedule(
278-
listOf(
295+
pages = listOf(
279296
aSchedulePage(
280297
events = listOf(
281298
anEvent(track = Optional.absent(), numericId = 1),
@@ -302,7 +319,7 @@ class FirestoreScheduleServiceTest {
302319
.test()
303320
.assertValue(
304321
aSchedule(
305-
listOf(
322+
pages = listOf(
306323
aSchedulePage(events = emptyList())
307324
)
308325
)
@@ -326,7 +343,7 @@ class FirestoreScheduleServiceTest {
326343
.test()
327344
.assertValue(
328345
aSchedule(
329-
listOf(
346+
pages = listOf(
330347
aSchedulePage(
331348
events = listOf(
332349
anEvent(track = Optional.of(aTrack(id = "A")), numericId = 1),
@@ -356,7 +373,7 @@ class FirestoreScheduleServiceTest {
356373
.test()
357374
.assertValue(
358375
aSchedule(
359-
listOf(
376+
pages = listOf(
360377
aSchedulePage(
361378
events = listOf(
362379
anEvent(track = Optional.absent(), numericId = 1)
@@ -366,21 +383,4 @@ class FirestoreScheduleServiceTest {
366383
)
367384
)
368385
}
369-
370-
private fun Date.plusOneDay(): Date = CALENDAR.apply {
371-
clear()
372-
time = this@plusOneDay
373-
add(Calendar.DAY_OF_YEAR, 1)
374-
}.time
375-
376-
private fun Date.dateOnly(): Date = CALENDAR.apply {
377-
clear()
378-
time = this@dateOnly
379-
set(Calendar.HOUR, 0)
380-
set(Calendar.MINUTE, 0)
381-
set(Calendar.SECOND, 0)
382-
set(Calendar.MILLISECOND, 0)
383-
}.time
384-
385-
private fun Date.toLocalDateTime() = LocalDateTime(this)
386386
}

app/src/test/java/net/squanchy/schedule/domain/view/ScheduleFixtures.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.squanchy.schedule.domain.view
22

3+
import net.squanchy.A_DATE
4+
import net.squanchy.A_TIMEZONE
35
import net.squanchy.eventdetails.domain.view.ExperienceLevel
46
import net.squanchy.speaker.domain.view.Speaker
57
import net.squanchy.speaker.domain.view.aSpeaker
@@ -8,8 +10,6 @@ import org.joda.time.DateTimeZone
810
import org.joda.time.LocalDate
911
import org.joda.time.LocalDateTime
1012

11-
private val A_TIMEZONE = DateTimeZone.forID("Europe/Rome")
12-
1313
fun aSchedule(
1414
pages: List<SchedulePage> = listOf(aSchedulePage()),
1515
timezone: DateTimeZone = A_TIMEZONE
@@ -30,7 +30,7 @@ fun aSchedulePage(
3030

3131
fun aDay(
3232
id: String = "dayId",
33-
date: LocalDate = LocalDate(123456789, A_TIMEZONE)
33+
date: LocalDate = A_DATE.toDateTime(A_TIMEZONE).toLocalDate()
3434
) = Day(
3535
id = id,
3636
date = date
@@ -39,16 +39,16 @@ fun aDay(
3939
fun anEvent(
4040
id: String = "banana",
4141
numericId: Long = 1234,
42-
startTime: LocalDateTime = LocalDateTime(123456789),
43-
endTime: LocalDateTime = LocalDateTime(123459999),
42+
startTime: LocalDateTime = A_DATE.toDateTime(A_TIMEZONE).toLocalDateTime(),
43+
endTime: LocalDateTime = A_DATE.plusMinutes(1).toDateTime(A_TIMEZONE).toLocalDateTime(),
4444
title: String = "Hello \uD83C\uDF4C", // Yes, that's a banana emoji. You never know
4545
place: Optional<Place> = Optional.of(aPlace()),
4646
experienceLevel: Optional<ExperienceLevel> = Optional.of(ExperienceLevel.BEGINNER),
4747
speakers: List<Speaker> = listOf(aSpeaker()),
4848
type: Event.Type = Event.Type.KEYNOTE,
4949
description: Optional<String> = Optional.of("Now this is the story all about how\nMy life got flipped, turned upside down"),
5050
track: Optional<Track> = Optional.of(aTrack()),
51-
timeZone: DateTimeZone = DateTimeZone.forID("Europe/Rome"),
51+
timeZone: DateTimeZone = A_TIMEZONE,
5252
favorited: Boolean = false
5353
) = Event(
5454
id = id,

0 commit comments

Comments
 (0)