rubypath 0.3.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,428 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Path do
4
- let(:delta) { 1.0 }
5
-
6
- describe 'File Operations' do
7
- with_backends :mock, :sys do
8
- let(:path) { Path('/path/to/file.txt') }
9
-
10
- describe_method :name, aliases: [:basename] do
11
- subject { path.send described_method }
12
-
13
- it 'should return file name' do
14
- should eq 'file.txt'
15
- end
16
- end
17
-
18
- describe_method :unlink do
19
- subject { path.send described_method }
20
-
21
- context 'on non-existent file' do
22
- it { expect{ subject }.to raise_error Errno::ENOENT }
23
- end
24
-
25
- context 'on existent file' do
26
- before { path.mkfile }
27
-
28
- it 'should unlink file' do
29
- expect{ subject }.to change(path, :exist?).from(true).to(false)
30
- end
31
- end
32
-
33
- context 'on existent directory' do
34
- before { path.mkpath }
35
-
36
- it { expect{ subject }.to raise_error Errno::EISDIR }
37
- end
38
-
39
- context 'with args' do
40
- subject { path.send(described_method, 'file') }
41
-
42
- context 'on non-existent file' do
43
- it { expect{ subject }.to raise_error Errno::ENOENT }
44
- end
45
-
46
- context 'on existent file' do
47
- before { path.mkfile('file') }
48
-
49
- it 'should unlink file' do
50
- expect{ subject }
51
- .to change(path.join('file'), :exist?).from(true).to(false)
52
- end
53
- end
54
- end
55
- end
56
-
57
- describe_method :touch do
58
- let(:path) { Path '/rubypath' }
59
- let(:args) { Array.new }
60
- let(:expected_path) { path }
61
- subject { path.touch(*args) }
62
- before { expect(path).to_not be_existent }
63
-
64
- shared_examples '#touch' do
65
- it 'should create file' do
66
- subject
67
- expect(expected_path).to be_existent
68
- end
69
-
70
- it 'should update modification time' do
71
- subject
72
- expect(expected_path.mtime).to be_within(delta).of(Time.now)
73
- end
74
- end
75
-
76
- shared_examples '#touch with existing file' do
77
- before do
78
- expected_path.write 'ABC'
79
- expected_path.mtime = Time.now - 3600
80
- end
81
- before { expect(expected_path.mtime).to be < (Time.now - 30) }
82
-
83
- it_behaves_like '#touch'
84
-
85
- it 'should not change content' do
86
- subject
87
- expect(expected_path.read).to eq 'ABC'
88
- end
89
- end
90
-
91
- it_behaves_like '#touch with existing file'
92
-
93
- context 'with args' do
94
- let(:args) { '../file' }
95
- let(:expected_path) { Path '/file' }
96
-
97
- it_behaves_like '#touch with existing file'
98
- end
99
-
100
- context 'with existing file in path' do
101
- let(:path) { super().join('file') }
102
- before { path.parent.write 'ABC' }
103
-
104
- it 'should raise ENOTDIR error' do
105
- expect{ subject }.to raise_error(
106
- Errno::ENOTDIR, 'Not a directory - /rubypath/file')
107
- end
108
- end
109
-
110
- context 'with existing directory' do
111
- before do
112
- path.mkdir
113
- path.mtime = Time.now - 3600
114
- end
115
- before { expect(path).to be_directory }
116
- before { expect(path.mtime).to be < (Time.now - 30) }
117
-
118
- it 'should should update modification time' do
119
- subject
120
- expect(path.mtime).to be_within(delta).of(Time.now)
121
- end
122
- end
123
-
124
- context 'with file in non-existent directory' do
125
- let(:path) { Path '/dir/file' }
126
-
127
- it 'should raise ENOENT error' do
128
- expect{ subject }.to raise_error(
129
- Errno::ENOENT, 'No such file or directory - /dir/file')
130
- end
131
- end
132
- end
133
-
134
- describe_method :mkfile do
135
- let(:path) { Path '/path/to/file.txt' }
136
- let(:args) { Array.new }
137
- let(:expected_path) { path.dup }
138
- subject { path.send described_method, *args }
139
-
140
- shared_examples '#mkfile' do
141
- it 'should create all missing directories' do
142
- expect{ subject }.to change{ expected_path.parent.directory? }
143
- .from(false).to(true)
144
- end
145
-
146
- it 'should create file' do
147
- expect{ subject }.to change{ expected_path.file? }
148
- .from(false).to(true)
149
- end
150
- end
151
-
152
- it_behaves_like '#mkfile'
153
-
154
- context 'with args' do
155
- let(:args) { %w(sub file) }
156
- let(:expected_path) { Path '/path/to/file.txt/sub/file' }
157
-
158
- it_behaves_like '#mkfile'
159
- end
160
-
161
- context 'with existing directory' do
162
- before { path.mkpath }
163
-
164
- it 'should raise ENOENT error' do
165
- expect{ subject }.to raise_error(
166
- Errno::ENOENT, 'No such file or directory - /path/to/file.txt')
167
- end
168
- end
169
-
170
- context 'with existing file in path' do
171
- before do
172
- path.parent.parent.mkpath
173
- path.parent.touch
174
- end
175
-
176
- it 'should raise EISDIR error' do
177
- expect{ subject }.to raise_error(
178
- Errno::ENOTDIR, 'Not a directory - /path/to/file.txt')
179
- end
180
- end
181
-
182
- context 'with absolute root dir as path' do
183
- let(:path) { Path '/' }
184
-
185
- it 'should raise EISDIR error' do
186
- expect{ subject }.to raise_error(
187
- Errno::ENOENT, 'No such file or directory - /')
188
- end
189
- end
190
- end
191
-
192
- describe_method :lookup do
193
- let(:path) { Path('~') }
194
- before do
195
- Path.mock do |r|
196
- path.mkpath 'a/b/c/d'
197
- path.touch 'a/test.txt'
198
- path.touch 'a/b/c/config.yaml'
199
- path.touch 'a/b/.config.yml'
200
- path.touch 'a/config.yml'
201
- end
202
- end
203
- before { expect(path.join('a/b/c/d')).to be_directory }
204
-
205
- context 'with filename' do
206
- it 'should find file in current directory' do
207
- expect(path.join('a').send(described_method, 'test.txt'))
208
- .to eq path.join('a/test.txt').expand
209
- end
210
-
211
- it 'should find file in parent directory' do
212
- expect(path.join(%w(a b)).send(described_method, 'test.txt'))
213
- .to eq path.join('a/test.txt').expand
214
- end
215
-
216
- it 'should find file in ancestor directory' do
217
- expect(path.join('a/b/c/d').send(described_method, 'test.txt'))
218
- .to eq path.join('a/test.txt').expand
219
- end
220
-
221
- it 'should find first file in ancestor directory' do
222
- expect(path.join('a/b/c/d').send(described_method, 'config.yaml'))
223
- .to eq path.join('a/b/c/config.yaml').expand
224
- end
225
- end
226
-
227
- context 'with glob' do
228
- it 'should find file in current directory' do
229
- expect(path.join('a').send(described_method, 'test.*'))
230
- .to eq path.join('a/test.txt').expand
231
- end
232
-
233
- it 'should find file in parent directory' do
234
- expect(path.join('a/b').send(described_method, 'test.*'))
235
- .to eq path.join('a/test.txt').expand
236
- end
237
-
238
- it 'should find file in ancestor directory' do
239
- expect(path.join('a/b/c/d').send(described_method, 'test.*'))
240
- .to eq path.join('a/test.txt').expand
241
- end
242
-
243
- it 'should find first file in ancestor directory' do
244
- expect(path.join('a/b/c/d').send(described_method, 'config.*'))
245
- .to eq path.join('a/b/c/config.yaml').expand
246
- end
247
-
248
- it 'should find first file that match (I)' do
249
- expect(path.join('a/b').send(described_method, '*.yml'))
250
- .to eq path.join('a/config.yml').expand
251
- end
252
-
253
- if defined?(::File::FNM_EXTGLOB)
254
- it 'should find first file that match (II)' do
255
- expect(path.join('a/b')
256
- .send(described_method, 'config.{yml,yaml}'))
257
- .to eq path.join('a/config.yml').expand
258
- end
259
- end
260
-
261
- it 'should find first file that dotmatch' do
262
- expect(path.join('a/b')
263
- .send(described_method, '*.yml', ::File::FNM_DOTMATCH))
264
- .to eq path.join('a/b/.config.yml').expand
265
- end
266
- end
267
-
268
- context 'with regexp' do
269
- it 'should find file in current directory' do
270
- expect(path.join('a').send(described_method, /^test\.txt$/))
271
- .to eq path.join('a/test.txt').expand
272
- end
273
-
274
- it 'should find file in parent directory' do
275
- expect(path.join('a/b').send(described_method, /^test\.txt$/))
276
- .to eq path.join('a/test.txt').expand
277
- end
278
-
279
- it 'should find file in ancestor directory' do
280
- expect(path.join('a/b/c/d').send(described_method, /^test\.txt$/))
281
- .to eq path.join('a/test.txt').expand
282
- end
283
-
284
- it 'should find first file in ancestor directory' do
285
- expect(path.join('a/b/c/d')
286
- .send(described_method, /^config\.yaml$/))
287
- .to eq path.join('a/b/c/config.yaml').expand
288
- end
289
-
290
- it 'should find first file that match' do
291
- expect(path.join('a/b').send(described_method, /^config\.ya?ml$/))
292
- .to eq path.join('a/config.yml').expand
293
- end
294
- end
295
- end
296
-
297
- describe_method :mtime do
298
- let(:path) { Path '/file.txt' }
299
- before { path.touch }
300
- subject { path.send described_method }
301
-
302
- it 'should return file modification time' do
303
- should be_within(delta).of(Time.now)
304
- end
305
-
306
- context 'with modification time changed' do
307
- before { path.mtime = Time.new(2175, 12, 24, 18, 00, 30) }
308
-
309
- it 'should return file modification time' do
310
- should eq Time.new(2175, 12, 24, 18, 00, 30)
311
- end
312
- end
313
- end
314
-
315
- describe_method :mtime= do
316
- let(:path) { Path '/file.txt' }
317
- before { path.touch }
318
- subject { path.send described_method, Time.new(2175, 12, 24, 18, 00, 30) }
319
-
320
- it 'should change file modification time' do
321
- expect{ subject }.to change{ path.mtime }.to Time.new(2175, 12, 24, 18, 00, 30)
322
- end
323
- end
324
-
325
- describe_method :atime do
326
- let(:path) { Path '/file.txt' }
327
- subject { path.send described_method }
328
-
329
- context 'new create file' do
330
- before { path.touch }
331
-
332
- it { should be_within(delta).of(Time.now) }
333
- end
334
-
335
- context 'with existing file' do
336
- before { path.touch }
337
-
338
- context 'older file' do
339
- before { path.touch }
340
- before { sleep 0.3 }
341
-
342
- it { should be_within(delta).of(Time.now - 0.3) }
343
- end
344
-
345
- context 'and changed access time' do
346
- before { path.atime = Time.new(2175, 12, 24, 18, 00, 30) }
347
-
348
- it 'should return file access time' do
349
- should eq Time.new(2175, 12, 24, 18, 00, 30)
350
- end
351
- end
352
- end
353
- end
354
-
355
- describe_method :atime= do
356
- let(:path) { Path '/file.txt' }
357
- before { path.touch }
358
- subject { path.send described_method, Time.new(2175, 12, 24, 18, 00, 30) }
359
-
360
- it 'should change file access time' do
361
- expect{ subject }.to change{ path.atime }.to Time.new(2175, 12, 24, 18, 00, 30)
362
- end
363
- end
364
-
365
- describe_method :mode do
366
- let(:path) { Path '/file' }
367
- subject { path.send described_method }
368
-
369
- context 'with file' do
370
- before { path.touch }
371
- it { should eq 0666 - Path.umask }
372
- end
373
-
374
- context 'with directory' do
375
- before { path.mkpath }
376
- it { should eq 0777 - Path.umask }
377
- end
378
- end
379
- end
380
-
381
- describe 'umask' do
382
- shared_examples 'umask setter' do
383
- with_backend :sys do
384
- it 'should set umask' do
385
- subject
386
- expect(File.umask).to eq 0077
387
- end
388
- end
389
-
390
- with_backend :mock do
391
- it 'should set umask' do
392
- expect{ subject }.to change{ Path.umask }.from(0022).to(0077)
393
- end
394
- end
395
- end
396
-
397
- describe_method :umask do
398
- let(:args) { Array.new }
399
- subject { Path.send described_method, *args }
400
-
401
- context 'as getter' do
402
- with_backend :sys do
403
- it 'should return umask' do
404
- should eq File.umask
405
- end
406
- end
407
-
408
- with_backend :mock do
409
- it 'should return umask' do
410
- should eq 0022
411
- end
412
- end
413
- end
414
-
415
- context 'as setter' do
416
- let(:args) { [0077] }
417
- it_behaves_like 'umask setter'
418
- end
419
- end
420
-
421
- describe_method :umask= do
422
- let(:args) { [0077] }
423
- subject { Path.send described_method, *args }
424
- it_behaves_like 'umask setter'
425
- end
426
- end
427
- end
428
- end
@@ -1,66 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Path do
4
- describe 'File Predicates' do
5
- with_backends :mock, :sys do
6
- describe_method :file? do
7
- let(:path) { Path '/file.txt' }
8
- before { expect(path).to_not be_existent }
9
- subject { path.send(described_method) }
10
-
11
- context 'with existing file' do
12
- before { path.touch }
13
- it { should eq true }
14
- end
15
-
16
- context 'with existing but wrong node (dir)' do
17
- before { path.mkdir }
18
- it { should eq false }
19
- end
20
-
21
- context 'with not existent file' do
22
- it { should eq false }
23
- end
24
- end
25
-
26
- describe_method :directory? do
27
- let(:dir) { Path '/dir' }
28
- before { expect(dir).to_not be_existent }
29
- subject { dir.send(described_method) }
30
-
31
- context 'with existing directory' do
32
- before { dir.mkdir }
33
- it { should eq true }
34
- end
35
-
36
- context 'with existing but wrong node (file)' do
37
- before { dir.touch }
38
- it { should eq false }
39
- end
40
-
41
- context 'with not existent directory' do
42
- it { should eq false }
43
- end
44
- end
45
-
46
- describe_method :exists?, aliases: [:exist?, :existent?] do
47
- let(:path) { Path '/file' }
48
- subject { path.send described_method }
49
-
50
- context 'with existing directory' do
51
- before { path.mkdir }
52
- it { should eq true }
53
- end
54
-
55
- context 'with existing file' do
56
- before { path.touch }
57
- it { should eq true }
58
- end
59
-
60
- context 'with non-existing node' do
61
- it { should eq false }
62
- end
63
- end
64
- end
65
- end
66
- end