tests/testthat/test-validate_data.R

date1 <- structure(1585220000, class = c("POSIXct", "POSIXt"))


# .validate_variable_exist ------------------------------------------------

test_that(".validate_variable_exist", {
  testdata <- dplyr::tibble(
    bidule = 1,
    truc = 2
  )
  
  testdatatable <- data.table::data.table(
    bidule = 1,
    truc = 2
  )
  
  expect_true(.validate_variable_exist(testdata, c("bidule", "truc")))
  expect_error(.validate_variable_exist(testdata, c("bidule", "truc", "bidul"), "error"))
  expect_warning(.validate_variable_exist(testdata, c("bidule", "truc", "TRUC")))
  
  expect_true(.validate_variable_exist(testdatatable, c("bidule", "truc")))
  expect_error(.validate_variable_exist(testdatatable, c("bidule", "truc", "bidul"), "error"))
  expect_warning(.validate_variable_exist(testdatatable, c("bidule", "truc", "TRUC")))
})


# .validate_variable_no_missing -------------------------------------------

test_that(".validate_variable_no_missing() on data.frame", {
  expect_error(.validate_variable_no_missing(
    data = data.frame(foo = c("1", "")), 
    vectorname = "foo", 
    action = "bidule"))
  expect_error(.validate_variable_no_missing(
    data = data.frame(foo = c("1", "")), 
    vectorname = "foo", 
    action = NULL))
  expect_false(expect_warning(.validate_variable_no_missing(
    data = data.frame(foo = c("1", "")), 
    vectorname = "foo", 
    action = "warning")))
  expect_error(.validate_variable_no_missing(
    data = data.frame(foo = c("1", "")), 
    vectorname = "foo", 
    action = "error"))
  
  expect_false(expect_warning(.validate_variable_no_missing(
    data = data.frame(foo = c("1", NA)), 
    vectorname = "foo", 
    action = "warning")))
  expect_error(.validate_variable_no_missing(
    data = data.frame(foo = c("1", NA)), 
    vectorname = "foo", 
    action = "error"))
  expect_true(.validate_variable_no_missing(
    data = data.frame(foo = c("1", NA)), 
    vectorname = character(0),
    action = "error"))
  expect_true(.validate_variable_no_missing(
    data.frame(bar = c("1", NA)), 
    vectorname = "foo",
    action = "error"))
})


test_that(".validate_variable_no_missing() on data.table", {
  expect_error(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", "")), 
    vectorname = "foo", 
    action = "bidule"))
  expect_error(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", "")), 
    vectorname = "foo", 
    action = NULL))
  expect_false(expect_warning(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", "")), 
    vectorname = "foo", 
    action = "warning")))
  expect_error(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", "")), 
    vectorname = "foo", 
    action = "error"))
  
  expect_false(expect_warning(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", NA)), 
    vectorname = "foo", 
    action = "warning")))
  expect_error(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", NA)), 
    vectorname = "foo", 
    action = "error"))
  expect_true(.validate_variable_no_missing(
    data = data.table::data.table(foo = c("1", NA)), 
    vectorname = character(0),
    action = "error"))
  expect_true(.validate_variable_no_missing(
    data.table::data.table(bar = c("1", NA)), 
    vectorname = "foo",
    action = "error"))
})



# .validate_inpatient_encounters/validate_inpatient_episodes -------------------

test_that("validate_inpatient_episodes on test dataset", {
  expect_true(validate_inpatient_episodes(.ramses_mock_dataset$patients,
                                          .ramses_mock_dataset$episodes))
  
  expect_true(validate_inpatient_episodes(patients = .ramses_mock_dataset$patients,
                                          episodes = .ramses_mock_dataset$episodes,
                                          wards = inpatient_wards))
})

