context("downstream")

test_that("downstream basic usage works", {
  skip_on_cran()
  vcr::use_cassette("downstream", {
    cc <- downstream("Ursus", db = "gbif", downto = "Species",
      messages = FALSE)
  }, preserve_exact_body_bytes = TRUE)

  expect_is(cc, "downstream")
  expect_named(cc, "Ursus")
  expect_is(cc$Ursus$rank, "character")
})

test_that("downstream - taxonomic id input", {
  skip_on_cran()
  vcr::use_cassette("downstream_id_input", {
    aa <- downstream(get_gbifid("Ursus", messages = FALSE),
      db = "gbif", downto = "Species")
  }, preserve_exact_body_bytes = TRUE)

  expect_is(aa, "downstream")
  expect_is(aa[[1]], "data.frame")
  expect_is(aa[[1]]$name_type, "character")
})

test_that("downstream - multiple data sources", {
  skip_on_cran()
  vcr::use_cassette("downstream_multiple_data_sources", {
    ids <- sw(get_ids("Ursus", db = c("gbif", 'itis'), rows = 1,
      messages = FALSE, suppress = TRUE))
    aa <- downstream(ids, downto = "Species")
  }, preserve_exact_body_bytes = TRUE)

  expect_is(aa, "downstream_ids")
  expect_is(aa[[1]], "downstream")
  expect_is(aa[[1]]$Ursus, "data.frame")
})

test_that("downstream - Use the rows parameter", {
  skip_on_cran()
  vcr::use_cassette("downstream_rows_param", {
    aa <- downstream("Pinus", db = 'gbif', downto = "species",
      rows = 1, messages = FALSE)
  })

  expect_is(aa, "downstream")
  expect_is(aa[[1]], "data.frame")
  expect_is(aa[[1]]$name, "character")
})

test_that("downstream fails well", {
  skip_on_cran()

  expect_error(downstream("adfaf"), "Must specify downto")
  expect_error(downstream("Ursus", downto = "adfasdf"), "Must specify db")
  expect_error(downstream("Ursus", downto = "Species", db = "asdfdsf"),
               "the provided db value was not recognised")
})

test_that("warn on mismatch 'db'", {
  skip_on_cran()
  vcr::use_cassette("downstream_warn_on_db_mismatch", {
    expect_warning(
      downstream(
        get_gbifid('Apis', messages = FALSE, rows = 1), downto = "species",
        db = "itis"))
  })
})

test_that("downstream basic usage works", {
  skip_on_cran()
  vcr::use_cassette("downstream_bold", {
    cc <- downstream("Ursus", db = "bold", downto = "species",
      messages = FALSE)
  }, preserve_exact_body_bytes = TRUE)

  expect_is(cc, "downstream")
  expect_named(cc, "Ursus")
  expect_is(cc$Ursus$rank, "character")
})

test_that("worms - can pass through marine_only parameter", {
  skip_on_cran()
  vcr::use_cassette("downstream_worms_marine_only_para", {
    # should return one row, Didelphimorphia
    aa <- downstream(1837, db = "worms", downto = "order")
    # should return 10 rows
    bb <- downstream(1837, db = "worms", downto = "order", marine_only=FALSE)
  })

  expect_is(aa, "downstream")
  expect_is(bb, "downstream")
  expect_gt(NROW(bb[[1]]), NROW(aa[[1]]))
})
