mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-05 15:28:27 +01:00
Replaced Path* dataclasses with PathInfo/URLInfo/CloudURLInfo, which know how parse, serialize, stringify and join themselves. They also provide useful accessors like part of an url or pathlib.Path like .parent or .name. Along the way two families of bugs where fixed and should never occur in the future: - paths not matched as strings anymore, e.g. using str.startswith() - Output.path is eliminated as ambiguous Both families might had caused undefined surprising behavior when local and remote paths clash.
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
import mock
|
|
from unittest import TestCase
|
|
|
|
from dvc.remote.base import RemoteBASE, RemoteCmdError, RemoteMissingDepsError
|
|
|
|
|
|
class TestRemoteBASE(object):
|
|
REMOTE_CLS = RemoteBASE
|
|
|
|
|
|
class TestMissingDeps(TestCase, TestRemoteBASE):
|
|
def test(self):
|
|
REQUIRES = {"foo": None, "bar": None, "mock": mock}
|
|
with mock.patch.object(self.REMOTE_CLS, "REQUIRES", REQUIRES):
|
|
with self.assertRaises(RemoteMissingDepsError):
|
|
self.REMOTE_CLS(None, {})
|
|
|
|
|
|
class TestCmdError(TestCase, TestRemoteBASE):
|
|
def test(self):
|
|
repo = None
|
|
config = {}
|
|
|
|
cmd = "sed 'hello'"
|
|
ret = "1"
|
|
err = "sed: expression #1, char 2: extra characters after command"
|
|
|
|
with mock.patch.object(
|
|
self.REMOTE_CLS,
|
|
"remove",
|
|
side_effect=RemoteCmdError("base", cmd, ret, err),
|
|
):
|
|
with self.assertRaises(RemoteCmdError):
|
|
self.REMOTE_CLS(repo, config).remove("file")
|
|
|
|
|
|
class TestCacheExists(TestCase):
|
|
def test(self):
|
|
config = {
|
|
"url": "base://example/prefix",
|
|
"connection_string": "1234567",
|
|
}
|
|
remote = RemoteBASE(None, config)
|
|
|
|
remote.PARAM_CHECKSUM = "checksum"
|
|
remote.path_info = remote.path_cls(config["url"])
|
|
remote.url = ""
|
|
remote.prefix = ""
|
|
path_info = remote.path_info / "example"
|
|
checksum_info = {remote.PARAM_CHECKSUM: "1234567890"}
|
|
|
|
with mock.patch.object(remote, "_checkout") as mock_checkout:
|
|
with mock.patch.object(remote, "_save") as mock_save:
|
|
with mock.patch.object(
|
|
remote, "changed_cache", return_value=True
|
|
):
|
|
remote.save(path_info, checksum_info)
|
|
mock_save.assert_called_once()
|
|
mock_checkout.assert_not_called()
|
|
|
|
with mock.patch.object(remote, "_checkout") as mock_checkout:
|
|
with mock.patch.object(remote, "_save") as mock_save:
|
|
with mock.patch.object(
|
|
remote, "changed_cache", return_value=False
|
|
):
|
|
remote.save(path_info, checksum_info)
|
|
mock_save.assert_not_called()
|
|
mock_checkout.assert_called_once()
|