test_that(".validate_inpatient_encounters()/validate_inpatient_episodes() on data.frame", {

  faulty_encounters <- data.frame(list(
    patient_id = c(1, 2, 2),
    encounter_id = c(1, 2, 3),
    admission_date = c(date1, date1, date1 + 3*3600),
    discharge_date = c(date1 - 12*3600, 
                       date1 + 6*3600,
                       date1 + 6*3600)
  ))
  
  expect_false(expect_warning(.validate_inpatient_encounters(faulty_encounters[1, ])))
  expect_false(expect_warning(.validate_inpatient_encounters(faulty_encounters[-1, ])))
  
  healthy_episodes <- data.frame(list(
    patient_id = "1",
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 3*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  ))
  
  expect_equal(
    validate_inpatient_episodes(patients = dplyr::tibble(patient_id = "1"),
                                episodes = healthy_episodes),
    TRUE
  )
  expect_error(
    validate_inpatient_episodes(patients = dplyr::tibble(wrong_variable = "1"),
                                episodes = healthy_episodes)
  )
  expect_error(
    validate_inpatient_episodes(patients = dplyr::tibble(patient_id = "2"),
                                episodes = healthy_episodes)
  )
  
  expect_error(
    validate_inpatient_episodes(patients = dplyr::tibble(patient_id = "1"),
                                episodes = healthy_episodes[, -3])
  )
  
  expect_equal(
    validate_inpatient_episodes(patients = dplyr::tibble(patient_id = "1"),
                                episodes = healthy_episodes,
                                wards = dplyr::tibble(
                                  patient_id = "1",
                                  encounter_id = 2,
                                  ward_start = date1,
                                  ward_end = date1 + 3*3600,
                                  ward_code = "3E",
                                  ward_display_name = "3 East",
                                  ward_description = "3 East"
                                )),
    TRUE
  )
  
  expect_error(
    validate_inpatient_episodes(patients = dplyr::tibble(patient_id = "1"),
                                episodes = healthy_episodes,
                                wards = dplyr::tibble(
                                  patient_id = "1",
                                  encounter_id = 2,
                                  ward_start = date1,
                                  ward_end = date1 + 3*3600,
                                  ward_code = "3E",
                                  ward_description = "3 East"
                                ))
  )
  
  overlap_episode <- data.frame(list(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 3*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 0.5*3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  ))
  
  missing_first_episode <- data.frame(list(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 2:4,
    last_episode_in_encounter = 2,
    episode_start = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    episode_end = c(date1 + 2*3600, date1 + 3*3600, date1 + 4*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  ))
  
  missing_intermediate_episode <- data.frame(list(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = c(1, 3, 4),
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 2*3600, date1 + 3*3600),
    episode_end = c(date1 + 3600, date1 + 3*3600, date1 + 4*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  ))
  
  missing_final_episode <- data.frame(list( 
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  ))
  
  expect_true(expect_warning(validate_inpatient_episodes(dplyr::tibble(patient_id = 1),
                                                         missing_first_episode)))
  expect_true(expect_warning(validate_inpatient_episodes(dplyr::tibble(patient_id = 1),
                                                         missing_intermediate_episode)))
  expect_true(expect_warning(validate_inpatient_episodes(dplyr::tibble(patient_id = 1),
                                                         missing_final_episode)))
  expect_false(expect_warning(validate_inpatient_episodes(dplyr::tibble(patient_id = 1),
                                                          overlap_episode)))
 
})


test_that(".validate_inpatient_encounters()/validate_inpatient_episodes() on data.table", {
  
  faulty_encounters <- data.table::data.table(
    patient_id = c(1, 2, 2),
    encounter_id = c(1, 2, 3),
    admission_date = c(date1, date1, date1 + 3*3600),
    discharge_date = c(date1 - 12*3600, 
                       date1 + 6*3600,
                       date1 + 6*3600)
  )
  
  expect_false(expect_warning(.validate_inpatient_encounters(faulty_encounters[1, ])))
  expect_false(expect_warning(.validate_inpatient_encounters(faulty_encounters[-1, ])))
  
  healthy_episodes <- data.table::data.table(
    patient_id = "1",
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 3*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  expect_equal(
    validate_inpatient_episodes(patients = data.table::data.table(patient_id = "1"),
                                episodes = healthy_episodes),
    TRUE
  )
  expect_error(
    validate_inpatient_episodes(patients = data.table::data.table(wrong_variable = "1"),
                                episodes = healthy_episodes)
  )
  expect_error(
    validate_inpatient_episodes(patients = data.table::data.table(patient_id = "2"),
                                episodes = healthy_episodes)
  )
  
  overlap_episode <- data.table::data.table(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 3*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 0.5*3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  missing_first_episode <- data.table::data.table(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 2:4,
    last_episode_in_encounter = 2,
    episode_start = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    episode_end = c(date1 + 2*3600, date1 + 3*3600, date1 + 4*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  missing_intermediate_episode <- data.table::data.table(
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = c(1, 3, 4),
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 2*3600, date1 + 3*3600),
    episode_end = c(date1 + 3600, date1 + 3*3600, date1 + 4*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  missing_final_episode <- data.table::data.table( 
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  episode_dates_inverted <- data.table::data.table( 
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    episode_end = c(date1, date1 + 3600, date1 + 2*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  encounter_dates_inverted <- data.table::data.table( 
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1 + 4*3600,
    discharge_date = date1,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 3*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  episode_spilling_out_of_encounter <- data.table::data.table( 
    patient_id = 1,
    encounter_id = 2,
    admission_date = date1,
    discharge_date = date1 + 4*3600,
    episode_number = 1:3,
    last_episode_in_encounter = 2,
    episode_start = c(date1, date1 + 3600, date1 + 2*3600),
    episode_end = c(date1 + 3600, date1 + 2*3600, date1 + 5*3600),
    admission_method = "2",
    consultant_code = "CXXXXXX",
    main_specialty_code = "100"
  )
  
  expect_true(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                                         missing_first_episode)))
  expect_true(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                                         missing_intermediate_episode)))
  expect_true(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                                         missing_final_episode)))
  expect_false(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                                          overlap_episode)))
  expect_false(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                             episode_dates_inverted)))
  expect_false(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                             encounter_dates_inverted)))
  expect_false(expect_warning(validate_inpatient_episodes(data.table::data.table(patient_id = 1),
                                             episode_spilling_out_of_encounter)))
})


