rspec-bash 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -0
  4. data/README.md +23 -0
  5. data/Rakefile +15 -4
  6. data/bin/bash_stub.sh +92 -0
  7. data/bin/bash_wrapper.sh.erb +12 -0
  8. data/bin/ruby_stub.rb +33 -0
  9. data/lib/rspec/bash.rb +5 -4
  10. data/lib/rspec/bash/command.rb +5 -0
  11. data/lib/rspec/bash/command/call_configuration.rb +76 -0
  12. data/lib/rspec/bash/command/call_configuration_manager.rb +24 -0
  13. data/lib/rspec/bash/command/call_log.rb +48 -0
  14. data/lib/rspec/bash/command/call_log_manager.rb +38 -0
  15. data/lib/rspec/bash/command/stubbed_command.rb +64 -0
  16. data/lib/rspec/bash/server.rb +3 -0
  17. data/lib/rspec/bash/server/bash_stub_marshaller.rb +19 -0
  18. data/lib/rspec/bash/server/ruby_stub_marshaller.rb +13 -0
  19. data/lib/rspec/bash/server/stub_server.rb +47 -0
  20. data/lib/rspec/bash/stubbed_env.rb +75 -54
  21. data/lib/rspec/bash/util/call_conf_argument_list_matcher.rb +5 -5
  22. data/lib/rspec/bash/util/call_log_argument_list_matcher.rb +1 -1
  23. data/lib/rspec/bash/wrapper.rb +4 -0
  24. data/lib/rspec/bash/wrapper/bash_stub_script.rb +15 -0
  25. data/lib/rspec/bash/wrapper/bash_wrapper.rb +54 -0
  26. data/lib/rspec/bash/wrapper/ruby_stub_script.rb +15 -0
  27. data/lib/rspec/bash/wrapper/stub_function.rb +36 -0
  28. data/rspec-bash.gemspec +2 -1
  29. data/spec/classes/command/call_configuration_manager_spec.rb +68 -0
  30. data/spec/classes/{call_configuration_spec.rb → command/call_configuration_spec.rb} +51 -114
  31. data/spec/classes/command/call_log_manager_spec.rb +83 -0
  32. data/spec/classes/{call_log_spec.rb → command/call_log_spec.rb} +23 -82
  33. data/spec/classes/command/stubbed_command_spec.rb +118 -0
  34. data/spec/classes/server/bash_stub_marshaller_spec.rb +38 -0
  35. data/spec/classes/server/ruby_stub_marshaller_spec.rb +31 -0
  36. data/spec/classes/server/stub_server_spec.rb +121 -0
  37. data/spec/classes/stubbed_env_spec.rb +141 -280
  38. data/spec/classes/util/call_conf_argument_list_matcher_spec.rb +17 -17
  39. data/spec/classes/util/call_log_argument_list_matcher_spec.rb +24 -18
  40. data/spec/classes/wrapper/bash_wrapper_spec.rb +37 -0
  41. data/spec/classes/wrapper/ruby_stub_script_spec.rb +204 -0
  42. data/spec/helper/string_file_io.rb +1 -1
  43. data/spec/integration/call_log/called_with_args_spec.rb +8 -4
  44. data/spec/integration/call_log/called_with_no_args_spec.rb +1 -1
  45. data/spec/integration/call_log/stdin_spec.rb +10 -4
  46. data/spec/integration/edge_cases_spec.rb +34 -0
  47. data/spec/integration/matchers/be_called_with_arguments_spec.rb +12 -13
  48. data/spec/integration/matchers/be_called_with_no_arguments_spec.rb +6 -7
  49. data/spec/integration/stubbed_command/outputs_spec.rb +111 -91
  50. data/spec/integration/stubbed_command/returns_exitstatus_spec.rb +46 -37
  51. data/spec/integration/stubbed_env/execute_with_env_vars_spec.rb +3 -4
  52. data/spec/integration/stubbed_env/execute_with_path_spec.rb +6 -7
  53. data/spec/integration/stubbed_env/execute_with_stub_wrapper_spec.rb +4 -12
  54. data/spec/integration/stubbed_env/override_spec.rb +354 -0
  55. data/spec/integration/wrapper/bash_stub_script_spec.rb +383 -0
  56. data/spec/integration/wrapper/bash_wrapper_spec.rb +48 -0
  57. data/spec/scripts/function_library.sh +9 -1
  58. data/spec/spec_helper.rb +2 -0
  59. metadata +65 -21
  60. data/bin/function_override.sh.erb +0 -7
  61. data/bin/function_override_wrapper.sh.erb +0 -19
  62. data/bin/stub.rb.erb +0 -56
  63. data/lib/rspec/bash/call_configuration.rb +0 -62
  64. data/lib/rspec/bash/call_log.rb +0 -71
  65. data/lib/rspec/bash/stubbed_command.rb +0 -88
  66. data/spec/classes/stub_spec.rb +0 -510
  67. data/spec/classes/stubbed_command_spec.rb +0 -134
  68. data/spec/integration/assert_called_spec.rb +0 -0
