Skip to content

Commit ec39f9d

Browse files
author
atollk
committed
Added unit tests for the preserve_time parameter.
At this point in time, all the new tests are failing right now; as they should, because the functionality of `preserve_time` has not been implemented yet.
1 parent 1327a63 commit ec39f9d

File tree

8 files changed

+167
-48
lines changed

8 files changed

+167
-48
lines changed

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ sitepackages = false
133133
skip_missing_interpreters = true
134134
requires =
135135
setuptools >=38.3.0
136+
parameterized ~=0.8
136137
137138
[testenv]
138139
commands = pytest --cov={toxinidir}/fs {posargs} {toxinidir}/tests

tests/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ pysendfile ~=2.0 ; python_version <= "3.3"
1414
# mock v4+ doesn't support Python 2.7 anymore
1515
mock ~=3.0 ; python_version < "3.3"
1616

17+
# parametrized to prevent code duplication in tests.
18+
parameterized ~=0.8

tests/test_copy.py

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,77 @@
88
import shutil
99
import calendar
1010

11+
from parameterized import parameterized
12+
1113
import fs.copy
1214
from fs import open_fs
1315

1416

1517
class TestCopy(unittest.TestCase):
16-
def test_copy_fs(self):
17-
for workers in (0, 1, 2, 4):
18-
src_fs = open_fs("mem://")
19-
src_fs.makedirs("foo/bar")
20-
src_fs.makedirs("foo/empty")
21-
src_fs.touch("test.txt")
22-
src_fs.touch("foo/bar/baz.txt")
18+
@parameterized.expand([(0,), (1,), (2,), (4,)])
19+
def test_copy_fs(self, workers):
20+
namespaces = ("details", "accessed", "metadata_changed", "modified")
2321

24-
dst_fs = open_fs("mem://")
25-
fs.copy.copy_fs(src_fs, dst_fs, workers=workers)
22+
src_fs = open_fs("mem://")
23+
src_fs.makedirs("foo/bar")
24+
src_fs.makedirs("foo/empty")
25+
src_fs.touch("test.txt")
26+
src_fs.touch("foo/bar/baz.txt")
27+
src_file1_info = src_fs.getinfo("test.txt", namespaces)
28+
src_file2_info = src_fs.getinfo("foo/bar/baz.txt", namespaces)
2629

27-
self.assertTrue(dst_fs.isdir("foo/empty"))
28-
self.assertTrue(dst_fs.isdir("foo/bar"))
29-
self.assertTrue(dst_fs.isfile("test.txt"))
30+
dst_fs = open_fs("mem://")
31+
fs.copy.copy_fs(src_fs, dst_fs, workers=workers, preserve_time=True)
32+
33+
self.assertTrue(dst_fs.isdir("foo/empty"))
34+
self.assertTrue(dst_fs.isdir("foo/bar"))
35+
self.assertTrue(dst_fs.isfile("test.txt"))
36+
37+
dst_file1_info = dst_fs.getinfo("test.txt", namespaces)
38+
dst_file2_info = dst_fs.getinfo("foo/bar/baz.txt", namespaces)
39+
self.assertEqual(dst_file1_info.modified, src_file1_info.modified)
40+
self.assertEqual(dst_file1_info.accessed, src_file1_info.accessed)
41+
self.assertEqual(
42+
dst_file1_info.metadata_changed, src_file1_info.metadata_changed
43+
)
44+
self.assertEqual(dst_file2_info.modified, src_file2_info.modified)
45+
self.assertEqual(dst_file2_info.accessed, src_file2_info.accessed)
46+
self.assertEqual(
47+
dst_file2_info.metadata_changed, src_file2_info.metadata_changed
48+
)
3049

3150
def test_copy_value_error(self):
3251
src_fs = open_fs("mem://")
3352
dst_fs = open_fs("mem://")
3453
with self.assertRaises(ValueError):
3554
fs.copy.copy_fs(src_fs, dst_fs, workers=-1)
3655

