context("fetching and parsing summary recs")

fake_ids <- sample(1e5, 501)
pop_ids = c("307082412", "307075396", "307075338", "307075274")
pop_summ_xml <- entrez_summary(db="popset", 
                               id=pop_ids, version="1.0")
pop_summ_json <- entrez_summary(db="popset", 
                                id=pop_ids, version="2.0")
pop_summ_xml2 <- entrez_summary(db="popset", 
                               id=pop_ids, version="1.0", retmode="xml")

test_that("Functions to fetch summaries work", {
          #tests
          expect_that(pop_summ_xml, is_a("list"))
          expect_that(pop_summ_json, is_a("list"))

          expect_that(pop_summ_xml[[4]], is_a("esummary"))
          expect_that(pop_summ_json[[4]], is_a("esummary"))
          sapply(pop_summ_json, function(x)
                 expect_match(x[["title"]], "Muraenidae")
          )         
})  



test_that("List elements in XML are parsable", {
         rec <- entrez_summary(db="pubmed", id=25696867, version="1.0")
         expect_named(rec$History)
         expect_gt(length(rec$History), 0)
})
         

test_that("Version 2 xml records can be fetched and parsed", {
    sapply(pop_summ_xml2, function(x)
                 expect_match(x[["Title"]], "Muraenidae"))
    expect_that(length(pop_summ_xml2[[1]]), is_more_than(12))
})

test_that("JSON and XML objects are similar", {
          #It would be nice to test whether the xml and json records
          # have the same data in them, but it turns out they don't
          # when they leave the NCBI, so let's ensure we can get some
          # info from each file, even if they won't be exactly the same
          sapply(pop_summ_xml, function(x)
                 expect_match(x[["Title"]], "Muraenidae"))
          sapply(pop_summ_json, function(x)
                 expect_match(x[["title"]], "Muraenidae"))
          
          expect_that(length(pop_summ_xml[[1]]), is_more_than(12))
          expect_that(length(pop_summ_json[[1]]), is_more_than(12))
          
})


test_that("Error whent tring to fetch 1.0 summaries as json", {
      expect_error(
        entrez_summary("pubmed", id = fake_ids[1:10], version="1.0", retmode="json")
      )
})

test_that("We can print summary records", {
      expect_output(print(pop_summ_json), "List of  4 esummary records")        
      expect_output(print(pop_summ_json[[1]]), "esummary result with \\d+ items")        
      expect_output(print(pop_summ_xml), "List of  4 esummary records")        
      expect_output(print(pop_summ_xml[[1]]), "esummary result with \\d+ items")        
})

test_that("We can detect errors in esummary records", {
    expect_warning(
       entrez_summary(db="pmc", id=c(4318541212,4318541), version="1.0")
    )
    expect_warning(
       entrez_summary(db="pmc", id=c(4318541212,4318541))
    )
})
                         
test_that("We can detect errors in esummary returns", {
    expect_error(
       entrez_summary(db="pmc", id=fake_ids, version="2.0")       
    )
})

test_that("We can extract elements from esummary object", {
    expect_that(extract_from_esummary(pop_summ_xml, c("Title", "TaxId")), is_a("matrix"))
    expect_that(extract_from_esummary(pop_summ_xml, c("Title", "TaxId"), simplify=FALSE), is_a("list"))
    expect_that(extract_from_esummary(pop_summ_xml2, c("Title", "TaxId"), simplify=FALSE), is_a("list"))
    expect_that(extract_from_esummary(pop_summ_json, "title"), is_a("character"))
   
})

test_that("We can extract elements from a single esummary", {
    expect_that(extract_from_esummary(pop_summ_xml[[1]], c("Title", "TaxId")), is_a("list"))
    expect_that(extract_from_esummary(pop_summ_xml[[1]], "Gi"), is_a("integer"))
    expect_that(extract_from_esummary(pop_summ_xml[[1]], "Gi", FALSE), is_a("list"))
})

test_that("We can get a list of one element if we ask for it", {
    expect_that(entrez_summary(db="popset", id=307075396, always_return_list=TRUE), is_a("list"))
    expect_that(entrez_summary(db="popset", id=307075396), is_a("esummary"))
})


test_that("We can fetch summaries on versioned sequences", {
    old_rec = entrez_summary(db="nuccore", id="AF123456.1")
    new_rec = entrez_summary(db="nuccore", id="AF123456.2")
    expect_match(old_rec$title, "testis-specific mRNA")
    expect_match(new_rec$title, "doublesex and mab-3 related transcription factor")    
})
