capistrano-spec 0.2.2 → 0.3.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.
data/Gemfile CHANGED
@@ -5,4 +5,5 @@ group :test do
5
5
  gem 'rspec'
6
6
  gem 'rake'
7
7
  gem 'jeweler'
8
+ gem 'capistrano'
8
9
  end
data/Gemfile.lock CHANGED
@@ -1,14 +1,28 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
+ capistrano (2.14.2)
5
+ highline
6
+ net-scp (>= 1.0.0)
7
+ net-sftp (>= 2.0.0)
8
+ net-ssh (>= 2.0.14)
9
+ net-ssh-gateway (>= 1.1.0)
4
10
  diff-lcs (1.1.3)
5
11
  git (1.2.5)
12
+ highline (1.6.16)
6
13
  jeweler (1.8.3)
7
14
  bundler (~> 1.0)
8
15
  git (>= 1.2.5)
9
16
  rake
10
17
  rdoc
11
18
  json (1.6.6)
19
+ net-scp (1.1.0)
20
+ net-ssh (>= 2.6.5)
21
+ net-sftp (2.1.1)
22
+ net-ssh (>= 2.6.5)
23
+ net-ssh (2.6.6)
24
+ net-ssh-gateway (1.2.0)
25
+ net-ssh (>= 2.6.5)
12
26
  rake (0.9.2.2)
13
27
  rdoc (3.12)
14
28
  json (~> 1.4)
@@ -25,6 +39,7 @@ PLATFORMS
25
39
  ruby
26
40
 
27
41
  DEPENDENCIES
42
+ capistrano
28
43
  jeweler
29
44
  rake
30
45
  rspec
data/README.rdoc CHANGED
@@ -73,7 +73,7 @@ Alright, we can start testing by making Capistrano::Configuration and load Capis
73
73
  @configuration = Capistrano::Configuration.new
74
74
  Capistrano::Speak.load_into(@configuration)
75
75
  end
76
-
76
+
77
77
  end
78
78
 
79
79
 
@@ -84,7 +84,7 @@ Now, remember, if you +set+ values, you can access them using +fetch+:
84
84
  before do
85
85
  @configuration.set :foo, 'bar'
86
86
  end
87
-
87
+
88
88
  it "should define foo" do
89
89
  @configuration.fetch(:foo).should == 'bar'
90
90
  end
@@ -96,7 +96,7 @@ You can also find and execute tasks, so you can verify if you successfully set a
96
96
  before do
97
97
  @configuration.find_and_execute_task('speak')
98
98
  end
99
-
99
+
100
100
  it "should define message" do
101
101
  @configuration.fetch(:message).should == 'oh hai'
102
102
  end