37-
def test_copy_dir(self):
56+
@parameterized.expand([(0,), (1,), (2,), (4,)])
57+
def test_copy_dir(self, workers):
58+
namespaces = ("details", "accessed", "metadata_changed", "modified")
59+
3860
src_fs = open_fs("mem://")
3961
src_fs.makedirs("foo/bar")
4062
src_fs.makedirs("foo/empty")
4163
src_fs.touch("test.txt")
4264
src_fs.touch("foo/bar/baz.txt")
43-
for workers in (0, 1, 2, 4):
44-
with open_fs("mem://") as dst_fs:
45-
fs.copy.copy_dir(src_fs, "/foo", dst_fs, "/", workers=workers)
46-
self.assertTrue(dst_fs.isdir("bar"))
47-
self.assertTrue(dst_fs.isdir("empty"))
48-
self.assertTrue(dst_fs.isfile("bar/baz.txt"))
65+
src_file1_info = src_fs.getinfo("test.txt", namespaces)
66+
src_file2_info = src_fs.getinfo("foo/bar/baz.txt", namespaces)
67+
68+
with open_fs("mem://") as dst_fs:
69+
fs.copy.copy_dir(
70+
src_fs, "/foo", dst_fs, "/", workers=workers, preserve_time=True
71+
)
72+
self.assertTrue(dst_fs.isdir("bar"))
73+
self.assertTrue(dst_fs.isdir("empty"))
74+
self.assertTrue(dst_fs.isfile("bar/baz.txt"))
75+
76+
dst_file2_info = dst_fs.getinfo("bar/baz.txt", namespaces)
77+
self.assertEqual(dst_file2_info.modified, src_file2_info.modified)
78+
self.assertEqual(dst_file2_info.accessed, src_file2_info.accessed)
79+
self.assertEqual(
80+
dst_file2_info.metadata_changed, src_file2_info.metadata_changed
81+
)
4982

5083
def test_copy_large(self):
5184
data1 = b"foo" * 512 * 1024

tests/test_memoryfs.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,19 @@ def test_close_mem_free(self):
6666
"Memory usage increased after closing the file system; diff is %0.2f KiB."
6767
% (diff_close.size_diff / 1024.0),
6868
)
69+
70+
def test_copy_preserve_time(self):
71+
self.fs.makedir("foo")
72+
self.fs.makedir("bar")
73+
self.fs.touch("foo/file.txt")
74+
75+
namespaces = ("details", "accessed", "metadata_changed", "modified")
76+
src_info = self.fs.getinfo("foo/file.txt", namespaces)
77+
78+
self.fs.copy("foo/file.txt", "bar/file.txt", preserve_time=True)
79+
self.assertTrue(self.fs.exists("bar/file.txt"))
80+
81+
dst_info = self.fs.getinfo("bar/file.txt", namespaces)
82+
self.assertEqual(dst_info.modified, src_info.modified)
83+
self.assertEqual(dst_info.accessed, src_info.accessed)
84+
self.assertEqual(dst_info.metadata_changed, src_info.metadata_changed)

tests/test_mirror.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,36 @@
22

33
import unittest
44

5+
from parameterized import parameterized_class
6+
57
from fs.mirror import mirror
68
from fs import open_fs
79

810

11+
@parameterized_class(("WORKERS",), [(0,), (1,), (2,), (4,)])
912
class TestMirror(unittest.TestCase):
10-
WORKERS = 0 # Single threaded
11-
1213
def _contents(self, fs):
1314
"""Extract an FS in to a simple data structure."""
15+
namespaces = ("details", "accessed", "metadata_changed", "modified")
1416
contents = []
1517
for path, dirs, files in fs.walk():
1618
for info in dirs:
1719
_path = info.make_path(path)
1820
contents.append((_path, "dir", b""))
1921
for info in files:
2022
_path = info.make_path(path)
21-
contents.append((_path, "file", fs.readbytes(_path)))
23+
_bytes = fs.readbytes(_path)
24+
_info = fs.getinfo(_path, namespaces)
25+
contents.append(
26+
(
27+
_path,
28+
"file",
29+
_bytes,
30+
_info.modified,
31+
_info.accessed,
32+
_info.metadata_changed,
33+
)
34+
)
2235
return sorted(contents)
2336

2437
def assert_compare_fs(self, fs1, fs2):
@@ -28,36 +41,36 @@ def assert_compare_fs(self, fs1, fs2):
2841
def test_empty_mirror(self):
2942
m1 = open_fs("mem://")
3043
m2 = open_fs("mem://")
31-
mirror(m1, m2, workers=self.WORKERS)
44+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
3245
self.assert_compare_fs(m1, m2)
3346

3447
def test_mirror_one_file(self):
3548
m1 = open_fs("mem://")
3649
m1.writetext("foo", "hello")
3750
m2 = open_fs("mem://")
38-
mirror(m1, m2, workers=self.WORKERS)
51+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
3952
self.assert_compare_fs(m1, m2)
4053

