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()
}
}