# validate_inpatient_diagnoses --------------------------------------------

test_that("validate_inpatient_diagnoses on test dataset", {
  expect_warning(
    validate_inpatient_diagnoses(
      diagnoses_data = .ramses_mock_dataset$diagnoses,
      diagnoses_lookup = .ramses_mock_dataset$icd10cm_2020))
})

test_that("validate_inpatient_diagnoses() on data.frame", {
  test_diagnoses <- data.frame(list(
    patient_id = 1,
    encounter_id = 1,
    episode_number = 1,
    icd_code = c("J440", "N39", "N81", NA),
    diagnosis_position = 1,
    last_episode_in_encounter = "2"
  ))
  test_lookup <- data.frame(list(
    icd_code = c("J44", "N39"),
    icd_display = c("J44", "N39"),
    icd_description = c("Other chronic obstructive pulmonary disease",
                  "Other disorders of urinary system"),
    category_code = c("J44", "N39"),
    category_description = c("Other chronic obstructive pulmonary disease",
                             "Other disorders of urinary system")
  ))
  
  expect_true(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[1,], 
                                 diagnoses_lookup = test_lookup)))
  expect_true(validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[2,], 
                                           diagnoses_lookup = test_lookup))
  expect_true(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[3,], 
                                 diagnoses_lookup = test_lookup)))
  expect_error(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[3,], 
                                 diagnoses_lookup = dplyr::select(test_lookup, icd_code)))
  expect_false(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[4,], 
                                 diagnoses_lookup = test_lookup)
  ))
  expect_error(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[3,-2], 
                                 diagnoses_lookup = test_lookup))
  
})

test_that("validate_inpatient_diagnoses() on data.table", {
  test_diagnoses <- data.table::data.table(
    patient_id = 1,
    encounter_id = 1,
    episode_number = 1,
    icd_code = c("J440", "N39", "N81", NA),
    diagnosis_position = 1,
    last_episode_in_encounter = "2"
  )
  test_lookup <- data.table::data.table(
    icd_code = c("J44", "N39"),
    icd_display = c("J44", "N39"),
    icd_description = c("Other chronic obstructive pulmonary disease",
                        "Other disorders of urinary system"),
    category_code = c("J44", "N39"),
    category_description = c("Other chronic obstructive pulmonary disease",
                             "Other disorders of urinary system")
  )
  
  expect_true(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[1,], 
                                 diagnoses_lookup = test_lookup)))
  expect_true(validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[2,], 
                                           diagnoses_lookup = test_lookup))
  expect_true(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[3,], 
                                 diagnoses_lookup = test_lookup)))
  expect_error(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[3,], 
                                 diagnoses_lookup = test_lookup[, icd_code]))
  expect_false(expect_warning(
    validate_inpatient_diagnoses(diagnoses_data = test_diagnoses[4,], 
                                 diagnoses_lookup = test_lookup)
  ))
  
})

# validate_prescriptions --------------------------------------------------

test_that("validate_prescriptions on test dataset", {
  expect_null(validate_prescriptions(.ramses_mock_dataset$drug_rx))
})

