@@ -230,6 +230,33 @@ class ConfigurationsTest {
230230 assertEquals(" Custom Title" , emailTemplate.bookingConfirmed?.title)
231231 assertEquals(" Custom Body" , emailTemplate.bookingConfirmed?.body)
232232 }
233+
234+ @Test
235+ fun `AdditionalFieldType METADATA serializes correctly` () {
236+ val adapter = JsonHelper .moshi().adapter(AdditionalField ::class .java)
237+ val jsonBuffer = Buffer ().writeUtf8(
238+ """
239+ {
240+ "label": "Additional Information",
241+ "type": "metadata",
242+ "required": true,
243+ "order": 1
244+ }
245+ """ .trimIndent(),
246+ )
247+
248+ val additionalField = adapter.fromJson(jsonBuffer)!!
249+ assertIs<AdditionalField >(additionalField)
250+ assertEquals(" Additional Information" , additionalField.label)
251+ assertEquals(AdditionalFieldType .METADATA , additionalField.type)
252+ assertEquals(true , additionalField.required)
253+ assertEquals(1 , additionalField.order)
254+
255+ // Test serialization back to JSON
256+ val serializedJson = adapter.toJson(additionalField)
257+ assert (serializedJson.contains(" \" type\" :\" metadata\" " ))
258+ assert (serializedJson.contains(" \" label\" :\" Additional Information\" " ))
259+ }
233260 }
234261
235262 @Nested
@@ -530,5 +557,95 @@ class ConfigurationsTest {
530557 assert (serializedRequest.contains(" \" booking_confirmed\" " ))
531558 assert (serializedRequest.contains(" Your Meeting is Confirmed" ))
532559 }
560+
561+ @Test
562+ fun `creating a configuration with metadata additional fields calls requests with the correct params` () {
563+ val adapter = JsonHelper .moshi().adapter(CreateConfigurationRequest ::class .java)
564+ val participantCalendarIds = ArrayList <String >()
565+ participantCalendarIds.add(" primary" )
566+
567+ val configurationAvailabilityParticipant = ConfigurationAvailabilityParticipant .Builder ().calendarIds(participantCalendarIds).build()
568+
569+ val configurationBookingParticipant = ConfigurationBookingParticipant .Builder ().calendarId(" primary" ).build()
570+
571+ val configurationParticipant = ConfigurationParticipant .Builder (" test@nylas.com" )
572+ .availability(configurationAvailabilityParticipant)
573+ .booking(configurationBookingParticipant)
574+ .name(" Test Participant" )
575+ .isOrganizer(true )
576+ .build()
577+
578+ val configurationAvailability = ConfigurationAvailability .Builder ().intervalMinutes(30 ).build()
579+
580+ val configurationEventBooking = ConfigurationEventBooking .Builder ().title(" Test Event Booking" ).build()
581+
582+ // Create additional fields including the new METADATA field type
583+ val additionalFields = mapOf (
584+ " department" to AdditionalField (
585+ label = " Department" ,
586+ type = AdditionalFieldType .TEXT ,
587+ required = true ,
588+ order = 1 ,
589+ ),
590+ " project_info" to AdditionalField (
591+ label = " Project Information" ,
592+ type = AdditionalFieldType .METADATA ,
593+ required = false ,
594+ order = 2 ,
595+ ),
596+ " contact_preference" to AdditionalField (
597+ label = " Contact Preference" ,
598+ type = AdditionalFieldType .DROPDOWN ,
599+ required = true ,
600+ order = 3 ,
601+ ),
602+ )
603+
604+ // Create scheduler settings with additional fields
605+ val schedulerSettings = ConfigurationSchedulerSettings .Builder ()
606+ .additionalFields(additionalFields)
607+ .availableDaysInFuture(14 )
608+ .minBookingNotice(120 )
609+ .build()
610+
611+ val participants = ArrayList <ConfigurationParticipant >()
612+ participants.add(configurationParticipant)
613+
614+ val createConfigurationRequest = CreateConfigurationRequest .Builder (
615+ participants,
616+ configurationAvailability,
617+ configurationEventBooking,
618+ )
619+ .name(" Configuration with Metadata Additional Fields" )
620+ .scheduler(schedulerSettings)
621+ .build()
622+
623+ configurations.create(grantId, createConfigurationRequest)
624+
625+ val pathCaptor = argumentCaptor<String >()
626+ val typeCaptor = argumentCaptor<Type >()
627+ val requestBodyCaptor = argumentCaptor<String >()
628+ val queryParamCaptor = argumentCaptor<ListConfigurationsQueryParams >()
629+ val overrideParamCaptor = argumentCaptor<RequestOverrides >()
630+ verify(mockNylasClient).executePost<Response <Configuration >>(
631+ pathCaptor.capture(),
632+ typeCaptor.capture(),
633+ requestBodyCaptor.capture(),
634+ queryParamCaptor.capture(),
635+ overrideParamCaptor.capture(),
636+ )
637+
638+ assertEquals(" v3/grants/$grantId /scheduling/configurations" , pathCaptor.firstValue)
639+ assertEquals(Types .newParameterizedType(Response ::class .java, Configuration ::class .java), typeCaptor.firstValue)
640+
641+ val serializedRequest = adapter.toJson(createConfigurationRequest)
642+ assertEquals(serializedRequest, requestBodyCaptor.firstValue)
643+
644+ // Verify that the JSON contains the new METADATA field type
645+ assert (serializedRequest.contains(" \" type\" :\" metadata\" " ))
646+ assert (serializedRequest.contains(" \" project_info\" " ))
647+ assert (serializedRequest.contains(" \" Project Information\" " ))
648+ assert (serializedRequest.contains(" \" additional_fields\" " ))
649+ }
533650 }
534651}
0 commit comments