@Override
  public void move(String noteId, String notePath, String newNotePath, AuthenticationInfo subject) throws IOException {
    Preconditions.checkArgument(StringUtils.isNotEmpty(noteId));
    BlobId sourceBlobId = makeBlobId(noteId, notePath);
    BlobId destinationBlobId = makeBlobId(noteId, newNotePath);
    try {
      storage.get(sourceBlobId).copyTo(destinationBlobId);
    } catch (Exception se) {
      throw new IOException("Could not copy from " + sourceBlobId.toString() + " to " + destinationBlobId.toString() + ": " + se.getMessage(), se);
    }
    remove(noteId, notePath, subject);
  }
@Test
  void testMove_nonexistent() throws IOException {
    zConf.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_GCS_STORAGE_DIR.getVarName(), DEFAULT_URL);
    this.notebookRepo = new GCSNotebookRepo(zConf, noteParser, storage);
    assertThrows(IOException.class, () -> {
      notebookRepo.move("id", "/name", "/name_new", AUTH_INFO);
    });
  }