# File Operations Tests

file_scan_response <- list(
  data = list(
    type = "analysis",
    id = "mock_analysis_id_123"
  )
)

file_report_response <- list(
  data = list(
    type = "file",
    id = "mock_file_id",
    attributes = list(
      last_analysis_results = list(
        "Antivirus1" = list(category = "undetected"),
        "Antivirus2" = list(category = "malicious")
      ),
      total_votes = list(
        harmless = 50,
        malicious = 2
      )
    )
  )
)

test_that("scan_file validates input correctly", {
  expect_error(scan_file(), "argument \"file_path\" is missing")
  expect_error(scan_file(NULL), "Must be of type 'character'")
  expect_error(scan_file(123), "Must be of type 'character'")
  expect_error(scan_file(character(0)), "Must have length 1")
  expect_error(scan_file("nonexistent_file.txt"), "File does not exist")
})

test_that("file_report validates input correctly", {
  expect_error(file_report(), class = "virustotal_validation_error")
  expect_error(file_report(NULL), class = "virustotal_validation_error")
  expect_error(file_report(123), class = "virustotal_validation_error")
  expect_error(file_report(""), class = "virustotal_validation_error")

  old_key <- Sys.getenv("VirustotalToken")
  Sys.unsetenv("VirustotalToken")
  expect_error(file_report("dummy_hash"), class = "virustotal_auth_error")

  if (old_key != "") {
    Sys.setenv(VirustotalToken = old_key)
  }
})

test_that("rescan_file validates input correctly", {
  expect_error(rescan_file(), "Assertion on 'hash' failed")
  expect_error(rescan_file(NULL), "Assertion on 'hash' failed")
  expect_error(rescan_file(123), "Assertion on 'hash' failed")
  expect_error(
    rescan_file(""),
    "All elements must have at least 1 characters"
  )
})

test_that("get_file_upload_url validates correctly", {
  expect_true(exists("get_file_upload_url"))
})

test_that("get_file_comments validates input correctly", {
  expect_error(get_file_comments(), "Assertion on 'hash' failed")
  expect_error(get_file_comments(NULL), "Assertion on 'hash' failed")
  expect_error(
    get_file_comments(""),
    "All elements must have at least 1 characters"
  )
})

test_that("post_file_comments validates input correctly", {
  expect_error(post_file_comments(), "Assertion on 'hash' failed")
  expect_error(post_file_comments("hash123"), "Assertion on 'comment' failed")
  expect_error(
    post_file_comments("hash123", ""),
    "All elements must have at least 1 characters"
  )
})

test_that("get_file_votes validates input correctly", {
  expect_error(get_file_votes(), "Assertion on 'hash' failed")
  expect_error(get_file_votes(NULL), "Assertion on 'hash' failed")
  expect_error(
    get_file_votes(""),
    "All elements must have at least 1 characters"
  )
})

test_that("post_file_votes validates input correctly", {
  expect_error(post_file_votes(), "Assertion on 'hash' failed")
  expect_error(post_file_votes("hash123"), "Assertion on 'verdict' failed")
  expect_error(
    post_file_votes("hash123", "invalid"),
    "Verdict must be either 'harmless' or 'malicious'"
  )
})

test_that("get_file_relationships validates input correctly", {
  expect_error(get_file_relationships(), "Assertion on 'hash' failed")
  expect_error(
    get_file_relationships("hash123"),
    "Assertion on 'relationship' failed"
  )
  expect_error(
    get_file_relationships("hash123", "invalid"),
    "Invalid relationship type"
  )
})

test_that("download_file validates input correctly", {
  expect_error(download_file(), "Assertion on 'hash' failed")
  expect_error(download_file(NULL), "Assertion on 'hash' failed")
  expect_error(
    download_file(""),
    "All elements must have at least 1 characters"
  )
})

test_that("get_file_download_url validates input correctly", {
  expect_error(get_file_download_url(), "Assertion on 'hash' failed")
  expect_error(get_file_download_url(NULL), "Assertion on 'hash' failed")
  expect_error(
    get_file_download_url(""),
    "All elements must have at least 1 characters"
  )
})

test_that("file operations work with mocked responses", {
  skip_if_not_installed("httptest")
  skip_if(Sys.getenv("VirustotalToken") == "", "API key not set")

  expect_true(exists("scan_file"))
  expect_true(exists("file_report"))
  expect_true(exists("rescan_file"))
  expect_true(exists("get_file_upload_url"))
  expect_true(exists("get_file_comments"))
  expect_true(exists("post_file_comments"))
  expect_true(exists("get_file_votes"))
  expect_true(exists("post_file_votes"))
  expect_true(exists("get_file_relationships"))
  expect_true(exists("download_file"))
  expect_true(exists("get_file_download_url"))
})