@@ -1,98 +1,107 @@
1
1
  require 'spec_helper'
2
+ include Rspec::Bash
3
+
4
+ def execute_script(script)
5
+ let!(:execute_results) do
6
+ stdout, stderr, status = stubbed_env.execute_inline(
7
+ script
8
+ )
9
+ [stdout, stderr, status]
10
+ end
11
+ let(:stdout) { execute_results[0] }
12
+ let(:stderr) { execute_results[1] }
13
+ let(:exitcode) { execute_results[2].exitstatus }
14
+ end
2
15
 
3
16
  describe 'StubbedCommand' do
4
- include Rspec::Bash
5
17
  let(:stubbed_env) { create_stubbed_env }
6
- let!(:command1_stub) { stubbed_env.stub_command('command1') }
18
+ let!(:command) { stubbed_env.stub_command('stubbed_command') }
7
19
 
8
20
  context '#returns_exitstatus' do
9
21
  context 'when given no exit status to return' do
10
- let(:status) do
11
- _, _, status = stubbed_env.execute_inline('command1 first_argument second_argument')
12
- status.exitstatus
13
- end
22
+ execute_script('stubbed_command first_argument second_argument')
14
23
 
15
24
  it 'exits with the appropriate exit code' do
16
- expect(status).to be 0
25
+ expect(exitcode).to be 0
17
26
  end
18
27
  end
19
28
 
20
29
  context 'when given no args to match' do
21
- let(:status) do
22
- command1_stub
30
+ before do
31
+ command
23
32
  .returns_exitstatus(100)
24
- _, _, status = stubbed_env.execute_inline('command1 first_argument second_argument')
25
- status.exitstatus
26
33
  end
27
34
 
35
+ execute_script('stubbed_command first_argument second_argument')
36
+
28
37
  it 'exits with the appropriate exit code' do
29
- expect(status).to be 100
38
+ expect(exitcode).to be 100
30
39
  end
31
40
  end
32
41
 
33
42
  context 'when given an exact argument match' do
34
- let(:status) do
35
- command1_stub
43
+ before do
44
+ command
36
45
  .with_args('first_argument', 'second_argument')
37
46
  .returns_exitstatus(101)
38
- _, _, status = stubbed_env.execute_inline('command1 first_argument second_argument')
39
- status.exitstatus
40
47
  end
41
48
 
49
+ execute_script('stubbed_command first_argument second_argument')
50
+
42
51
  it 'exits with the appropriate exit code' do
43
- expect(status).to be 101
52
+ expect(exitcode).to be 101
44
53
  end
45
54
  end
46
55
  context 'when given an anything argument match' do
47
- let(:status) do
48
- command1_stub
56
+ before do
57
+ command
49
58
  .with_args('first_argument', anything)
50
59
  .returns_exitstatus(102)
51
- _, _, status = stubbed_env.execute_inline('command1 first_argument second_argument')
52
- status.exitstatus
53
60
  end
54
61
 
62
+ execute_script('stubbed_command first_argument second_argument')
63
+
55
64
  it 'exits with the appropriate exit code' do
