package org.tasks.caldav import org.tasks.data.UUIDHelper import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.UninstallModules import kotlinx.coroutines.runBlocking import org.junit.Assert.* import org.junit.Test import org.tasks.data.entity.CaldavAccount import org.tasks.data.entity.CaldavCalendar import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_OWNER import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_READ_ONLY import org.tasks.data.dao.PrincipalDao import org.tasks.injection.ProductionModule import javax.inject.Inject @UninstallModules(ProductionModule::class) @HiltAndroidTest class SharingOwncloudTest : CaldavTest() { @Inject lateinit var principalDao: PrincipalDao private suspend fun setupAccount(user: String) { account = CaldavAccount( uuid = UUIDHelper.newUUID(), username = user, password = encryption.encrypt("password"), url = server.url("/remote.php/dav/calendars/$user/").toString(), ).let { it.copy(id = caldavDao.insert(it)) } } @Test fun calendarOwner() = runBlocking { setupAccount("user1") val calendar = CaldavCalendar( account = this@SharingOwncloudTest.account.uuid, ctag = "http://sabre.io/ns/sync/1", url = "${this@SharingOwncloudTest.account.url}test-shared/", ) caldavDao.insert(calendar) enqueue(OC_OWNER) sync() assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access) } @Test fun readOnly() = runBlocking { setupAccount("user2") val calendar = CaldavCalendar( account = this@SharingOwncloudTest.account.uuid, ctag = "http://sabre.io/ns/sync/2", url = "${this@SharingOwncloudTest.account.url}test-shared_shared_by_user1/", ) caldavDao.insert(calendar) enqueue(OC_READ_ONLY) sync() assertEquals(ACCESS_READ_ONLY, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access) } @Test fun principalForSharee() = runBlocking { setupAccount("user1") val calendar = CaldavCalendar( account = this@SharingOwncloudTest.account.uuid, ctag = "http://sabre.io/ns/sync/1", url = "${this@SharingOwncloudTest.account.url}test-shared/", ) caldavDao.insert(calendar) enqueue(OC_OWNER) sync() val principal = principalDao.getAll() .apply { assertTrue(size == 1) } .first() assertEquals(calendar.id, principal.list) assertEquals("principal:principals/users/user2", principal.href) assertEquals("user2", principal.name) assertEquals(CaldavCalendar.INVITE_ACCEPTED, principal.inviteStatus) assertEquals(ACCESS_READ_ONLY, principal.access.access) } @Test fun principalForOwner() = runBlocking { setupAccount("user2") val calendar = CaldavCalendar( account = this@SharingOwncloudTest.account.uuid, ctag = "http://sabre.io/ns/sync/2", url = "${this@SharingOwncloudTest.account.url}test-shared_shared_by_user1/", ) caldavDao.insert(calendar) enqueue(OC_READ_ONLY) sync() val principal = principalDao.getAll() .apply { assertTrue(size == 1) } .first() assertEquals(calendar.id, principal.list) assertEquals("principals/users/user1", principal.href) assertEquals(null, principal.displayName) assertEquals(CaldavCalendar.INVITE_ACCEPTED, principal.inviteStatus) assertEquals(ACCESS_OWNER, principal.access.access) } companion object { private val OC_OWNER = """ /remote.php/dav/calendars/user1/test-shared/ Test shared http://sabre.io/ns/sync/1 #0082c9 http://sabre.io/ns/sync/1 principals/users/user1 principal:principals/users/user2 user2 /remote.php/dav/principals/users/user1/ HTTP/1.1 200 OK HTTP/1.1 404 Not Found """.trimIndent() val OC_READ_ONLY = """ /remote.php/dav/calendars/user2/test-shared_shared_by_user1/ Test shared (user1) http://sabre.io/ns/sync/2 #0082c9 http://sabre.io/ns/sync/2 principals/users/user1 /remote.php/dav/principals/users/user2/ HTTP/1.1 200 OK HTTP/1.1 404 Not Found """.trimIndent() } }