4154
def test_mirror_one_file_one_dir(self):
4255
m1 = open_fs("mem://")
4356
m1.writetext("foo", "hello")
4457
m1.makedir("bar")
4558
m2 = open_fs("mem://")
46-
mirror(m1, m2, workers=self.WORKERS)
59+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
4760
self.assert_compare_fs(m1, m2)
4861

4962
def test_mirror_delete_replace(self):
5063
m1 = open_fs("mem://")
5164
m1.writetext("foo", "hello")
5265
m1.makedir("bar")
5366
m2 = open_fs("mem://")
54-
mirror(m1, m2, workers=self.WORKERS)
67+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
5568
self.assert_compare_fs(m1, m2)
5669
m2.remove("foo")
57-
mirror(m1, m2, workers=self.WORKERS)
70+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
5871
self.assert_compare_fs(m1, m2)
5972
m2.removedir("bar")
60-
mirror(m1, m2, workers=self.WORKERS)
73+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
6174
self.assert_compare_fs(m1, m2)
6275

6376
def test_mirror_extra_dir(self):
@@ -66,7 +79,7 @@ def test_mirror_extra_dir(self):
6679
m1.makedir("bar")
6780
m2 = open_fs("mem://")
6881
m2.makedir("baz")
69-
mirror(m1, m2, workers=self.WORKERS)
82+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
7083
self.assert_compare_fs(m1, m2)
7184

7285
def test_mirror_extra_file(self):
@@ -76,7 +89,7 @@ def test_mirror_extra_file(self):
7689
m2 = open_fs("mem://")
7790
m2.makedir("baz")
7891
m2.touch("egg")
79-
mirror(m1, m2, workers=self.WORKERS)
92+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
8093
self.assert_compare_fs(m1, m2)
8194

8295
def test_mirror_wrong_type(self):
@@ -86,28 +99,16 @@ def test_mirror_wrong_type(self):
8699
m2 = open_fs("mem://")
87100
m2.makedir("foo")
88101
m2.touch("bar")
89-
mirror(m1, m2, workers=self.WORKERS)
102+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
90103
self.assert_compare_fs(m1, m2)
91104

92105
def test_mirror_update(self):
93106
m1 = open_fs("mem://")
94107
m1.writetext("foo", "hello")
95108
m1.makedir("bar")
96109
m2 = open_fs("mem://")
97-
mirror(m1, m2, workers=self.WORKERS)
110+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
98111
self.assert_compare_fs(m1, m2)
99112
m2.appendtext("foo", " world!")
100-
mirror(m1, m2, workers=self.WORKERS)
113+
mirror(m1, m2, workers=self.WORKERS, preserve_time=True)
101114
self.assert_compare_fs(m1, m2)
102-
103-
104-
class TestMirrorWorkers1(TestMirror):
105-
WORKERS = 1
106-
107-
108-
class TestMirrorWorkers2(TestMirror):
109-
WORKERS = 2
110-
111-
112-
class TestMirrorWorkers4(TestMirror):
113-
WORKERS = 4

tests/test_move.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,67 @@
22

33
import unittest
44

5+
from parameterized import parameterized_class
6+
57
import fs.move
68
from fs import open_fs
79

810

11+
@parameterized_class(("preserve_time",), [(True,), (False,)])
912
class TestMove(unittest.TestCase):
1013
def test_move_fs(self):
14+
namespaces = ("details", "accessed", "metadata_changed", "modified")
15+
1116
src_fs = open_fs("mem://")
1217
src_fs.makedirs("foo/bar")
1318
src_fs.touch("test.txt")
1419
src_fs.touch("foo/bar/baz.txt")
20+
src_file1_info = src_fs.getinfo("test.txt", namespaces)
21+
src_file2_info = src_fs.getinfo("foo/bar/baz.txt", namespaces)
1522

1623
dst_fs = open_fs("mem://")
1724
fs.move.move_fs(src_fs, dst_fs)
1825

1926
self.assertTrue(dst_fs.isdir("foo/bar"))
2027
self.assertTrue(dst_fs.isfile("test.txt"))
28+
self.assertTrue(dst_fs.isfile("foo/bar/baz.txt"))
2129
self.assertTrue(src_fs.isempty("/"))
2230

