def test_open_local_or_remote_file__directory(tmpdir): """ Test the `open_local_or_remote_file` raises a ValueError for a given `Link` to a directory. """ link = Link(path_to_url(tmpdir.strpath)) session = Session() with pytest.raises(ValueError, match="Cannot open directory for read"): with open_local_or_remote_file(link, session): pass # pragma: no cover
def test_open_local_or_remote_file__local_file(tmp_path, content, content_length): """ Test the `open_local_or_remote_file` returns a context manager to a FileStream for a given `Link` to a local file. """ local_file_path = tmp_path / "foo.txt" local_file_path.write_bytes(content) link = Link(local_file_path.as_uri()) session = Session() with open_local_or_remote_file(link, session) as file_stream: assert file_stream.stream.read() == content assert file_stream.size == content_length
def test_open_local_or_remote_file__remote_file(tmp_path, content, content_length, expected_content_length): """ Test the `open_local_or_remote_file` returns a context manager to a FileStream for a given `Link` to a remote file. """ link = Link("https://example.com/foo.txt") session = Session() response_file_path = tmp_path / "foo.txt" response_file_path.write_bytes(content) mock_response = mock.Mock() mock_response.raw = response_file_path.open("rb") mock_response.headers = {"content-length": content_length} with mock.patch.object(session, "get", return_value=mock_response): with open_local_or_remote_file(link, session) as file_stream: assert file_stream.stream.read() == content assert file_stream.size == expected_content_length mock_response.close.assert_called_once()