library(quantmod)

# Tests for getSymbols
test.web.endpoints <- Sys.getenv("QUANTMOD_TEST_WEB_ENDPOINTS")

if (nzchar(test.web.endpoints)) {
  # Checks for Alpha Vantage
  apikey <- Sys.getenv("QUANTMOD_AV_API_KEY")
  if (nzchar(apikey)) {
    ibm_daily_unadj <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = FALSE, periodicity = "daily", auto.assign = FALSE)
    ibm_daily_adj   <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = TRUE, periodicity = "daily", auto.assign = FALSE)
    stopifnot(has.Ad(ibm_daily_adj))

    Sys.sleep(60) #AV throttles to 5 calls per minute

    ibm_weekly_unadj <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = FALSE, periodicity = "weekly", auto.assign = FALSE)
    ibm_weekly_adj   <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = TRUE, periodicity = "weekly", auto.assign = FALSE)
    stopifnot(has.Ad(ibm_weekly_adj))

    ibm_monthly_unadj <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = FALSE, periodicity = "monthly", auto.assign = FALSE)
    ibm_monthly_adj   <- getSymbols("IBM", src = "av", api.key = apikey,
      adjusted = TRUE, periodicity = "monthly", auto.assign = FALSE)
    stopifnot(has.Ad(ibm_monthly_adj))
  }
}

# Checks to ensure caught errors do not prevent other symbols from loading.
# Use one symbol that always works (e.g. from disk) and another that fails.
data(sample_matrix, package = "xts")
IBM <- as.xts(sample_matrix)
cn <- c("Open", "High", "Low", "Close")

td <- tempdir()
tf <- file.path(td, "IBM.rda")
save(IBM, file = tf)
tf <- file.path(td, "IBM.csv")
write.zoo(IBM, file = tf, sep = ",")
rm(IBM)

e <- new.env()

# Test getSymbols() works if only passed one symbol that does not have data.
x <- try({
  getSymbols("IBM;WYSIWYG", env = e, src = "csv", dir = td, col.names = cn)
}, silent = TRUE)
stopifnot(exists("IBM", e))
rm(IBM, pos = e)

x <- try({
  getSymbols("IBM;WYSIWYG", env = e, src = "rda", dir = td, col.names = cn)
}, silent = TRUE)
stopifnot(exists("IBM", e))
rm(IBM, pos = e)

if (nzchar(test.web.endpoints)) {
  x <- try({
    getSymbols("IBM;WYSIWYG", env = e, src = "yahoo")
  }, silent = TRUE)
  stopifnot(exists("IBM", e))
  rm(IBM, pos = e)

  if (nzchar(apikey)) {
    x <- try({
      getSymbols("IBM;WYSIWYG", env = e, src = "av", api.key = apikey)
    }, silent = TRUE)
    stopifnot(exists("IBM", e))
    rm(IBM, pos = e)
  }

  x <- try({
    getSymbols("DGS10;WYSIWYG", env = e, src = "FRED")
  }, silent = TRUE)
  stopifnot(exists("DGS10", e))
  rm(DGS10, pos = e)

  x <- try({
    getSymbols("EUR/USD;WYS/WYG", env = e, src = "oanda")
  }, silent = TRUE)
  stopifnot(exists("EURUSD", e))
  rm(EURUSD, pos = e)

  # Ensure getSymbols() errors if only passed one symbol that does not have data.
  # "csv" and "rda" already skip missing symbols
  x <- try({
    getSymbols("WYSIWYG", env = e, src = "yahoo")
  }, silent = TRUE)
  stopifnot(inherits(x, "try-error"))

  x <- try({
    getSymbols("WYSIWYG", env = e, src = "FRED")
  }, silent = TRUE)
  stopifnot(inherits(x, "try-error"))

  if (nzchar(apikey)) {
    x <- try({
      getSymbols("WYSIWYG", env = e, src = "av", api.key = apikey)
    }, silent = TRUE)
    stopifnot(inherits(x, "try-error"))
  }

  x <- try({
    getSymbols("WYS/WYG", env = e, src = "oanda")
  }, silent = TRUE)
  stopifnot(inherits(x, "try-error"))

  # Individual getSymbols() "methods" should not error if only passed one symbol.
  setSymbolLookup(AAPL = "yahoo", DGS10 = "FRED")
  getSymbols("AAPL;DGS10", env = e)
  stopifnot(exists("AAPL", e))
  stopifnot(exists("DGS10", e))
}