56
- expect(status).to be 102
65
+ expect(exitcode).to be 102
57
66
  end
58
67
  end
59
68
  context 'when given any_args argument match' do
60
- let(:status) do
61
- command1_stub
69
+ before do
70
+ command
62
71
  .with_args(any_args)
63
72
  .returns_exitstatus(103)
64
- _, _, status = stubbed_env.execute_inline('command1 poglet piglet')
65
- status.exitstatus
66
73
  end
67
74
 
75
+ execute_script('stubbed_command poglet piglet')
76
+
68
77
  it 'exits with the appropriate exit code' do
69
- expect(status).to be 103
78
+ expect(exitcode).to be 103
70
79
  end
71
80
  end
72
81
  context 'when given other types of RSpec::Mock::ArgumentMatcher argument match' do
73
- let(:status) do
74
- command1_stub
82
+ before do
83
+ command
75
84
  .with_args(instance_of(String), instance_of(String))
76
85
  .returns_exitstatus(104)
77
- _, _, status = stubbed_env.execute_inline('command1 poglet 1')
78
- status.exitstatus
79
86
  end
80
87
 
88
+ execute_script('stubbed_command poglet 1')
89
+
81
90
  it 'exits with the appropriate exit code' do
82
- expect(status).to be 104
91
+ expect(exitcode).to be 104
83
92
  end
84
93
  end
85
94
  context 'when given regex argument match' do
86
- let(:status) do
87
- command1_stub
95
+ before do
96
+ command
88
97
  .with_args(/p.glet/, /p.glet/)
89
98
  .returns_exitstatus(105)
90
- _, _, status = stubbed_env.execute_inline('command1 poglet piglet')
91
- status.exitstatus
92
99
  end
93
100
 
101
+ execute_script('stubbed_command poglet piglet')
102
+
94
103
  it 'exits with the appropriate exit code' do
95
- expect(status).to be 105
104
+ expect(exitcode).to be 105
96
105
  end
97
106
  end
98
107
  end
@@ -1,13 +1,12 @@
1
1
  require 'spec_helper'
2
+ include Rspec::Bash
2
3
 
3
4
  describe 'StubbedEnv' do
4
- include Rspec::Bash
5
+ subject { create_stubbed_env }
5
6
 
6
7
  context '#execute(..., ENV => VARIABLES)' do
7
- let(:stubbed_env) { create_stubbed_env }
8
-
9
8
  it 'exits with an error' do
