Skip to content

Commit a02937d

Browse files
fix retrieve only writable calendars & improved tests
1 parent f4c121b commit a02937d

File tree

2 files changed

+65
-104
lines changed

2 files changed

+65
-104
lines changed

android/src/main/kotlin/sncf/connect/tech/eventide/CalendarImplem.kt

+21-28
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ class CalendarImplem(
5454

5555
val calendarUri = contentResolver.insert(uri, values)
5656
if (calendarUri != null) {
57-
val calendarId = calendarUri.lastPathSegment?.toLong()
57+
val calendarId = calendarUri.lastPathSegment
5858
if (calendarId != null) {
5959
val calendar = Calendar(
60-
id = calendarId.toString(),
60+
id = calendarId,
6161
title = title,
6262
color = color,
6363
isWritable = true,
@@ -119,22 +119,12 @@ class CalendarImplem(
119119
CalendarContract.Calendars.ACCOUNT_TYPE
120120
)
121121

122-
val (selection, selectionArgs) = Pair(onlyWritableCalendars, from).let { (onlyWritable, account) ->
123-
if (onlyWritable && account != null) {
124-
val selection = CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL + " >= ? AND " + CalendarContract.Calendars.ACCOUNT_NAME + " = ? AND " + CalendarContract.Calendars.ACCOUNT_TYPE + " = ?"
125-
val selectionArgs = arrayOf(CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR.toString(), account.name, account.type)
126-
return@let Pair(selection, selectionArgs)
127-
} else if (onlyWritable) {
128-
val selection = CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL + " >= ?"
129-
val selectionArgs = arrayOf(CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR.toString())
130-
return@let Pair(selection, selectionArgs)
131-
} else if (account != null) {
132-
val selection = CalendarContract.Calendars.ACCOUNT_NAME + " = ? AND " + CalendarContract.Calendars.ACCOUNT_TYPE + " = ?"
133-
val selectionArgs = arrayOf(account.name, account.type)
134-
return@let Pair(selection, selectionArgs)
135-
} else {
136-
return@let Pair(null, null)
137-
}
122+
var selection: String? = null
123+
var selectionArgs: Array<String>? = null
124+
125+
from?.let { account ->
126+
selection = CalendarContract.Calendars.ACCOUNT_NAME + " = ? AND " + CalendarContract.Calendars.ACCOUNT_TYPE + " = ?"
127+
selectionArgs = arrayOf(account.name, account.type)
138128
}
139129

140130
val cursor = contentResolver.query(calendarContentUri, projection, selection, selectionArgs, null)
@@ -149,18 +139,21 @@ class CalendarImplem(
149139
val accountName = it.getString(it.getColumnIndexOrThrow(CalendarContract.Calendars.ACCOUNT_NAME))
150140
val accountType = it.getString(it.getColumnIndexOrThrow(CalendarContract.Calendars.ACCOUNT_TYPE))
151141

152-
val calendar = Calendar(
153-
id = id,
154-
title = displayName,
155-
color = color,
156-
isWritable = accessLevel >= CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR,
157-
account = Account(
158-
name = accountName,
159-
type = accountType
142+
val isWritable = accessLevel >= CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR
143+
if (!onlyWritableCalendars || isWritable) {
144+
val calendar = Calendar(
145+
id = id,
146+
title = displayName,
147+
color = color,
148+
isWritable = isWritable,
149+
account = Account(
150+
name = accountName,
151+
type = accountType
152+
)
160153
)
161-
)
162154

163-
calendars.add(calendar)
155+
calendars.add(calendar)
156+
}
164157
}
165158
}
166159

android/src/test/kotlin/sncf/connect/tech/eventide/CalendarImplemTest.kt

+44-76
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,18 @@ class CalendarImplemTest {
8787

8888
var result: Result<Calendar>? = null
8989
val latch = CountDownLatch(1)
90-
calendarImplem.createCalendar("Test Calendar", 0xFF0000, Account("1", "Test Account")) {
90+
calendarImplem.createCalendar("Test Calendar", 0x00FF00, Account("1", "Test Account")) {
9191
result = it
9292
latch.countDown()
9393
}
9494

9595
latch.await()
9696

9797
assertTrue(result!!.isSuccess)
98+
assertTrue(result!!.getOrNull()!!.title == "Test Calendar")
99+
assertTrue(result!!.getOrNull()!!.color.toInt() == 0x00FF00)
100+
assertTrue(result!!.getOrNull()!!.account.name == "1")
101+
assertTrue(result!!.getOrNull()!!.account.type == "Test Account")
98102
assertEquals("1", result!!.getOrNull()?.id)
99103
}
100104

@@ -110,6 +114,7 @@ class CalendarImplemTest {
110114
}
111115

112116
assertTrue(result!!.isFailure)
117+
assertNull(result!!.getOrNull())
113118
}
114119

115120
@Test
@@ -129,6 +134,7 @@ class CalendarImplemTest {
129134
latch.await()
130135

131136
assertTrue(result!!.isFailure)
137+
assertNull(result!!.getOrNull())
132138
}
133139

134140
@Test
@@ -150,6 +156,7 @@ class CalendarImplemTest {
150156
latch.await()
151157

152158
assertTrue(result!!.isFailure)
159+
assertNull(result!!.getOrNull())
153160
}
154161

155162
@Test
@@ -158,11 +165,11 @@ class CalendarImplemTest {
158165
firstArg<(Boolean) -> Unit>().invoke(true)
159166
}
160167
val cursor = mockk<Cursor>(relaxed = true)
161-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
162-
every { cursor.moveToNext() } returnsMany listOf(true, false)
163-
every { cursor.getLong(any()) } returns 1L
164-
every { cursor.getString(any()) } returns "Test Calendar"
165-
every { cursor.getLong(any()) } returns 0xFF0000
168+
every { contentResolver.query(calendarContentUri, any(), any(), any(), any()) } returns cursor
169+
every { cursor.moveToNext() } returnsMany listOf(true, true, false)
170+
every { cursor.getLong(any()) } returnsMany listOf(1L, 0xFF0000, 2L, 0xFF0000)
171+
every { cursor.getString(any()) } returnsMany listOf("Test Calendar", "Test Account", "Test Account Type", "Test Calendar2", "Test Account", "Test Account Type")
172+
every { cursor.getInt(any()) } returnsMany listOf(CalendarContract.Calendars.CAL_ACCESS_OWNER, CalendarContract.Calendars.CAL_ACCESS_OWNER)
166173

167174
var result: Result<List<Calendar>>? = null
168175
val latch = CountDownLatch(1)
@@ -174,42 +181,35 @@ class CalendarImplemTest {
174181
latch.await()
175182

176183
assertTrue(result!!.isSuccess)
177-
assertEquals(1, result!!.getOrNull()?.size)
184+
assertEquals(2, result!!.getOrNull()?.size)
185+
assertEquals("Test Calendar", result!!.getOrNull()?.get(0)?.title)
186+
assertEquals("Test Calendar2", result!!.getOrNull()?.get(1)?.title)
178187
}
179188

180189
@Test
181-
fun retrieveCalendars_onlyWritableAndAccountFilter_appliesCorrectSelection() = runTest {
190+
fun retrieveCalendars_withGrantedPermission_returnsOnlyWritableCalendars() = runTest {
182191
every { permissionHandler.requestReadPermission(any()) } answers {
183192
firstArg<(Boolean) -> Unit>().invoke(true)
184193
}
185194
val cursor = mockk<Cursor>(relaxed = true)
186-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
187-
every { cursor.moveToNext() } returns false
195+
every { contentResolver.query(calendarContentUri, any(), any(), any(), any()) } returns cursor
196+
every { cursor.moveToNext() } returnsMany listOf(true, true, false)
197+
every { cursor.getLong(any()) } returnsMany listOf(1L, 0xFF0000, 2L, 0xFF0000)
198+
every { cursor.getString(any()) } returnsMany listOf("Test Calendar", "Test Account", "Test Account Type", "Test Calendar", "Test Account", "Test Account Type")
199+
every { cursor.getInt(any()) } returnsMany listOf(CalendarContract.Calendars.CAL_ACCESS_OWNER, CalendarContract.Calendars.CAL_ACCESS_READ)
188200

189201
var result: Result<List<Calendar>>? = null
190202
val latch = CountDownLatch(1)
191-
calendarImplem.retrieveCalendars(true, Account("testAccount", "testType")) {
203+
calendarImplem.retrieveCalendars(true, null) {
192204
result = it
193205
latch.countDown()
194206
}
195207

196208
latch.await()
197209

198-
val expectedSelection = "${CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL} >= ? AND ${CalendarContract.Calendars.ACCOUNT_NAME} = ? AND ${CalendarContract.Calendars.ACCOUNT_TYPE} = ?"
199-
val expectedSelectionArgs = arrayOf(CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR.toString(), "testAccount", "testType")
200-
201-
verify {
202-
contentResolver.query(
203-
calendarContentUri,
204-
any(),
205-
expectedSelection,
206-
expectedSelectionArgs,
207-
any()
208-
)
209-
}
210-
211210
assertTrue(result!!.isSuccess)
212-
assertTrue(result!!.getOrNull()?.isEmpty()!!)
211+
assertEquals(1, result!!.getOrNull()?.size)
212+
assertEquals("Test Calendar", result!!.getOrNull()?.get(0)?.title)
213213
}
214214

215215
@Test
@@ -218,7 +218,7 @@ class CalendarImplemTest {
218218
firstArg<(Boolean) -> Unit>().invoke(true)
219219
}
220220
val cursor = mockk<Cursor>(relaxed = true)
221-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
221+
every { contentResolver.query(calendarContentUri, any(), any(), any(), any()) } returns cursor
222222
every { cursor.moveToNext() } returns false
223223

224224
var result: Result<List<Calendar>>? = null
@@ -247,48 +247,13 @@ class CalendarImplemTest {
247247
assertTrue(result!!.getOrNull()?.isEmpty()!!)
248248
}
249249

250-
@Test
251-
fun retrieveCalendars_onlyWritable_appliesCorrectSelection() = runTest {
252-
every { permissionHandler.requestReadPermission(any()) } answers {
253-
firstArg<(Boolean) -> Unit>().invoke(true)
254-
}
255-
val cursor = mockk<Cursor>(relaxed = true)
256-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
257-
every { cursor.moveToNext() } returns false
258-
259-
var result: Result<List<Calendar>>? = null
260-
val latch = CountDownLatch(1)
261-
calendarImplem.retrieveCalendars(true, null) {
262-
result = it
263-
latch.countDown()
264-
}
265-
266-
latch.await()
267-
268-
val expectedSelection = "${CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL} >= ?"
269-
val expectedSelectionArgs = arrayOf(CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR.toString())
270-
271-
verify {
272-
contentResolver.query(
273-
calendarContentUri,
274-
any(),
275-
expectedSelection,
276-
expectedSelectionArgs,
277-
any()
278-
)
279-
}
280-
281-
assertTrue(result!!.isSuccess)
282-
assertTrue(result!!.getOrNull()?.isEmpty()!!)
283-
}
284-
285250
@Test
286251
fun retrieveCalendars_noFilter_appliesCorrectSelection() = runTest {
287252
every { permissionHandler.requestReadPermission(any()) } answers {
288253
firstArg<(Boolean) -> Unit>().invoke(true)
289254
}
290255
val cursor = mockk<Cursor>(relaxed = true)
291-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
256+
every { contentResolver.query(calendarContentUri, any(), any(), any(), any()) } returns cursor
292257
every { cursor.moveToNext() } returns false
293258

294259
var result: Result<List<Calendar>>? = null
@@ -334,7 +299,7 @@ class CalendarImplemTest {
334299
firstArg<(Boolean) -> Unit>().invoke(true)
335300
}
336301
val cursor = mockk<Cursor>(relaxed = true)
337-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
302+
every { contentResolver.query(calendarContentUri, any(), any(), any(), any()) } returns cursor
338303
every { cursor.moveToNext() } returns false
339304

340305
var result: Result<List<Calendar>>? = null
@@ -355,7 +320,7 @@ class CalendarImplemTest {
355320
every { permissionHandler.requestWritePermission(any()) } answers {
356321
firstArg<(Boolean) -> Unit>().invoke(true)
357322
}
358-
every { contentResolver.delete(any(), any(), any()) } returns 1
323+
every { contentResolver.delete(calendarContentUri, any(), any()) } returns 1
359324

360325
var result: Result<Unit>? = null
361326
val latch = CountDownLatch(1)
@@ -388,7 +353,7 @@ class CalendarImplemTest {
388353
every { permissionHandler.requestWritePermission(any()) } answers {
389354
firstArg<(Boolean) -> Unit>().invoke(true)
390355
}
391-
every { contentResolver.delete(any(), any(), any()) } throws Exception("Delete failed")
356+
every { contentResolver.delete(calendarContentUri, any(), any()) } throws Exception("Delete failed")
392357

393358
var result: Result<Unit>? = null
394359
val latch = CountDownLatch(1)
@@ -407,7 +372,7 @@ class CalendarImplemTest {
407372
every { permissionHandler.requestWritePermission(any()) } answers {
408373
firstArg<(Boolean) -> Unit>().invoke(true)
409374
}
410-
every { contentResolver.delete(any(), any(), any()) } returns 0
375+
every { contentResolver.delete(calendarContentUri, any(), any()) } returns 0
411376

412377
var result: Result<Unit>? = null
413378
val latch = CountDownLatch(1)
@@ -517,11 +482,14 @@ class CalendarImplemTest {
517482
firstArg<(Boolean) -> Unit>().invoke(true)
518483
}
519484
val cursor = mockk<Cursor>(relaxed = true)
520-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
485+
486+
CalendarContract.Events.ALL_DAY
487+
every { contentResolver.query(eventContentUri, any(), any(), any(), any()) } returns cursor
521488
every { cursor.moveToNext() } returnsMany listOf(true, false)
522-
every { cursor.getLong(any()) } returns 1L
523-
every { cursor.getString(any()) } returns "Test Event"
489+
every { cursor.getLong(cursor.getColumnIndexOrThrow(CalendarContract.Events._ID)) } returns 1L
490+
every { cursor.getString(any()) } returnsMany listOf("Test Event", "Description")
524491
every { cursor.getLong(any()) } returns 0L
492+
every { cursor.getInt(cursor.getColumnIndexOrThrow(CalendarContract.Events.ALL_DAY)) } returns 0
525493

526494
var result: Result<List<Event>>? = null
527495
val latch = CountDownLatch(1)
@@ -557,7 +525,7 @@ class CalendarImplemTest {
557525
firstArg<(Boolean) -> Unit>().invoke(true)
558526
}
559527
val cursor = mockk<Cursor>(relaxed = true)
560-
every { contentResolver.query(any(), any(), any(), any(), any()) } returns cursor
528+
every { contentResolver.query(eventContentUri, any(), any(), any(), any()) } returns cursor
561529
every { cursor.moveToNext() } returns false
562530

563531
var result: Result<List<Event>>? = null
@@ -578,7 +546,7 @@ class CalendarImplemTest {
578546
every { permissionHandler.requestReadPermission(any()) } answers {
579547
firstArg<(Boolean) -> Unit>().invoke(true)
580548
}
581-
every { contentResolver.query(any(), any(), any(), any(), any()) } throws Exception("Query failed")
549+
every { contentResolver.query(eventContentUri, any(), any(), any(), any()) } throws Exception("Query failed")
582550

583551
var result: Result<List<Event>>? = null
584552
val latch = CountDownLatch(1)
@@ -597,7 +565,7 @@ class CalendarImplemTest {
597565
every { permissionHandler.requestWritePermission(any()) } answers {
598566
firstArg<(Boolean) -> Unit>().invoke(true)
599567
}
600-
every { contentResolver.delete(any(), any(), any()) } returns 1
568+
every { contentResolver.delete(eventContentUri, any(), any()) } returns 1
601569

602570
var result: Result<Unit>? = null
603571
val latch = CountDownLatch(1)
@@ -630,7 +598,7 @@ class CalendarImplemTest {
630598
every { permissionHandler.requestWritePermission(any()) } answers {
631599
firstArg<(Boolean) -> Unit>().invoke(true)
632600
}
633-
every { contentResolver.delete(any(), any(), any()) } throws Exception("Delete failed")
601+
every { contentResolver.delete(eventContentUri, any(), any()) } throws Exception("Delete failed")
634602

635603
var result: Result<Unit>? = null
636604
val latch = CountDownLatch(1)
@@ -649,7 +617,7 @@ class CalendarImplemTest {
649617
every { permissionHandler.requestWritePermission(any()) } answers {
650618
firstArg<(Boolean) -> Unit>().invoke(true)
651619
}
652-
every { contentResolver.delete(any(), any(), any()) } returns 0
620+
every { contentResolver.delete(eventContentUri, any(), any()) } returns 0
653621

654622
var result: Result<Unit>? = null
655623
val latch = CountDownLatch(1)
@@ -789,7 +757,7 @@ class CalendarImplemTest {
789757
every { permissionHandler.requestWritePermission(any()) } answers {
790758
firstArg<(Boolean) -> Unit>().invoke(true)
791759
}
792-
every { contentResolver.delete(any(), any(), any()) } throws Exception("Delete failed")
760+
every { contentResolver.delete(eventContentUri, any(), any()) } throws Exception("Delete failed")
793761

794762
var result: Result<Event>? = null
795763
val latch = CountDownLatch(1)
@@ -810,7 +778,7 @@ class CalendarImplemTest {
810778
every { permissionHandler.requestWritePermission(any()) } answers {
811779
firstArg<(Boolean) -> Unit>().invoke(true)
812780
}
813-
every { contentResolver.delete(any(), any(), any()) } returns 0
781+
every { contentResolver.delete(remindersContentUri, any(), any()) } returns 0
814782

815783
var result: Result<Event>? = null
816784
val latch = CountDownLatch(1)

0 commit comments

Comments
 (0)