memfs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,209 @@
1
+ require 'spec_helper'
2
+
3
+ module MemFs
4
+ describe File::Stat do
5
+ describe '.new' do
6
+ context "when optional follow_symlink argument is set to true" do
7
+ it "raises an error if the end-of-links-chain target doesn't exist" do
8
+ fs.symlink('/test-file', '/test-link')
9
+ expect { File::Stat.new('/test-link', true) }.to raise_error(Errno::ENOENT)
10
+ end
11
+ end
12
+ end
13
+
14
+ describe '#atime' do
15
+ let(:time) { Time.now - 500000 }
16
+
17
+ it "returns the access time of the entry" do
18
+ fs.touch('/test-file')
19
+ entry = fs.find!('/test-file')
20
+ entry.atime = time
21
+ expect(File::Stat.new('/test-file').atime).to eq(time)
22
+ end
23
+
24
+ context "when the entry is a symlink" do
25
+ context "and the optional follow_symlink argument is true" do
26
+ it "returns the access time of the last target of the link chain" do
27
+ fs.touch('/test-file')
28
+ entry = fs.find!('/test-file')
29
+ entry.atime = time
30
+ fs.symlink('/test-file', '/test-link')
31
+ expect(File::Stat.new('/test-link', true).atime).to eq(time)
32
+ end
33
+ end
34
+
35
+ context "and the optional follow_symlink argument is false" do
36
+ it "returns the access time of the symlink itself" do
37
+ fs.touch('/test-file')
38
+ entry = fs.find!('/test-file')
39
+ entry.atime = time
40
+ fs.symlink('/test-file', '/test-link')
41
+ expect(File::Stat.new('/test-link').atime).not_to eq(time)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "#blksize" do
48
+ it "returns the block size of the file" do
49
+ fs.touch('/test-file')
50
+ expect(File::Stat.new('/test-file').blksize).to be(4096)
51
+ end
52
+ end
53
+
54
+ describe "#dev" do
55
+ it "returns an integer representing the device on which stat resides" do
56
+ fs.touch('/test-file')
57
+ expect(File::Stat.new('/test-file').dev).to be_a(Fixnum)
58
+ end
59
+ end
60
+
61
+ describe '#directory?' do
62
+ before :each do
63
+ fs.mkdir('/test')
64
+ fs.touch('/test-file')
65
+ fs.symlink('/test', '/link-to-dir')
66
+ fs.symlink('/test-file', '/link-to-file')
67
+ end
68
+
69
+ it "returns true if the entry is a directory" do
70
+ expect(File::Stat.new('/test')).to be_directory
71
+ end
72
+
73
+ it "returns false if the entry is not a directory" do
74
+ expect(File::Stat.new('/test-file')).not_to be_directory
75
+ end
76
+
77
+ context "when the entry is a symlink" do
78
+ context "and the optional follow_symlink argument is true" do
79
+ it "returns true if the last target of the link chain is a directory" do
80
+ expect(File::Stat.new('/link-to-dir', true)).to be_directory
81
+ end
82
+
83
+ it "returns false if the last target of the link chain is not a directory" do
84
+ expect(File::Stat.new('/link-to-file', true)).not_to be_directory
85
+ end
86
+ end
87
+
88
+ context "and the optional follow_symlink argument is false" do
89
+ it "returns false if the last target of the link chain is a directory" do
90
+ expect(File::Stat.new('/link-to-dir', false)).not_to be_directory
91
+ end
92
+
93
+ it "returns false if the last target of the link chain is not a directory" do
94
+ expect(File::Stat.new('/link-to-file', false)).not_to be_directory
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '#entry' do
101
+ it "returns the comcerned entry" do
102
+ entry = fs.touch('/test-file')
103
+ stat = File::Stat.new('/test-file')
104
+ expect(stat.entry).to be_a(Fake::File)
105
+ end
106
+ end
107
+
108
+ describe "#file?" do
109
+ it "returns true if the entry is a regular file" do
110
+ fs.touch('/test-file')
111
+ expect(File.stat('/test-file')).to be_file
112
+ end
113
+
114
+ it "returns false if the entry is not a regular file" do
115
+ fs.mkdir('/test-dir')
116
+ expect(File.stat('/test-dir')).not_to be_file
117
+ end
118
+
119
+ context "when the entry is a symlink" do
120
+ it "returns true if its target is a regular file" do
121
+ fs.touch('/test-file')
122
+ fs.symlink('/test-file', '/test-link')
123
+ expect(File.stat('/test-link')).to be_file
124
+ end
125
+
126
+ it "returns false if its target is not a regular file" do
127
+ fs.mkdir('/test-dir')
128
+ fs.symlink('/test-dir', '/test-link')
129
+ expect(File.stat('/test-link')).not_to be_file
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "#gid" do
135
+ it "returns the group id of the named entry" do
136
+ fs.touch('/test-file')
137
+ fs.chown(nil, 42, '/test-file')
138
+ expect(File::Stat.new('/test-file').gid).to be(42)
139
+ end
140
+ end
141
+
142
+ describe "#ino" do
143
+ it "returns the inode number for stat." do
144
+ fs.touch('/test-file')
145
+ expect(File::Stat.new('/test-file').ino).to be_a(Fixnum)
146
+ end
147
+ end
148
+
149
+ describe '#mode' do
150
+ it "returns an integer representing the permission bits of stat" do
151
+ fs.touch('/test-file')
152
+ fs.chmod(0777, '/test-file')
153
+ expect(File::Stat.new('/test-file').mode).to be(0100777)
154
+ end
155
+ end
156
+
157
+ describe "#sticky?" do
158
+ it "returns true if the named file has the sticky bit set" do
159
+ fs.touch('/test-file')
160
+ fs.chmod(01777, '/test-file')
161
+ expect(File::Stat.new('/test-file')).to be_sticky
162
+ end
163
+
164
+ it "returns false if the named file hasn't' the sticky bit set" do
165
+ fs.touch('/test-file')
166
+ expect(File::Stat.new('/test-file')).not_to be_sticky
167
+ end
168
+ end
169
+
170
+ describe '#symlink?' do
171
+ it "returns true if the entry is a symlink" do
172
+ fs.touch('/test-file')
173
+ fs.symlink('/test-file', '/test-link')
174
+ expect(File::Stat.new('/test-link').symlink?).to be_true
175
+ end
176
+
177
+ it "returns false if the entry is not a symlink" do
178
+ fs.touch('/test-file')
179
+ expect(File::Stat.new('/test-file').symlink?).to be_false
180
+ end
181
+ end
182
+
183
+ describe "#uid" do
184
+ it "returns the user id of the named entry" do
185
+ fs.touch('/test-file')
186
+ fs.chown(42, nil, '/test-file')
187
+ expect(File::Stat.new('/test-file').uid).to be(42)
188
+ end
189
+ end
190
+
191
+ describe "#world_writable?" do
192
+ context "when +file_name+ is writable by others" do
193
+ it "returns an integer representing the file permission bits of +file_name+" do
194
+ fs.touch('/test-file')
195
+ fs.chmod(0777, '/test-file')
196
+ expect(File::Stat.new('/test-file')).to be_world_writable
197
+ end
198
+ end
199
+
200
+ context "when +file_name+ is not writable by others" do
201
+ it "returns nil" do
202
+ fs.touch('/test-file')
203
+ fs.chmod(0644, '/test-file')
204
+ expect(File::Stat.new('/test-file')).not_to be_world_writable
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end