aruba 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +167 -3
  4. data/.simplecov +32 -0
  5. data/.travis.yml +5 -2
  6. data/.yardopts +8 -0
  7. data/CONTRIBUTING.md +18 -8
  8. data/Gemfile +25 -0
  9. data/History.md +8 -0
  10. data/README.md +80 -18
  11. data/Rakefile +1 -1
  12. data/aruba.gemspec +6 -8
  13. data/cucumber.yml +5 -6
  14. data/features/debug.feature +15 -0
  15. data/features/file_system_commands.feature +14 -2
  16. data/features/fixtures/copy/file.txt +1 -0
  17. data/features/fixtures/fixtures-app/test.txt +1 -0
  18. data/features/fixtures/spawn_process/stderr.sh +3 -0
  19. data/features/interactive.feature +2 -2
  20. data/features/step_definitions/aruba_dev_steps.rb +1 -1
  21. data/features/support/custom_main.rb +10 -6
  22. data/features/support/env.rb +27 -2
  23. data/features/support/simplecov_setup.rb +8 -0
  24. data/lib/aruba.rb +2 -2
  25. data/lib/aruba/announcer.rb +161 -0
  26. data/lib/aruba/api.rb +490 -251
  27. data/lib/aruba/config.rb +0 -1
  28. data/lib/aruba/cucumber.rb +71 -59
  29. data/lib/aruba/cucumber/hooks.rb +18 -13
  30. data/lib/aruba/errors.rb +6 -0
  31. data/lib/aruba/in_process.rb +5 -45
  32. data/lib/aruba/matchers/command.rb +79 -0
  33. data/lib/aruba/matchers/directory.rb +59 -0
  34. data/lib/aruba/matchers/file.rb +177 -0
  35. data/lib/aruba/matchers/mode.rb +52 -0
  36. data/lib/aruba/matchers/path.rb +99 -0
  37. data/lib/aruba/matchers/rspec_matcher_include_regexp.rb +21 -1
  38. data/lib/aruba/process_monitor.rb +113 -0
  39. data/lib/aruba/processes/basic_process.rb +25 -0
  40. data/lib/aruba/processes/debug_process.rb +59 -0
  41. data/lib/aruba/processes/in_process.rb +86 -0
  42. data/lib/aruba/processes/spawn_process.rb +159 -0
  43. data/lib/aruba/reporting.rb +2 -2
  44. data/lib/aruba/rspec.rb +26 -0
  45. data/lib/aruba/spawn_process.rb +5 -104
  46. data/lib/aruba/utils.rb +21 -0
  47. data/script/bootstrap +22 -0
  48. data/script/console +17 -0
  49. data/script/test +3 -0
  50. data/spec/aruba/api_spec.rb +813 -147
  51. data/spec/aruba/hooks_spec.rb +0 -1
  52. data/spec/aruba/matchers/command_spec.rb +43 -0
  53. data/spec/aruba/matchers/directory_spec.rb +58 -0
  54. data/spec/aruba/matchers/file_spec.rb +131 -0
  55. data/spec/aruba/matchers/path_spec.rb +85 -0
  56. data/spec/aruba/spawn_process_spec.rb +46 -28
  57. data/spec/spec_helper.rb +18 -13
  58. data/{config/rubocop/include.yml → spec/support/configs/.keep} +0 -0
  59. data/spec/support/configs/rspec.rb +15 -0
  60. data/spec/support/helpers/.keep +0 -0
  61. data/spec/support/helpers/reporting.rb +44 -0
  62. data/spec/support/matchers/.keep +0 -0
  63. data/spec/support/shared_contexts/.keep +0 -0
  64. data/spec/support/shared_contexts/aruba.rb +45 -0
  65. data/spec/support/shared_examples/.keep +0 -0
  66. data/spec/support/shared_examples/directory.rb +7 -0
  67. data/spec/support/shared_examples/file.rb +7 -0
  68. data/templates/js/jquery-1.11.3.min.js +5 -0
  69. data/templates/main.erb +1 -1
  70. metadata +87 -96
  71. data/config/rubocop/exclude.yml +0 -160
  72. data/templates/js/jquery-1.6.1.min.js +0 -18
@@ -0,0 +1,21 @@
1
+ module Aruba
2
+ module Utils
3
+ def detect_ruby(cmd)
4
+ if cmd =~ /^ruby\s/
5
+ cmd.gsub(/^ruby\s/, "#{current_ruby} ")
6
+ else
7
+ cmd
8
+ end
9
+ end
10
+
11
+ def current_ruby
12
+ File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
13
+ end
14
+
15
+ def ensure_newline(str)
16
+ str.chomp << "\n"
17
+ end
18
+
19
+ module_function :detect_ruby, :current_ruby, :ensure_newline
20
+ end
21
+ end
data/script/bootstrap ADDED
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ info_msg="\e[0;32m[INFO]\e[0;30m"
6
+ error_msg="\e[0;31mFAILED\e[0;30m"
7
+
8
+ function output_error_log {
9
+ [[ -f error.log ]] && ( cat error.log >&2; rm error.log)
10
+ }
11
+
12
+ echo -ne "$info_msg Checking if ruby installed? "
13
+ which 'ruby' >/dev/null 2>error.log || ( echo -e "$error_msg\n\nCould not find \`ruby\`. Please install ruby or add it to PATH"; output_error_log; exit 1 )
14
+ echo OK
15
+
16
+ echo -en "$info_msg rubygem \"bundler\" "
17
+ gem install bundler >/dev/null 2>error.log || ( echo -e "$error_msg\n\nAn error occurred during installation of bundler. Run \`gem install bundler\` yourself."; output_error_log; exit 1 )
18
+ echo OK
19
+
20
+ echo -en "$info_msg \"bundle install\" "
21
+ bundle install $* >/dev/null 2>error.log || ( echo -e "$error_msg\n\nAn error occurred during bundle install. Run \`bundle install\` yourself."; output_error_log; exit 1 )
22
+ echo OK
data/script/console ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'pry'
6
+
7
+ require 'aruba/api'
8
+ require 'aruba/reporting'
9
+
10
+ module Aruba
11
+ class MyConsole
12
+ include Aruba::Api
13
+ end
14
+ end
15
+
16
+ include Aruba
17
+ Pry.start MyConsole.new
data/script/test ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake test
@@ -2,136 +2,714 @@ require 'spec_helper'
2
2
  require 'securerandom'
