tests/testthat/test01_onedrive.R

tenant <- "consumers"
app <- Sys.getenv("AZ_TEST_NATIVE_APP_ID")

if(app == "")
    skip("OneDrive tests skipped: Microsoft Graph credentials not set")

if(!interactive())
    skip("OneDrive tests skipped: must be in interactive session")

tok <- get_test_token(tenant, app, c("Files.ReadWrite.All", "User.Read"))
if(is.null(tok))
    skip("OneDrive tests skipped: unable to login to consumers tenant")

drv <- try(call_graph_endpoint(tok, "me/drive"), silent=TRUE)
if(inherits(drv, "try-error"))
    skip("OneDrive tests skipped: service not available")

opt_use_itemid <- options(microsoft365r_use_itemid_in_path=TRUE)
od <- ms_drive$new(tok, tenant, drv)

test_that("OneDrive personal works",
{
    expect_is(od, "ms_drive")

    ls <- od$list_items()
    expect_is(ls, "data.frame")

    newfolder <- make_name()
    expect_silent(od$create_folder(newfolder))

    src <- "../resources/file.json"
    dest <- file.path(newfolder, basename(src))
    newsrc <- tempfile()
    expect_silent(od$upload_file(src, dest=dest))
    expect_silent(od$download_file(dest, dest=newsrc))

    expect_true(files_identical(src, newsrc))

    item <- od$get_item(dest)
    expect_is(item, "ms_drive_item")

    pager <- od$list_files(newfolder, filter=sprintf("name eq '%s'", basename(src)), n=NULL)
    expect_is(pager, "ms_graph_pager")
    lst1 <- pager$value
    expect_is(lst1, "data.frame")
    expect_identical(nrow(lst1), 1L)

    expect_silent(od$set_item_properties(dest, name="newname"))
    expect_silent(item$sync_fields())
    expect_identical(item$properties$name, "newname")
    expect_silent(item$update(name=basename(dest)))
    expect_identical(item$properties$name, basename(dest))

    expect_silent(od$delete_item(newfolder, confirm=FALSE))
})


test_that("Drive item methods work",
{
    root <- od$get_item("/")
    expect_is(root, "ms_drive_item")
    expect_equal(root$properties$name, "root")
    expect_equal(root$get_path(), "/")

    rootp <- root$get_parent_folder()
    expect_is(rootp, "ms_drive_item")
    expect_equal(rootp$properties$name, "root")

    tmpname1 <- make_name(10)
    folder1 <- root$create_folder(tmpname1)
    expect_is(folder1, "ms_drive_item")
    expect_true(folder1$is_folder())
    expect_equal(folder1$get_path(), paste0("/", tmpname1))

    folder1p <- folder1$get_parent_folder()
    expect_equal(rootp$properties$name, "root")

    tmpname2 <- make_name(10)
    folder2 <- folder1$create_folder(tmpname2)
    expect_is(folder2, "ms_drive_item")
    expect_true(folder2$is_folder())
    expect_equal(folder2$get_path(), paste0("/", tmpname1, "/", tmpname2))

    folder2p <- folder2$get_parent_folder()
    expect_equal(folder2p$properties$name, folder1$properties$name)

    src <- write_file()
    expect_silent(file1 <- root$upload(src))
    expect_is(file1, "ms_drive_item")
    expect_false(file1$is_folder())
    expect_error(file1$create_folder("bad"))
    expect_equal(file1$get_path(), paste0("/", basename(src)))

    file1p <- file1$get_parent_folder()
    expect_equal(file1p$properties$name, "root")

    file1_0 <- root$get_item(basename(src))
    expect_is(file1_0, "ms_drive_item")
    expect_false(file1_0$is_folder())
    expect_identical(file1_0$properties$name, file1$properties$name)

    dest1 <- tempfile()
    expect_silent(file1$download(dest1))
    expect_true(files_identical(src, dest1))

    expect_silent(file2 <- folder1$upload(src))
    expect_is(file2, "ms_drive_item")
    expect_equal(file2$get_path(), paste0("/", tmpname1, "/", basename(src)))

    file2p <- file2$get_parent_folder()
    expect_equal(file2p$properties$name, folder1$properties$name)

    dest2 <- tempfile()
    expect_silent(file2$download(dest2))
    expect_true(files_identical(src, dest2))

    dest3 <- tempfile()
    expect_silent(file3 <- folder2$upload(src, basename(dest3)))
    expect_is(file3, "ms_drive_item")
    expect_identical(file3$properties$name, basename(dest3))
    expect_silent(file3$download(dest3))
    expect_true(files_identical(src, dest3))

    file3_1 <- folder1$get_item(file.path(tmpname2, basename(dest3)))
    expect_is(file3_1, "ms_drive_item")
    expect_identical(file3_1$properties$name, file3$properties$name)

    lst0 <- root$list_files()
    expect_is(lst0, "data.frame")
    lst0_f <- root$list_files(info="name", full_names=TRUE)
    expect_type(lst0_f, "character")
    expect_true(all(substr(lst0_f, 1, 1) == "/"))

    lst0_1 <- root$list_files(tmpname1)
    lst1 <- folder1$list_files()
    expect_identical(lst0_1, lst1)

    lst1_f <- folder1$list_files(tmpname2, info="name", full_names=TRUE)
    expect_type(lst1_f, "character")
    expect_true(all(grepl(paste0("^", tmpname2), lst1_f)))

    expect_silent(file1$delete(confirm=FALSE))
    expect_silent(folder1$delete(confirm=FALSE))
})