test_that("validate_prescriptions() on data.frame", {
  
  expect_null(
    validate_prescriptions(
      data.frame(list(
        patient_id = "5593245762", 
        prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
        prescription_text = "Flucloxacillin IV 2g 3 days", 
        drug_code = "FLC", drug_name = "Flucloxacillin", 
        drug_display_name = "Flucloxacillin", 
        drug_group = "Beta-lactams/penicillins", 
        antiinfective_type = c("antibacterial"),
        ATC_code = "J01CF05",
        ATC_route = "P",
        authoring_date = structure(1421048831, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
        prescription_start = structure(1421051891, 
                                       class = c("POSIXct", "POSIXt"), 
                                       tzone = ""), 
        prescription_end = structure(1421311091, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
        prescription_status = "completed", 
        prescription_context = "inpatient", 
        dose = 2, unit = "g", route = "IV", frequency = "6H", 
        daily_frequency = 4, DDD = 4), stringsAsFactors = F)
    )
  )
  expect_error(validate_prescriptions(
    data.frame(list(
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "biduletrucc'estleurtruc", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 400, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = NA, 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P", 
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = "INVALID DATA",
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "ERROR!!!!!!!",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_null(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4), stringsAsFactors = F)
  ))
  
  expect_warning(validate_prescriptions(
    data.frame(list(
      patient_id = c("5593245762", "5593245762"),
      prescription_id = c("6025e96e1cc750dc6ec7fb9aadca0dbd", "2"),
      prescription_text = c("Flucloxacillin IV 2g 3 days", "Flucloxacillin IV 2g 4 days"), 
      drug_code = c("FLC","FLC"), drug_name = c("Flucloxacillin", "Flucloxacillin"), 
      drug_display_name = c("Flucloxacillin", "Flucloxacillin"),
      drug_group = c("Beta-lactams/penicillins",
                     "Beta-lactams/penicillins"),  
      antiinfective_type = c("antibacterial", "antibacterial"),
      ATC_code = c("J01CF05","J01CF05"),
      ATC_route = c("P", "P"),
      authoring_date = rep(structure(1421048831, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 2), 
      prescription_start = rep(structure(1421051891, 
                                         class = c("POSIXct", "POSIXt"), 
                                         tzone = ""), 2), 
      prescription_end = rep(structure(1421311091, 
                                       class = c("POSIXct", "POSIXt"), 
                                       tzone = ""),2), 
      prescription_status = c("completed", "completed"), 
      prescription_context = c("inpatient", "inpatient"), 
      dose = c(2, 2), unit = c("g", "g"), route = c("IV", "IV"), 
      frequency = c("6H", "6H"), 
      daily_frequency = c(4, 4), DDD = c( 4,  4)), stringsAsFactors = F)
  ))
  
  expect_null(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = as.POSIXct(NA), 
      prescription_status = "cancelled", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4))
  ))
  
  expect_error(validate_prescriptions(
    data.frame(list(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = as.POSIXct(NA), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4))
  ))
})

test_that("validate_prescriptions() on data.table", {
  
  expect_error(validate_prescriptions(
    data.table::data.table(
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_group = "Beta-lactam antibacterials, penicillins", 
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4)
  ))
  
  expect_error(validate_prescriptions(
    data.table::data.table(
      patient_id = NA, 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_group = "Beta-lactam antibacterials, penicillins",
      ATC_route = "P", 
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4)
  ))
  
  expect_error(validate_prescriptions(
    data.table::data.table(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      antiinfective_type = "INVALID DATA",
      ATC_code = "J01CF05",
      ATC_group = "Beta-lactam antibacterials, penicillins", 
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4)
  ))
  
  expect_error(validate_prescriptions(
    data.table::data.table(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_group = "Beta-lactam antibacterials, penicillins", 
      ATC_route = "ERROR!!!!!!!",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4)
  ))
  
  expect_null(validate_prescriptions(
    data.table::data.table(
      patient_id = "5593245762", 
      prescription_id = "6025e96e1cc750dc6ec7fb9aadca0dbd", 
      prescription_text = "Flucloxacillin IV 2g 3 days", 
      drug_code = "FLC", drug_name = "Flucloxacillin", 
      drug_display_name = "Flucloxacillin", 
      drug_group = "Beta-lactams/penicillins", 
      antiinfective_type = c("antibacterial"),
      ATC_code = "J01CF05",
      ATC_route = "P",
      authoring_date = structure(1421048831, 
                                 class = c("POSIXct", "POSIXt"), 
                                 tzone = ""), 
      prescription_start = structure(1421051891, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 
      prescription_end = structure(1421311091, 
                                   class = c("POSIXct", "POSIXt"), 
                                   tzone = ""), 
      prescription_status = "completed", 
      prescription_context = "inpatient", 
      dose = 2, unit = "g", route = "IV", frequency = "6H", 
      daily_frequency = 4, DDD = 4)
  ))
  
  expect_warning(validate_prescriptions(
    data.table::data.table(
      patient_id = c("5593245762", "5593245762"),
      prescription_id = c("6025e96e1cc750dc6ec7fb9aadca0dbd", "2"),
      prescription_text = c("Flucloxacillin IV 2g 3 days", "Flucloxacillin IV 2g 4 days"), 
      drug_code = c("FLC","FLC"), drug_name = c("Flucloxacillin", "Flucloxacillin"), 
      drug_display_name = c("Flucloxacillin", "Flucloxacillin"), 
      drug_group = c("Beta-lactams/penicillins",
                     "Beta-lactams/penicillins"), 
      antiinfective_type = c("antibacterial", "antibacterial"),
      ATC_code = c("J01CF05","J01CF05"),
      ATC_route = c("P", "P"),
      authoring_date = rep(structure(1421048831, 
                                     class = c("POSIXct", "POSIXt"), 
                                     tzone = ""), 2), 
      prescription_start = rep(structure(1421051891, 
                                         class = c("POSIXct", "POSIXt"), 
                                         tzone = ""), 2), 
      prescription_end = rep(structure(1421311091, 
                                       class = c("POSIXct", "POSIXt"), 
                                       tzone = ""),2), 
      prescription_status = c("completed", "completed"), 
      prescription_context = c("inpatient", "inpatient"), 
      dose = c(2, 2), unit = c("g", "g"), route = c("IV", "IV"), 
      frequency = c("6H", "6H"), 
      daily_frequency = c(4, 4), DDD = c( 4,  4))
  ))
  
})

# validate_administrations ------------------------------------------------

test_that("validate_administrations on test dataset", {
  expect_null(validate_administrations(.ramses_mock_dataset$drug_admins))
})

test_that("validate_administrations", {
  test_admin <- data.frame(list(
    patient_id = "3462786743", 
    administration_id = c("644", "645", "646"), 
    prescription_id = "a094fad22985020999e6a1773dfc87e3", 
    administration_text = "Meropenem IV 1g", 
    drug_code = "MEM", drug_name = "Meropenem", drug_display_name = "Meropenem", 
    drug_group = "Carbapenems", 
    antiinfective_type = "antibacterial", 
    ATC_code = "J01DH02", ATC_route = "P", 
    dose = 1, unit = "g", 
    route = "IV", 
    administration_date = structure(
      c(1491142845, 1491142846, 1491142845), 
      tzone = "Europe/London", 
      class = c("POSIXct", "POSIXt")
    ), 
    administration_status = "completed", 
    DDD = 0.333333333333333
  ))
  
  expect_null(validate_administrations(test_admin[1,]))
  expect_null(validate_administrations(test_admin[1:2,]))
  expect_warning(
    expect_null(
      expect_null(validate_administrations(test_admin[1:3,])))
  )
})

# arrange_variables -------------------------------------------------------

test_that("arrange_variables", {
  testdf <- data.frame(list(
    misc = 3,
    encounter_id = 2,
    patient_id = 1
  ))
  testDT <- data.table::data.table(
    misc = 3,
    encounter_id = 2,
    patient_id = 1
  )

  expect_error(arrange_variables(testdf, "missing variable"))
  expect_equal(
    colnames(arrange_variables(testdf, c("patient_id", "encounter_id"))), 
    c("patient_id", "encounter_id", "misc"))
  expect_error(arrange_variables(testDT, "missing variable"))
  expect_equal(
    colnames(arrange_variables(testDT, c("patient_id", "encounter_id"))), 
    c("patient_id", "encounter_id", "misc"))
})


# .validate_values_unique -------------------------------------------------

test_that(".validate_values_unique()", {
  testdata <- data.frame(list(a = 1:4, b = rep(4, 4)))
  testdatatable <- data.table::data.table(a = 1:4, b = rep(4, 4))
  
  expect_true(.validate_values_unique(testdata, c("a")))
  expect_error(.validate_values_unique(testdata, c("a", "b")))
  expect_error(.validate_values_unique(testdata, c("b")))
  expect_true(.validate_values_unique(testdata, c("a", "c")))
  expect_true(.validate_values_unique(testdata, c("c")))
  expect_true(.validate_values_unique(testdata, c()))
  expect_true(.validate_values_unique(testdata, NULL))
  
  expect_true(.validate_values_unique(testdatatable, c("a")))
  expect_error(.validate_values_unique(testdatatable, c("a", "b")))
  expect_error(.validate_values_unique(testdatatable, c("b")))
  expect_true(.validate_values_unique(testdatatable, c("a", "c")))
  expect_true(.validate_values_unique(testdatatable, c("c")))
  expect_true(.validate_values_unique(testdatatable, c()))
  expect_true(.validate_values_unique(testdatatable, NULL))
})


# .validate_UCUM_codes ----------------------------------------------------

test_that(".validate_UCUM_codes()", {
  testdata <- c('absurd_code', NA, '', '%', 'degree_Celsius', 'mm_Hg', '10^9/L', 
                'mmol/L', 'fL', 'g/L', 'pg', 'micromol/L', 'mg/L')
  expect_error(.validate_UCUM_codes(testdata[1:5]))
  expect_true(.validate_UCUM_codes(testdata[-1]))
})


# validate_microbiology ---------------------------------------------------

test_that("validate_microbiology on test dataset", {
  expect_true(validate_microbiology(
    .ramses_mock_dataset$micro$specimens,
    .ramses_mock_dataset$micro$isolates,
    .ramses_mock_dataset$micro$susceptibilities
  ))
})

test_that("validate_microbiology on data.frame", {
  testdata = list(
    specimens = data.frame(list(
      specimen_id = "1",
      patient_id = "1",
      status = "available",
      specimen_datetime = Sys.time(),
      specimen_type_code = "122575003",
      specimen_type_name = "Urine specimen",
      specimen_type_display = "Urine"
    ), stringsAsFactors = FALSE),
    isolates = data.frame(
      list(isolate_id = "1", 
           specimen_id = "1", 
           patient_id = "1", 
           organism_code = structure("B_ESCHR_COLI", class = c("mo", "character")), 
           organism_name = "Escherichia coli", 
           organism_display_name = "Escherichia coli", 
           multidrug_resistance = "Multi-drug-resistant (MDR)",
           isolation_datetime = Sys.time() + 259200
    ), stringsAsFactors = FALSE),
    susceptibilities = data.frame(list(
      isolate_id = "1", 
      specimen_id = "1",
      patient_id = "1",
      organism_code = "B_ESCHR_COLI",
      organism_name = "Escherichia coli",
      organism_display_name = "Escherichia coli", 
      agent_code = c("AMP", "AMC", "CAZ", "CTX", "CIP", "LEX", "CXM", "ETP", 
                  "FOS", "GEN", "MEM", "NIT", "TZP", "TMP"),
      agent_name = c("Ampicillin", "Amoxicillin/clavulanic acid", "Ceftazidime", "Cefotaxime", 
                    "Ciprofloxacin", "Cephalexin", "Cefuroxime", "Ertapenem", "Fosfomycin", 
                    "Gentamicin", "Meropenem", "Nitrofurantoin", "Piperacillin/tazobactam", 
                    "Trimethoprim"), 
      agent_display_name = c("Ampicillin", "Co-amoxiclav", "Ceftazidime", "Cefotaxime", "Ciprofloxacin",
                            "Cefalexin", "Cefuroxime", "Ertapenem", "Fosfomycin", "Gentamicin", 
                            "Meropenem", "Nitrofurantoin", "Piperacillin + Tazobactam", "Trimethoprim"),
      rsi_code = c("R", "R", "S", "S", "R", "S", "S", "S", "S", "S", "S", "S", "R", "R")
    ), stringsAsFactors = FALSE)
  )
  
  expect_true(validate_microbiology(
    testdata$specimens,
    testdata$isolates,
    testdata$susceptibilities
  ))
  
  # wrong specimen code
  testdata_spec_code <- testdata
  testdata_spec_code$specimens$specimen_type_code <- "biduletruccleurtruc"
  expect_warning(validate_microbiology(
    testdata_spec_code$specimens,
    testdata_spec_code$isolates,
    testdata_spec_code$susceptibilities
  ))
  
  # missing relations
  testdata_missing_id1 <- testdata
  testdata_missing_id1$susceptibilities$specimen_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id1$specimens,
    testdata_missing_id1$isolates,
    testdata_missing_id1$susceptibilities
  ))
  
  testdata_missing_id2 <- testdata
  testdata_missing_id2$susceptibilities$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id2$specimens,
    testdata_missing_id2$isolates,
    testdata_missing_id2$susceptibilities
  ))
  
  testdata_missing_id3 <- testdata
  testdata_missing_id3$isolates$specimen_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id3$specimens,
    testdata_missing_id3$isolates,
    testdata_missing_id3$susceptibilities
  ))
  
  testdata_invalid_organism_codes <- testdata
  testdata_invalid_organism_codes$isolates$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_organism_codes$specimens,
    testdata_invalid_organism_codes$isolates,
    testdata_invalid_organism_codes$susceptibilities
  ))
  
  testdata_invalid_organism_codes <- testdata
  testdata_invalid_organism_codes$susceptibilities$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_organism_codes$specimens,
    testdata_invalid_organism_codes$isolates,
    testdata_invalid_organism_codes$susceptibilities
  ))
  
  testdata_invalid_drug_codes <- testdata
  testdata_invalid_drug_codes$susceptibilities$agent_code[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_drug_codes$specimens,
    testdata_invalid_drug_codes$isolates,
    testdata_invalid_drug_codes$susceptibilities
  ))
  
})