10
- stdout, = stubbed_env.execute_inline(
9
+ stdout, = subject.execute_inline(
11
10
  'echo $SOME_ENV_VAR',
12
11
  'SOME_ENV_VAR' => 'SekretCredential'
13
12
  )
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
+ include Rspec::Bash
2
3
 
3
4
  describe 'StubbedEnv' do
4
- include Rspec::Bash
5
+ subject { create_stubbed_env }
5
6
 
6
7
  context '#execute(path, ...)' do
7
8
  describe 'running a file with non-existing commands' do
@@ -11,21 +12,19 @@ describe 'StubbedEnv' do
11
12
  end
12
13
 
13
14
  context 'with stubbed environment' do
14
- let(:stubbed_env) { create_stubbed_env }
15
-
16
15
  it 'exits with an error' do
17
- stubbed_env.execute_inline 'command1 "foo bar" 2>&1'
16
+ subject.execute_inline 'command1 "foo bar" 2>&1'
18
17
  expect($CHILD_STATUS.exitstatus).not_to eq 0
19
18
  end
20
19
 
21
20
  context 'with a stubbed command' do
22
21
  before do
23
- stubbed_env.stub_command('command1')
22
+ subject.stub_command('command1')
24
23
  end
25
24
 
26
25
  it 'exits with status code 0' do
27
- _, _, status = stubbed_env.execute_inline 'command1 "foo bar" 2>&1'
28
- expect(status.exitstatus).to eq 0
26
+ _, _, exitcode = subject.execute_inline 'command1 "foo bar" 2>&1'
27
+ expect(exitcode.exitstatus).to eq 0
29
28
  end
30
29
  end
31
30
  end
@@ -1,23 +1,15 @@
1
- require 'English'
2
1
  require 'rspec/bash'
2
+ include Rspec::Bash
3
3
 
4
4
  describe 'StubbedEnv' do
5
- include Rspec::Bash
6
- let(:stubbed_env) { create_stubbed_env }
7
- let!(:grep_mock) { stubbed_env.stub_command('grep') }
8
- let!(:ls_mock) { stubbed_env.stub_command('ls') }
5
+ subject { create_stubbed_env }
6
+ let!(:grep_mock) { subject.stub_command('grep') }
9
7
 
10
8
  context '#execute(<commands that are in stub wrapper>, ...)' do
11
9
  it 'does not call the grep command' do
12
- stubbed_env.execute_inline('exit 0')
10
+ subject.execute_inline('exit 0')
13
11
 
14
12
  expect(grep_mock).to_not be_called
15
13
  end
16
-
17
- it 'does not call the ls command' do
18
- stubbed_env.execute_inline('exit 0')
19
-
20
- expect(ls_mock).to_not be_called
21
- end
22
14
  end
23
15
  end
@@ -0,0 +1,354 @@
1
+ require 'spec_helper'
2
+ include Rspec::Bash
3
+
4
+ def execute_script(script)
5
+ let!(:execute_results) do
6
+ stdout, stderr, status = stubbed_env.execute_inline(
7
+ script
8
+ )
9
+ [stdout, stderr, status]
10
+ end
11
+ let(:stdout) { execute_results[0] }
12
+ let(:stderr) { execute_results[1] }
13
+ let(:exitcode) { execute_results[2].exitstatus }
14
+ end
15
+
16
+ def execute_function(script, function)
17
+ let!(:execute_results) do
18
+ stdout, stderr, status = stubbed_env.execute_function(
19
+ script,
20
+ function
21
+ )
22
+ [stdout, stderr, status]
23
+ end
24
+ let(:stdout) { execute_results[0] }
25
+ let(:stderr) { execute_results[1] }
26
+ let(:exitcode) { execute_results[2].exitstatus }
27
+ end
28
+
29
+ describe('StubbedEnv override tests') do
30
+ subject { create_stubbed_env }
31
+ let(:stubbed_env) { subject }
32
+
33
+ let!(:command) do
34
+ command = subject.stub_command('overridden_command')
35
+ command.outputs('i was overridden')
36
+ command.outputs('standard error output', to: :stderr)
37
+ command
38
+ end
39
+ let!(:function) do
40
+ function = subject.stub_command('overridden_function')
41
+ function.outputs('i was overridden')
42
+ function.outputs('standard error output', to: :stderr)
43
+ function
44
+ end
45
+
46
+ context '#execute_inline' do
47
+ context 'with a stubbed function' do
48
+ context 'and no arguments' do
49
+ execute_script(
50
+ <<-multiline_script
51
+ #!/usr/bin/env bash
52
+ function overridden_function {
53
+ echo 'i was not overridden'
54
+ }
55
+ overridden_function
56
+
57
+ echo 'standard error output' 1>&2
58
+ multiline_script
59
+ )
60
+
61
+ it 'calls the stubbed function' do
62
+ expect(function).to be_called
63
+ end
64
+
65
+ it 'prints the overridden output' do
66
+ expect(stdout).to eql('i was overridden')
67
+ end
68
+
69
+ it 'prints provided stderr output to standard error' do
70
+ expect(stderr.chomp).to eql('standard error outputstandard error output')
71
+ end
72
+ end
73
+
74
+ context 'and simple arguments' do
75
+ execute_script(
76
+ <<-multiline_script
77
+ #!/usr/bin/env bash
78
+ function overridden_function {
79
+ echo 'i was not overridden'
80
+ }
81
+ overridden_function argument_one argument_two
82
+
83
+ echo 'standard error output' 1>&2
84
+ multiline_script
85
+ )
86
+
87
+ it 'calls the stubbed function' do
88
+ expect(function).to be_called_with_arguments('argument_one', 'argument_two')
89
+ end
90
+
91
+ it 'prints the overridden output' do
92
+ expect(stdout).to eql('i was overridden')
93
+ end
94
+ end
95
+
96
+ context 'and complex arguments (spaces, etc.)' do
97
+ execute_script(
98
+ <<-multiline_script
99
+ #!/usr/bin/env bash
100
+ function overridden_function {
101
+ echo 'i was not overridden'
102
+ }
103
+ overridden_function "argument one" "argument two"
104
+
105
+ echo 'standard error output' 1>&2
106
+ multiline_script
107
+ )
108
+
109
+ it 'calls the stubbed function' do
110
+ expect(function).to be_called_with_arguments('argument one', 'argument two')
111
+ end
112
+
113
+ it 'prints the overridden output' do
114
+ expect(stdout).to eql('i was overridden')
115
+ end
116
+ end
117
+ end
118
+ context 'with a stubbed command' do
119
+ context 'and no arguments' do
120
+ execute_script(
121
+ <<-multiline_script
122
+ #!/usr/bin/env bash
123
+ overridden_command
124
+ multiline_script
125
+ )
126
+
127
+ it 'calls the stubbed command' do
128
+ expect(command).to be_called
129
+ end
130
+
131
+ it 'prints the overridden output' do
132
+ expect(stdout).to eql('i was overridden')
133
+ end
134
+ end
135
+
136
+ context 'and simple arguments' do
137
+ execute_script(
138
+ <<-multiline_script
139
+ #!/usr/bin/env bash
140
+ overridden_command argument_one argument_two
141
+ multiline_script
142
+ )
143
+
144
+ it 'calls the stubbed command' do
145
+ expect(command).to be_called_with_arguments('argument_one', 'argument_two')
146
+ end
147
+
148
+ it 'prints the overridden output' do
149
+ expect(stdout).to eql('i was overridden')
150
+ end
151
+ end
152
+
153
+ context 'and complex arguments (spaces, etc.)' do
154
+ execute_script(
155
+ <<-multiline_script
156
+ #!/usr/bin/env bash
157
+ overridden_command "argument one" "argument two"
158
+ multiline_script
159
+ )
160
+
161
+ it 'calls the stubbed command' do
162
+ expect(command).to be_called_with_arguments('argument one', 'argument two')
163
+ end
164
+
165
+ it 'prints the overridden output' do
166
+ expect(stdout).to eql('i was overridden')
167
+ end
168
+ end
169
+
170
+ context 'and a path' do
171
+ context 'relative path' do
172
+ let!(:path_command) do
173
+ path_command = subject.stub_command('relative/path/to/overridden_path_command')
174
+ path_command.outputs('i was overridden in a path')
175
+ end
176
+
177
+ execute_script(
178
+ 'relative/path/to/overridden_path_command'
179
+ )
180
+
181
+ it 'calls the relative path stubbed command' do
182
+ expect(path_command).to be_called
183
+ end
184
+
185
+ it 'prints the relative path overridden output' do
186
+ expect(stdout).to eql('i was overridden in a path')
187
+ end
188
+ end
189
+ context 'absolute path' do
190
+ let!(:path_command) do
191
+ path_command = subject.stub_command('/absolute/path/to/overridden_path_command')
192
+ path_command.outputs('i was overridden in a path')
193
+ end
194
+
195
+ execute_script(
196
+ '/absolute/path/to/overridden_path_command'
197
+ )
198
+
199
+ it 'calls the stubbed command' do
200
+ expect(path_command).to be_called
201
+ end
202
+
203
+ it 'prints the overridden output' do
204
+ expect(stdout).to eql('i was overridden in a path')
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ context '#execute_function' do
212
+ context 'with a stubbed function' do
213
+ context 'and no arguments' do
214
+ execute_function(
215
+ './spec/scripts/function_library.sh',
216
+ 'overridden_function'
217
+ )
218
+
219
+ it 'calls the stubbed function' do
220
+ expect(function).to be_called
221
+ end
222
+
223
+ it 'prints the overridden output' do
224
+ expect(stdout).to eql('i was overridden')
225
+ end
226
+
227
+ it 'prints provided stderr output to standard error' do
228
+ expect(stderr).to eql("standard error output\n")
229
+ end
230
+ end
231
+
232
+ context 'and simple arguments' do
233
+ execute_function(
234
+ './spec/scripts/function_library.sh',
235
+ 'overridden_function argument_one argument_two'
236
+ )
237
+
238
+ it 'calls the stubbed function' do
239
+ expect(function).to be_called_with_arguments('argument_one', 'argument_two')
240
+ end
241
+
242
+ it 'prints the overridden output' do
243
+ expect(stdout).to eql('i was overridden')
244
+ end
245
+ end
246
+
247
+ context 'and complex arguments (spaces, etc.)' do
248
+ execute_function(
249
+ './spec/scripts/function_library.sh',
250
+ 'overridden_function "argument one" "argument two"'
251
+ )
252
+
253
+ it 'calls the stubbed function' do
254
+ expect(function).to be_called_with_arguments('argument one', 'argument two')
255
+ end
256
+
257
+ it 'prints the overridden output' do
258
+ expect(stdout).to eql('i was overridden')
259
+ end
260
+ end
261
+
262
+ context 'and a path' do
263
+ context 'relative path' do
264
+ let!(:path_function) do
265
+ path_function = subject.stub_command('relative/path/to/overridden_path_functions')
266
+ path_function.outputs('i was overridden in a path')
267
+ end
268
+
269
+ execute_function(
270
+ './spec/scripts/function_library.sh',
271
+ 'relative/path/to/overridden_path_functions'
272
+ )
273
+
274
+ it 'calls the relative path stubbed function' do
275
+ expect(path_function).to be_called
276
+ end
277
+
278
+ it 'prints the relative path overridden output' do
279
+ expect(stdout).to eql('i was overridden in a path')
280
+ end
281
+ end
282
+ context 'absolute path' do
283
+ let!(:path_function) do
284
+ path_function = subject.stub_command('/absolute/path/to/overridden_path_functions')
285
+ path_function.outputs('i was overridden in a path')
286
+ end
287
+
288
+ execute_function(
289
+ './spec/scripts/function_library.sh',
290
+ '/absolute/path/to/overridden_path_functions'
291
+ )
292
+
293
+ it 'calls the stubbed function' do
294
+ expect(path_function).to be_called
295
+ end
296
+
297
+ it 'prints the overridden output' do
298
+ expect(stdout).to eql('i was overridden in a path')
299
+ end
300
+ end
301
+ end
302
+ end
303
+ context 'with a stubbed command' do
304
+ context 'and no arguments' do
305
+ execute_function(
306
+ './spec/scripts/function_library.sh',
307
+ 'overridden_command_function'
308
+ )
309
+
310
+ it 'calls the stubbed command' do
311
+ expect(command).to be_called
312
+ end
313
+
314
+ it 'prints the overridden output' do
315
+ expect(stdout).to eql('i was overridden')
316
+ end
317
+
318
+ it 'prints provided stderr output to standard error' do
319
+ expect(stderr.chomp).to eql('standard error outputstandard error output')
320
+ end
321
+ end
322
+
323
+ context 'and simple arguments' do
324
+ execute_function(
325
+ './spec/scripts/function_library.sh',
326
+ 'overridden_command_function argument_one argument_two'
327
+ )
328
+
329
+ it 'calls the stubbed command' do
330
+ expect(command).to be_called_with_arguments('argument_one', 'argument_two')
331
+ end
332
+
333
+ it 'prints the overridden output' do
334
+ expect(stdout).to eql('i was overridden')
335
+ end
336
+ end
337
+
338
+ context 'and complex arguments (spaces, etc.)' do
339
+ execute_function(
340
+ './spec/scripts/function_library.sh',
341
+ 'overridden_command_function "argument one" "argument two"'
342
+ )
343
+
344
+ it 'calls the stubbed command' do
345
+ expect(command).to be_called_with_arguments('argument one', 'argument two')
346
+ end
347
+
348
+ it 'prints the overridden output' do
349
+ expect(stdout).to eql('i was overridden')
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end