Add more access level tests

pull/1381/head
Alex Baker 5 years ago
parent 682038399c
commit a8091ba913

@ -34,7 +34,7 @@ class CaldavSynchronizerTest : CaldavTest() {
@Test @Test
fun setMessageOnError() = runBlocking { fun setMessageOnError() = runBlocking {
enqueueFailure(500) enqueue()
synchronizer.sync(account) synchronizer.sync(account)
@ -49,7 +49,6 @@ class CaldavSynchronizerTest : CaldavTest() {
url = "${this@CaldavSynchronizerTest.account.url}test-shared/" url = "${this@CaldavSynchronizerTest.account.url}test-shared/"
}) })
enqueue(OC_SHARE_PROPFIND) enqueue(OC_SHARE_PROPFIND)
enqueueFailure()
synchronizer.sync(account) synchronizer.sync(account)
@ -70,7 +69,6 @@ class CaldavSynchronizerTest : CaldavTest() {
with(CALENDAR, calendar.uuid) with(CALENDAR, calendar.uuid)
)) ))
enqueue(OC_SHARE_PROPFIND, OC_SHARE_REPORT) enqueue(OC_SHARE_PROPFIND, OC_SHARE_REPORT)
enqueueFailure()
synchronizer.sync(account) synchronizer.sync(account)

@ -33,15 +33,21 @@ abstract class CaldavTest : InjectingTestCase() {
@After @After
fun after() = server.shutdown() fun after() = server.shutdown()
protected fun enqueue(vararg responses: String) = responses.forEach { protected fun enqueue(vararg responses: String) {
server.enqueue( responses.forEach {
server.enqueue(
MockResponse() MockResponse()
.setResponseCode(207) .setResponseCode(207)
.setHeader("Content-Type", "text/xml; charset=\"utf-8\"") .setHeader("Content-Type", "text/xml; charset=\"utf-8\"")
.setBody(it) .setBody(it)
) )
}
server.enqueue(MockResponse().setResponseCode(500))
} }
protected fun enqueueFailure(code: Int = 500) = companion object {
server.enqueue(MockResponse().setResponseCode(code)) init {
CaldavSynchronizer.registerFactories()
}
}
} }