3
3
 
4
4
  describe Aruba::Api do
5
+ include_context 'uses aruba API'
5
6
 
6
- def random_string(options = {})
7
- options[:prefix].to_s + SecureRandom.hex + options[:suffix].to_s
7
+ describe 'current_directory' do
8
+ it "should return the current dir as 'tmp/aruba'" do
9
+ expect(@aruba.current_directory).to match(/^tmp\/aruba$/)
10
+ end
11
+
12
+ it "can be cleared" do
13
+ write_file('test', 'test test test')
14
+
15
+ in_current_directory do
16
+ expect(File.exist?('test')).to be_truthy
17
+ end
18
+
19
+ clean_current_directory
20
+
21
+ in_current_directory do
22
+ expect(File.exist?('test')).to be_falsey
23
+ end
24
+ end
8
25
  end
9
26
 
10
- before(:each) do
11
- klass = Class.new {
12
- include Aruba::Api
27
+ describe '#all_paths' do
28
+ let(:name) { @file_name }
29
+ let(:path) { @file_path }
13
30
 
14
- def set_tag(tag_name, value)
15
- self.instance_variable_set "@#{tag_name}", value
31
+ context 'when file exist' do
32
+ before :each do
33
+ File.write(path, '')
16
34
  end
17
35
 
18
- def announce_or_puts(*args)
19
- p caller[0..2]
36
+ it { expect(all_paths).to include expand_path(name) }
37
+ end
38
+
39
+ context 'when directory exist' do
40
+ let(:name) { 'test_dir' }
41
+ let(:path) { File.join(@aruba.current_directory, name) }
42
+
43
+ before :each do
44
+ FileUtils.mkdir_p path
20
45
  end
21
- }
22
- @aruba = klass.new
23
46
 
24
- @file_name = "test.txt"
25
- @file_size = 256
26
- @file_path = File.join(@aruba.current_dir, @file_name)
47
+ it { expect(all_paths).to include expand_path(name) }
48
+ end
27
49
 
28
- (@aruba.dirs.length - 1).times do |depth| #Ensure all parent dirs exists
29
- dir = File.join(*@aruba.dirs[0..depth])
30
- Dir.mkdir(dir) unless File.exist?(dir)
50
+ context 'when nothing exist' do
51
+ it { expect(all_paths).to eq [] }
31
52
  end
32
- raise "We must work with relative paths, everything else is dangerous" if ?/ == @aruba.current_dir[0]
33
- FileUtils.rm_rf(@aruba.current_dir)
34
- Dir.mkdir(@aruba.current_dir)
35
53
  end
36
54
 
37
- describe 'current_dir' do
38
- it "should return the current dir as 'tmp/aruba'" do
39
- expect(@aruba.current_dir).to match(/^tmp\/aruba$/)
55
+ describe '#all_files' do
56
+ let(:name) { @file_name }
57
+ let(:path) { @file_path }
58
+
59
+ context 'when file exist' do
60
+ before :each do
61
+ File.write(path, '')
62
+ end
63
+
64
+ it { expect(all_files).to include expand_path(name) }
40
65
  end
41
66
 
42
- it "can be cleared" do
43
- write_file('test', 'test test test')
67
+ context 'when directory exist' do
68
+ let(:name) { 'test_dir' }
69
+ let(:path) { File.join(@aruba.current_directory, name) }
44
70
 
45
- in_current_dir do
46
- expect(File.exist?('test')).to be_truthy
71
+ before :each do
72
+ FileUtils.mkdir_p path
47
73
  end
48
74
 
49
- clean_current_dir
75
+ it { expect(all_files).to eq [] }
76
+ end
50
77
 
51
- in_current_dir do
52
- expect(File.exist?('test')).to be_falsey
78
+ context 'when nothing exist' do
79
+ it { expect(all_files).to eq [] }
80
+ end
81
+ end
82
+
83
+ describe '#all_directories' do
84
+ let(:name) { @file_name }
85
+ let(:path) { @file_path }
86
+
87
+ context 'when file exist' do
88
+ before :each do
89
+ File.write(path, '')
53
90
  end
54
91
 
92
+ it { expect(all_directories).to eq [] }
93
+ end
94
+
95
+ context 'when directory exist' do
96
+ let(:name) { 'test_dir' }
97
+ let(:path) { File.join(@aruba.current_directory, name) }
98
+
99
+ before :each do
100
+ FileUtils.mkdir_p path
101
+ end
102
+
103
+ it { expect(all_directories).to include expand_path(name) }
104
+ end
105
+
106
+ context 'when nothing exist' do
107
+ it { expect(all_directories).to eq [] }
55
108
  end
56
109
  end
57
110
 
58
111
  describe 'directories' do
59
112
  before(:each) do
60
113
  @directory_name = 'test_dir'
61
- @directory_path = File.join(@aruba.current_dir, @directory_name)
114
+ @directory_path = File.join(@aruba.current_directory, @directory_name)
62
115
  end
63
116
 
64
- context '#create_dir' do
117
+ context '#create_directory' do
65
118
  it 'creates a directory' do
66
- @aruba.create_dir @directory_name
119
+ @aruba.create_directory @directory_name
67
120
  expect(File.exist?(File.expand_path(@directory_path))).to be_truthy
68
121
  end
69
122
  end
123
+ end
70
124
 
71
- context '#remove_dir' do
72
- before :each do
73
- Dir.mkdir(@directory_path)
125
+ describe '#read' do
126
+ let(:name) { 'test.txt'}
127
+ let(:path) { File.join(@aruba.current_directory, name) }
128
+ let(:content) { 'asdf' }
129
+
130
+ before :each do
131
+ set_env 'HOME', File.expand_path(@aruba.current_directory)
132
+ end
133
+
134
+ context 'when does not exist' do
135
+ it { expect { @aruba.read(name) }.to raise_error ArgumentError }
136
+ end
137
+
138
+ context 'when exists' do
139
+ context 'when file' do
140
+ before :each do
141
+ File.open(File.expand_path(path), 'w') { |f| f << content }
142
+ end
143
+
144
+ context 'when normal file' do
145
+ it { expect(@aruba.read(name)).to eq [content] }
146
+ end
147
+
148
+ context 'when binary file' do
149
+ let(:content) { "\u0000" }
150
+ it { expect(@aruba.read(name)).to eq [content] }
151
+ end
152
+
153
+ context 'when is empty file' do
154
+ let(:content) { '' }
155
+ it { expect(@aruba.read(name)).to eq [] }
156
+ end
157
+
158
+ context 'when path contains ~' do
159
+ let(:string) { random_string }
160
+ let(:name) { File.join('~', string) }
161
+ let(:path) { File.join(@aruba.current_directory, string) }
162
+
163
+ it { expect(@aruba.read(name)).to eq [content] }
164
+ end
74
165
  end
