Skip to content

Commit cdffde1

Browse files
authored
tests: add fs related tests (#18)
1 parent 57ab544 commit cdffde1

File tree

4 files changed

+158
-5
lines changed

4 files changed

+158
-5
lines changed

scmrepo/fs.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def _open(
8080
cache_options: Dict = None,
8181
**kwargs: Any,
8282
) -> BinaryIO:
83+
if mode != "rb":
84+
raise NotImplementedError
85+
8386
key = self._get_key(path)
8487
try:
8588
obj = self.trie.open(key, mode=mode)

tests/conftest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ def docker(request: pytest.FixtureRequest):
7979
for cmd in [("docker", "ps"), ("docker-compose", "version")]:
8080
try:
8181
subprocess.call(
82-
cmd,
83-
shell=True,
82+
" ".join(cmd),
8483
stderr=subprocess.DEVNULL,
8584
stdout=subprocess.DEVNULL,
8685
)

tests/test_dulwich.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import os
21
import socket
32
import threading
43
from io import StringIO
@@ -13,6 +12,7 @@
1312
USER,
1413
Server,
1514
)
15+
from funcy import retry
1616
from pytest_mock import MockerFixture
1717

1818
from scmrepo.git.backend.dulwich.asyncssh_vendor import AsyncSSHVendor
@@ -89,7 +89,6 @@ def test_run_command_with_privkey(server: Server, ssh_port: int):
8989
assert b"test_run_command_with_privkey" in server.commands
9090

9191

92-
@pytest.mark.xfail("CI" in os.environ, reason="failing in CI")
9392
def test_run_command_data_transfer(server: Server, ssh_port: int):
9493
vendor = AsyncSSHVendor()
9594
con = vendor.run_command(
@@ -107,7 +106,13 @@ def test_run_command_data_transfer(server: Server, ssh_port: int):
107106
channel.send_stderr(b"stderr\n")
108107
channel.close()
109108

110-
assert con.can_read()
109+
def check_can_read():
110+
assert con.can_read()
111+
return True
112+
113+
# pylint: disable=no-value-for-parameter
114+
can_read = retry(10, timeout=0.1)(check_can_read)
115+
assert can_read()
111116
assert con.read(4096) == b"stdout\n"
112117
assert con.read_stderr(4096) == b"stderr\n"
113118

tests/test_fs.py

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import os
2+
3+
import pytest
4+
from pytest_test_utils import TmpDir
5+
6+
from scmrepo.git import Git
7+
8+
9+
def test_open(tmp_dir: TmpDir, scm: Git):
10+
files = tmp_dir.gen(
11+
{"foo": "foo", "тест": "проверка", "data": {"lorem": "ipsum"}}
12+
)
13+
scm.add_commit(files, message="add")
14+
15+
fs = scm.get_fs("master")
16+
with fs.open("foo", mode="r", encoding="utf-8") as fobj:
17+
assert fobj.read() == "foo"
18+
with fs.open("тест", mode="r", encoding="utf-8") as fobj:
19+
assert fobj.read() == "проверка"
20+
with pytest.raises(IOError):
21+
fs.open("not-existing-file")
22+
with pytest.raises(IOError):
23+
fs.open("data")
24+
25+
26+
def test_exists(tmp_dir: TmpDir, scm: Git):
27+
scm.commit("init")
28+
files = tmp_dir.gen(
29+
{"foo": "foo", "тест": "проверка", "data": {"lorem": "ipsum"}}
30+
)
31+
32+
fs = scm.get_fs("master")
33+
34+
assert not fs.exists("foo")
35+
assert not fs.exists("тест")
36+
assert not fs.exists("data")
37+
assert not fs.exists(os.path.join("data", "lorem"))
38+
39+
scm.add_commit(files, message="add")
40+
41+
fs = scm.get_fs("master")
42+
assert fs.exists("foo")
43+
assert fs.exists("тест")
44+
assert fs.exists("data")
45+
assert fs.exists(os.path.join("data", "lorem"))
46+
assert not fs.exists("non-existing-file")
47+
48+
49+
def test_isdir(tmp_dir: TmpDir, scm: Git):
50+
tmp_dir.gen({"foo": "foo", "тест": "проверка", "data": {"lorem": "ipsum"}})
51+
scm.add_commit(["foo", "data"], message="add")
52+
53+
fs = scm.get_fs("master")
54+
55+
assert fs.isdir("data")
56+
assert not fs.isdir("foo")
57+
assert not fs.isdir("non-existing-file")
58+
59+
60+
def test_isfile(tmp_dir: TmpDir, scm: Git):
61+
tmp_dir.gen({"foo": "foo", "тест": "проверка", "data": {"lorem": "ipsum"}})
62+
scm.add_commit(["foo", "data"], message="add")
63+
64+
fs = scm.get_fs("master")
65+
assert fs.isfile("foo")
66+
assert not fs.isfile("data")
67+
assert not fs.isfile("not-existing-file")
68+
69+
70+
def test_walk(tmp_dir: TmpDir, scm: Git):
71+
tmp_dir.gen(
72+
{
73+
"foo": "foo",
74+
"тест": "проверка",
75+
"data": {"lorem": "ipsum", "subdir": {"sub": "sub"}},
76+
}
77+
)
78+
scm.add_commit(os.path.join("data", "subdir"), message="add")
79+
fs = scm.get_fs("master")
80+
81+
def convert_to_sets(walk_results):
82+
return [
83+
(root, set(dirs), set(nondirs))
84+
for root, dirs, nondirs in walk_results
85+
]
86+
87+
assert convert_to_sets(fs.walk(".")) == convert_to_sets(
88+
[
89+
(scm.root_dir, ["data"], []),
90+
(os.path.join(scm.root_dir, "data"), ["subdir"], []),
91+
(
92+
os.path.join(scm.root_dir, "data", "subdir"),
93+
[],
94+
["sub"],
95+
),
96+
]
97+
)
98+
99+
assert convert_to_sets(
100+
fs.walk(os.path.join("data", "subdir"))
101+
) == convert_to_sets(
102+
[
103+
(
104+
os.path.join(scm.root_dir, "data", "subdir"),
105+
[],
106+
["sub"],
107+
)
108+
]
109+
)
110+
111+
112+
def test_ls(tmp_dir: TmpDir, scm: Git):
113+
files = tmp_dir.gen(
114+
{
115+
"foo": "foo",
116+
"тест": "проверка",
117+
"data": {"lorem": "ipsum", "subdir": {"sub": "sub"}},
118+
}
119+
)
120+
scm.add_commit(files, message="add")
121+
fs = scm.get_fs("master")
122+
123+
assert fs.ls(".", detail=False) == ["foo", "тест", "data"]
124+
assert fs.ls(".") == {
125+
"data": {
126+
"mode": 16384,
127+
"name": str(tmp_dir / "data"),
128+
"sha": "f5d6ac1955c85410b71bb6e35e4c57c54e2ad524",
129+
"size": 66,
130+
"type": "directory",
131+
},
132+
"foo": {
133+
"mode": 33188,
134+
"name": str(tmp_dir / "foo"),
135+
"sha": "19102815663d23f8b75a47e7a01965dcdc96468c",
136+
"size": 3,
137+
"type": "file",
138+
},
139+
"тест": {
140+
"mode": 33188,
141+
"name": str(tmp_dir / "тест"),
142+
"sha": "eeeba1738f4c12844163b89112070c6e57eb764e",
143+
"size": 16,
144+
"type": "file",
145+
},
146+
}

0 commit comments

Comments
 (0)