23-
def test_copy_dir(self):
31+
if self.preserve_time:
32+
dst_file1_info = dst_fs.getinfo("test.txt", namespaces)
33+
dst_file2_info = dst_fs.getinfo("foo/bar/baz.txt", namespaces)
34+
self.assertEqual(dst_file1_info.modified, src_file1_info.modified)
35+
self.assertEqual(dst_file1_info.accessed, src_file1_info.accessed)
36+
self.assertEqual(
37+
dst_file1_info.metadata_changed, src_file1_info.metadata_changed
38+
)
39+
self.assertEqual(dst_file2_info.modified, src_file2_info.modified)
40+
self.assertEqual(dst_file2_info.accessed, src_file2_info.accessed)
41+
self.assertEqual(
42+
dst_file2_info.metadata_changed, src_file2_info.metadata_changed
43+
)
44+
45+
def test_move_dir(self):
46+
namespaces = ("details", "accessed", "metadata_changed", "modified")
47+
2448
src_fs = open_fs("mem://")
2549
src_fs.makedirs("foo/bar")
2650
src_fs.touch("test.txt")
2751
src_fs.touch("foo/bar/baz.txt")
52+
src_file2_info = src_fs.getinfo("foo/bar/baz.txt", namespaces)
2853

2954
dst_fs = open_fs("mem://")
3055
fs.move.move_dir(src_fs, "/foo", dst_fs, "/")
3156

3257
self.assertTrue(dst_fs.isdir("bar"))
3358
self.assertTrue(dst_fs.isfile("bar/baz.txt"))
3459
self.assertFalse(src_fs.exists("foo"))
60+
self.assertTrue(src_fs.isfile("test.txt"))
61+
62+
if self.preserve_time:
63+
dst_file2_info = dst_fs.getinfo("bar/baz.txt", namespaces)
64+
self.assertEqual(dst_file2_info.modified, src_file2_info.modified)
65+
self.assertEqual(dst_file2_info.accessed, src_file2_info.accessed)
66+
self.assertEqual(
67+
dst_file2_info.metadata_changed, src_file2_info.metadata_changed
68+
)

tests/test_opener.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,14 +300,26 @@ def test_user_data_opener(self, app_dir):
300300
def test_open_ftp(self, mock_FTPFS):
301301
open_fs("ftp://foo:bar@ftp.example.org")
302302
mock_FTPFS.assert_called_once_with(
303-
"ftp.example.org", passwd="bar", port=21, user="foo", proxy=None, timeout=10, tls=False
303+
"ftp.example.org",
304+
passwd="bar",
305+
port=21,
306+
user="foo",
307+
proxy=None,
308+
timeout=10,
309+
tls=False,
304310
)
305311

306312
@mock.patch("fs.ftpfs.FTPFS")
307313
def test_open_ftps(self, mock_FTPFS):
308314
open_fs("ftps://foo:bar@ftp.example.org")
309315
mock_FTPFS.assert_called_once_with(
310-
"ftp.example.org", passwd="bar", port=21, user="foo", proxy=None, timeout=10, tls=True
316+
"ftp.example.org",
317+
passwd="bar",
318+
port=21,
319+
user="foo",
320+
proxy=None,
321+
timeout=10,
322+
tls=True,
311323
)
312324

313325
@mock.patch("fs.ftpfs.FTPFS")

tests/test_osfs.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import shutil
88
import tempfile
99
import sys
10+
import time
1011
import unittest
1112

1213
from fs import osfs, open_fs
@@ -87,6 +88,25 @@ def test_expand_vars(self):
8788
self.assertIn("TYRIONLANISTER", fs1.getsyspath("/"))
8889
self.assertNotIn("TYRIONLANISTER", fs2.getsyspath("/"))
8990

91+
def test_copy_preserve_time(self):
92+
self.fs.makedir("foo")
93+
self.fs.makedir("bar")
94+
now = time.time() - 10000
95+
if not self.fs.create("foo/file.txt"):
96+
raw_info = {"details": {"accessed": now, "modified": now}}
97+
self.fs.setinfo("foo/file.txt", raw_info)
98+
99+
namespaces = ("details", "accessed", "metadata_changed", "modified")
100+
src_info = self.fs.getinfo("foo/file.txt", namespaces)
101+
102+
self.fs.copy("foo/file.txt", "bar/file.txt", preserve_time=True)
103+
self.assertTrue(self.fs.exists("bar/file.txt"))
104+
105+
dst_info = self.fs.getinfo("bar/file.txt", namespaces)
106+
self.assertEqual(dst_info.modified, src_info.modified)
107+
self.assertEqual(dst_info.accessed, src_info.accessed)
108+
self.assertEqual(dst_info.metadata_changed, src_info.metadata_changed)
109+
90110
@unittest.skipUnless(osfs.sendfile, "sendfile not supported")
91111
@unittest.skipIf(
92112
sys.version_info >= (3, 8),

0 commit comments

Comments
 (0)