test_that("validate_microbiology on data.table", {
  testdata = list(
    specimens = data.table::data.table(
      specimen_id = "1",
      patient_id = "1",
      status = "available",
      specimen_datetime = Sys.time(),
      specimen_type_code = "122575003",
      specimen_type_name = "Urine specimen",
      specimen_type_display = "Urine"
    ),
    isolates = data.table::data.table(
      isolate_id = "1", 
      specimen_id = "1", 
      patient_id = "1", 
      organism_code = structure("B_ESCHR_COLI", class = c("mo", "character")), 
      organism_name = "Escherichia coli", 
      organism_display_name = "Escherichia coli", 
      multidrug_resistance = "Multi-drug-resistant (MDR)",
      isolation_datetime = Sys.time() + 259200
      ),
    susceptibilities = data.table::data.table(
      isolate_id = "1", 
      specimen_id = "1",
      patient_id = "1",
      organism_code = "B_ESCHR_COLI",
      organism_name = "Escherichia coli",
      organism_display_name = "Escherichia coli", 
      agent_code = c("AMP", "AMC", "CAZ", "CTX", "CIP", "LEX", "CXM", "ETP", 
                  "FOS", "GEN", "MEM", "NIT", "TZP", "TMP"),
      agent_name = c("Ampicillin", "Amoxicillin/clavulanic acid", "Ceftazidime", "Cefotaxime", 
                    "Ciprofloxacin", "Cephalexin", "Cefuroxime", "Ertapenem", "Fosfomycin", 
                    "Gentamicin", "Meropenem", "Nitrofurantoin", "Piperacillin/tazobactam", 
                    "Trimethoprim"), 
      agent_display_name = c("Ampicillin", "Co-amoxiclav", "Ceftazidime", "Cefotaxime", "Ciprofloxacin",
                            "Cefalexin", "Cefuroxime", "Ertapenem", "Fosfomycin", "Gentamicin", 
                            "Meropenem", "Nitrofurantoin", "Piperacillin + Tazobactam", "Trimethoprim"),
      rsi_code = c("R", "R", "S", "S", "R", "S", "S", "S", "S", "S", "S", "S", "R", "R")
    )
  )
  
  expect_true(validate_microbiology(
    testdata$specimens,
    testdata$isolates,
    testdata$susceptibilities
  ))
  
  # wrong specimen code
  testdata_spec_code <- testdata
  testdata_spec_code$specimens$specimen_type_code <- "biduletruccleurtruc"
  expect_warning(validate_microbiology(
    testdata_spec_code$specimens,
    testdata_spec_code$isolates,
    testdata_spec_code$susceptibilities
  ))
  
  # missing relations
  testdata_missing_id1 <- testdata
  testdata_missing_id1$susceptibilities$specimen_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id1$specimens,
    testdata_missing_id1$isolates,
    testdata_missing_id1$susceptibilities
  ))
  
  testdata_missing_id2 <- testdata
  testdata_missing_id2$susceptibilities$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id2$specimens,
    testdata_missing_id2$isolates,
    testdata_missing_id2$susceptibilities
  ))
  
  testdata_missing_id3 <- testdata
  testdata_missing_id3$isolates$specimen_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_missing_id3$specimens,
    testdata_missing_id3$isolates,
    testdata_missing_id3$susceptibilities
  ))
  
  testdata_invalid_organism_codes <- testdata
  testdata_invalid_organism_codes$isolates$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_organism_codes$specimens,
    testdata_invalid_organism_codes$isolates,
    testdata_invalid_organism_codes$susceptibilities
  ))
  
  testdata_invalid_organism_codes <- testdata
  testdata_invalid_organism_codes$susceptibilities$isolate_id[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_organism_codes$specimens,
    testdata_invalid_organism_codes$isolates,
    testdata_invalid_organism_codes$susceptibilities
  ))
  
  testdata_invalid_drug_codes <- testdata
  testdata_invalid_drug_codes$susceptibilities$agent_code[1] <- "biduletruccleurtruc"
  expect_error(validate_microbiology(
    testdata_invalid_drug_codes$specimens,
    testdata_invalid_drug_codes$isolates,
    testdata_invalid_drug_codes$susceptibilities
  ))
  
})

