From d8543e85ccf85839b395402f54a56b0c5140d118 Mon Sep 17 00:00:00 2001 From: Aaron de Mello Date: Tue, 12 Aug 2025 09:40:51 -0400 Subject: [PATCH] feat: add dedicated conferencing provider enums for create and update operations --- CHANGELOG.md | 18 + .../com/nylas/models/ConferencingProvider.kt | 13 +- .../CreateEventAutoConferencingProvider.kt | 17 + .../CreateEventManualConferencingProvider.kt | 26 ++ .../com/nylas/models/CreateEventRequest.kt | 62 ++- .../UpdateEventAutoConferencingProvider.kt | 17 + .../UpdateEventManualConferencingProvider.kt | 26 ++ .../com/nylas/models/UpdateEventRequest.kt | 68 +++- .../kotlin/com/nylas/resources/EventsTests.kt | 367 ++++++++++++++++++ 9 files changed, 597 insertions(+), 17 deletions(-) create mode 100644 src/main/kotlin/com/nylas/models/CreateEventAutoConferencingProvider.kt create mode 100644 src/main/kotlin/com/nylas/models/CreateEventManualConferencingProvider.kt create mode 100644 src/main/kotlin/com/nylas/models/UpdateEventAutoConferencingProvider.kt create mode 100644 src/main/kotlin/com/nylas/models/UpdateEventManualConferencingProvider.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 971dd570..10bff023 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Nylas Java SDK Changelog +## [Unreleased] + +### Added +* `CreateEventAutoConferencingProvider` enum for autocreate conferencing providers in event creation +* `CreateEventManualConferencingProvider` enum for manual conferencing providers in event creation +* `UpdateEventAutoConferencingProvider` enum for autocreate conferencing providers in event updates +* `UpdateEventManualConferencingProvider` enum for manual conferencing providers in event updates + +### Changed +* Enhanced `CreateEventRequest.Conferencing` to use dedicated provider enums while maintaining backward compatibility +* Enhanced `UpdateEventRequest.Conferencing` to use dedicated provider enums while maintaining backward compatibility + +### Deprecated +* `CreateEventRequest.Conferencing.Autocreate.fromConferencingProvider()` - Use `CreateEventAutoConferencingProvider` instead +* `CreateEventRequest.Conferencing.Details.fromConferencingProvider()` - Use `CreateEventManualConferencingProvider` instead +* `UpdateEventRequest.Conferencing.Autocreate.fromConferencingProvider()` - Use `UpdateEventAutoConferencingProvider` instead +* `UpdateEventRequest.Conferencing.Details.fromConferencingProvider()` - Use `UpdateEventManualConferencingProvider` instead + ## [2.12.0] ### Added diff --git a/src/main/kotlin/com/nylas/models/ConferencingProvider.kt b/src/main/kotlin/com/nylas/models/ConferencingProvider.kt index 2c62adc3..6065dd98 100644 --- a/src/main/kotlin/com/nylas/models/ConferencingProvider.kt +++ b/src/main/kotlin/com/nylas/models/ConferencingProvider.kt @@ -6,23 +6,20 @@ import com.squareup.moshi.Json * Enum for the different conferencing providers. */ enum class ConferencingProvider { - @Json(name = "Zoom Meeting") - ZOOM_MEETING, - @Json(name = "Google Meet") GOOGLE_MEET, + @Json(name = "GoToMeeting") + GOTOMEETING, + @Json(name = "Microsoft Teams") MICROSOFT_TEAMS, @Json(name = "WebEx") WEBEX, - @Json(name = "GoToMeeting") - GOTOMEETING, - - @Json(name = "skypeForConsumer") - SKYPE_FOR_CONSUMER, + @Json(name = "Zoom Meeting") + ZOOM_MEETING, @Json(name = "unknown") UNKNOWN, diff --git a/src/main/kotlin/com/nylas/models/CreateEventAutoConferencingProvider.kt b/src/main/kotlin/com/nylas/models/CreateEventAutoConferencingProvider.kt new file mode 100644 index 00000000..1b1d247f --- /dev/null +++ b/src/main/kotlin/com/nylas/models/CreateEventAutoConferencingProvider.kt @@ -0,0 +1,17 @@ +package com.nylas.models + +import com.squareup.moshi.Json + +/** + * Enum for the different conferencing providers that can be used to auto-create a meeting. + */ +enum class CreateEventAutoConferencingProvider { + @Json(name = "Google Meet") + GOOGLE_MEET, + + @Json(name = "Zoom Meeting") + ZOOM_MEETING, + + @Json(name = "Microsoft Teams") + MICROSOFT_TEAMS, +} diff --git a/src/main/kotlin/com/nylas/models/CreateEventManualConferencingProvider.kt b/src/main/kotlin/com/nylas/models/CreateEventManualConferencingProvider.kt new file mode 100644 index 00000000..ec924e79 --- /dev/null +++ b/src/main/kotlin/com/nylas/models/CreateEventManualConferencingProvider.kt @@ -0,0 +1,26 @@ +package com.nylas.models + +import com.squareup.moshi.Json + +/** + * Enum for the different conferencing providers that can be used to manually create a meeting. + */ +enum class CreateEventManualConferencingProvider { + @Json(name = "Google Meet") + GOOGLE_MEET, + + @Json(name = "Zoom Meeting") + ZOOM_MEETING, + + @Json(name = "Microsoft Teams") + MICROSOFT_TEAMS, + + @Json(name = "Teams for Business") + TEAMS_FOR_BUSINESS, + + @Json(name = "Skype for Business") + SKYPE_FOR_BUSINESS, + + @Json(name = "Skype for Consumer") + SKYPE_FOR_CONSUMER, +} diff --git a/src/main/kotlin/com/nylas/models/CreateEventRequest.kt b/src/main/kotlin/com/nylas/models/CreateEventRequest.kt index 56f90664..ec4c3ea1 100644 --- a/src/main/kotlin/com/nylas/models/CreateEventRequest.kt +++ b/src/main/kotlin/com/nylas/models/CreateEventRequest.kt @@ -321,14 +321,41 @@ data class CreateEventRequest( * The conferencing provider. */ @Json(name = "provider") - val provider: ConferencingProvider, + val provider: CreateEventAutoConferencingProvider, /** * Empty dict to indicate an intention to autocreate a video link. * Additional provider settings may be included in autocreate.settings, but Nylas does not validate these. */ @Json(name = "autocreate") val autocreate: Map = emptyMap(), - ) : Conferencing() + ) : Conferencing() { + companion object { + /** + * Create an Autocreate conferencing object using the original ConferencingProvider enum. + * @param provider The conferencing provider from the original enum + * @param autocreate Empty dict to indicate an intention to autocreate a video link + * @return Autocreate object with converted provider + * @deprecated Use CreateEventAutoConferencingProvider instead. This method will be removed in a future version. + */ + @Deprecated( + message = "Use CreateEventAutoConferencingProvider instead of ConferencingProvider", + replaceWith = ReplaceWith("Autocreate(CreateEventAutoConferencingProvider.fromConferencingProvider(provider), autocreate)"), + ) + @JvmStatic + fun fromConferencingProvider( + provider: ConferencingProvider, + autocreate: Map = emptyMap(), + ): Autocreate { + val newProvider = when (provider) { + ConferencingProvider.GOOGLE_MEET -> CreateEventAutoConferencingProvider.GOOGLE_MEET + ConferencingProvider.ZOOM_MEETING -> CreateEventAutoConferencingProvider.ZOOM_MEETING + ConferencingProvider.MICROSOFT_TEAMS -> CreateEventAutoConferencingProvider.MICROSOFT_TEAMS + else -> throw IllegalArgumentException("Provider $provider is not supported for autocreate conferencing. Use CreateEventAutoConferencingProvider instead.") + } + return Autocreate(newProvider, autocreate) + } + } + } /** * Class representation of a conferencing details object @@ -338,13 +365,42 @@ data class CreateEventRequest( * The conferencing provider. */ @Json(name = "provider") - val provider: ConferencingProvider, + val provider: CreateEventManualConferencingProvider, /** * The conferencing details */ @Json(name = "details") val details: Config, ) : Conferencing() { + companion object { + /** + * Create a Details conferencing object using the original ConferencingProvider enum. + * @param provider The conferencing provider from the original enum + * @param details The conferencing details config + * @return Details object with converted provider + * @deprecated Use CreateEventManualConferencingProvider instead. This method will be removed in a future version. + */ + @Deprecated( + message = "Use CreateEventManualConferencingProvider instead of ConferencingProvider", + replaceWith = ReplaceWith("Details(CreateEventManualConferencingProvider.fromConferencingProvider(provider), details)"), + ) + @JvmStatic + fun fromConferencingProvider( + provider: ConferencingProvider, + details: Config, + ): Details { + val newProvider = when (provider) { + ConferencingProvider.GOOGLE_MEET -> CreateEventManualConferencingProvider.GOOGLE_MEET + ConferencingProvider.ZOOM_MEETING -> CreateEventManualConferencingProvider.ZOOM_MEETING + ConferencingProvider.MICROSOFT_TEAMS -> CreateEventManualConferencingProvider.MICROSOFT_TEAMS + ConferencingProvider.GOTOMEETING -> throw IllegalArgumentException("GoToMeeting is not supported in CreateEventManualConferencingProvider. Use the new enum directly.") + ConferencingProvider.WEBEX -> throw IllegalArgumentException("WebEx is not supported in CreateEventManualConferencingProvider. Use the new enum directly.") + ConferencingProvider.UNKNOWN -> throw IllegalArgumentException("Unknown provider is not supported for event creation. Use CreateEventManualConferencingProvider instead.") + } + return Details(newProvider, details) + } + } + /** * Class representation of a conferencing details config object * @property meetingCode The conferencing meeting code. Used for Zoom. diff --git a/src/main/kotlin/com/nylas/models/UpdateEventAutoConferencingProvider.kt b/src/main/kotlin/com/nylas/models/UpdateEventAutoConferencingProvider.kt new file mode 100644 index 00000000..b6ff420c --- /dev/null +++ b/src/main/kotlin/com/nylas/models/UpdateEventAutoConferencingProvider.kt @@ -0,0 +1,17 @@ +package com.nylas.models + +import com.squareup.moshi.Json + +/** + * Enum for the different conferencing providers that can be used to auto-create a meeting when updating events. + */ +enum class UpdateEventAutoConferencingProvider { + @Json(name = "Google Meet") + GOOGLE_MEET, + + @Json(name = "Zoom Meeting") + ZOOM_MEETING, + + @Json(name = "Microsoft Teams") + MICROSOFT_TEAMS, +} diff --git a/src/main/kotlin/com/nylas/models/UpdateEventManualConferencingProvider.kt b/src/main/kotlin/com/nylas/models/UpdateEventManualConferencingProvider.kt new file mode 100644 index 00000000..29ca80e7 --- /dev/null +++ b/src/main/kotlin/com/nylas/models/UpdateEventManualConferencingProvider.kt @@ -0,0 +1,26 @@ +package com.nylas.models + +import com.squareup.moshi.Json + +/** + * Enum for the different conferencing providers that can be used to manually create a meeting when updating events. + */ +enum class UpdateEventManualConferencingProvider { + @Json(name = "Google Meet") + GOOGLE_MEET, + + @Json(name = "Zoom Meeting") + ZOOM_MEETING, + + @Json(name = "Microsoft Teams") + MICROSOFT_TEAMS, + + @Json(name = "Teams for Business") + TEAMS_FOR_BUSINESS, + + @Json(name = "Skype for Business") + SKYPE_FOR_BUSINESS, + + @Json(name = "Skype for Consumer") + SKYPE_FOR_CONSUMER, +} diff --git a/src/main/kotlin/com/nylas/models/UpdateEventRequest.kt b/src/main/kotlin/com/nylas/models/UpdateEventRequest.kt index f40b6921..6075af95 100644 --- a/src/main/kotlin/com/nylas/models/UpdateEventRequest.kt +++ b/src/main/kotlin/com/nylas/models/UpdateEventRequest.kt @@ -354,7 +354,7 @@ data class UpdateEventRequest( * The conferencing provider. */ @Json(name = "provider") - val provider: ConferencingProvider? = null, + val provider: UpdateEventAutoConferencingProvider? = null, /** * Empty dict to indicate an intention to autocreate a video link. * Additional provider settings may be included in autocreate.settings, but Nylas does not validate these. @@ -362,11 +362,38 @@ data class UpdateEventRequest( @Json(name = "autocreate") val autocreate: Map? = null, ) : Conferencing() { + companion object { + /** + * Create an Autocreate conferencing object using the original ConferencingProvider enum. + * @param provider The conferencing provider from the original enum + * @param autocreate Empty dict to indicate an intention to autocreate a video link + * @return Autocreate object with converted provider + * @deprecated Use UpdateEventAutoConferencingProvider instead. This method will be removed in a future version. + */ + @Deprecated( + message = "Use UpdateEventAutoConferencingProvider instead of ConferencingProvider", + replaceWith = ReplaceWith("Autocreate(UpdateEventAutoConferencingProvider.fromConferencingProvider(provider), autocreate)"), + ) + @JvmStatic + fun fromConferencingProvider( + provider: ConferencingProvider, + autocreate: Map? = null, + ): Autocreate { + val newProvider = when (provider) { + ConferencingProvider.GOOGLE_MEET -> UpdateEventAutoConferencingProvider.GOOGLE_MEET + ConferencingProvider.ZOOM_MEETING -> UpdateEventAutoConferencingProvider.ZOOM_MEETING + ConferencingProvider.MICROSOFT_TEAMS -> UpdateEventAutoConferencingProvider.MICROSOFT_TEAMS + else -> throw IllegalArgumentException("Provider $provider is not supported for autocreate conferencing. Use UpdateEventAutoConferencingProvider instead.") + } + return Autocreate(newProvider, autocreate) + } + } + /** * Builder for [Autocreate]. */ class Builder { - private var provider: ConferencingProvider? = null + private var provider: UpdateEventAutoConferencingProvider? = null private var autocreate: Map? = null /** @@ -374,7 +401,7 @@ data class UpdateEventRequest( * @param provider The conferencing provider. * @return The builder. */ - fun provider(provider: ConferencingProvider) = apply { this.provider = provider } + fun provider(provider: UpdateEventAutoConferencingProvider) = apply { this.provider = provider } /** * Set the autocreate settings. @@ -400,13 +427,42 @@ data class UpdateEventRequest( * The conferencing provider. */ @Json(name = "provider") - val provider: ConferencingProvider? = null, + val provider: UpdateEventManualConferencingProvider? = null, /** * The conferencing details */ @Json(name = "details") val details: Config? = null, ) : Conferencing() { + companion object { + /** + * Create a Details conferencing object using the original ConferencingProvider enum. + * @param provider The conferencing provider from the original enum + * @param details The conferencing details config + * @return Details object with converted provider + * @deprecated Use UpdateEventManualConferencingProvider instead. This method will be removed in a future version. + */ + @Deprecated( + message = "Use UpdateEventManualConferencingProvider instead of ConferencingProvider", + replaceWith = ReplaceWith("Details(UpdateEventManualConferencingProvider.fromConferencingProvider(provider), details)"), + ) + @JvmStatic + fun fromConferencingProvider( + provider: ConferencingProvider, + details: Config? = null, + ): Details { + val newProvider = when (provider) { + ConferencingProvider.GOOGLE_MEET -> UpdateEventManualConferencingProvider.GOOGLE_MEET + ConferencingProvider.ZOOM_MEETING -> UpdateEventManualConferencingProvider.ZOOM_MEETING + ConferencingProvider.MICROSOFT_TEAMS -> UpdateEventManualConferencingProvider.MICROSOFT_TEAMS + ConferencingProvider.GOTOMEETING -> throw IllegalArgumentException("GoToMeeting is not supported in UpdateEventManualConferencingProvider. Use the new enum directly.") + ConferencingProvider.WEBEX -> throw IllegalArgumentException("WebEx is not supported in UpdateEventManualConferencingProvider. Use the new enum directly.") + ConferencingProvider.UNKNOWN -> throw IllegalArgumentException("Unknown provider is not supported for event updates. Use UpdateEventManualConferencingProvider instead.") + } + return Details(newProvider, details) + } + } + /** * Class representation of a conferencing details config object * @property meetingCode The conferencing meeting code. Used for Zoom. @@ -474,7 +530,7 @@ data class UpdateEventRequest( * Builder for [Details]. */ class Builder { - private var provider: ConferencingProvider? = null + private var provider: UpdateEventManualConferencingProvider? = null private var details: Config? = null /** @@ -482,7 +538,7 @@ data class UpdateEventRequest( * @param provider The conferencing provider. * @return The builder. */ - fun provider(provider: ConferencingProvider) = apply { this.provider = provider } + fun provider(provider: UpdateEventManualConferencingProvider) = apply { this.provider = provider } /** * Set the conferencing details. diff --git a/src/test/kotlin/com/nylas/resources/EventsTests.kt b/src/test/kotlin/com/nylas/resources/EventsTests.kt index 32483bbd..d343fed6 100644 --- a/src/test/kotlin/com/nylas/resources/EventsTests.kt +++ b/src/test/kotlin/com/nylas/resources/EventsTests.kt @@ -222,6 +222,278 @@ class EventsTests { val whenDate = event.getWhen() as When.Date assertEquals("2024-06-18", whenDate.date) } + + @Test + fun `CreateEventAutoConferencingProvider serializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventAutoConferencingProvider::class.java) + + assertEquals("\"Google Meet\"", adapter.toJson(CreateEventAutoConferencingProvider.GOOGLE_MEET)) + assertEquals("\"Zoom Meeting\"", adapter.toJson(CreateEventAutoConferencingProvider.ZOOM_MEETING)) + assertEquals("\"Microsoft Teams\"", adapter.toJson(CreateEventAutoConferencingProvider.MICROSOFT_TEAMS)) + } + + @Test + fun `CreateEventAutoConferencingProvider deserializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventAutoConferencingProvider::class.java) + + assertEquals(CreateEventAutoConferencingProvider.GOOGLE_MEET, adapter.fromJson("\"Google Meet\"")) + assertEquals(CreateEventAutoConferencingProvider.ZOOM_MEETING, adapter.fromJson("\"Zoom Meeting\"")) + assertEquals(CreateEventAutoConferencingProvider.MICROSOFT_TEAMS, adapter.fromJson("\"Microsoft Teams\"")) + } + + @Test + fun `CreateEventManualConferencingProvider serializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventManualConferencingProvider::class.java) + + assertEquals("\"Google Meet\"", adapter.toJson(CreateEventManualConferencingProvider.GOOGLE_MEET)) + assertEquals("\"Zoom Meeting\"", adapter.toJson(CreateEventManualConferencingProvider.ZOOM_MEETING)) + assertEquals("\"Microsoft Teams\"", adapter.toJson(CreateEventManualConferencingProvider.MICROSOFT_TEAMS)) + assertEquals("\"Teams for Business\"", adapter.toJson(CreateEventManualConferencingProvider.TEAMS_FOR_BUSINESS)) + assertEquals("\"Skype for Business\"", adapter.toJson(CreateEventManualConferencingProvider.SKYPE_FOR_BUSINESS)) + assertEquals("\"Skype for Consumer\"", adapter.toJson(CreateEventManualConferencingProvider.SKYPE_FOR_CONSUMER)) + } + + @Test + fun `CreateEventManualConferencingProvider deserializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventManualConferencingProvider::class.java) + + assertEquals(CreateEventManualConferencingProvider.GOOGLE_MEET, adapter.fromJson("\"Google Meet\"")) + assertEquals(CreateEventManualConferencingProvider.ZOOM_MEETING, adapter.fromJson("\"Zoom Meeting\"")) + assertEquals(CreateEventManualConferencingProvider.MICROSOFT_TEAMS, adapter.fromJson("\"Microsoft Teams\"")) + assertEquals(CreateEventManualConferencingProvider.TEAMS_FOR_BUSINESS, adapter.fromJson("\"Teams for Business\"")) + assertEquals(CreateEventManualConferencingProvider.SKYPE_FOR_BUSINESS, adapter.fromJson("\"Skype for Business\"")) + assertEquals(CreateEventManualConferencingProvider.SKYPE_FOR_CONSUMER, adapter.fromJson("\"Skype for Consumer\"")) + } + + @Test + fun `CreateEventRequest with Autocreate conferencing serializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventRequest::class.java) + val createEventRequest = CreateEventRequest( + whenObj = CreateEventRequest.When.Time(1620000000), + title = "Test Event", + conferencing = CreateEventRequest.Conferencing.Autocreate( + provider = CreateEventAutoConferencingProvider.GOOGLE_MEET, + autocreate = mapOf("setting1" to "value1"), + ), + ) + + val json = adapter.toJson(createEventRequest) + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(json)!! + + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Google Meet", conferencing["provider"]) + assertEquals(mapOf("setting1" to "value1"), conferencing["autocreate"]) + } + + @Test + fun `CreateEventRequest with Details conferencing serializes properly`() { + val adapter = JsonHelper.moshi().adapter(CreateEventRequest::class.java) + val createEventRequest = CreateEventRequest( + whenObj = CreateEventRequest.When.Time(1620000000), + title = "Test Event", + conferencing = CreateEventRequest.Conferencing.Details( + provider = CreateEventManualConferencingProvider.ZOOM_MEETING, + details = CreateEventRequest.Conferencing.Details.Config( + url = "https://zoom.us/j/123456789", + meetingCode = "123456789", + password = "secret", + ), + ), + ) + + val json = adapter.toJson(createEventRequest) + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(json)!! + + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Zoom Meeting", conferencing["provider"]) + val details = conferencing["details"] as Map<*, *> + assertEquals("https://zoom.us/j/123456789", details["url"]) + assertEquals("123456789", details["meeting_code"]) + assertEquals("secret", details["password"]) + } + + @Test + fun `UpdateEventRequest with Autocreate conferencing serializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventRequest::class.java) + val updateEventRequest = UpdateEventRequest( + title = "Updated Event", + conferencing = UpdateEventRequest.Conferencing.Autocreate( + provider = UpdateEventAutoConferencingProvider.MICROSOFT_TEAMS, + autocreate = emptyMap(), + ), + ) + + val json = adapter.toJson(updateEventRequest) + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(json)!! + + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Microsoft Teams", conferencing["provider"]) + assertEquals(emptyMap(), conferencing["autocreate"]) + } + + @Test + fun `UpdateEventRequest with Details conferencing serializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventRequest::class.java) + val updateEventRequest = UpdateEventRequest( + title = "Updated Event", + conferencing = UpdateEventRequest.Conferencing.Details( + provider = UpdateEventManualConferencingProvider.TEAMS_FOR_BUSINESS, + details = UpdateEventRequest.Conferencing.Details.Config( + url = "https://teams.microsoft.com/join/123", + pin = "123456", + ), + ), + ) + + val json = adapter.toJson(updateEventRequest) + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(json)!! + + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Teams for Business", conferencing["provider"]) + val details = conferencing["details"] as Map<*, *> + assertEquals("https://teams.microsoft.com/join/123", details["url"]) + assertEquals("123456", details["pin"]) + } + + @Test + fun `Event with existing ConferencingProvider still works properly`() { + // This test verifies that the original Event model continues to work with the original ConferencingProvider enum + // The Event model uses the original Conferencing sealed class, not the new CreateEvent/UpdateEvent ones + val adapter = JsonHelper.moshi().adapter(Event::class.java) + val jsonBuffer = Buffer().writeUtf8( + """ + { + "id": "event-123", + "grant_id": "grant-456", + "calendar_id": "calendar-789", + "when": { + "time": 1620000000, + "object": "time" + }, + "title": "Test Event with Original Conferencing", + "object": "event", + "conferencing": { + "provider": "Zoom Meeting", + "details": { + "url": "https://zoom.us/j/123456789", + "meeting_code": "123456789" + } + } + } + """.trimIndent(), + ) + + val event = adapter.fromJson(jsonBuffer)!! + assertIs(event.conferencing) + val details = event.conferencing as Conferencing.Details + assertEquals(ConferencingProvider.ZOOM_MEETING, details.provider) + assertEquals("https://zoom.us/j/123456789", details.details.url) + assertEquals("123456789", details.details.meetingCode) + } + + @Test + fun `CreateEventRequest Autocreate with deprecated ConferencingProvider works properly`() { + // Test backward compatibility using deprecated fromConferencingProvider method + @Suppress("DEPRECATION") + val autocreate = CreateEventRequest.Conferencing.Autocreate.fromConferencingProvider( + ConferencingProvider.GOOGLE_MEET, + mapOf("setting1" to "value1"), + ) + + assertEquals(CreateEventAutoConferencingProvider.GOOGLE_MEET, autocreate.provider) + assertEquals(mapOf("setting1" to "value1"), autocreate.autocreate) + } + + @Test + fun `CreateEventRequest Details with deprecated ConferencingProvider works properly`() { + // Test backward compatibility using deprecated fromConferencingProvider method + val config = CreateEventRequest.Conferencing.Details.Config( + url = "https://zoom.us/j/123456789", + meetingCode = "123456789", + ) + + @Suppress("DEPRECATION") + val details = CreateEventRequest.Conferencing.Details.fromConferencingProvider( + ConferencingProvider.ZOOM_MEETING, + config, + ) + + assertEquals(CreateEventManualConferencingProvider.ZOOM_MEETING, details.provider) + assertEquals(config, details.details) + } + + @Test + fun `UpdateEventRequest Autocreate with deprecated ConferencingProvider works properly`() { + // Test backward compatibility using deprecated fromConferencingProvider method + @Suppress("DEPRECATION") + val autocreate = UpdateEventRequest.Conferencing.Autocreate.fromConferencingProvider( + ConferencingProvider.MICROSOFT_TEAMS, + mapOf("teams_setting" to true), + ) + + assertEquals(UpdateEventAutoConferencingProvider.MICROSOFT_TEAMS, autocreate.provider) + assertEquals(mapOf("teams_setting" to true), autocreate.autocreate) + } + + @Test + fun `UpdateEventRequest Details with deprecated ConferencingProvider works properly`() { + // Test backward compatibility using deprecated fromConferencingProvider method + val config = UpdateEventRequest.Conferencing.Details.Config( + url = "https://teams.microsoft.com/join/123", + pin = "654321", + ) + + @Suppress("DEPRECATION") + val details = UpdateEventRequest.Conferencing.Details.fromConferencingProvider( + ConferencingProvider.MICROSOFT_TEAMS, + config, + ) + + assertEquals(UpdateEventManualConferencingProvider.MICROSOFT_TEAMS, details.provider) + assertEquals(config, details.details) + } + + @Test + fun `UpdateEventAutoConferencingProvider serializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventAutoConferencingProvider::class.java) + + assertEquals("\"Google Meet\"", adapter.toJson(UpdateEventAutoConferencingProvider.GOOGLE_MEET)) + assertEquals("\"Zoom Meeting\"", adapter.toJson(UpdateEventAutoConferencingProvider.ZOOM_MEETING)) + assertEquals("\"Microsoft Teams\"", adapter.toJson(UpdateEventAutoConferencingProvider.MICROSOFT_TEAMS)) + } + + @Test + fun `UpdateEventAutoConferencingProvider deserializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventAutoConferencingProvider::class.java) + + assertEquals(UpdateEventAutoConferencingProvider.GOOGLE_MEET, adapter.fromJson("\"Google Meet\"")) + assertEquals(UpdateEventAutoConferencingProvider.ZOOM_MEETING, adapter.fromJson("\"Zoom Meeting\"")) + assertEquals(UpdateEventAutoConferencingProvider.MICROSOFT_TEAMS, adapter.fromJson("\"Microsoft Teams\"")) + } + + @Test + fun `UpdateEventManualConferencingProvider serializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventManualConferencingProvider::class.java) + + assertEquals("\"Google Meet\"", adapter.toJson(UpdateEventManualConferencingProvider.GOOGLE_MEET)) + assertEquals("\"Zoom Meeting\"", adapter.toJson(UpdateEventManualConferencingProvider.ZOOM_MEETING)) + assertEquals("\"Microsoft Teams\"", adapter.toJson(UpdateEventManualConferencingProvider.MICROSOFT_TEAMS)) + assertEquals("\"Teams for Business\"", adapter.toJson(UpdateEventManualConferencingProvider.TEAMS_FOR_BUSINESS)) + assertEquals("\"Skype for Business\"", adapter.toJson(UpdateEventManualConferencingProvider.SKYPE_FOR_BUSINESS)) + assertEquals("\"Skype for Consumer\"", adapter.toJson(UpdateEventManualConferencingProvider.SKYPE_FOR_CONSUMER)) + } + + @Test + fun `UpdateEventManualConferencingProvider deserializes properly`() { + val adapter = JsonHelper.moshi().adapter(UpdateEventManualConferencingProvider::class.java) + + assertEquals(UpdateEventManualConferencingProvider.GOOGLE_MEET, adapter.fromJson("\"Google Meet\"")) + assertEquals(UpdateEventManualConferencingProvider.ZOOM_MEETING, adapter.fromJson("\"Zoom Meeting\"")) + assertEquals(UpdateEventManualConferencingProvider.MICROSOFT_TEAMS, adapter.fromJson("\"Microsoft Teams\"")) + assertEquals(UpdateEventManualConferencingProvider.TEAMS_FOR_BUSINESS, adapter.fromJson("\"Teams for Business\"")) + assertEquals(UpdateEventManualConferencingProvider.SKYPE_FOR_BUSINESS, adapter.fromJson("\"Skype for Business\"")) + assertEquals(UpdateEventManualConferencingProvider.SKYPE_FOR_CONSUMER, adapter.fromJson("\"Skype for Consumer\"")) + } } @Nested @@ -406,6 +678,101 @@ class EventsTests { assertEquals(adapter.toJson(updateEventRequest), requestBodyCaptor.firstValue) } + @Test + fun `updating an event with autocreate conferencing calls requests with the correct params`() { + val eventId = "event-123" + val adapter = JsonHelper.moshi().adapter(UpdateEventRequest::class.java) + val updateEventRequest = + UpdateEventRequest( + title = "Updated Meeting with Autocreate", + conferencing = UpdateEventRequest.Conferencing.Autocreate( + provider = UpdateEventAutoConferencingProvider.ZOOM_MEETING, + autocreate = mapOf("waiting_room" to true, "join_before_host" to false), + ), + ) + val updateEventQueryParams = + UpdateEventQueryParams( + calendarId = "calendar-id", + notifyParticipants = true, + ) + + events.update(grantId, eventId, updateEventRequest, updateEventQueryParams) + val pathCaptor = argumentCaptor() + val typeCaptor = argumentCaptor() + val requestBodyCaptor = argumentCaptor() + val queryParamCaptor = argumentCaptor() + val overrideParamCaptor = argumentCaptor() + verify(mockNylasClient).executePut>( + pathCaptor.capture(), + typeCaptor.capture(), + requestBodyCaptor.capture(), + queryParamCaptor.capture(), + overrideParamCaptor.capture(), + ) + + assertEquals("v3/grants/$grantId/events/$eventId", pathCaptor.firstValue) + assertEquals(Types.newParameterizedType(Response::class.java, Event::class.java), typeCaptor.firstValue) + assertEquals(adapter.toJson(updateEventRequest), requestBodyCaptor.firstValue) + + // Verify the JSON contains the correct conferencing data + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(requestBodyCaptor.firstValue)!! + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Zoom Meeting", conferencing["provider"]) + val autocreate = conferencing["autocreate"] as Map<*, *> + assertEquals(true, autocreate["waiting_room"]) + assertEquals(false, autocreate["join_before_host"]) + } + + @Test + fun `updating an event with manual conferencing details calls requests with the correct params`() { + val eventId = "event-123" + val adapter = JsonHelper.moshi().adapter(UpdateEventRequest::class.java) + val updateEventRequest = + UpdateEventRequest( + title = "Updated Meeting with Manual Conferencing", + conferencing = UpdateEventRequest.Conferencing.Details( + provider = UpdateEventManualConferencingProvider.SKYPE_FOR_BUSINESS, + details = UpdateEventRequest.Conferencing.Details.Config( + url = "https://meet.lync.com/example/123", + password = "secret123", + phone = listOf("+1-555-123-4567", "+1-555-987-6543"), + ), + ), + ) + val updateEventQueryParams = + UpdateEventQueryParams( + calendarId = "calendar-id", + notifyParticipants = true, + ) + + events.update(grantId, eventId, updateEventRequest, updateEventQueryParams) + val pathCaptor = argumentCaptor() + val typeCaptor = argumentCaptor() + val requestBodyCaptor = argumentCaptor() + val queryParamCaptor = argumentCaptor() + val overrideParamCaptor = argumentCaptor() + verify(mockNylasClient).executePut>( + pathCaptor.capture(), + typeCaptor.capture(), + requestBodyCaptor.capture(), + queryParamCaptor.capture(), + overrideParamCaptor.capture(), + ) + + assertEquals("v3/grants/$grantId/events/$eventId", pathCaptor.firstValue) + assertEquals(Types.newParameterizedType(Response::class.java, Event::class.java), typeCaptor.firstValue) + assertEquals(adapter.toJson(updateEventRequest), requestBodyCaptor.firstValue) + + // Verify the JSON contains the correct conferencing data + val jsonMap = JsonHelper.moshi().adapter(Map::class.java).fromJson(requestBodyCaptor.firstValue)!! + val conferencing = jsonMap["conferencing"] as Map<*, *> + assertEquals("Skype for Business", conferencing["provider"]) + val details = conferencing["details"] as Map<*, *> + assertEquals("https://meet.lync.com/example/123", details["url"]) + assertEquals("secret123", details["password"]) + assertEquals(listOf("+1-555-123-4567", "+1-555-987-6543"), details["phone"]) + } + @Test fun `updating event reminders calls requests with the correct params`() { val eventId = "event-123"