-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathAndroidEventTest.kt
More file actions
225 lines (194 loc) · 8.04 KB
/
AndroidEventTest.kt
File metadata and controls
225 lines (194 loc) · 8.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package at.bitfire.ical4android
import android.accounts.Account
import android.content.ContentProviderClient
import android.content.ContentUris
import android.provider.CalendarContract.ACCOUNT_TYPE_LOCAL
import android.provider.CalendarContract.AUTHORITY
import android.provider.CalendarContract.Events
import androidx.core.content.contentValuesOf
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import at.bitfire.ical4android.impl.TestCalendar
import at.bitfire.ical4android.util.MiscUtils.closeCompat
import at.bitfire.synctools.icalendar.Css3Color
import at.bitfire.synctools.storage.calendar.AndroidCalendar
import at.bitfire.synctools.storage.calendar.AndroidEvent2
import at.bitfire.synctools.test.InitCalendarProviderRule
import net.fortuna.ical4j.model.DateTime
import net.fortuna.ical4j.model.component.VAlarm
import net.fortuna.ical4j.model.property.Attendee
import net.fortuna.ical4j.model.property.DtEnd
import net.fortuna.ical4j.model.property.DtStart
import net.fortuna.ical4j.model.property.Organizer
import net.fortuna.ical4j.model.property.Status
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import java.net.URI
import java.time.Duration
class AndroidEventTest {
@get:Rule
val initCalendarProviderRule: TestRule = InitCalendarProviderRule.initialize()
private val testAccount = Account(javaClass.name, ACCOUNT_TYPE_LOCAL)
lateinit var client: ContentProviderClient
private lateinit var calendar: AndroidCalendar
private lateinit var legacyCalendar: LegacyAndroidCalendar
@Before
fun prepare() {
val context = getInstrumentation().targetContext
client = context.contentResolver.acquireContentProviderClient(AUTHORITY)!!
calendar = TestCalendar.findOrCreate(testAccount, client, withColors = true)
legacyCalendar = LegacyAndroidCalendar(calendar)
}
@After
fun shutdown() {
calendar.delete()
client.closeCompat()
}
@Test
fun testConstructor_ContentValues() {
val e = AndroidEvent(
calendar, contentValuesOf(
Events._ID to 123,
Events._SYNC_ID to "some-ical.ics",
AndroidEvent2.COLUMN_ETAG to "some-etag",
AndroidEvent2.COLUMN_SCHEDULE_TAG to "some-schedule-tag",
AndroidEvent2.COLUMN_FLAGS to 45
)
)
assertEquals(123L, e.id)
assertEquals("some-ical.ics", e.syncId)
assertEquals("some-etag", e.eTag)
assertEquals("some-schedule-tag", e.scheduleTag)
assertEquals(45, e.flags)
}
@Test
fun testUpdateEvent() {
// add test event without reminder
val event = Event()
event.uid = "sample1@testAddEvent"
event.summary = "Sample event"
event.dtStart = DtStart("20150502T120000Z")
event.dtEnd = DtEnd("20150502T130000Z")
event.organizer = Organizer(URI("mailto:organizer@example.com"))
val uri = legacyCalendar.add(event)
// update test event in calendar
val testEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri))!!
val event2 = legacyCalendar.getEvent(testEvent.id)!!
event2.summary = "Updated event"
// add data rows
event2.alarms += VAlarm(Duration.parse("-P1DT2H3M4S"))
event2.attendees += Attendee(URI("mailto:user@example.com"))
val uri2 = testEvent.update(event2)
// event should have been updated
assertEquals(ContentUris.parseId(uri), ContentUris.parseId(uri2))
// read again and verify result
val updatedEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri2))!!
try {
val event3 = legacyCalendar.getEvent(updatedEvent.id)!!
assertEquals(event2.summary, event3.summary)
assertEquals(1, event3.alarms.size)
assertEquals(1, event3.attendees.size)
} finally {
updatedEvent.delete()
}
}
@Test
fun testUpdateEvent_ResetColor() {
// add event with color
val event = Event().apply {
uid = "sample1@testAddEvent"
dtStart = DtStart(DateTime())
color = Css3Color.silver
}
val uri = legacyCalendar.add(event)
val id = ContentUris.parseId(uri)
// verify that it has color
val beforeUpdate = legacyCalendar.getAndroidEvent(calendar, id)!!
assertNotNull(legacyCalendar.getEvent(beforeUpdate.id)!!.color)
// update: reset color
event.color = null
beforeUpdate.update(event)
// verify that it doesn't have color anymore
val afterUpdate = legacyCalendar.getAndroidEvent(calendar, id)!!
assertNull(legacyCalendar.getEvent(afterUpdate.id)!!.color)
}
@Test
fun testUpdateEvent_UpdateStatusFromNull() {
val event = Event()
event.uid = "sample1@testAddEvent"
event.summary = "Sample event with STATUS"
event.dtStart = DtStart("20150502T120000Z")
event.dtEnd = DtEnd("20150502T130000Z")
val uri = legacyCalendar.add(event)
// update test event in calendar
val testEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri))!!
val event2 = legacyCalendar.getEvent(testEvent.id)!!
event2.summary = "Sample event without STATUS"
event2.status = Status.VEVENT_CONFIRMED
val uri2 = testEvent.update(event2)
// event should have been updated
assertEquals(ContentUris.parseId(uri), ContentUris.parseId(uri2))
// read again and verify result
val updatedEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri2))!!
try {
val event3 = legacyCalendar.getEvent(updatedEvent.id)!!
assertEquals(Status.VEVENT_CONFIRMED, event3.status)
} finally {
updatedEvent.delete()
}
}
@Test
fun testUpdateEvent_UpdateStatusToNull() {
val event = Event()
event.uid = "sample1@testAddEvent"
event.summary = "Sample event with STATUS"
event.dtStart = DtStart("20150502T120000Z")
event.dtEnd = DtEnd("20150502T130000Z")
event.status = Status.VEVENT_CONFIRMED
val uri = legacyCalendar.add(event)
// update test event in calendar
val testEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri))!!
val event2 = legacyCalendar.getEvent(testEvent.id)!!
event2.summary = "Sample event without STATUS"
event2.status = null
val uri2 = testEvent.update(event2)
// event should have been deleted and inserted again
assertNotEquals(ContentUris.parseId(uri), ContentUris.parseId(uri2))
// read again and verify result
val updatedEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri2))!!
try {
val event3 = legacyCalendar.getEvent(updatedEvent.id)!!
assertNull(event3.status)
} finally {
updatedEvent.delete()
}
}
@Test
fun testTransaction() {
val event = Event()
event.uid = "sample1@testTransaction"
event.summary = "an event"
event.dtStart = DtStart("20150502T120000Z")
event.dtEnd = DtEnd("20150502T130000Z")
for (i in 0 until 20)
event.attendees += Attendee(URI("mailto:att$i@example.com"))
val uri = legacyCalendar.add(event)
val testEvent = legacyCalendar.getAndroidEvent(calendar, ContentUris.parseId(uri))!!
try {
assertEquals(20, legacyCalendar.getEvent(testEvent.id)!!.attendees.size)
} finally {
testEvent.delete()
}
}
}