@ -5,50 +5,60 @@ import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.Assert.* import org.junit.Assert.*
import org.junit.Before
import org.junit.Test import org.junit.Test
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
@UninstallModules(ProductionModule::class) @UninstallModules(ProductionModule::class)
@HiltAndroidTest @HiltAndroidTest
class OwnCloudSynchronizationTest : CaldavTest() { class SharingOwncloudTest : CaldavTest() {
@Before private suspend fun setupAccount(user: String) {
override fun setUp() = runBlocking {
super.setUp()
account = CaldavAccount().apply { account = CaldavAccount().apply {
uuid = UUIDHelper.newUUID() uuid = UUIDHelper.newUUID()
username = "username" username = user
password = encryption.encrypt("password") password = encryption.encrypt("password")
url = server.url("/remote.php/dav/calendars/user1/").toString() url = server.url("/remote.php/dav/calendars/$user/").toString()
id = caldavDao.insert(this) id = caldavDao.insert(this)
} }
} }
@Test @Test
fun calendarOwner() = runBlocking { fun calendarOwner() = runBlocking {
setupAccount("user1")
val calendar = CaldavCalendar().apply { val calendar = CaldavCalendar().apply {
account = this@OwnCloudSynchronizationTest.account.uuid account = this@SharingOwncloudTest.account.uuid
ctag = "http://sabre.io/ns/sync/1" ctag = "http://sabre.io/ns/sync/1"
url = "${this@OwnCloudSynchronizationTest.account.url}test-shared/" url = "${this@SharingOwncloudTest.account.url}test-shared/"
caldavDao.insert(this) caldavDao.insert(this)
} }
enqueue(OC_OWNER) enqueue(OC_OWNER)
enqueueFailure()
synchronizer.sync(account) synchronizer.sync(account)
assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access) assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
} }
companion object { @Test
init { fun readOnly() = runBlocking {
CaldavSynchronizer.registerFactories() setupAccount("user2")
val calendar = CaldavCalendar().apply {
account = this@SharingOwncloudTest.account.uuid
ctag = "http://sabre.io/ns/sync/2"
url = "${this@SharingOwncloudTest.account.url}test-shared_shared_by_user1/"
caldavDao.insert(this)
} }
enqueue(OC_READ_ONLY)
synchronizer.sync(account)
assertEquals(ACCESS_READ_ONLY, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
}
companion object {
private val OC_OWNER = """ private val OC_OWNER = """
<?xml version="1.0"?> <?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" <d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav"
@ -130,5 +140,61 @@ class OwnCloudSynchronizationTest : CaldavTest() {
</d:response> </d:response>
</d:multistatus> </d:multistatus>
""".trimIndent() """.trimIndent()
val OC_READ_ONLY = """
<?xml version="1.0"?>
<d:multistatus xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/"
xmlns:d="DAV:" xmlns:nc="http://nextcloud.org/ns"
xmlns:oc="http://owncloud.org/ns" xmlns:s="http://sabredav.org/ns">
<d:response>
<d:href>/remote.php/dav/calendars/user2/test-shared_shared_by_user1/</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection />
<cal:calendar />
</d:resourcetype>
<d:displayname>Test shared (user1)</d:displayname>
<cal:supported-calendar-component-set>
<cal:comp name="VTODO" />
</cal:supported-calendar-component-set>
<cs:getctag>http://sabre.io/ns/sync/2</cs:getctag>
<x1:calendar-color xmlns:x1="http://apple.com/ns/ical/">#0082c9</x1:calendar-color>
<d:sync-token>http://sabre.io/ns/sync/2</d:sync-token>
<oc:owner-principal>principals/users/user1</oc:owner-principal>
<oc:invite />
<d:current-user-privilege-set>
<d:privilege>
<d:write-properties />
</d:privilege>
<d:privilege>
<d:read />
</d:privilege>
<d:privilege>
<d:read-acl />
</d:privilege>
<d:privilege>
<d:read-current-user-privilege-set />
</d:privilege>
<d:privilege>
<cal:read-free-busy />
</d:privilege>
</d:current-user-privilege-set>
<d:current-user-principal>
<d:href>/remote.php/dav/principals/users/user2/</d:href>
</d:current-user-principal>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
<d:propstat>
<d:prop>
<d:share-access />
<d:invite />
</d:prop>
<d:status>HTTP/1.1 404 Not Found</d:status>
</d:propstat>
</d:response>
</d:multistatus>
""".trimIndent()
} }
} }

@ -0,0 +1,242 @@
package org.tasks.caldav
import com.todoroo.astrid.helper.UUIDHelper
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Test
import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_WRITE
import org.tasks.injection.ProductionModule
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
class SharingSabredavTest : CaldavTest() {
private suspend fun setupAccount(user: String) {
account = CaldavAccount().apply {
uuid = UUIDHelper.newUUID()
username = user
password = encryption.encrypt("password")
url = server.url("/calendars/$user/").toString()
id = caldavDao.insert(this)
}
}
@Test
fun calendarOwner() = runBlocking {
setupAccount("user1")
val calendar = CaldavCalendar().apply {
account = this@SharingSabredavTest.account.uuid
ctag = "http://sabre.io/ns/sync/1"
url = "${this@SharingSabredavTest.account.url}940468858232147861/"
caldavDao.insert(this)
}
enqueue(SD_OWNER)
synchronizer.sync(account)
assertEquals(
ACCESS_OWNER,
caldavDao.getCalendarByUuid(calendar.uuid!!)?.access
)
}
@Test
fun calendarSharee() = runBlocking {
setupAccount("user2")
val calendar = CaldavCalendar().apply {
account = this@SharingSabredavTest.account.uuid
ctag = "http://sabre.io/ns/sync/1"
url = "${this@SharingSabredavTest.account.url}c3853d69-cb7a-476c-a23b-30ffd70f110b/"
caldavDao.insert(this)
}
enqueue(SD_SHAREE)
synchronizer.sync(account)
assertEquals(
ACCESS_READ_WRITE,
caldavDao.getCalendarByUuid(calendar.uuid!!)?.access
)
}
companion object {
private val SD_OWNER = """
<?xml version="1.0"?>
<d:multistatus xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/"
xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
<d:response>
<d:href>/calendars/user1/940468858232147861/</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection />
<cal:calendar />
</d:resourcetype>
<d:displayname>Shared</d:displayname>
<cal:supported-calendar-component-set>
<cal:comp name="VTODO" />
</cal:supported-calendar-component-set>
<cs:getctag>http://sabre.io/ns/sync/1</cs:getctag>
<d:sync-token>http://sabre.io/ns/sync/1</d:sync-token>
<d:share-access>
<d:shared-owner />
</d:share-access>
<d:invite>
<d:sharee>
<d:href>mailto:user@example.com</d:href>
<d:prop>
<d:displayname>Example User</d:displayname>
</d:prop>
<d:share-access>
<d:read-write />
</d:share-access>
<d:invite-accepted />
</d:sharee>
</d:invite>
<d:current-user-privilege-set>
<d:privilege>
<cal:read-free-busy />
</d:privilege>
<d:privilege>
<d:read />
</d:privilege>
<d:privilege>
<d:read-acl />
</d:privilege>
<d:privilege>
<d:read-current-user-privilege-set />
</d:privilege>
<d:privilege>
<d:write-properties />
</d:privilege>
<d:privilege>
<d:write />
</d:privilege>
<d:privilege>
<d:write-content />
</d:privilege>
<d:privilege>
<d:unlock />
</d:privilege>
<d:privilege>
<d:bind />
</d:privilege>
<d:privilege>
<d:unbind />
</d:privilege>
<d:privilege>
<d:write-acl />
</d:privilege>
<d:privilege>
<d:share />
</d:privilege>
</d:current-user-privilege-set>
<d:current-user-principal>
<d:href>/principals/user1/</d:href>
</d:current-user-principal>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
<d:propstat>
<d:prop>
<x1:calendar-color xmlns:x1="http://apple.com/ns/ical/" />
<x2:owner-principal xmlns:x2="http://owncloud.org/ns" />
<x2:invite xmlns:x2="http://owncloud.org/ns" />
</d:prop>
<d:status>HTTP/1.1 404 Not Found</d:status>
</d:propstat>
</d:response>
</d:multistatus>
""".trimIndent()
private val SD_SHAREE = """
<?xml version="1.0"?>
<d:multistatus xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/"
xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
<d:response>
<d:href>/calendars/user2/c3853d69-cb7a-476c-a23b-30ffd70f110b/
</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection />
<cal:calendar />
</d:resourcetype>
<d:displayname>Shared</d:displayname>
<cal:supported-calendar-component-set>
<cal:comp name="VTODO" />
</cal:supported-calendar-component-set>
<cs:getctag>http://sabre.io/ns/sync/1</cs:getctag>
<d:sync-token>http://sabre.io/ns/sync/1</d:sync-token>
<d:share-access>
<d:read-write />
</d:share-access>
<d:invite>
<d:sharee>
<d:href>/principals/user1</d:href>
<d:prop />
<d:share-access>
<d:shared-owner />
</d:share-access>
<d:invite-accepted />
</d:sharee>
</d:invite>
<d:current-user-privilege-set>
<d:privilege>
<cal:read-free-busy />
</d:privilege>
<d:privilege>
<d:read />
</d:privilege>
<d:privilege>
<d:read-acl />
</d:privilege>
<d:privilege>
<d:read-current-user-privilege-set />
</d:privilege>
<d:privilege>
<d:write-properties />
</d:privilege>
<d:privilege>
<d:write />
</d:privilege>
<d:privilege>
<d:write-content />
</d:privilege>
<d:privilege>
<d:unlock />
</d:privilege>
<d:privilege>
<d:bind />
</d:privilege>
<d:privilege>
<d:unbind />
</d:privilege>
<d:privilege>
<d:write-acl />
</d:privilege>
</d:current-user-privilege-set>
<d:current-user-principal>
<d:href>/principals/user2/</d:href>
</d:current-user-principal>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
<d:propstat>
<d:prop>
<x1:calendar-color xmlns:x1="http://apple.com/ns/ical/" />
<x2:owner-principal xmlns:x2="http://owncloud.org/ns" />
<x2:invite xmlns:x2="http://owncloud.org/ns" />
</d:prop>
<d:status>HTTP/1.1 404 Not Found</d:status>
</d:propstat>
</d:response>
</d:multistatus>
""".trimIndent()
}
}
Loading…
Cancel
Save