library("testthat")
library("tidywikidatar")

test_that("check if image returned when valid id given", {
  testthat::skip_if_offline()
  testthat::skip_on_cran()
  testthat::skip_on_ci()

  tw_set_cache_folder(path = tempdir())

  test_id_df <- tw_get(
    id = "Q2",
    id_l = tw_test_items
  )

  expect_true(
    object = {
      tw_get_image(
        id = "Q2",
        cache = FALSE,
        id_df = test_id_df
      ) %>%
        tidyr::drop_na() %>%
        nrow() %>%
        as.logical()
    }
  )

  expect_true(
    object = {
      tw_get_image(
        id = "Q2",
        cache = TRUE,
        id_df = test_id_df
      ) %>%
        tidyr::drop_na() %>%
        nrow() %>%
        as.logical()
    }
  )
})

test_that("check if image returned when invalid id given", {
  testthat::skip_if_offline()
  testthat::skip_on_cran()
  testthat::skip_on_ci()

  test_id_df <- tw_get(
    id = "Q2",
    id_l = tw_test_items
  )

  expect_true(
    object = {
      tw_get_image(id = "non_qid_string") %>%
        is.null()
    }
  )

  expect_true(
    object = {
      tw_get_image_same_length(
        id = "non_qid_string",
        id_df = test_id_df
      ) %>%
        is.na()
    }
  )

  expect_equal(
    object = {
      tw_get_image_same_length(
        id = c("non_qid_string", NA),
        id_df = test_id_df
      ) %>%
        is.na() %>%
        sum()
    },
    expected = 2
  )

  expect_equal(
    object = {
      tw_get_image_same_length(
        id = c("non_qid_string", "Q2", "non_qid_string", NA),
        id_df = test_id_df
      ) %>%
        is.na() %>%
        which()
    },
    expected = c(1, 3, 4)
  )
})


test_that("check if image metadata returned correctly with or without cache", {
  testthat::skip_if_offline()
  testthat::skip_on_cran() # to prevent error due to calls to Wikimedia Commons from CRAN server
  testthat::skip_on_ci()

  test_id_df <- tw_get(
    id = "Q2",
    id_l = tw_test_items
  )

  expect_equal(
    object = {
      df <- tw_get_image_metadata_single(
        id = c("Q2"),
        only_first = TRUE,
        cache = FALSE
      )

      list(
        ncol = ncol(df),
        nrow = nrow(df),
        id = df %>% dplyr::pull(id)
      )
    },
    expected = list(
      ncol = 19,
      nrow = 1,
      id = "Q2"
    )
  )

  expect_equal(
    object = {
      tw_set_cache_folder(path = tempdir())

      df <- tw_get_image_metadata(
        id = c("Q2", NA, "not_an_id", "Q5"),
        only_first = TRUE,
        cache = TRUE,
        id_df = test_id_df,
        wait = 10
      )

      list(
        ncol = ncol(df),
        nrow = nrow(df),
        id = df %>% dplyr::pull(id),
        missing_image = which(is.na(df$image_filename))
      )
    },
    expected = list(
      ncol = 19,
      nrow = 4,
      id = c("Q2", NA, "not_an_id", "Q5"),
      missing_image = c(2, 3)
    )
  )

  expect_equal(
    object = {
      tw_set_cache_folder(path = tempdir())

      df <- tw_get_image_metadata(
        id = c("Q2", NA, "not_an_id", "Q5"),
        only_first = TRUE,
        cache = FALSE,
        id_df = test_id_df,
        wait = 10
      )

      list(
        ncol = ncol(df),
        nrow = nrow(df),
        id = df %>% dplyr::pull(id)
      )
    },
    expected = list(
      ncol = 19,
      nrow = 4,
      id = c("Q2", NA, "not_an_id", "Q5")
    )
  )
})