# validate_investigations -------------------------------------------------

test_that("validate_investigations on test dataset", {
  expect_true(validate_investigations(inpatient_investigations))
})

test_that("validate_investigations", {
  example_data <- dplyr::tibble(
    observation_id = c("1", "2"), 
    patient_id = "99999999999", 
    encounter_id = "9278078393", status = "final", 
    request_datetime = as.POSIXct("2016-03-30 13:51:13"), 
    observation_datetime = as.POSIXct("2016-03-30 13:51:45"), 
    observation_value_text = "", 
    observation_value_numeric = c(35.7, 100.4), 
    observation_name = "Body temperature", 
    observation_display = "Temperature", 
    observation_code_system = "http://loinc.org", 
    observation_code = "8310-5", 
    observation_unit = c("degree_Celsius", "degree_F")
  )
  
  example_datatable <- data.table::data.table(
    observation_id = c("1", "2"), 
    patient_id = "99999999999", 
    encounter_id = "9278078393", status = "final", 
    request_datetime = as.POSIXct("2016-03-30 13:51:13"), 
    observation_datetime = as.POSIXct("2016-03-30 13:51:45"), 
    observation_value_text = "", 
    observation_value_numeric = c(35.7, 100.4), 
    observation_name = "Body temperature", 
    observation_display = "Temperature", 
    observation_code_system = "http://loinc.org", 
    observation_code = "8310-5", 
    observation_unit = c("degree_Celsius", "degree_F")
  )
  
  expect_true(validate_investigations(example_data[1,]))
  expect_error(validate_investigations(example_data))
  
  expect_true(validate_investigations(example_datatable[1,]))
  expect_error(validate_investigations(example_datatable))
  
  non_unique_metadata <- dplyr::tibble(
    observation_id = c("1", "2"), 
    patient_id = "99999999999", 
    encounter_id = "9278078393", status = "final", 
    request_datetime = as.POSIXct("2016-03-30 13:51:13"), 
    observation_datetime = as.POSIXct("2016-03-30 13:51:45"), 
    observation_value_text = "", 
    observation_value_numeric = c(35.7, 100.4), 
    observation_name = "Body temperature", 
    observation_display = c("Body temperature", "Temperature"), 
    observation_code_system = "http://loinc.org", 
    observation_code = "8310-5", 
    observation_unit = c("degree_Celsius", "degree_Celsius")
  )
  
  expect_error(
    validate_investigations(non_unique_metadata),
    "^Every `observation_code` must only be associated with one `observation_name` and `observation_display` only"
  )
})