test_that("Methods work with filenames with special characters",
{
    test_name <- paste(make_name(5), "plus spaces and áccénts")
    src <- write_file(fname=file.path(tempdir(), test_name))

    expect_silent(od$upload_file(src, basename(src)))
    expect_silent(item <- od$get_item(basename(test_name)))
    expect_true(item$properties$name == basename(test_name))
    expect_silent(item$delete(confirm=FALSE))
})


test_that("Nested folder creation/deletion works",
{
    f1 <- make_name(10)
    f2 <- make_name(10)
    f3 <- make_name(10)

    it12 <- od$create_folder(file.path(f1, f2))
    expect_is(it12, "ms_drive_item")

    it1 <- od$get_item(f1)
    expect_is(it1, "ms_drive_item")

    replicate(30, it1$upload(write_file()))

    it123 <- it1$create_folder(file.path(f2, f3))
    expect_is(it123, "ms_drive_item")

    expect_silent(it1$delete(confirm=FALSE, by_item=TRUE))
})


test_that("Get item by ID works",
{
    dir1 <- make_name(10)
    src <- "../resources/file.json"

    obj <- od$upload_file(src, file.path(dir1, "file.json"))
    id <- obj$properties$id
    obj2 <- od$get_item(itemid=id)
    expect_identical(obj$properties$id, obj2$properties$id)

    expect_silent(obj2$delete(confirm=FALSE))
})


test_that("Folder upload/download works",
{
    srcdir <- tempfile()
    srcdir2 <- tempfile(tmpdir=srcdir)
    dir.create(srcdir2, showWarnings=FALSE, recursive=TRUE)
    src1 <- write_file(srcdir)
    src2 <- write_file(srcdir)
    src3 <- write_file(srcdir2)
    src4 <- write_file(srcdir2)

    root <- od$get_item("/")

    # serial, not recursive
    destdir1 <- basename(tempfile())
    returndir1 <- tempfile()

    expect_silent(root$upload(srcdir, destdir1, recursive=FALSE, parallel=FALSE))

    obj1 <- root$get_item(destdir1)
    expect_silent(obj1$download(returndir1, recursive=FALSE, parallel=FALSE))
    expect_silent(obj1$delete(confirm=FALSE))

    files_identical(src1, file.path(returndir1, basename(src1)))
    files_identical(src2, file.path(returndir1, basename(src2)))
    expect_false(file.exists(file.path(returndir1, basename(src3))))
    expect_false(file.exists(file.path(returndir1, basename(src4))))

    # serial, recursive
    destdir2 <- basename(tempfile())
    returndir2 <- tempfile()

    expect_silent(root$upload(srcdir, destdir2, recursive=TRUE, parallel=FALSE))

    obj2 <- root$get_item(destdir2)
    expect_silent(obj2$download(returndir2, recursive=TRUE, parallel=FALSE))
    expect_silent(obj2$delete(confirm=FALSE))

    files_identical(src1, file.path(returndir2, basename(src1)))
    files_identical(src2, file.path(returndir2, basename(src2)))
    files_identical(src3, file.path(returndir2, basename(srcdir2), basename(src3)))
    files_identical(src4, file.path(returndir2, basename(srcdir2), basename(src4)))

    # parallel, not recursive
    destdir3 <- basename(tempfile())
    returndir3 <- tempfile()

    expect_silent(root$upload(srcdir, destdir3, recursive=FALSE, parallel=TRUE))

    obj3 <- root$get_item(destdir3)
    expect_silent(obj3$download(returndir3, recursive=FALSE, parallel=TRUE))
    expect_silent(obj3$delete(confirm=FALSE))

    files_identical(src1, file.path(returndir3, basename(src1)))
    files_identical(src2, file.path(returndir3, basename(src2)))
    expect_false(file.exists(file.path(returndir3, basename(src3))))
    expect_false(file.exists(file.path(returndir3, basename(src4))))

    # parallel, recursive
    destdir4 <- basename(tempfile())
    returndir4 <- tempfile()

    expect_silent(root$upload(srcdir, destdir4, recursive=TRUE, parallel=TRUE))

    obj4 <- root$get_item(destdir4)
    expect_silent(obj4$download(returndir4, recursive=TRUE, parallel=TRUE))
    expect_silent(obj4$delete(confirm=FALSE))

    files_identical(src1, file.path(returndir4, basename(src1)))
    files_identical(src2, file.path(returndir4, basename(src2)))
    files_identical(src3, file.path(returndir4, basename(srcdir2), basename(src3)))
    files_identical(src4, file.path(returndir4, basename(srcdir2), basename(src4)))
})


teardown({
    options(opt_use_itemid)
})

Try the Microsoft365R package in your browser

Any scripts or data that you put into this service are public.

Microsoft365R documentation built on May 31, 2023, 6:10 p.m.