75
166
 
76
- it 'should delete directory' do
77
- @aruba.remove_dir(@directory_name)
78
- expect(File.exist?(@directory_path)).to eq false
167
+ context 'when directory' do
168
+ let(:name) { 'test.d' }
169
+
170
+ before :each do
171
+ Array(path).each { |p| Dir.mkdir p }
172
+ end
173
+
174
+ it { expect { @aruba.read(name) }.to raise_error ArgumentError }
79
175
  end
176
+ end
177
+ end
80
178
 
81
- it "works with ~ in path name" do
82
- directory_path = File.join('~', random_string)
179
+ describe '#list' do
180
+ let(:name) { 'test.d' }
181
+ let(:content) { %w(subdir.1.d subdir.2.d) }
182
+ let(:path) { File.join(@aruba.current_directory, name) }
183
+
184
+ before :each do
185
+ set_env 'HOME', File.expand_path(@aruba.current_directory)
186
+ end
187
+
188
+ context 'when does not exist' do
189
+ it { expect { @aruba.list(name) }.to raise_error ArgumentError }
190
+ end
191
+
192
+ context 'when exists' do
193
+ context 'when file' do
194
+ let(:name) { 'test.txt' }
195
+
196
+ before :each do
197
+ File.open(File.expand_path(path), 'w') { |f| f << content }
198
+ end
199
+
200
+ context 'when normal file' do
201
+ it { expect{ @aruba.list(name) }.to raise_error ArgumentError }
202
+ end
203
+ end
204
+
205
+ context 'when directory' do
206
+ before :each do
207
+ Array(path).each { |p| Dir.mkdir p }
208
+ end
83
209
 
84
- with_env 'HOME' => File.expand_path(current_dir) do
85
- Dir.mkdir(File.expand_path(directory_path))
86
- @aruba.remove_dir(directory_path)
210
+ before :each do
211
+ Array(content).each { |p| Dir.mkdir File.join(path, p) }
212
+ end
213
+
214
+ context 'when has subdirectories' do
215
+ context 'when is simple path' do
216
+ let(:existing_files) { @aruba.list(name) }
217
+ let(:expected_files) { content.map { |c| File.join(name, c) }.sort }
218
+
219
+ it { expect(expected_files - existing_files).to be_empty}
220
+ end
221
+
222
+ context 'when path contains ~' do
223
+ let(:string) { random_string }
224
+ let(:name) { File.join('~', string) }
225
+ let(:path) { File.join(@aruba.current_directory, string) }
226
+
227
+ let(:existing_files) { @aruba.list(name) }
228
+ let(:expected_files) { content.map { |c| File.join(string, c) } }
87
229
 
88
- expect(File.exist?(File.expand_path(directory_path))).to eq false
230
+ it { expect(expected_files - existing_files).to be_empty}
231
+ end
232
+ end
233
+
234
+ context 'when has no subdirectories' do
235
+ let(:content) { [] }
236
+ it { expect(@aruba.list(name)).to eq [] }
237
+ end
238
+ end
239
+ end
240
+ end
241
+
242
+ describe '#remove' do
243
+ let(:name) { 'test.txt'}
244
+ let(:path) { File.join(@aruba.current_directory, name) }
245
+ let(:options) { {} }
246
+
247
+ before :each do
248
+ set_env 'HOME', File.expand_path(@aruba.current_directory)
249
+ end
250
+
251
+ context 'when file' do
252
+ context 'when exists' do
253
+ before :each do
254
+ Array(path).each { |p| File.open(File.expand_path(p), 'w') { |f| f << "" } }
255
+ end
256
+
257
+ before :each do
258
+ @aruba.remove(name, options)
259
+ end
260
+
261
+ context 'when is a single file' do
262
+ it_behaves_like 'a non-existing file'
263
+ end
264
+
265
+ context 'when are multiple files' do
266
+ let(:file_name) { %w(file1 file2 file3) }
267
+ let(:file_path) { %w(file1 file2 file3).map { |p| File.join(@aruba.current_directory, p) } }
268
+
269
+ it_behaves_like 'a non-existing file'
270
+ end
271
+
272
+ context 'when path contains ~' do
273
+ let(:string) { random_string }
274
+ let(:file_name) { File.join('~', string) }
275
+ let(:file_path) { File.join(@aruba.current_directory, string) }
276
+
277
+ it_behaves_like 'a non-existing file'
278
+ end
279
+ end
280
+
281
+ context 'when does not exist' do
282
+ before :each do
283
+ @aruba.remove(name, options)
284
+ end
285
+
286
+ context 'when is forced to delete file' do
287
+ let(:options) { { force: true } }
288
+
289
+ it_behaves_like 'a non-existing file'
290
+ end
291
+ end
292
+ end
293
+
294
+ context 'when is directory' do
295
+ let(:name) { 'test.d' }
296
+
297
+ context 'when exists' do
298
+ before :each do
299
+ Array(path).each { |p| Dir.mkdir p }
300
+ end
301
+
302
+ before :each do
303
+ @aruba.remove(name, options)
304
+ end
305
+
306
+ context 'when is a single directory' do
307
+ it_behaves_like 'a non-existing directory'
308
+ end
309
+
310
+ context 'when are multiple directorys' do
311
+ let(:directory_name) { %w(directory1 directory2 directory3) }
312
+ let(:directory_path) { %w(directory1 directory2 directory3).map { |p| File.join(@aruba.current_directory, p) } }
313
+
314
+ it_behaves_like 'a non-existing directory'
315
+ end
316
+
317
+ context 'when path contains ~' do
318
+ let(:string) { random_string }
319
+ let(:directory_name) { File.join('~', string) }
320
+ let(:directory_path) { File.join(@aruba.current_directory, string) }
321
+
322
+ it_behaves_like 'a non-existing directory'
323
+ end
324
+ end
325
+
326
+ context 'when does not exist' do
327
+ before :each do
328
+ @aruba.remove(name, options)
329
+ end
330
+
331
+ context 'when is forced to delete directory' do
332
+ let(:options) { { force: true } }
333
+
334
+ it_behaves_like 'a non-existing directory'
89
335
  end