# Bug 85 ------------------------------------------------------------------

test_that("Bug 85 - uniqueness of patient_id in patient dataset", {
  
  expect_error(
    validate_inpatient_episodes(
      patients = data.frame(
        patient_id = c("1253675584", "1253675584"), 
        NHS_number = c("5632763868", "5632763868"),
        forename = c("jflmnfcjnc", "jflmnfcjnc"), 
        surname = c("mljkaigaji", "mljkaigaji"), 
        sex = c("1", "1"), ethnic_category_UK = c("A", "A"), 
        date_of_birth = c("1999-11-21", "1999-11-21"),
        date_of_death = c(NA_character_, NA_character_)
      ),
      episodes = data.frame(
        patient_id = "1253675584", encounter_id = "8751633817", 
        admission_method = "2", 
        admission_date = as.POSIXct("2015-02-26 18:30:55"), 
        discharge_date = as.POSIXct("2015-03-17 17:23:49"), 
        episode_number = 1L, last_episode_in_encounter = "2",
        episode_start = as.POSIXct("2015-02-26 18:30:55"), 
        episode_end = as.POSIXct("2015-03-17 17:23:49"), 
        consultant_code = "C1000002", 
        main_specialty_code = "100", 
        last_episode_in_encounter = 2, 
        ramses_bed_days = 1.72303240740741
      )
    )
  )
  
})
ramses-antibiotics/ramses-package documentation built on Feb. 13, 2024, 1:01 p.m.