@Test
  @SuppressWarnings("unchecked")
  public void testImport() throws Exception {
    server.enqueue(new MockResponse().setBody(BATCH_CALENDAR_RESPONSE));
    server.enqueue(new MockResponse().setResponseCode(201).setBody(BATCH_EVENT_RESPONSE));
    server.start();

    HttpUrl baseUrl = server.url("");
    MicrosoftCalendarImporter importer =
        new MicrosoftCalendarImporter(
            baseUrl.toString(), client, mapper, transformerService);

    CalendarModel calendarModel = new CalendarModel("OldId1", "name", "name");
    CalendarAttendeeModel attendeeModel =
        new CalendarAttendeeModel("Test Attendee", "test@test.com", false);
    CalendarEventModel.CalendarEventTime start =
        new CalendarEventModel.CalendarEventTime(
            ZonedDateTime.now(ZoneId.of("GMT")).toOffsetDateTime(), false);
    CalendarEventModel.CalendarEventTime end =
        new CalendarEventModel.CalendarEventTime(
            ZonedDateTime.now(ZoneId.of("GMT")).toOffsetDateTime(), false);
    CalendarEventModel eventModel =
        new CalendarEventModel(
            "OldId1",
            "Event1",
            "Test Notes",
            singletonList(attendeeModel),
            "Location1",
            start,
            end,
            null);
    CalendarContainerResource resource =
        new CalendarContainerResource(singleton(calendarModel), singleton(eventModel));

    FakeIdempotentImportExecutor executor = new FakeIdempotentImportExecutor();

    ImportResult result = importer.importItem(JOB_ID, executor, token, resource);

    assertEquals(ImportResult.ResultType.OK, result.getType());

    // verify the batch calendar request
    RecordedRequest calendarBatch = server.takeRequest();
    Map<String, Object> calendarBody =
        (Map<String, Object>) mapper.readValue(calendarBatch.getBody().readUtf8(), Map.class);

    List<Map<String, Object>> calendarRequests =
        (List<Map<String, Object>>) calendarBody.get("requests");

    assertNotNull(calendarRequests);
    assertEquals(1, calendarRequests.size());

    Map<String, Object> calendarRequest = calendarRequests.get(0);

    assertNotNull(calendarRequest.get("headers"));
    assertEquals("POST", calendarRequest.get("method"));
    assertEquals("/v1.0/me/calendars", calendarRequest.get("url"));

    Map<String, Object> calendarRequestBody = (Map<String, Object>) calendarRequest.get("body");
    assertNotNull(calendarRequestBody);
    assertEquals("name", calendarRequestBody.get("name"));

    // verify the calendar id mapping from old id to new id was saved
    assertEquals("NewId1", executor.getCachedValue("OldId1"));

    // verify the batch event request
    RecordedRequest eventBatch = server.takeRequest();
    Map<String, Object> eventRequests =
        (Map<String, Object>) mapper.readValue(eventBatch.getBody().readUtf8(), Map.class);
    Map<String, Object> eventRequest =
        (Map<String, Object>) ((List<Map<String, Object>>) eventRequests.get("requests")).get(0);

    assertNotNull(eventRequest.get("headers"));
    assertEquals("POST", eventRequest.get("method"));
    assertEquals(
        "/v1.0/me/calendars/NewId1/events",
        eventRequest.get("url")); // verify the URL is contructed correctly with NewId

    Map<String, Object> eventRequestBody = (Map<String, Object>) eventRequest.get("body");
    assertNotNull(eventRequestBody);
    assertEquals("Event1", eventRequestBody.get("subject"));

    Map<String, Object> location = (Map<String, Object>) eventRequestBody.get("location");
    assertEquals("Location1", location.get("displayName"));
    assertEquals("Default", location.get("locationType"));

    Map<String, Object> body = (Map<String, Object>) eventRequestBody.get("body");
    assertEquals("Test Notes", body.get("content"));
    assertEquals("HTML", body.get("contentType"));

    List<Map<String, Object>> attendees =
        (List<Map<String, Object>>) eventRequestBody.get("attendees");
    assertEquals(1, attendees.size());
    Map<String, Object> attendee = (Map<String, Object>) attendees.get(0);
    assertEquals("required", attendee.get("type"));
    Map<String, Object> emailAddress = (Map<String, Object>) attendee.get("emailAddress");
    assertEquals("test@test.com", emailAddress.get("address"));
    assertEquals("Test Attendee", emailAddress.get("name"));

    // verify dates
    Map<String, Object> startDate = (Map<String, Object>) eventRequestBody.get("start");
    assertNotNull(startDate.get("dateTime"));
    assertEquals("UTC", startDate.get("timeZone"));

    Map<String, Object> endDate = (Map<String, Object>) eventRequestBody.get("end");
    assertNotNull(endDate.get("dateTime"));
    assertEquals("UTC", endDate.get("timeZone"));
  }
Verifies Calendar export using mock HTTP endpoints that replay responses from the Microsoft Graph
API.
extensions/data-transfer/portability-data-transfer-microsoft/src/test/java/org/datatransferproject/transfer/microsoft/integration/MicrosoftCalendarImportTest.java