context("Projects")
with_mock_crunch({
projects <- session()$projects
test_that("Getting projects catalog", {
expect_is(projects, "ProjectFolder")
expect_length(projects, 2)
expect_identical(names(projects), c("Project One", "Project Three"))
})
test_that("Getting project from catalog", {
expect_true(is.project(projects[[1]]))
expect_true(is.project(projects$`Project One`))
expect_true(is.project(projects[["Project One"]]))
expect_null(projects$`Beta Project`)
})
aproject <- projects[["Project One"]]
test_that("Project attributes", {
expect_identical(name(aproject), "Project One")
})
creation <- '{"element":"shoji:entity","body":{"name":"A new project"}}'
test_that("Simple project creation by assignment", {
expect_POST(
projects[["A new project"]] <- list(),
"https://app.crunch.io/api/projects/",
creation
)
expect_POST(
projects$`A new project` <- list(),
"https://app.crunch.io/api/projects/",
creation
)
})
test_that("Project creation with newProject", {
expect_POST(
newProject("A new project"),
"https://app.crunch.io/api/projects/",
creation
)
with_POST("https://app.crunch.io/api/projects/project1/", {
## Mock the return of that creation
pro <- newProject("This is being ignored")
expect_true(is.project(pro))
expect_identical(name(pro), "Project One")
## Now also check that the PATCH to add members happens
expect_PATCH(
newProject("A new project", members = "new.user@crunch.io"),
"https://app.crunch.io/api/projects/project1/members/",
'{"new.user@crunch.io":{}}'
)
})
})
test_that("Project editing", {
expect_PATCH(
names(projects)[2] <- "New name",
"https://app.crunch.io/api/projects/",
'{"element":"shoji:catalog","index":',
'{"https://app.crunch.io/api/projects/project3/":{"name":"New name"}}}'
)
expect_PATCH(
name(projects[[2]]) <- "New name",
"https://app.crunch.io/api/projects/project3/",
'{"name":"New name"}'
)
})
test_that("Project deletion", {
expect_error(
delete(projects[[1]]),
"Must confirm deleting folder"
)
with(consent(), {
expect_DELETE(delete(projects[[1]]), "https://app.crunch.io/api/projects/project1/")
})
})
m <- members(aproject)
test_that("Project members catalog", {
expect_is(m, "MemberCatalog")
expect_identical(names(m), c("Fake User", "Roger User"))
expect_identical(emails(m), c("fake.user@example.com", "roger.user@example.com"))
expect_identical(
name(m[["roger.user@example.com"]]),
"Roger User"
)
expect_null(m[["NOTAUSER@example.com"]])
expect_identical(
names(m["roger.user@example.com"]),
"Roger User"
)
expect_error(
m["NOTAUSER@example.com"],
"Undefined elements selected: NOTAUSER@example.com"
)
})
test_that("Add members by members<-", {
expect_PATCH(
members(aproject) <- c("new.user@crunch.io", "foo@example.co"),
"https://app.crunch.io/api/projects/project1/members/",
'{"new.user@crunch.io":{},"foo@example.co":{}}'
)
})
test_that("Add members doesn't re-add if already a member", {
expect_PATCH(
members(aproject) <- c("new.user@crunch.io", "roger.user@example.com"),
"https://app.crunch.io/api/projects/project1/members/",
'{"new.user@crunch.io":{}}'
)
})
test_that("Remove members by <- NULL", {
expect_PATCH(
members(aproject)[["roger.user@example.com"]] <- NULL,
"https://app.crunch.io/api/projects/project1/members/",
'{"roger.user@example.com":null}'
)
})
test_that("is.editor on member catalog", {
expect_identical(is.editor(m), c(TRUE, FALSE))
})
test_that("is.editor<- on member catalog", {
expect_PATCH(
is.editor(m) <- c(TRUE, TRUE),
"https://app.crunch.io/api/projects/project1/members/",
'{"https://app.crunch.io/api/users/user2/":{"permissions":{"edit":true}}}'
)
expect_PATCH(
is.editor(m[2]) <- TRUE,
"https://app.crunch.io/api/projects/project1/members/",
'{"https://app.crunch.io/api/users/user2/":{"permissions":{"edit":true}}}'
)
expect_no_request(is.editor(m[2]) <- FALSE) ## No change, so no PATCH request made
})
test_that("Print method for MemberCatalog", {
expect_prints(
m,
get_output(data.frame(
name = c("Fake User", "Roger User"),
email = c("fake.user@example.com", "roger.user@example.com"),
is.editor = c(TRUE, FALSE)
))
)
})
d <- datasets(aproject)
test_that("datasets() filters a project folder", {
expect_identical(
names(d),
c("an archived dataset", "test ds", "streaming no messages")
)
})
test_that("Can loadDataset from a project dataset catalog", {
ds <- loadDataset("test ds", project = aproject)
expect_is(ds, "CrunchDataset")
expect_identical(name(ds), "test ds")
expect_identical(
loadDataset("test ds", project = "Project One"),
ds
)
})
test_that("loadDataset project arg error handling", {
expect_error(
loadDataset("foo", project = 12),
"Project 12 is not valid"
)
expect_error(
loadDataset("foo", project = "Not a project"),
'Project "Not a project" is not valid'
)
})
test_that("Project datasets order", {
expect_deprecated(do <- ordering(d))
expect_is(do, "DatasetOrder")
expect_identical(
do@graph,
list(DatasetGroup("Group 1", "https://app.crunch.io/api/datasets/3/"))
)
expect_prints(do,
paste("[+] Group 1", " ECON.sav", sep = "\n"),
fixed = TRUE
)
})
test_that("Add datasets to project by <- a dataset (which calls mv)", {
ds <- cachedLoadDataset("ECON.sav")
expect_PATCH(
datasets(aproject) <- ds,
"https://app.crunch.io/api/projects/project1/"
)
})
test_that("Add datasets to project by <- does nothing if already present", {
ds <- cachedLoadDataset("test ds")
expect_no_request(datasets(aproject) <- ds)
})
test_that("Organize datasets is gone!", {
expect_error(
ordering(aproject) <- DatasetOrder(DatasetGroup(
"new group",
datasets(aproject)
)),
"Hi there!"
)
})
})
with_test_authentication({
myprojects <- projects()
my.name <- name(me())
my.email <- email(me())
nprojects.0 <- length(myprojects)
test_that("Can get project catalog", {
expect_is(myprojects, "ProjectFolder")
})
name.of.project1 <- now()
test_that("Can create a project", {
expect_false(name.of.project1 %in% names(myprojects))
myprojects[[name.of.project1]] <- list()
expect_true(name.of.project1 %in% names(myprojects))
expect_true(length(myprojects) == nprojects.0 + 1L)
expect_true(is.project(myprojects[[name.of.project1]]))
expect_length(members(myprojects[[name.of.project1]]), 1)
expect_identical(
names(members(myprojects[[name.of.project1]])),
my.name
)
})
myprojects <- refresh(myprojects)
pj <- myprojects[[name.of.project1]]
p_url <- self(pj)
name2 <- paste(name.of.project1, "revised")
test_that("Can rename a project by name<-", {
expect_identical(
self(myprojects[[name.of.project1]]),
p_url
)
expect_null(myprojects[[name2]])
name(myprojects[[name.of.project1]]) <- name2
expect_null(myprojects[[name.of.project1]])
expect_identical(self(myprojects[[name2]]), p_url)
})
name3 <- paste(name2, "FINAL")
test_that("Can rename a project with names<-", {
expect_false(name3 %in% names(myprojects))
names(myprojects)[urls(myprojects) == p_url] <- name3
expect_true(name3 %in% names(myprojects))
expect_identical(self(myprojects[[name3]]), p_url)
})
test_that("Can delete a project by URL", {
myprojects <- refresh(myprojects)
expect_true(p_url %in% urls(myprojects))
try(crDELETE(p_url))
expect_false(p_url %in% urls(refresh(myprojects)))
})
test_that("Can create a project with members", {
skip("TODO")
skip_on_jenkins("Jenkins user needs more permissions")
myprojects <- refresh(myprojects)
nprojects.2 <- length(myprojects)
name.of.project2 <- now()
expect_false(name.of.project2 %in% names(myprojects))
u <- testUser()
myprojects[[name.of.project2]] <- list(members = email(u))
expect_true(name.of.project2 %in% names(myprojects))
expect_true(length(myprojects) == nprojects.2 + 1L)
expect_true(setequal(
names(members(myprojects[[name.of.project2]])),
c(name(u), my.name)
))
})
test_that("Can add members to a project (and then set as an editor)", {
skip_on_jenkins("Jenkins user needs more permissions")
tp <- newProject(name = now())
u <- testUser()
expect_identical(names(members(tp)), my.name)
members(tp) <- email(u)
expect_true(setequal(
names(members(tp)),
c(name(u), my.name)
))
expect_identical(
is.editor(members(tp)[email(u)]),
c(FALSE)
)
is.editor(members(tp)[email(u)]) <- TRUE
expect_identical(
is.editor(members(tp)[email(u)]),
c(TRUE)
)
})
test_that("Can remove members from a project", {
skip_on_jenkins("Jenkins user needs more permissions")
tp <- newProject(name = now())
u <- testUser()
expect_identical(names(members(tp)), my.name)
members(tp) <- email(u)
expect_true(setequal(names(members(tp)), c(name(u), my.name)))
try(members(tp)[[email(u)]] <- NULL)
expect_identical(names(members(tp)), my.name)
})
ds <- createDataset(name = now())
tp <- newProject(name = now())
test_that("Can add datasets to project", {
expect_true(is.project(tp))
expect_length(datasets(tp), 0)
datasets(tp) <- ds
expect_identical(names(datasets(tp)), name(ds))
expect_identical(owner(refresh(ds)), self(tp))
})
ds2 <- loadDataset(name(ds), project = name(tp))
test_that("Can load a dataset from a project", {
expect_true(is.dataset(ds2))
expect_identical(self(ds2), self(ds))
})
test_that("Can rename a dataset in a project", {
newname <- paste(name(ds2), "edited")
name(ds2) <- newname
expect_identical(name(ds2), newname)
expect_identical(name(refresh(ds2)), newname)
expect_identical(name(datasets(refresh(tp))[[1]]), newname)
})
test_that("Can privatize a dataset belonging to a project", {
expect_identical(owner(ds2), self(tp))
owner(ds2) <- me()
expect_identical(owner(ds2), self(me()))
})
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.