示例#1
0
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
示例#2
0
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
示例#5
0
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
示例#8
0
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
示例#10
0
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",