@Override
  public ImportResult importItem(
      UUID jobId,
      IdempotentImportExecutor idempotentExecutor,
      TokenSecretAuthData authData,
      PhotosContainerResource data)
      throws Exception {

    // Make the data smugmug compatible
    data.transmogrify(transmogrificationConfig);

    try {
      SmugMugInterface smugMugInterface = getOrCreateSmugMugInterface(authData);
      for (PhotoAlbum album : data.getAlbums()) {
        idempotentExecutor.executeAndSwallowIOExceptions(
            album.getId(),
            album.getName(),
            () -> importSingleAlbum(jobId, album, smugMugInterface));
      }
      for (PhotoModel photo : data.getPhotos()) {
        idempotentExecutor.executeAndSwallowIOExceptions(
            photo.getIdempotentId(),
            photo.getTitle(),
            () -> importSinglePhoto(jobId, idempotentExecutor, photo, smugMugInterface));
      }
    } catch (IOException e) {
      monitor.severe(() -> "Error importing", e);
      return new ImportResult(e);
    }
    return ImportResult.OK;
  }
@Test
  public void importStoresAlbumInJobStore() throws Exception {
    // setup test objects
    UUID jobId = UUID.randomUUID();

    PhotoAlbum photoAlbum1 = new PhotoAlbum("albumId1", "albumName1", "albumDescription1");
    PhotoModel photoModel1 =
        new PhotoModel(
            "PHOTO_TITLE",
            "FETCHABLE_URL",
            "PHOTO_DESCRIPTION",
            "MEDIA_TYPE",
            "photoId1",
            photoAlbum1.getId(),
            false);
    PhotoModel photoModel2 =
        new PhotoModel(
            "PHOTO_TITLE",
            "FETCHABLE_URL",
            "PHOTO_DESCRIPTION",
            "MEDIA_TYPE",
            "photoId2",
            photoAlbum1.getId(),
            false);
    PhotoModel photoModel3 =
        new PhotoModel(
            "PHOTO_TITLE",
            "FETCHABLE_URL",
            "PHOTO_DESCRIPTION",
            "MEDIA_TYPE",
            "photoId3",
            photoAlbum1.getId(),
            false);

    PhotosContainerResource photosContainerResource1 =
        new PhotosContainerResource(Collections.singletonList(photoAlbum1), ImmutableList.of());
    PhotosContainerResource photosContainerResource2 =
        new PhotosContainerResource(
            ImmutableList.of(), ImmutableList.of(photoModel1, photoModel2, photoModel3));


    SmugMugAlbum smugMugAlbum1 =
        new SmugMugAlbum(
            "date",
            photoAlbum1.getDescription(),
            photoAlbum1.getName(),
            "privacy",
            "albumUri1",
            "urlname",
            "weburi");
    String overflowAlbumName = smugMugAlbum1.getName() + " (1)";
    SmugMugAlbum smugMugAlbum2 =
        new SmugMugAlbum(
            "date",
            photoAlbum1.getDescription(),
            overflowAlbumName,
            "privacy",
            "albumUri2",
            "urlname",
            "weburi");

    SmugMugAlbumResponse mockAlbumResponse1 =
        new SmugMugAlbumResponse(smugMugAlbum1.getUri(), "Locator", "LocatorType", smugMugAlbum1);
    SmugMugAlbumResponse mockAlbumResponse2 =
        new SmugMugAlbumResponse(smugMugAlbum2.getUri(), "Locator", "LocatorType", smugMugAlbum2);


    when(smugMugInterface.createAlbum(eq(smugMugAlbum1.getName()))).thenReturn(mockAlbumResponse1);
    when(smugMugInterface.createAlbum(eq(smugMugAlbum2.getName()))).thenReturn(mockAlbumResponse2);

    SmugMugImageUploadResponse smugMugUploadImageResponse =
        new SmugMugImageUploadResponse(
            "imageUri",
            "albumImageUri",
            new ImageInfo("imageUri", "albumImageUri", "statusImageReplaceUri", "url"));
    when(smugMugInterface.uploadImage(any(), any(), any())).thenReturn(smugMugUploadImageResponse);
    when(smugMugInterface.getImageAsStream(any())).thenReturn(bufferedInputStream);

    // Run test
    SmugMugPhotosImporter importer =
        new SmugMugPhotosImporter(
            smugMugInterface,
            config,
            jobStore,
            new AppCredentials("key", "secret"),
            mock(ObjectMapper.class),
            monitor);
    ImportResult result =
        importer.importItem(
            jobId, EXECUTOR, new TokenSecretAuthData("token", "secret"), photosContainerResource1);

    result =
        importer.importItem(
            jobId, EXECUTOR, new TokenSecretAuthData("token", "secret"), photosContainerResource2);

    // Verify 
    ArgumentCaptor<String> photoUrlsCaptor = ArgumentCaptor.forClass(String.class);
    ArgumentCaptor<String> albumNamesCaptor = ArgumentCaptor.forClass(String.class);
    verify(smugMugInterface, atLeastOnce()).createAlbum(albumNamesCaptor.capture());
    verify(smugMugInterface, atLeastOnce()).getImageAsStream(photoUrlsCaptor.capture());
    
    List<String> capturedAlbumNames = albumNamesCaptor.getAllValues();
    assertTrue(capturedAlbumNames.contains(smugMugAlbum1.getName()));
    assertTrue(capturedAlbumNames.contains(smugMugAlbum2.getName()));
    
    List<String> capturedPhotoUrls = photoUrlsCaptor.getAllValues();
    assertTrue(capturedPhotoUrls.contains(photoModel1.getFetchableUrl()));
    assertTrue(capturedPhotoUrls.contains(photoModel2.getFetchableUrl()));
    assertTrue(capturedPhotoUrls.contains(photoModel3.getFetchableUrl()));

    String overflowAlbumId = photoAlbum1.getId() + "-overflow-1";
    assertThat((String) EXECUTOR.getCachedValue(photoAlbum1.getId()))
        .isEqualTo(smugMugAlbum1.getUri());
    assertThat((String) EXECUTOR.getCachedValue(overflowAlbumId)).isEqualTo(smugMugAlbum2.getUri());

    SmugMugPhotoTempData tempData1 =
        new SmugMugPhotoTempData(
            photoAlbum1.getId(),
            smugMugAlbum1.getName(),
            smugMugAlbum1.getDescription(),
            smugMugAlbum1.getUri(),
            2,
            overflowAlbumId);
    SmugMugPhotoTempData tempData2 =
        new SmugMugPhotoTempData(
            overflowAlbumId,
            smugMugAlbum2.getName(),
            smugMugAlbum2.getDescription(),
            smugMugAlbum2.getUri(),
            1,
            null);
    assertThat(
            jobStore
                .findData(
                    jobId,
                    String.format(TEMP_DATA_FORMAT, photoAlbum1.getId()),
                    SmugMugPhotoTempData.class)
                .toString())
        .isEqualTo(tempData1.toString());
    assertThat(
            jobStore
                .findData(
                    jobId,
                    String.format(TEMP_DATA_FORMAT, overflowAlbumId),
                    SmugMugPhotoTempData.class)
                .toString())
        .isEqualTo(tempData2.toString());
  }