90
336
  end
91
337
  end
92
338
  end
93
339
 
94
340
  describe 'files' do
95
- context '#touch_file' do
96
- it 'creates an empty file' do
97
- @aruba.touch_file(@file_name)
98
- expect(File.exist?(@file_path)).to eq true
99
- expect(File.size(@file_path)).to eq 0
341
+ describe '#touch' do
342
+ let(:name) { @file_name }
343
+ let(:path) { @file_path }
344
+ let(:options) { {} }
345
+
346
+ before :each do
347
+ set_env 'HOME', File.expand_path(@aruba.current_directory)
100
348
  end
101
349
 
102
- it 'supports an unexisting directory in path' do
103
- path = 'directory/test'
104
- full_path = File.join(@aruba.current_dir, path)
105
- @aruba.touch_file(path)
350
+ context 'when file' do
351
+ before :each do
352
+ @aruba.touch(name, options)
353
+ end
354
+
355
+ context 'when does not exist' do
356
+ context 'and should be created in existing directory' do
357
+ it { expect(File.size(path)).to eq 0 }
358
+ it_behaves_like 'an existing file'
359
+ end
360
+
361
+ context 'and should be created in non-existing directory' do
362
+ let(:name) { 'directory/test' }
363
+ let(:path) { File.join(@aruba.current_directory, 'directory/test') }
364
+
365
+ it_behaves_like 'an existing file'
366
+ end
367
+
368
+ context 'and path includes ~' do
369
+ let(:string) { random_string }
370
+ let(:name) { File.join('~', string) }
371
+ let(:path) { File.join(@aruba.current_directory, string) }
372
+
373
+ it_behaves_like 'an existing file'
374
+ end
375
+
376
+ context 'and the mtime should be set statically' do
377
+ let(:time) { Time.parse('2014-01-01 10:00:00') }
378
+ let(:options) { { mtime: Time.parse('2014-01-01 10:00:00') } }
379
+
380
+ it_behaves_like 'an existing file'
381
+ it { expect(File.mtime(path)).to eq time }
382
+ end
106
383
 
107
- expect(File.exist?(full_path)).to eq true
384
+ context 'and multiple file names are given' do
385
+ let(:name) { %w(file1 file2 file3) }
386
+ let(:path) { %w(file1 file2 file3).map { |p| File.join(@aruba.current_directory, p) } }
387
+ it_behaves_like 'an existing file'
388
+ end
389
+ end
108
390
  end
109
391
 
110
- it "works with ~ in path name" do
111
- file_path = File.join('~', random_string)
392
+ context 'when directory' do
393
+ let(:name) { %w(directory1) }
394
+ let(:path) { Array(name).map { |p| File.join(@aruba.current_directory, p) } }
112
395
 
