def test_fetch_software_from_github_archive(): # we "fetch" a local ZIP file to simulate a Zenodo record created from a # GitHub repository via the Zenodo-GitHub integration with zenodo_archive() as zen_path: mock_response = BytesIO( json.dumps( { "files": [ { "filename": "some_dir/afake.zip", "links": {"download": "file://{}".format(zen_path)}, } ], "metadata": {"upload_type": "software"}, } ).encode("utf-8") ) def mock_urlopen(self, req): if isinstance(req, Request): return mock_response else: return urlopen(req) with patch.object(Zenodo, "_urlopen", new=mock_urlopen): zen = Zenodo() with TemporaryDirectory() as d: output = [] for l in zen.fetch({"record": "1234"}, d): output.append(l) unpacked_files = set(os.listdir(d)) expected = set(["some-other-file.txt", "some-file.txt"]) assert expected == unpacked_files
def test_content_id(): with patch.object(Zenodo, "_urlopen") as fake_urlopen: fake_urlopen.return_value.url = "https://zenodo.org/record/3232985" zen = Zenodo() zen.detect("10.5281/zenodo.3232985") assert zen.content_id == "3232985"
def test_fetch_software(requests_mock): # we "fetch" a local ZIP file to simulate a Zenodo software record with a # ZIP file in it with zenodo_archive() as zen_path: mock_response = { "files": [{ # this is the difference to the GitHub generated one, # the ZIP file isn't in a directory "filename": "afake.zip", "links": { "download": "file://{}".format(zen_path) }, }], "metadata": { "upload_type": "software" }, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) requests_mock.get("file://{}".format(zen_path), content=open(zen_path, "rb").read()) with TemporaryDirectory() as d: zen = Zenodo() spec = spec = {"host": test_zen.hosts[0], "record": "1234"} output = [] for l in zen.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) expected = set(["some-other-file.txt", "some-file.txt"]) assert expected == unpacked_files
def test_fetch_software_from_github_archive(requests_mock): # we "fetch" a local ZIP file to simulate a Zenodo record created from a # GitHub repository via the Zenodo-GitHub integration with zenodo_archive() as zen_path: mock_response = { "files": [{ "filename": "some_dir/afake.zip", "links": { "download": "file://{}".format(zen_path) }, }], "metadata": { "upload_type": "other" }, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) requests_mock.get("file://{}".format(zen_path), content=open(zen_path, "rb").read()) zen = Zenodo() spec = {"host": test_zen.hosts[0], "record": "1234"} with TemporaryDirectory() as d: output = [] for l in zen.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) expected = set(["some-other-file.txt", "some-file.txt"]) assert expected == unpacked_files
def test_fetch_software(): # we "fetch" a local ZIP file to simulate a Zenodo software record with a # ZIP file in it with zenodo_archive() as zen_path: mock_response = BytesIO( json.dumps({ "files": [{ # this is the difference to the GitHub generated one, # the ZIP file isn't in a directory "filename": "afake.zip", "links": { "download": "file://{}".format(zen_path) }, }], "metadata": { "upload_type": "software" }, }).encode("utf-8")) def mock_urlopen(self, req): if isinstance(req, Request): return mock_response else: return urlopen(req) with patch.object(Zenodo, "_urlopen", new=mock_urlopen): with TemporaryDirectory() as d: zen = Zenodo() spec = spec = { "host": { "hostname": [ "https://zenodo.org/record/", "http://zenodo.org/record/", ], "api": "https://zenodo.org/api/records/", "filepath": "files", "filename": "filename", "download": "links.download", "type": "metadata.upload_type", }, "record": "1234", } output = [] for l in zen.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) expected = set(["some-other-file.txt", "some-file.txt"]) assert expected == unpacked_files
def test_fetch_data(): # we "fetch" a local ZIP file to simulate a Zenodo data record with zenodo_archive() as a_zen_path: with zenodo_archive() as b_zen_path: mock_response = BytesIO( json.dumps({ "files": [ { "filename": "afake.zip", "links": { "download": "file://{}".format(a_zen_path) }, }, { "filename": "bfake.zip", "links": { "download": "file://{}".format(b_zen_path) }, }, ], "metadata": { "upload_type": "data" }, }).encode("utf-8")) def mock_urlopen(self, req): if isinstance(req, Request): return mock_response else: return urlopen(req) with patch.object(Zenodo, "urlopen", new=mock_urlopen): with TemporaryDirectory() as d: zen = Zenodo() spec = {"host": test_zen.hosts[0], "record": "1234"} output = [] for l in zen.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) # ZIP files shouldn't have been unpacked expected = {"bfake.zip", "afake.zip"} assert expected == unpacked_files
def test_fetch_data(requests_mock): # we "fetch" a local ZIP file to simulate a Zenodo data record with zenodo_archive() as a_zen_path: with zenodo_archive() as b_zen_path: mock_response = { "files": [ { "filename": "afake.zip", "links": { "download": "file://{}".format(a_zen_path) }, }, { "filename": "bfake.zip", "links": { "download": "file://{}".format(b_zen_path) }, }, ], "metadata": { "upload_type": "data" }, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) requests_mock.get("file://{}".format(a_zen_path), content=open(a_zen_path, "rb").read()) requests_mock.get("file://{}".format(b_zen_path), content=open(b_zen_path, "rb").read()) with TemporaryDirectory() as d: zen = Zenodo() spec = {"host": test_zen.hosts[0], "record": "1234"} output = [] for l in zen.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) # ZIP files shouldn't have been unpacked expected = {"bfake.zip", "afake.zip"} assert expected == unpacked_files
def test_detect(): with patch.object(Zenodo, "_urlopen") as fake_urlopen: fake_urlopen.return_value.url = "https://zenodo.org/record/3232985" # valid Zenodo DOIs trigger this content provider assert Zenodo().detect("10.5281/zenodo.3232985") == {"record": "3232985"} assert Zenodo().detect("https://doi.org/10.5281/zenodo.3232985") == { "record": "3232985" } assert Zenodo().detect("https://zenodo.org/record/3232985") == { "record": "3232985" } # only two of the three calls above have to resolve a DOI assert fake_urlopen.call_count == 2 with patch.object(Zenodo, "_urlopen") as fake_urlopen: # Don't trigger the Zenodo content provider assert Zenodo().detect("/some/path/here") is None assert Zenodo().detect("https://example.com/path/here") is None # donn't handle DOIs that aren't from Zenodo assert Zenodo().detect("https://doi.org/10.21105/joss.01277") is None # none of the examples are Zenodo like, so we should not attempt to # resolve a DOI either assert not fake_urlopen.called
def test_detect_zenodo(test_input, expected, requests_mock): requests_mock.get(re.compile("https://"), json=doi_resolver) # valid Zenodo DOIs trigger this content provider assert Zenodo().detect(test_input[0]) == expected assert Zenodo().detect(test_input[1]) == expected assert Zenodo().detect(test_input[2]) == expected # only two of the three calls above have to resolve a DOI (2 req per doi resolution) assert requests_mock.call_count == 4 requests_mock.reset_mock() # Don't trigger the Zenodo content provider assert Zenodo().detect("/some/path/here") is None assert Zenodo().detect("https://example.com/path/here") is None # don't handle DOIs that aren't from Zenodo assert Zenodo().detect("https://doi.org/10.21105/joss.01277") is None
def test_detect_zenodo(test_input, expected): with patch.object(Zenodo, "_urlopen") as fake_urlopen: fake_urlopen.return_value.url = test_input[0] # valid Zenodo DOIs trigger this content provider assert Zenodo().detect(test_input[0]) == expected assert Zenodo().detect(test_input[1]) == expected assert Zenodo().detect(test_input[2]) == expected # only two of the three calls above have to resolve a DOI assert fake_urlopen.call_count == 2 with patch.object(Zenodo, "_urlopen") as fake_urlopen: # Don't trigger the Zenodo content provider assert Zenodo().detect("/some/path/here") is None assert Zenodo().detect("https://example.com/path/here") is None # don't handle DOIs that aren't from Zenodo fake_urlopen.return_value.url = ( "http://joss.theoj.org/papers/10.21105/joss.01277") assert Zenodo().detect("https://doi.org/10.21105/joss.01277") is None
def test_content_id(requests_mock): requests_mock.get(re.compile("https://"), json=doi_resolver) zen = Zenodo() zen.detect("10.5281/zenodo.3232985") assert zen.content_id == "3232985"
# doi responses are redirects if resp is not None: context.status_code = 302 context.headers["Location"] = resp return resp def test_content_id(requests_mock): requests_mock.get(re.compile("https://"), json=doi_resolver) zen = Zenodo() zen.detect("10.5281/zenodo.3232985") assert zen.content_id == "3232985" test_zen = Zenodo() test_hosts = [ ( [ "https://zenodo.org/record/3232985", "10.5281/zenodo.3232985", "https://doi.org/10.5281/zenodo.3232985", ], { "host": test_zen.hosts[0], "record": "3232985" }, ), ( [ "https://data.caltech.edu/records/1235",