diff options
author | Ricki Hirner <hirner@bitfire.at> | 2021-09-11 15:49:04 +0300 |
---|---|---|
committer | Ricki Hirner <hirner@bitfire.at> | 2021-09-11 15:49:04 +0300 |
commit | 396537a4f8519a31484d4d090ccca25b1fdb42d2 (patch) | |
tree | 22c0882b5ee0858ab35dae1bf50dd804eb321eb0 | |
parent | 8d7b5d4a47a1ff7b8bb8a17aa8f8d3f2359d55f8 (diff) |
Attendees: fix problem where attendees with account owner email ("me") was always inserted as organizer; tests
5 files changed, 778 insertions, 8 deletions
diff --git a/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt b/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt new file mode 100644 index 0000000..df507e8 --- /dev/null +++ b/src/androidTest/java/at/bitfire/ical4android/AttendeeMappingsTest.kt @@ -0,0 +1,727 @@ +package at.bitfire.ical4android + +import android.content.ContentValues +import android.net.Uri +import android.provider.CalendarContract.Attendees +import net.fortuna.ical4j.model.Parameter +import net.fortuna.ical4j.model.parameter.CuType +import net.fortuna.ical4j.model.parameter.Role +import net.fortuna.ical4j.model.property.Attendee +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class AttendeeMappingsTest { + + companion object { + const val DEFAULT_ORGANIZER = "organizer@example.com" + + val CuTypeFancy = CuType("X-FANCY") + val RoleFancy = Role("X-FANCY") + } + + + @Test + fun testAndroidToICalendar_TypeRequired_RelationshipAttendee() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeRequired_RelationshipOrganizer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeRequired_RelationshipPerformer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER) + }) { + assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeRequired_RelationshipSpeaker() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertEquals(Role.CHAIR, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeRequired_RelationshipNone() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_REQUIRED) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE) + }) { + assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + + @Test + fun testAndroidToICalendar_TypeOptional_RelationshipAttendee() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeOptional_RelationshipOrganizer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeOptional_RelationshipPerformer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER) + }) { + assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE)) + assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeOptional_RelationshipSpeaker() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertEquals(Role.CHAIR, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeOptional_RelationshipNone() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE) + }) { + assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE)) + assertEquals(Role.OPT_PARTICIPANT, getParameter(Parameter.ROLE)) + } + } + + + @Test + fun testAndroidToICalendar_TypeNone_RelationshipAttendee() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeNone_RelationshipOrganizer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeNone_RelationshipPerformer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER) + }) { + assertEquals(CuType.GROUP, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeNone_RelationshipSpeaker() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER) + }) { + assertNull(getParameter(Parameter.CUTYPE)) + assertEquals(Role.CHAIR, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeNone_RelationshipNone() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE) + }) { + assertEquals(CuType.UNKNOWN, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + + @Test + fun testAndroidToICalendar_TypeResource_RelationshipAttendee() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE) + }) { + assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeResource_RelationshipOrganizer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER) + }) { + assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeResource_RelationshipPerformer() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_PERFORMER) + }) { + assertEquals(CuType.ROOM, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeResource_RelationshipSpeaker() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_SPEAKER) + }) { + assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE)) + assertEquals(Role.CHAIR, getParameter(Parameter.ROLE)) + } + } + + @Test + fun testAndroidToICalendar_TypeResource_RelationshipNone() { + testAndroidToICalendar(ContentValues().apply { + put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_RESOURCE) + put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_NONE) + }) { + assertEquals(CuType.RESOURCE, getParameter(Parameter.CUTYPE)) + assertNull(getParameter(Parameter.ROLE)) + } + } + + + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com")) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeNone_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeIndividual_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.INDIVIDUAL) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeUnknown_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.UNKNOWN) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeGroup_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.GROUP) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeResource_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.RESOURCE) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_NONE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeRoom_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuType.ROOM) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_RESOURCE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_PERFORMER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleNone() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleChair() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + parameters.add(Role.CHAIR) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_SPEAKER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleReqParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + parameters.add(Role.REQ_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleOptParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + parameters.add(Role.OPT_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_OPTIONAL, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleNonParticipant() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + parameters.add(Role.NON_PARTICIPANT) + }) { + assertEquals(Attendees.TYPE_NONE, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + @Test + fun testICalendarToAndroid_CuTypeXValue_RoleXValue() { + testICalendarToAndroid(Attendee("mailto:attendee@example.com").apply { + parameters.add(CuTypeFancy) + parameters.add(RoleFancy) + }) { + assertEquals(Attendees.TYPE_REQUIRED, values[Attendees.ATTENDEE_TYPE]) + assertEquals(Attendees.RELATIONSHIP_ATTENDEE, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + @Test + fun testICalendarToAndroid_Organizer() { + testICalendarToAndroid(Attendee("mailto:$DEFAULT_ORGANIZER")) { + assertEquals(Attendees.RELATIONSHIP_ORGANIZER, values[Attendees.ATTENDEE_RELATIONSHIP]) + } + } + + + + // helpers + + private fun testICalendarToAndroid(attendee: Attendee, organizer: String = DEFAULT_ORGANIZER, test: (BatchOperation.CpoBuilder).() -> Unit) { + val row = BatchOperation.CpoBuilder.newInsert(Uri.EMPTY) + AttendeeMappings.iCalendarToAndroid(attendee, row, organizer) + test(row) + } + + private fun testAndroidToICalendar(values: ContentValues, test: (Attendee).() -> Unit) { + val attendee = Attendee() + AttendeeMappings.androidToICalendar(values, attendee) + test(attendee) + } + +}
\ No newline at end of file diff --git a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt index 42e748b..e52a3ca 100644 --- a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt +++ b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt @@ -534,7 +534,10 @@ abstract class AndroidEvent( event.alarms.forEach { insertReminder(batch, idxEvent, it) } // add attendees - event.attendees.forEach { insertAttendee(batch, idxEvent, it) } + val organizer = event.organizerEmail ?: + /* no ORGANIZER, use current account owner as ORGANIZER */ + calendar.ownerAccount ?: calendar.account.name + event.attendees.forEach { insertAttendee(batch, idxEvent, it, organizer) } // add extended properties // CATEGORIES @@ -610,7 +613,7 @@ abstract class AndroidEvent( exception.alarms.forEach { insertReminder(batch, idxException, it) } // add exception attendees - exception.attendees.forEach { insertAttendee(batch, idxException, it) } + exception.attendees.forEach { insertAttendee(batch, idxException, it, organizer) } } return idxEvent @@ -911,7 +914,7 @@ abstract class AndroidEvent( batch.enqueue(builder) } - protected open fun insertAttendee(batch: BatchOperation, idxEvent: Int?, attendee: Attendee) { + protected open fun insertAttendee(batch: BatchOperation, idxEvent: Int?, attendee: Attendee, organizer: String) { val builder = CpoBuilder .newInsert(calendar.syncAdapterURI(Attendees.CONTENT_URI)) .withEventId(Attendees.EVENT_ID, idxEvent) @@ -935,7 +938,7 @@ abstract class AndroidEvent( } // type/relation mapping is complex and thus outsourced to AttendeeMappings - AttendeeMappings.iCalendarToAndroid(attendee, builder, calendar.ownerAccount ?: calendar.account.name) + AttendeeMappings.iCalendarToAndroid(attendee, builder, organizer) val status = when(attendee.getParameter(Parameter.PARTSTAT) as? PartStat) { PartStat.ACCEPTED -> Attendees.ATTENDEE_STATUS_ACCEPTED diff --git a/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt b/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt index ac90cdf..8c321f2 100644 --- a/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt +++ b/src/main/java/at/bitfire/ical4android/AttendeeMappings.kt @@ -95,14 +95,14 @@ object AttendeeMappings { * ¹ custom/unknown ROLE values must be treated as REQ-PARTICIPANT * ² custom/unknown CUTYPE values must be treated as UNKNOWN * - * When [attendee] is the ORGANIZER, [CalendarContract.Attendees.ATTENDEE_RELATIONSHIP] = RELATIONSHIP_ATTENDEE + * When [attendee] is the [organizer], [CalendarContract.Attendees.ATTENDEE_RELATIONSHIP] = RELATIONSHIP_ATTENDEE * is replaced by [CalendarContract.Attendees.RELATIONSHIP_ORGANIZER]. * * @param attendee iCalendar attendee to map * @param row builder for the Android attendee row - * @param owner email address of account owner ([CalendarContract.Calendars.OWNER_ACCOUNT]); used to determine whether [attendee] is the organizer + * @param organizer email address of iCalendar ORGANIZER; used to determine whether [attendee] is the organizer */ - fun iCalendarToAndroid(attendee: Attendee, row: BatchOperation.CpoBuilder, owner: String) { + fun iCalendarToAndroid(attendee: Attendee, row: BatchOperation.CpoBuilder, organizer: String) { val type: Int var relationship: Int @@ -155,7 +155,8 @@ object AttendeeMappings { uri.schemeSpecificPart else attendee.getParameter<Email>(Parameter.EMAIL)?.value - if (email == owner) + + if (email == organizer) relationship = Attendees.RELATIONSHIP_ORGANIZER } diff --git a/src/main/java/at/bitfire/ical4android/Event.kt b/src/main/java/at/bitfire/ical4android/Event.kt index da72c1d..c432511 100644 --- a/src/main/java/at/bitfire/ical4android/Event.kt +++ b/src/main/java/at/bitfire/ical4android/Event.kt @@ -17,6 +17,7 @@ import net.fortuna.ical4j.model.Calendar import net.fortuna.ical4j.model.TimeZone import net.fortuna.ical4j.model.component.VAlarm import net.fortuna.ical4j.model.component.VEvent +import net.fortuna.ical4j.model.parameter.Email import net.fortuna.ical4j.model.property.* import java.io.IOException import java.io.OutputStream @@ -316,4 +317,18 @@ class Event: ICalendar() { return event } + + val organizerEmail: String? + get() { + var email: String? = null + organizer?.let { organizer -> + val uri = organizer.calAddress + email = if (uri.scheme.equals("mailto", true)) + uri.schemeSpecificPart + else + organizer.getParameter<Email>(Parameter.EMAIL)?.value + } + return email + } + } diff --git a/src/test/java/at/bitfire/ical4android/EventTest.kt b/src/test/java/at/bitfire/ical4android/EventTest.kt index 01604af..a2ce504 100644 --- a/src/test/java/at/bitfire/ical4android/EventTest.kt +++ b/src/test/java/at/bitfire/ical4android/EventTest.kt @@ -280,6 +280,30 @@ class EventTest { } + // methods / fields + + @Test + fun testOrganizerEmail_None() { + assertNull(Event().organizerEmail) + } + + @Test + fun testOrganizerEmail_EmailParameter() { + assertEquals("organizer@example.com", Event().apply { + organizer = Organizer("SomeFancyOrganizer").apply { + parameters.add(Email("organizer@example.com")) + } + }.organizerEmail) + } + + @Test + fun testOrganizerEmail_MailtoValue() { + assertEquals("organizer@example.com", Event().apply { + organizer = Organizer("mailto:organizer@example.com") + }.organizerEmail) + } + + // helpers private fun findEvent(events: Iterable<Event>, uid: String): Event { |