test_that("update_klass gir riktig resultat ved enkle endringer", {
  data("klass_131_2020_graph")
  graph <- klass_131_2020_graph
  data("api_endringer_2019")

  endringer_kommunestruktur_enkle <-
    api_endringer_2019 %>%
    # 2020 hadde mange enkle endringer
    dplyr::filter(changeOccurred == "2020-01-01") %>%
    dplyr::group_by(oldCode) %>%
    dplyr::filter(dplyr::n() == 1) %>% # vi tester ikke delinger av koder
    dplyr::group_by(newCode) %>%
    dplyr::filter(dplyr::n() == 1) %>% # vi tester ikke sammenslåtte koder
    dplyr::ungroup() %>%
    dplyr::select(oldCode, newCode, changeOccurred)

  omkodet <-
    endringer_kommunestruktur_enkle %>%
    dplyr::mutate(
      oppdatert = update_klass(
        codes = oldCode,
        classification = 131,
        output = "code",
        report = FALSE,
        graph = graph
      )
    )

  feil <-
    omkodet %>%
    dplyr::rowwise() %>%
    dplyr::filter(!newCode %in% oppdatert)

  expect_equal(nrow(feil), 0)
})

test_that("update_klass gir riktig resultat ved sammenslåtte koder", {
  data("klass_131_1964_graph")
  graph <- klass_131_1964_graph

  data("api_endringer_1963")

  endringer_kommunestruktur_sammenslåinger <-
    api_endringer_1963 %>%
    dplyr::filter(changeOccurred == "1964-01-01") %>%
    dplyr::group_by(oldCode, changeOccurred) %>%
    dplyr::filter(dplyr::n() == 1) %>% # vi tester ikke delinger av koder
    dplyr::group_by(newCode) %>%
    dplyr::filter(dplyr::n() > 1)

  omkodet <-
    endringer_kommunestruktur_sammenslåinger %>%
    dplyr::mutate(
      oppdatert = update_klass(
        codes = oldCode,
        dates = as.Date(changeOccurred) - 1,
        classification = 131,
        graph = graph
      ),
      oppdatert_ikkecomb = update_klass(
        codes = oldCode,
        dates = as.Date(changeOccurred) - 1,
        classification = 131,
        graph = graph,
        combine = FALSE
      )
    )

  omkodet %>%
    dplyr::rowwise() %>%
    dplyr::filter(!newCode %in% oppdatert) %>%
    # `1441 Selje` is split in 1964 to `1441 Selje` and `1439 Vågsøy`,
    # but only `1439 Vågsøy` is recorded in the changes API
    dplyr::filter(!oldCode == "1441" & changeOccurred == "1964-01-01") %>%
    nrow() %>%
    expect_equal(expected = 0)

  omkodet %>%
    dplyr::rowwise() %>%
    dplyr::filter(!is.na(oppdatert_ikkecomb)) %>%
    nrow() %>%
    expect_equal(expected = 0)
})

test_that("update_klass gir riktig resultat ved ugyldige koder", {
  data("klass_131_graph")
  graph <- klass_131_graph

  expect_true(
    all(
      is.na(
        update_klass(c("foo", "bar", "egg", "ham"), graph = graph)
      )
    )
  )
})

test_that("update_klass gir riktig resultat ved delte koder", {
  data("klass_131_1964_graph")
  graph <- klass_131_1964_graph

  data("api_endringer_1963")

  endringer_kommunestruktur_delinger <-
    api_endringer_1963 %>%
    # 1964 hadde klart flest delinger av koder
    dplyr::filter(changeOccurred == "1964-01-01") %>%
    dplyr::group_by(oldCode) %>%
    dplyr::filter(dplyr::n() > 1) %>%
    dplyr::ungroup() %>%
    dplyr::select(oldCode, newCode, changeOccurred)

  omkodet <-
    endringer_kommunestruktur_delinger %>%
    dplyr::mutate(
      oppdatert = update_klass(
        codes = oldCode,
        dates = as.Date(changeOccurred) - 1,
        classification = 131,
        graph = graph
      )
    )

  expect_true(all(is.na(omkodet$oppdatert)))
})


test_that("update_klass gir forventet format på output", {
  data("klass_131_graph")
  graph <- klass_131_graph

  update_helper <- function(output, report) {
    update_klass(
      codes = "0301",
      dates = "1838-01-01",
      output = output,
      report = report,
      graph = graph
    )
  }

  expect_type(update_helper(output = "code", report = FALSE), "character")
  expect_type(update_helper(output = "code", report = TRUE), "list")
  expect_type(update_helper(output = TRUE, report = FALSE), "list")
  expect_type(update_helper(output = "code", report = TRUE)[[1]], "character")
  expect_s3_class(
    update_helper(output = c("code", "name"), report = TRUE)[[1]],
    "data.frame"
  )
  expect_type(update_helper(output = c("code", "name"), report = TRUE), "list")
  expect_type(update_helper(output = TRUE, report = FALSE), "list")
  expect_s3_class(
    update_helper(output = TRUE, report = FALSE)[[1]],
    "data.frame"
  )
  expect_equal(nrow(update_helper(output = TRUE, report = FALSE)[[1]]), 1)
  expect_equal(
    nrow(update_helper(output = c("code", "name"), report = FALSE)[[1]]),
    1
  )
  expect_equal(length(update_helper(output = "code", report = FALSE)), 1)
})

test_that("update_klass oppdaterer koder som har hatt navneendringer", {
  ## ... og der navneendringene ikke er logget som endringer, jf. [#56]

  data("klass_131_graph")
  graph <- klass_131_graph

  expect_equal(
    update_klass(
      codes = "1420",
      dates = "1838-01-01",
      graph = graph
    ),
    "4640",
    ignore_attr = TRUE
  )
})