113
- with_env 'HOME' => File.expand_path(current_dir) do
114
- @aruba.touch_file(file_path)
115
- expect(File.exist?(File.expand_path(file_path))).to eq true
396
+ context 'when exist' do
397
+ before(:each) { Array(path).each { |p| FileUtils.mkdir_p p } }
398
+
399
+ before :each do
400
+ @aruba.touch(name, options)
401
+ end
402
+
403
+ context 'and the mtime should be set statically' do
404
+ let(:time) { Time.parse('2014-01-01 10:00:00') }
405
+ let(:options) { { mtime: Time.parse('2014-01-01 10:00:00') } }
406
+
407
+ it_behaves_like 'an existing directory'
408
+ it { Array(path).each { |p| expect(File.mtime(p)).to eq time } }
409
+ end
410
+ end
411
+ end
412
+ end
413
+
414
+ describe '#absolute?' do
415
+ let(:name) { @file_name }
416
+ let(:path) { File.expand_path(File.join(@aruba.current_directory, name)) }
417
+
418
+ context 'when is absolute path' do
419
+ it { expect(@aruba).to be_absolute(path) }
420
+ end
421
+
422
+ context 'when is relative path' do
423
+ it { expect(@aruba).not_to be_absolute(name) }
424
+ end
425
+ end
426
+
427
+ describe '#relative?' do
428
+ let(:name) { @file_name }
429
+ let(:path) { File.expand_path(File.join(@aruba.current_directory, name)) }
430
+
431
+ context 'when is absolute path' do
432
+ it { expect(@aruba).not_to be_relative(path) }
433
+ end
434
+
435
+ context 'when is relative path' do
436
+ it { expect(@aruba).to be_relative(name) }
437
+ end
438
+ end
439
+
440
+ describe '#exist?' do
441
+ context 'when is file' do
442
+ let(:name) { @file_name }
443
+ let(:path) { @file_path }
444
+
445
+ context 'when exists' do
446
+ before :each do
447
+ File.write(path, '')
448
+ end
449
+
450
+ it { expect(@aruba).to be_exist(name) }
451
+ end
452
+
453
+ context 'when does not exist' do
454
+ it { expect(@aruba).not_to be_exist(name) }
455
+ end
456
+ end
457
+
458
+ context 'when is directory' do
459
+ let(:name) { 'test.d' }
460
+ let(:path) { File.join(@aruba.current_directory, name) }
461
+
462
+ context 'when exists' do
463
+ before :each do
464
+ FileUtils.mkdir_p path
465
+ end
466
+
467
+ it { expect(@aruba).to be_exist(name) }
468
+ end
469
+
470
+ context 'when does not exist' do
471
+ it { expect(@aruba).not_to be_exist(name) }
472
+ end
473
+ end
474
+ end
475
+
476
+ describe '#file?' do
477
+ context 'when is file' do
478
+ let(:name) { @file_name }
479
+ let(:path) { @file_path }
480
+
481
+ context 'when exists' do
482
+ before :each do
483
+ File.write(path, '')
484
+ end
485
+
486
+ it { expect(@aruba).to be_file(name) }
487
+ end
488
+
489
+ context 'when does not exist' do
490
+ it { expect(@aruba).not_to be_file(name) }
491
+ end
492
+ end
493
+
494
+ context 'when is directory' do
495
+ let(:name) { 'test.d' }
496
+ let(:path) { File.join(@aruba.current_directory, name) }
497
+
498
+ context 'when exists' do
499
+ before :each do
500
+ FileUtils.mkdir_p path
501
+ end
502
+
503
+ it { expect(@aruba).not_to be_file(name) }
504
+ end
505
+
506
+ context 'when does not exist' do
507
+ it { expect(@aruba).not_to be_file(name) }
508
+ end
509
+ end
510
+ end
511
+
512
+ describe '#directory?' do
513
+ context 'when is file' do
514
+ let(:name) { @file_name }
515
+ let(:path) { @file_path }
516
+
517
+ context 'when exists' do
518
+ before :each do
519
+ File.write(path, '')
520
+ end
521
+
522
+ it { expect(@aruba).not_to be_directory(name) }
523
+ end
524
+
525
+ context 'when does not exist' do
526
+ it { expect(@aruba).not_to be_directory(name) }
527
+ end
528
+ end
529
+
530
+ context 'when is directory' do
531
+ let(:name) { 'test.d' }
532
+ let(:path) { File.join(@aruba.current_directory, name) }
533
+
534
+ context 'when exists' do
535
+ before :each do
536
+ FileUtils.mkdir_p path
537
+ end
538
+
539
+ it { expect(@aruba).to be_directory(name) }
540
+ end
541
+
542
+ context 'when does not exist' do
543
+ it { expect(@aruba).not_to be_directory(name) }
544
+ end
545
+ end
546
+ end
547
+
548
+ describe '#copy' do
549
+ let(:source) { 'file.txt' }
550
+ let(:destination) { 'file1.txt' }
551
+
552
+ context 'when source is existing' do
553
+ context 'when destination is non-existing' do
554
+ context 'when source is file' do
555
+ before(:each) { create_test_files(source) }
556
+
557
+ before :each do
558
+ @aruba.copy source, destination
559
+ end
560
+
561
+ context 'when source is plain file' do
562
+ it { expect(destination).to be_existing_file }
563
+ end
564
+
565
+ context 'when source is contains "~" in path' do
566
+ let(:source) { '~/file.txt' }
567
+ it { expect(destination).to be_existing_file }
568
+ end
569
+
570
+ context 'when source is fixture' do
571
+ let(:source) { '%/copy/file.txt' }
572
+ let(:destination) { 'file.txt' }
573
+ it { expect(destination).to be_existing_file }
574
+ end
575
+
576
+ context 'when source is list of files' do
577
+ let(:source) { %w(file1.txt file2.txt file3.txt) }
578
+ let(:destination) { 'file.d' }
579
+ let(:destination_files) { source.map { |s| File.join(destination, s) } }
580
+
581
+ it { expect(destination_files).to be_existing_files }
582
+ end
583
+ end
584
+
585
+ context 'when source is directory' do
586
+ let(:source) { 'src.d' }
587
+ let(:destination) { 'dst.d' }
588
+
589
+ before :each do
590
+ FileUtils.mkdir_p File.join(@aruba.current_directory, source)
591
+ end
592
+
593
+ before :each do
594
+ @aruba.copy source, destination
595
+ end
596
+
597
+ context 'when source is single directory' do
598
+ it { expect(destination).to be_existing_directory }
599
+ end
600
+
601
+ context 'when source is nested directory' do
602
+ let(:source) { 'src.d/subdir.d' }
603
+ let(:destination) { 'dst.d/' }
604
+
605
+ it { expect(destination).to be_existing_directory }
606
+ end
607
+ end
608
+ end
609
+
610
+ context 'when destination is existing' do
611
+ context 'when source is list of files' do
612
+ before(:each) { create_test_files(source) }
613
+
614
+ context 'when destination is directory' do
615
+ let(:source) { %w(file1.txt file2.txt file3.txt) }
616
+ let(:destination) { 'file.d' }
617
+ let(:destination_files) { source.map { |s| File.join(destination, s) } }
618
+
619
+ before :each do
620
+ FileUtils.mkdir_p File.join(@aruba.current_directory, destination)
621
+ end
622
+
623
+ before :each do
624
+ @aruba.copy source, destination
625
+ end
626
+
627
+ it { source.each { |s| expect(destination_files).to be_existing_files } }
628
+ end
629
+
630
+ context 'when destination is not a directory' do
631
+ let(:source) { %w(file1.txt file2.txt file3.txt) }
632
+ let(:destination) { 'file.txt' }
633
+
634
+ before(:each) { create_test_files(destination) }
635
+
636
+ it { expect { @aruba.copy source, destination }.to raise_error ArgumentError, "Multiples sources can only be copied to a directory" }
637
+ end
638
+
639
+ context 'when a source is the same like destination' do
640
+ let(:source) { 'file1.txt' }
641
+ let(:destination) { 'file1.txt' }
642
+
643
+ before(:each) { create_test_files(source) }
644
+
645
+ # rubocop:disable Metrics/LineLength
646
+ it { expect { @aruba.copy source, destination }.to raise_error ArgumentError, %(same file: #{File.expand_path(File.join(@aruba.current_directory, source))} and #{File.expand_path(File.join(@aruba.current_directory, destination))}) }
647
+ # rubocop:enable Metrics/LineLength
648
+ end
649
+
650
+ context 'when a fixture is destination' do
651
+ let(:source) { '%/copy/file.txt' }
652
+ let(:destination) { '%/copy/file.txt' }
653
+
654
+ it { expect { @aruba.copy source, destination }.to raise_error ArgumentError, "Using a fixture as destination (#{destination}) is not supported" }
655
+ end
656
+ end
657
+ end
658
+
659
+ context 'when source is non-existing' do
660
+ it { expect { @aruba.copy source, destination }.to raise_error ArgumentError}
116
661
  end
117
662
  end
118
663
  end
119
664
 
120
665
  context '#absolute_path' do
121
- it 'expands and returns path' do
122
- expect(@aruba.absolute_path(@file_name)).to eq File.expand_path(@file_path)
666
+ context 'when file_name is array of path names' do
667
+ it { silence(:stderr) { expect(@aruba.absolute_path(['path', @file_name])).to eq File.expand_path(File.join(current_directory, 'path', @file_name)) } }
668
+ end
669
+ end
670
+
671
+ context '#expand_path' do
672
+ context 'when file_name is given' do
673
+ it { expect(@aruba.expand_path(@file_name)).to eq File.expand_path(@file_path) }
674
+ end
675
+
676
+ context 'when path contains "."' do
677
+ it { expect(@aruba.expand_path('.')).to eq File.expand_path(current_directory) }
678
+ end
679
+
680
+ context 'when path contains ".."' do
681
+ it { expect(@aruba.expand_path('path/..')).to eq File.expand_path(File.join(current_directory)) }
682
+ end
683
+
684
+ context 'when path is nil' do
685
+ it { expect { @aruba.expand_path(nil) }.to raise_error ArgumentError }
123
686
  end
124
687
 
125
- it 'removes "."' do
126
- expect(@aruba.absolute_path('.')).to eq File.expand_path(current_dir)
688
+ context 'when path is empty' do
689
+ it { expect { @aruba.expand_path('') }.to raise_error ArgumentError }
127
690
  end
128
691
 
129
- it 'removes ".."' do
130
- expect(@aruba.absolute_path('..')).to eq File.expand_path(File.join(current_dir, '..'))
692
+ context 'when dir_path is given similar to File.expand_path ' do
693
+ it { expect(@aruba.expand_path(@file_name, 'path')).to eq File.expand_path(File.join(current_directory, 'path', @file_name)) }
131
694
  end
132
695
 
133
- it 'joins multiple arguments' do
134
- expect(@aruba.absolute_path('path', @file_name)).to eq File.expand_path(File.join(current_dir, 'path', @file_name))
696
+ context 'when file_name contains fixtures "%" string' do
697
+ let(:klass) do
698
+ Class.new do
699
+ include Aruba::Api
700
+
701
+ def root_directory
702
+ File.expand_path(current_directory)
703
+ end
704
+ end
705
+ end
706
+
707
+ before :each do
708
+ @aruba = klass.new
709
+ @aruba.touch_file 'spec/fixtures/file1'
710
+ end
711
+
712
+ it { expect(@aruba.expand_path('%/file1')).to eq File.expand_path(File.join(current_directory, 'spec', 'fixtures', 'file1')) }
135
713
  end
136
714
  end
137
715
 
@@ -153,7 +731,7 @@ describe Aruba::Api do
153
731
  it "works with ~ in path name" do
154
732
  file_path = File.join('~', random_string)
155
733
 
156
- with_env 'HOME' => File.expand_path(current_dir) do
734
+ with_env 'HOME' => File.expand_path(current_directory) do
157
735
  @aruba.write_fixed_size_file(file_path, @file_size)
158
736
 
159
737
  expect(File.exist?(File.expand_path(file_path))).to eq true
@@ -176,7 +754,7 @@ describe Aruba::Api do
176
754
  it "works with ~ in path name" do
177
755
  file_path = File.join('~', random_string)
178
756
 
179
- with_env 'HOME' => File.expand_path(current_dir) do
757
+ with_env 'HOME' => File.expand_path(current_directory) do
180
758
  @aruba.write_fixed_size_file(file_path, @file_size)
181
759
  @aruba.check_file_size([[file_path, @file_size]])
182
760
  end
@@ -188,78 +766,100 @@ describe Aruba::Api do
188
766
  end
189
767
  end
190
768
 
191
- context '#filesystem_permissions' do
192
- before(:each) { File.open(@file_path, 'w') { |f| f << "" } }
193
-
194
- it "should change a file's mode" do
195
- @aruba.filesystem_permissions(0644, @file_name)
196
- result = sprintf( "%o" , File::Stat.new(@file_path).mode )[-4,4]
197
- expect(result).to eq('0644')
769
+ describe '#filesystem_permissions' do
770
+ def actuctual_permissions
771
+ format( "%o" , File::Stat.new(file_path).mode )[-4,4]
772
+ end
198
773
 
199
- @aruba.filesystem_permissions(0655, @file_name)
200
- result = sprintf( "%o" , File::Stat.new(@file_path).mode )[-4,4]
201
- expect(result).to eq('0655')
774
+ let(:file_name) { @file_name }
775
+ let(:file_path) { @file_path }
776
+ let(:permissions) { '0655' }
202
777
 
203
- @aruba.filesystem_permissions("0655", @file_name)
204
- result = sprintf( "%o" , File::Stat.new(@file_path).mode )[-4,4]
205
- expect(result).to eq('0655')
778
+ before(:each) do
779
+ File.open(file_path, 'w') { |f| f << "" }
206
780
  end
207
781
 
208
- it "supports a string representation of permission as well" do
209
- @aruba.filesystem_permissions(0666, @file_name)
210
- @aruba.check_filesystem_permissions('0666', @file_name, true)
782
+ before(:each) do
783
+ @aruba.filesystem_permissions(permissions, file_name)
211
784
  end
212
785
 
213
- it "should succeed if mode does not match but is expected to be different" do
214
- @aruba.filesystem_permissions(0666, @file_name)
215
- @aruba.check_filesystem_permissions(0755, @file_name, false)
786
+ context 'when file exists' do
787
+ context 'and permissions are given as string' do
788
+ it { expect(actuctual_permissions).to eq('0655') }
789
+ end
790
+
791
+ context 'and permissions are given as octal number' do
792
+ let(:permissions) { 0655 }
793
+ it { expect(actuctual_permissions).to eq('0655') }
794
+ end
795
+
796
+ context 'and path has ~ in it' do
797
+ let(:string) { random_string }
798
+ let(:file_name) { File.join('~', string) }
799
+ let(:file_path) { File.join(@aruba.current_directory, string) }
800
+
801
+ it { expect(actuctual_permissions).to eq('0655') }
802
+ end
216
803
  end
804
+ end
805
+
806
+ describe '#check_filesystem_permissions' do
807
+ let(:file_name) { @file_name }
808
+ let(:file_path) { @file_path }
217
809
 
218
- it "should fail if mode matches and is expected to be different" do
219
- @aruba.filesystem_permissions(0666, @file_name)
220
- expect {
221
- @aruba.check_filesystem_permissions(0666, @file_name, false)
222
- }.to raise_error
810
+ let(:permissions) { '0655' }
811
+
812
+ before :each do
813
+ set_env 'HOME', File.expand_path(@aruba.current_directory)
223
814
  end
224
815
 
225
- it "should fail if mode does not match but is expected to be equal" do
226
- @aruba.filesystem_permissions(0666, @file_name)
227
- expect {
228
- @aruba.check_filesystem_permissions(0755, @file_name, true)
229
- }.to raise_error
816
+ before(:each) do
817
+ File.open(file_path, 'w') { |f| f << "" }
230
818
  end
231
819
 
232
- it "should succeed if mode matches and is expected to be equal" do
233
- @aruba.filesystem_permissions(0666, @file_name)
234
- @aruba.check_filesystem_permissions(0666, @file_name, true)
820
+ before(:each) do
821
+ @aruba.filesystem_permissions(permissions, file_name)
235
822
  end
236
823
 
237
- it "works with ~ in path name" do
238
- file_name = "~/test_file"
824
+ context 'when file exists' do
825
+ context 'and should have permissions' do
826
+ context 'and permissions are given as string' do
827
+ it { @aruba.check_filesystem_permissions(permissions, file_name, true) }
828
+ end
829
+
830
+ context 'and permissions are given as octal number' do
831
+ let(:permissions) { 0666 }
832
+
833
+ it { @aruba.check_filesystem_permissions(permissions, file_name, true) }
834
+ end
239
835
 
240
- with_env 'HOME' => File.expand_path(current_dir) do
241
- File.open(File.expand_path(file_name), 'w') { |f| f << "" }
836
+ context 'and path includes ~' do
837
+ let(:string) { random_string }
838
+ let(:file_name) { File.join('~', string) }
839
+ let(:file_path) { File.join(@aruba.current_directory, string) }
242
840
 
243
- @aruba.filesystem_permissions(0666, file_name)
244
- expect(@aruba.check_filesystem_permissions(0666, file_name, true) ).to eq(true)
841
+ it { @aruba.check_filesystem_permissions(permissions, file_name, true) }
842
+ end
843
+
844
+ context 'but fails because the permissions are different' do
845
+ let(:expected_permissions) { 0666 }
846
+
847
+ it { expect { @aruba.check_filesystem_permissions(expected_permissions, file_name, true) }.to raise_error }
848
+ end
245
849
  end
246
- end
247
- end
248
- context '#remove_file' do
249
- before(:each) { File.open(@file_path, 'w') { |f| f << "" } }
250
850
 
251
- it "should delete file" do
252
- @aruba.remove_file(@file_name)
253
- expect(File.exist?(@file_path)).to eq false
254
- end
851
+ context 'and should not have permissions' do
852
+ context 'and succeeds when the difference is expected and permissions are different' do
853
+ let(:different_permissions) { 0666 }
255
854
 
256
- it "works with ~ in path name" do
257
- file_path = File.join('~', random_string)
855
+ it { @aruba.check_filesystem_permissions(different_permissions, file_name, false) }
856
+ end
258
857
 
259
- with_env 'HOME' => File.expand_path(current_dir) do
260
- File.open(File.expand_path(file_path), 'w') { |f| f << "" }
261
- @aruba.remove_file(file_path)
262
- expect(File.exist?(file_path)).to eq false
858
+ context 'and fails because the permissions are the same although they should be different' do
859
+ let(:different_permissions) { 0655 }
860
+
861
+ it { expect { @aruba.check_filesystem_permissions(different_permissions, file_name, false) }.to raise_error }
862
+ end
263
863
  end
264
864
  end
265
865
  end
@@ -269,7 +869,7 @@ describe Aruba::Api do
269
869
 
270
870
  it "should check existence using plain match" do
271
871
  file_name = 'nested/dir/hello_world.txt'
272
- file_path = File.join(@aruba.current_dir, file_name)
872
+ file_path = File.join(@aruba.current_directory, file_name)
273
873
 
274
874
  FileUtils.mkdir_p File.dirname( file_path )
275
875
  File.open(file_path, 'w') { |f| f << "" }
@@ -282,7 +882,7 @@ describe Aruba::Api do
282
882
 
283
883
  it "should check existence using regex" do
284
884
  file_name = 'nested/dir/hello_world.txt'
285
- file_path = File.join(@aruba.current_dir, file_name)
885
+ file_path = File.join(@aruba.current_directory, file_name)
286
886
 
287
887
  FileUtils.mkdir_p File.dirname( file_path )
288
888
  File.open(file_path, 'w') { |f| f << "" }
@@ -295,7 +895,7 @@ describe Aruba::Api do
295
895
 
296
896
  it "is no problem to mix both" do
297
897
  file_name = 'nested/dir/hello_world.txt'
298
- file_path = File.join(@aruba.current_dir, file_name)
898
+ file_path = File.join(@aruba.current_directory, file_name)
299
899
 
300
900
  FileUtils.mkdir_p File.dirname( file_path )
301
901
  File.open(file_path, 'w') { |f| f << "" }
@@ -307,7 +907,7 @@ describe Aruba::Api do
307
907
  it "works with ~ in path name" do
308
908
  file_path = File.join('~', random_string)
309
909
 
310
- with_env 'HOME' => File.expand_path(current_dir) do
910
+ with_env 'HOME' => File.expand_path(current_directory) do
311
911
  FileUtils.mkdir_p File.dirname(File.expand_path(file_path))
312
912
  File.open(File.expand_path(file_path), 'w') { |f| f << "" }
313
913
 
@@ -321,20 +921,38 @@ describe Aruba::Api do
321
921
  @aruba.write_file(@file_name, "foo bar baz")
322
922
  end
323
923
 
324
- context "#check_binary_file_content" do
325
- it "succeeds if file content matches" do
326
- @aruba.write_file("fixture", "foo bar baz")
327
- @aruba.check_binary_file_content(@file_name, "fixture")
328
- @aruba.check_binary_file_content(@file_name, "fixture", true)
924
+ describe "#check_binary_file_content" do
925
+ let(:file_name) { @file_name }
926
+ let(:file_path) { @file_path }
927
+
928
+ let(:reference_file) { 'fixture' }
929
+ let(:reference_file_content) { 'foo bar baz' }
930
+
931
+ before :each do
932
+ @aruba.write_file(reference_file, reference_file_content)
329
933
  end
330
934
 
331
- it "succeeds if file content does not match" do
332
- @aruba.write_file("wrong_fixture", "bar")
333
- @aruba.check_binary_file_content(@file_name, "wrong_fixture", false)
935
+ context 'when files are the same' do
936
+ context 'and this is expected' do
937
+ it { @aruba.check_binary_file_content(file_name, reference_file) }
938
+ it { @aruba.check_binary_file_content(file_name, reference_file, true) }
939
+ end
940
+
941
+ context 'and this is not expected' do
942
+ it { expect { @aruba.check_binary_file_content(file_name, reference_file, false) }.to raise_error }
943
+ end
334
944
  end
335
945
 
336
- it "raises if file does not exist" do
337
- expect{@aruba.check_binary_file_content(@file_name, "non_existing", false)}.to raise_error
946
+ context 'when files are not the same' do
947
+ let(:reference_file_content) { 'bar' }
948
+
949
+ context 'and this is expected' do
950
+ it { @aruba.check_binary_file_content(file_name, reference_file, false) }
951
+ end
952
+
953
+ context 'and this is not expected' do
954
+ it { expect { @aruba.check_binary_file_content(file_name, reference_file, true) }.to raise_error }
955
+ end
338
956
  end
339
957
  end
340
958
 
@@ -354,7 +972,7 @@ describe Aruba::Api do
354
972
  it "works with ~ in path name" do
355
973
  file_path = File.join('~', random_string)
356
974
 
357
- with_env 'HOME' => File.expand_path(current_dir) do
975
+ with_env 'HOME' => File.expand_path(current_directory) do
358
976
  @aruba.write_file(file_path, "foo bar baz")
359
977
  @aruba.check_file_content(file_path, non_matching_content, false)
360
978
  end
@@ -375,7 +993,7 @@ describe Aruba::Api do
375
993
  it "works with ~ in path name" do
376
994
  file_path = File.join('~', random_string)
377
995
 
378
- with_env 'HOME' => File.expand_path(current_dir) do
996
+ with_env 'HOME' => File.expand_path(current_directory) do
379
997
  @aruba.write_file(file_path, "foo bar baz")
380
998
  @aruba.check_file_content(file_path, non_matching_content, false)
381
999
  end
@@ -398,7 +1016,7 @@ describe Aruba::Api do
398
1016
  it "works with ~ in path name" do
399
1017
  file_path = File.join('~', random_string)
400
1018
 
401
- with_env 'HOME' => File.expand_path(current_dir) do
1019
+ with_env 'HOME' => File.expand_path(current_directory) do
402
1020
  @aruba.write_file(file_path, "foo bar baz")
403
1021
 
404
1022
  @aruba.with_file_content file_path do |full_content|
@@ -448,20 +1066,28 @@ describe Aruba::Api do
448
1066
  describe '@announce_stdout' do
449
1067
  after(:each){@aruba.stop_processes!}
450
1068
  context 'enabled' do
1069
+ before :each do
1070
+ @aruba.send(:announcer).activate(:stdout)
1071
+ end
1072
+
451
1073
  it "should announce to stdout exactly once" do
452
- expect(@aruba).to receive(:announce_or_puts).once
453
- @aruba.set_tag(:announce_stdout, true)
454
- @aruba.run_simple('echo "hello world"', false)
455
- expect(@aruba.all_output).to match(/hello world/)
1074
+ result = capture(:stdout) do
1075
+ @aruba.run_simple('echo "hello world"', false)
1076
+ end
1077
+
1078
+ expect(result).to include('hello world')
1079
+ expect(@aruba.all_output).to include('hello world')
456
1080
  end
457
1081
  end
458
1082
 
459
1083
  context 'disabled' do
460
1084
  it "should not announce to stdout" do
461
- expect(@aruba).not_to receive(:announce_or_puts)
462
- @aruba.set_tag(:announce_stdout, false)
463
- @aruba.run_simple('echo "hello world"', false)
464
- expect(@aruba.all_output).to match(/hello world/)
1085
+ result = capture(:stdout) do
1086
+ @aruba.run_simple('echo "hello world"', false)
1087
+ end
1088
+
1089
+ expect(result).not_to include('hello world')
1090
+ expect(@aruba.all_output).to include('hello world')
465
1091
  end
466
1092
  end
467
1093
  end
@@ -520,6 +1146,46 @@ describe Aruba::Api do
520
1146
  end
521
1147
  end
522
1148
 
1149
+ describe 'fixtures' do
1150
+ let(:aruba) do
1151
+ klass = Class.new do
1152
+ include Aruba::Api
1153
+
1154
+ def root_directory
1155
+ expand_path('.')
1156
+ end
1157
+ end
1158
+
1159
+ klass.new
1160
+ end
1161
+
1162
+ describe '#fixtures_directory' do
1163
+ context 'when no fixtures directories exist' do
1164
+ it "should raise exception" do
1165
+ expect { aruba.fixtures_directory }.to raise_error
1166
+ end
1167
+ end
1168
+
1169
+ context 'when "/features/fixtures"-directory exist' do
1170
+ before(:each) { aruba.create_directory('features/fixtures') }
1171
+
1172
+ it { expect(aruba.fixtures_directory).to eq expand_path('features/fixtures') }
1173
+ end
1174
+
1175
+ context 'when "/spec/fixtures"-directory exist' do
1176
+ before(:each) { aruba.create_directory('spec/fixtures') }
1177
+
1178
+ it { expect(aruba.fixtures_directory).to eq expand_path('spec/fixtures') }
1179
+ end
1180
+
1181
+ context 'when "/test/fixtures"-directory exist' do
1182
+ before(:each) { aruba.create_directory('test/fixtures') }
1183
+
1184
+ it { expect(aruba.fixtures_directory).to eq expand_path('test/fixtures') }
1185
+ end
1186
+ end
1187
+ end
1188
+
523
1189
  describe "#set_env" do
524
1190
  after(:each) do
525
1191
  @aruba.stop_processes!