@@ -147,6 +147,37 @@ You also test [callbacks](http://rubydoc.info/github/capistrano/capistrano/maste
147
147
  @configuration.should callback('foo:bar').before('deploy:finalize_update')
148
148
  end
149
149
 
150
+ You can also stub requests if you need to access their output:
151
+
152
+ task :pwd do
153
+ set :pwd, capture('pwd')
154
+ end
155
+
156
+ it 'should capture working directory' do
157
+ @configuration.stub_command 'pwd', data: '/path/to/working/dir'
158
+ @configuration.fetch(:pwd).should == '/path/to/working/dir'
159
+ end
160
+
161
+ Additional options are +channel+ and +stream+ for testing custom +run+ blocks:
162
+
163
+ task :custom do
164
+ invoke_command 'pwd', :via => :sudo do |ch, stream, data|
165
+ # magical foo
166
+ end
167
+ end
168
+
169
+ As +sudo+ and +invoke_command+ use +run+ internal and +capture+ uses
170
+ +invoke_command+ they are also stub-able by specifying the exact command.
171
+
172
+ task :sudo_pwd do
173
+ set :pwd, capture('pwd', :via => :sudo)
174
+ end
175
+
176
+ it 'should capture sudo working directory' do
177
+ @configuration.stub_command 'sudo -p 'sudo password: ' pwd', data: '/sudo/dir'
178
+ @configuration.fetch(:pwd).should == '/sudo/dir'
179
+ end
180
+
150
181
  == Real world examples
151
182
 
152
183
  * [capistrano-mountaintop](https://github.com/technicalpickles/capistrano-mountaintop/blob/master/spec/capistrano-mountaintop_spec.rb)
data/Rakefile CHANGED
@@ -5,13 +5,13 @@ begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "capistrano-spec"
8
- gem.version = '0.2.2'
8
+ gem.version = '0.3.0'
9
9
 
10
10
  gem.summary = %Q{Test your capistrano recipes}
11
11
  gem.description = %Q{Helpers and matchers for testing capistrano}
12
12
  gem.email = "josh@technicalpickles.com"
13
13
  gem.homepage = "http://github.com/technicalpickles/capistrano-spec"
14
- gem.authors = ["Joshua Nichols", "Karl Matthias", "Peter M Souter"]
14
+ gem.authors = ["Joshua Nichols", "Karl Matthias", "Peter M Souter", "Jan Graichen"]
15
15
  gem.add_development_dependency "rspec", ">= 2.0.0"
16
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
17
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "capistrano-spec"
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Joshua Nichols", "Karl Matthias", "Peter M Souter"]
12
- s.date = "2013-04-02"
11
+ s.authors = ["Joshua Nichols", "Karl Matthias", "Peter M Souter", "Jan Graichen"]
12
+ s.date = "2013-04-07"
13
13
  s.description = "Helpers and matchers for testing capistrano"
14
14
  s.email = "josh@technicalpickles.com"
15
15
  s.extra_rdoc_files = [
@@ -28,11 +28,13 @@ Gem::Specification.new do |s|
28
28
  "lib/capistrano/spec.rb",
29
29
  "spec/capistrano-spec_spec.rb",
30
30
  "spec/spec.opts",
31
- "spec/spec_helper.rb"
31
+ "spec/spec_helper.rb",
32
+ "spec/stub_commands_spec.rb",
33
+ "spec/uploaded_spec.rb"
32
34
  ]
33
35
  s.homepage = "http://github.com/technicalpickles/capistrano-spec"
34
36
  s.require_paths = ["lib"]
35
- s.rubygems_version = "1.8.23"
37
+ s.rubygems_version = "1.8.25"
36
38
  s.summary = "Test your capistrano recipes"
37
39
 
38
40
  if s.respond_to? :specification_version then
@@ -11,6 +11,15 @@ module Capistrano
11
11
 
12
12
  def run(cmd, options={}, &block)
13
13
  runs[cmd] = {:options => options, :block => block}
14
+ if (stub = stubbed_commands[cmd])
15
+ raise ::Capistrano::CommandError if stub[:fail]
16
+ raise stub[:raise] if stub[:raise]
17
+
18
+ data = stub[:data]
19
+ data = stub[:with].call(cmd) if stub[:with].respond_to? :call
20
+
21
+ block.call stub[:channel], stub[:stream], data if block_given?
22
+ end
14
23
  end
15
24
 
16
25
  def runs
@@ -24,7 +33,15 @@ module Capistrano
24
33
  def uploads
25
34
  @uploads ||= {}
26
35
  end
27
-
36
+
37
+ def stubbed_commands
38
+ @stubbed_commands ||= {}
39
+ end
40
+
41
+ def stub_command(command, options = {}, &block)
42
+ options[:with] = block if block_given?
43
+ stubbed_commands[command] = { :stream => :out, :data => '' }.merge options
44
+ end
28
45
  end
29
46
 
30
47
  module Helpers
@@ -124,13 +141,13 @@ module Capistrano
124
141
  end
125
142
 
126
143
  define :have_uploaded do |path|
144
+ @to = nil # Reset `to` because it will influence next match otherwise.
145
+
127
146
  match do |configuration|
128
- upload = configuration.uploads[path]
129
- if @to
130
- upload && upload[:to] == @to
131
- else
132
- upload
133
- end
147
+ uploads = configuration.uploads
148
+ uploads = uploads.select { |f, u| f == path } if path
149
+ uploads = uploads.select { |f, u| u[:to] == @to } if @to
150
+ uploads.any?
134
151
  end
135
152
 
136
153
  def to(to)
@@ -158,7 +175,7 @@ module Capistrano
158
175
  failure_message_for_should do |actual|
159
176
  "expected configuration to run #{cmd}, but did not"
160
177
  end
161
-
178
+
162
179
  end
163
180
 
164
181
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'capistrano'
3
+
4
+ describe 'Command stubbing' do
5
+ before do
6
+ @configuration = Capistrano::Configuration.new
7
+ @configuration.extend Capistrano::Spec::ConfigurationExtension
8
+ @configuration.load do
9
+ def remote_pwd
10
+ capture 'pwd'
11
+ end
12
+
13
+ def remote_sudo_pwd
14
+ capture 'pwd', :via => :sudo
15
+ end
16
+
17
+ def custom_pwd
18
+ run 'pwd' do |ch, stream, data|
19
+ return "#{stream}: #{data}"
20
+ end
21
+ end
22
+
23
+ def no_block
24
+ run 'pwd'
25
+ nil
26
+ end
27
+ end
28
+ end
29
+
30
+ it 'should allow to stub command output' do
31
+ @configuration.stub_command 'pwd', :data => '/stubded/path'
32
+ @configuration.remote_pwd.should == '/stubded/path'
33
+ end
34
+
35
+ it 'should allow to stub sudo command output' do
36
+ @configuration.stub_command "sudo -p 'sudo password: ' pwd", :data => '/stubbed/path'
37
+ @configuration.remote_sudo_pwd.should == '/stubbed/path'
38
+ end
39
+
40
+ it 'should allow to stub custom command output' do
41
+ @configuration.stub_command 'pwd', :data => '/stubbed/path'
42
+ @configuration.custom_pwd.should == 'out: /stubbed/path'
43
+ end
44
+
45
+ it 'should allow to stub stream' do
46
+ @configuration.stub_command 'pwd', :data => '/stubbed/path', :stream => :err
47
+ @configuration.custom_pwd.should == 'err: /stubbed/path'
48
+ end
49
+
50
+ it 'should allow to stub commands without block' do
51
+ @configuration.stub_command 'pwd'
52
+ expect { @configuration.no_block }.to_not raise_error(NoMethodError)
53
+ end
54
+
55
+ it 'should allow to stub command processing' do
56
+ @configuration.stub_command 'pwd', with: proc { |cmd| cmd }
57
+ @configuration.remote_pwd.should == 'pwd'
58
+ end
59
+
60
+ it 'should allow to stub command processing (2)' do
61
+ testvar = false
62
+ @configuration.stub_command 'pwd' do |cmd| testvar = true end
63
+ @configuration.no_block
64
+ testvar.should be_true
65
+ end
66
+
67
+ it 'should allow to stub command processing with error' do
68
+ @configuration.stub_command 'pwd', raise: ::Capistrano::CommandError
69
+ expect { @configuration.no_block }.to raise_error(::Capistrano::CommandError)
70
+ end
71
+
72
+ it 'should allow to stub command processing with CommandError' do
73
+ @configuration.stub_command 'pwd', fail: true
74
+ expect { @configuration.no_block }.to raise_error(::Capistrano::CommandError)
75
+ end
76
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'capistrano'
3
+
4
+ describe 'Capistrano has uploaded' do
5
+ include Capistrano::Spec::Matchers
6
+
7
+ before do
8
+ @configuration = Capistrano::Configuration.new
9
+ @configuration.extend Capistrano::Spec::ConfigurationExtension
10
+ @configuration.load do
11
+ def upload_from_to
12
+ upload 'source.file', 'target.file'
13
+ end
14
+
15
+ def upload_to
16
+ upload 'temp.XC3PO.file', 'target.file' # E.g. uploading generated tar
17
+ end
18
+
19
+ def upload_from
20
+ upload 'source.file', 'temp.XC3PO.file' # E.g. uploading to temp file
21
+ end
22
+ end
23
+ end
24
+
25
+ it 'some file' do
26
+ @configuration.upload 'source.file', 'target.file'
27
+ @configuration.should have_uploaded
28
+ end
29
+
30
+ it 'a specific file to a specific location' do
31
+ @configuration.upload_from_to
32
+ @configuration.should have_uploaded('source.file').to('target.file')
33
+ end
34
+
35
+ it 'a specific file to some location' do
36
+ @configuration.upload_from
37
+ @configuration.should have_uploaded('source.file')
38
+ end
39
+
40
+ it 'some file to a specific location' do
41
+ @configuration.upload_to
42
+ @configuration.should have_uploaded.to('target.file')
43
+ end
44
+ end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Joshua Nichols
9
9
  - Karl Matthias
10
10
  - Peter M Souter
11
+ - Jan Graichen
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2013-04-02 00:00:00.000000000 Z
15
+ date: 2013-04-07 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: rspec
@@ -49,6 +50,8 @@ files:
49
50
  - spec/capistrano-spec_spec.rb
50
51
  - spec/spec.opts
51
52
  - spec/spec_helper.rb
53
+ - spec/stub_commands_spec.rb
54
+ - spec/uploaded_spec.rb
52
55
  homepage: http://github.com/technicalpickles/capistrano-spec
53
56
  licenses: []
54
57
  post_install_message:
@@ -69,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
72
  version: '0'
70
73
  requirements: []
71
74
  rubyforge_project:
72
- rubygems_version: 1.8.23
75
+ rubygems_version: 1.8.25
73
76
  signing_key:
74
77
  specification_version: 3
75
78
  summary: Test your capistrano recipes