expect_r_file <- function(...) {
  expect_true(file_exists(path_home_r(...)))
}

expect_fs_file <- function(...) {
  expect_true(file_exists(path_home(...)))
}


test_that("edit_file() creates new directory and another and a file within", {
  tmp <- file_temp()
  expect_false(dir_exists(tmp))
  capture.output(new_file <- edit_file(path(tmp, "new_dir", "new_file")))
  expect_true(dir_exists(tmp))
  expect_true(dir_exists(path(tmp, "new_dir")))
  expect_true(file_exists(path(tmp, "new_dir", "new_file")))
})

test_that("edit_file() creates new file in existing directory", {
  tmp <- file_temp()
  dir_create(tmp)
  capture.output(new_file <- edit_file(path(tmp, "new_file")))
  expect_true(file_exists(path(tmp, "new_file")))
})

test_that("edit_file() copes with path to existing file", {
  tmp <- file_temp()
  dir_create(tmp)
  existing <- file_create(path(tmp, "a_file"))
  capture.output(res <- edit_file(path(tmp, "a_file")))
  expect_identical(existing, res)
})

test_that("edit_template() can create a new template", {
  create_local_package()

  edit_template("new_template")
  expect_proj_file("inst/templates/new_template")
})

## testing edit_XXX("user") only on travis and appveyor, because I don't want to
## risk creating user-level files de novo for an actual user, which would
## obligate me to some nerve-wracking clean up

test_that("edit_r_XXX() and edit_git_XXX() have default scope", {
  skip_if_no_git_user()
  ## run these manually if you already have these files or are happy to
  ## have them or delete them
  skip_if_not_ci()

  ## on Windows, under R CMD check, some env vars are set to sentinel values
  ## https://github.com/wch/r-source/blob/78da6e06aa0017564ec057b768f98c5c79e4d958/src/library/tools/R/check.R#L257
  ## we need to explicitly ensure R_ENVIRON_USER="" here
  withr::local_envvar(list(R_ENVIRON_USER = ""))

  expect_no_error(edit_r_profile())
  expect_no_error(edit_r_buildignore())
  expect_no_error(edit_r_environ())
  expect_no_error(edit_r_makevars())
  expect_no_error(edit_git_config())
  expect_no_error(edit_git_ignore())
})

test_that("edit_r_XXX('user') ensures the file exists", {
  ## run these manually if you already have these files or are happy to
  ## have them or delete them
  skip_if_not_ci()

  ## on Windows, under R CMD check, some env vars are set to sentinel values
  ## https://github.com/wch/r-source/blob/78da6e06aa0017564ec057b768f98c5c79e4d958/src/library/tools/R/check.R#L257
  ## we need to explicitly ensure R_ENVIRON_USER="" here
  withr::local_envvar(list(R_ENVIRON_USER = ""))

  edit_r_environ("user")
  expect_r_file(".Renviron")

  edit_r_profile("user")
  expect_r_file(".Rprofile")

  edit_r_makevars("user")
  expect_r_file(".R", "Makevars")
})

test_that("edit_r_buildignore() only works with packages", {
  create_local_project()

  expect_usethis_error(edit_r_buildignore(), "not an R package")

  use_description()
  edit_r_buildignore()
  expect_proj_file(".Rbuildignore")
})

test_that("can edit snippets", {
  path <- withr::local_tempdir()
  withr::local_envvar(c("XDG_CONFIG_HOME" = path))

  path <- edit_rstudio_snippets(type = "R")
  expect_true(file_exists(path))

  expect_snapshot(
    edit_rstudio_snippets("not-existing-type"),
    error = TRUE
  )
})

test_that("edit_r_profile() respects R_PROFILE_USER", {
  path1 <- user_path_prep(file_temp())
  withr::local_envvar(list(R_PROFILE_USER = path1))

  path2 <- edit_r_profile("user")
  expect_equal(path1, path2)
})


test_that("edit_git_XXX('user') ensures the file exists", {
  skip_if_no_git_user()
  ## run these manually if you already have these files or are happy to
  ## have them or delete them
  skip_if_not_ci()

  edit_git_config("user")
  expect_fs_file(".gitconfig")

  edit_git_ignore("user")
  expect_fs_file(".gitignore")
  expect_match(
    git_cfg_get("core.excludesfile", where = "global"),
    "gitignore"
  )
})

test_that("edit_r_profile() ensures .Rprofile exists in project", {
  create_local_package()
  edit_r_profile("project")
  expect_proj_file(".Rprofile")

  create_local_project()
  edit_r_profile("project")
  expect_proj_file(".Rprofile")
})

test_that("edit_r_environ() ensures .Renviron exists in project", {
  create_local_package()
  edit_r_environ("project")
  expect_proj_file(".Renviron")

  create_local_project()
  edit_r_environ("project")
  expect_proj_file(".Renviron")
})

test_that("edit_r_makevars() ensures .R/Makevars exists in package", {
  create_local_package()
  edit_r_makevars("project")
  expect_proj_file(".R", "Makevars")
})

test_that("edit_git_config() ensures git ignore file exists in project", {
  create_local_package()
  edit_git_config("project")
  expect_proj_file(".git", "config")

  create_local_project()
  edit_git_config("project")
  expect_proj_file(".git", "config")
})

test_that("edit_git_ignore() ensures .gitignore exists in project", {
  create_local_package()
  edit_git_ignore("project")
  expect_proj_file(".gitignore")

  create_local_project()
  edit_git_ignore("project")
  expect_proj_file(".gitignore")
})
