def test_04_detect_verify_type_error(self): doi = DOIPlugin() # create an invalid doi and assert it is a doi bjid = {"id" : "a;lkdsjfjdsajadskja", "type" : "doi"} with self.assertRaises(model_exceptions.LookupException): doi.type_detect_verify(bjid)
def test_06_canonicalise_ignore(self): doi = DOIPlugin() bjid = {"id" : "whatever", "type" : "pmid"} record = models.MessageObject(record={"identifier" : bjid}) doi.canonicalise(record) assert not bjid.has_key("canonical")
def _resolve_doi(self, canonical_pmid): xml_url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=" + canonical_pmid[5:] + "&retmode=xml" # now dereference it and find out the target of the (chain of) 303(s) response = util.http_get(xml_url) if response.status_code != requests.codes.ok: raise plugin.PluginException(plugin.PluginException.HTTP, "unable to retrieve record from PubMed") try: xml = etree.fromstring(response.text.encode("utf-8")) except: log.error("Error parsing the XML from " + xml_url) return None, None xp = "/PubmedArticleSet/PubmedArticle/PubmedData/ArticleIdList/ArticleId[@IdType='doi']" els = xml.xpath(xp) if len(els) == 0: # we didn't find a DOI return None, None # FIXME: we assume there is only one DOI in the record - is this really true? doi_string = els[0].text doi = DOIPlugin() canonical_doi = doi.canonical_form(doi_string) loc = doi.dereference(canonical_doi) return canonical_doi, loc
def test_04_detect_verify_type_error(self): doi = DOIPlugin() # create an invalid doi and assert it is a doi bjid = {"id" : "a;lkdsjfjdsajadskja", "type" : "doi"} record = models.MessageObject(record={"identifier" : bjid}) with self.assertRaises(models.LookupException): doi.type_detect_verify(record)
def test_03_detect_verify_type_ignores(self): doi = DOIPlugin() bjid = {"id" : "whatever", "type" : "pmid"} doi.type_detect_verify(bjid) assert bjid['type'] == "pmid" bjid = {"key" : "value"} doi.type_detect_verify(bjid) assert not bjid.has_key("type")
def test_12_dereference_fail(self): oldget = requests.get requests.get = get_fail doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} record = models.MessageObject(record=record) with self.assertRaises(plugin.PluginException): doi.detect_provider(record) requests.get = oldget
def test_07_canonicalise_error(self): doi = DOIPlugin() # create an invalid doi and assert it is a doi bjid = {"id" : "a;lkdsjfjdsajadskja", "type" : "doi"} with self.assertRaises(model_exceptions.LookupException): doi.canonicalise(bjid) bjid = {"key" : "value"} with self.assertRaises(model_exceptions.LookupException): doi.canonicalise(bjid)
def test_01_detect_verify_type_real_dois(self): doi = DOIPlugin() counter = 0 for d in DOIS: bjid = {'id' : d} doi.type_detect_verify(bjid) assert bjid.has_key("type") assert bjid["type"] == "doi" counter += 1 assert counter == len(DOIS) assert counter > 0
def test_05_canonicalise_real(self): doi = DOIPlugin() counter = 0 for d in CANONICAL.keys(): bjid = {'id' : d, 'type' : 'doi'} doi.canonicalise(bjid) assert bjid.has_key("canonical") assert bjid["canonical"] == CANONICAL[d] counter += 1 assert counter == len(CANONICAL.keys()) assert counter > 0
def test_01_detect_verify_type_real_dois(self): doi = DOIPlugin() counter = 0 for d in DOIS: bjid = {'id' : d} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert bjid.has_key("type") assert bjid["type"] == "doi" counter += 1 assert counter == len(DOIS) assert counter > 0
def test_03_detect_verify_type_ignores(self): doi = DOIPlugin() bjid = {"id" : "whatever", "type" : "pmid"} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert bjid['type'] == "pmid" bjid = {"key" : "value"} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type")
def test_11_dereference_success_via_detect_provider(self): oldget = requests.get requests.get = get_success doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} doi.detect_provider(record) assert "provider" in record assert "url" in record["provider"] assert record['provider']['url'][0] == "http://location" assert record["provider"]["doi"] == "doi:123" requests.get = oldget
def test_09_dereference_no_location(self): oldget = requests.get requests.get = get_no_location doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} doi.provider_dereference(record) assert "provider" in record assert "url" not in record["provider"] assert "doi" in record["provider"] assert record["provider"]["doi"] == "doi:123" requests.get = oldget
def test_05_canonicalise_real(self): doi = DOIPlugin() counter = 0 for d in CANONICAL.keys(): bjid = {'id' : d, 'type' : 'doi'} record = models.MessageObject(record={"identifier" : bjid}) doi.canonicalise(record) assert bjid.has_key("canonical") assert bjid["canonical"] == CANONICAL[d] counter += 1 assert counter == len(CANONICAL.keys()) assert counter > 0
def test_07_canonicalise_error(self): doi = DOIPlugin() # create an invalid doi and assert it is a doi bjid = {"id" : "a;lkdsjfjdsajadskja", "type" : "doi"} record = models.MessageObject(record={"identifier" : bjid}) with self.assertRaises(models.LookupException): doi.canonicalise(record) bjid = {"key" : "value"} record = models.MessageObject(record={"identifier" : bjid}) with self.assertRaises(models.LookupException): doi.canonicalise(record)
def test_09_dereference_no_location(self): oldget = util.http_get util.http_get = get_no_location doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} record = models.MessageObject(record=record) doi.provider_dereference(record) record = record.record assert "provider" in record assert "url" not in record["provider"] assert "doi" in record["provider"] assert record["provider"]["doi"] == "doi:123" util.http_get = oldget
def test_11_dereference_success_via_detect_provider(self): oldget = util.http_get util.http_get = get_success doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} record = models.MessageObject(record=record) doi.detect_provider(record) record = record.record assert "provider" in record assert "url" in record["provider"] assert record['provider']['url'][0] == "http://location" assert record["provider"]["doi"] == "doi:123" util.http_get = oldget
def test_10_dereference_success(self): oldget = requests.get requests.get = get_success doi = DOIPlugin() record = {"identifier" : {"id" : "123", "type" : "doi", "canonical" : "doi:123"}} record = models.MessageObject(record=record) doi.provider_dereference(record) record = record.record assert "provider" in record assert "url" in record["provider"] assert record['provider']['url'][0] == "http://location" assert record["provider"]["doi"] == "doi:123" requests.get = oldget
def test_08_dereference_not_relevant(self): doi = DOIPlugin() record = {} doi.provider_dereference(record) assert len(record.keys()) == 0 record['identifier'] = {} doi.provider_dereference(record) assert len(record['identifier'].keys()) == 0 record['identifier']['id'] = "123" record['identifier']['type'] = "pmid" record['identifier']['canonical'] = "pmid:123" doi.provider_dereference(record) assert not "provider" in record record['identifier']['type'] = "doi" del record['identifier']['canonical'] doi.provider_dereference(record) assert not "provider" in record
def test_08_dereference_not_relevant(self): doi = DOIPlugin() record = models.MessageObject(record={}) doi.provider_dereference(record) assert len(record.record.keys()) == 0 record.id = "123" record.identifier_type = "pmid" record.canonical = "pmid:123" doi.provider_dereference(record) assert not "provider" in record.record record.identifier_type = "doi" record.canonical = None doi.provider_dereference(record) assert not "provider" in record.record
def test_02_detect_verify_type_not_dois(self): #Test the various erroneous DOI possibilities, which will include: #- prefixes without dois attached #- random strings doi = DOIPlugin() # try some prefixes bjid = {'id' : 'doi:'} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type") bjid = {'id' : 'http://dx.doi.org/'} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type") # try some random strings bjid = {'id' : 'qp23u4ehjkjewfiuwqr'} record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type") bjid = {'id' : 'qp23u410.jewfiuwqr'} # has the 10. substring in it record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type") bjid = {'id' : 'doi:qp23u4ehjkjewfiuwqr'} # starts with a doi prefix, but isn't one record = models.MessageObject(record={"identifier" : bjid}) doi.type_detect_verify(record) assert not bjid.has_key("type")
def test_06_canonicalise_ignore(self): doi = DOIPlugin() bjid = {"id" : "whatever", "type" : "pmid"} doi.canonicalise(bjid) assert not bjid.has_key("canonical")