savon_spec 0.1.6 → 1.1.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/.travis.yml +14 -0
- data/Gemfile +0 -2
- data/README.md +111 -76
- data/Rakefile +5 -36
- data/lib/savon/spec.rb +11 -5
- data/lib/savon/spec/fixture.rb +5 -5
- data/lib/savon/spec/macros.rb +2 -4
- data/lib/savon/spec/mock.rb +64 -43
- data/lib/savon/spec/version.rb +1 -1
- data/lib/savon_spec.rb +1 -0
- data/savon_spec.gemspec +15 -13
- data/spec/fixtures/get_user/success.xml +2 -2
- data/spec/savon/spec/fixture_spec.rb +21 -14
- data/spec/savon/spec/macros_spec.rb +1 -1
- data/spec/savon/spec/mock_spec.rb +91 -106
- metadata +72 -45
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# https://github.com/travis-ci/travis-ci/wiki/.travis.yml-options
|
2
|
+
language: "ruby"
|
3
|
+
script: "bundle exec rake"
|
4
|
+
rvm:
|
5
|
+
- 1.8.7
|
6
|
+
- 1.9.2
|
7
|
+
- 1.9.3
|
8
|
+
- jruby-18mode
|
9
|
+
- jruby-19mode
|
10
|
+
- rbx-18mode
|
11
|
+
- rbx-19mode
|
12
|
+
- ree
|
13
|
+
notifications:
|
14
|
+
irc: "irc.freenode.org#savon"
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,115 +1,150 @@
|
|
1
|
-
Savon::Spec
|
1
|
+
Savon::Spec [](http://travis-ci.org/rubiii/savon_spec)
|
2
2
|
===========
|
3
3
|
|
4
|
-
Savon testing library
|
4
|
+
Savon testing library.
|
5
|
+
|
5
6
|
|
6
7
|
Installation
|
7
8
|
------------
|
8
9
|
|
9
10
|
Savon::Spec is available through [Rubygems](http://rubygems.org/gems/savon_spec) and can be installed via:
|
10
11
|
|
11
|
-
|
12
|
+
```
|
13
|
+
$ gem install savon_spec
|
14
|
+
```
|
12
15
|
|
13
|
-
Dependencies
|
14
|
-
------------
|
15
16
|
|
16
|
-
|
17
|
+
Expects
|
18
|
+
-------
|
19
|
+
|
20
|
+
Include the `Savon::Spec::Macros` module into your specs:
|
21
|
+
|
22
|
+
``` ruby
|
23
|
+
RSpec.configure do |config|
|
24
|
+
config.include Savon::Spec::Macros
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
By including the module you get a `savon` method to mock SOAP requests. Here's a very simple example:
|
29
|
+
|
30
|
+
``` ruby
|
31
|
+
let(:client) do
|
32
|
+
Savon::Client.new do
|
33
|
+
wsdl.endpoint = "http://example.com"
|
34
|
+
wsdl.namespace = "http://users.example.com"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
before do
|
39
|
+
savon.expects(:get_user)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "mocks a SOAP request" do
|
43
|
+
client.request(:get_user)
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
This sets up an expectation for Savon to call the `:get_user` action and the specs should pass without errors.
|
48
|
+
Savon::Spec does not execute a POST request to your service, but uses [Savon hooks](http://savonrb.com/#hook_into_the_system) to return a fake response:
|
49
|
+
|
50
|
+
``` ruby
|
51
|
+
{ :code => 200, :headers => {}, :body => "" }
|
52
|
+
```
|
17
53
|
|
18
|
-
|
19
|
-
* [RSpec](http://rubygems.org/gems/rspec) ~> 2.0.0
|
20
|
-
* [Mocha](http://rubygems.org/gems/mocha) ~> 0.9.8
|
54
|
+
To further isolate your specs, I'd suggest setting up [FakeWeb](http://rubygems.org/gems/fakeweb) to disallow any HTTP requests.
|
21
55
|
|
22
|
-
Note to self: the required versions for RSpec and Mocha could probably be lower.
|
23
56
|
|
24
|
-
|
25
|
-
|
57
|
+
With
|
58
|
+
----
|
26
59
|
|
27
|
-
|
60
|
+
Mocking SOAP requests is fine, but what you really need to do is verify whether you're sending the right
|
61
|
+
parameters to your service.
|
28
62
|
|
29
|
-
|
63
|
+
``` ruby
|
64
|
+
before do
|
65
|
+
savon.expects(:get_user).with(:id => 1)
|
66
|
+
end
|
30
67
|
|
31
|
-
|
32
|
-
|
33
|
-
|
68
|
+
it "mocks a SOAP request" do
|
69
|
+
client.request(:get_user) do
|
70
|
+
soap.body = { :id => 1 }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
```
|
34
74
|
|
35
|
-
|
75
|
+
This checks whether Savon uses the SOAP body Hash you expected and raises a `Savon::Spec::ExpectationError` if it doesn't.
|
36
76
|
|
37
|
-
|
77
|
+
```
|
78
|
+
Failure/Error: client.request :get_user, :body => { :name => "Dr. Who" }
|
79
|
+
Savon::Spec::ExpectationError:
|
80
|
+
expected { :id => 1 } to be sent, got: { :name => "Dr. Who" }
|
81
|
+
```
|
38
82
|
|
39
|
-
|
40
|
-
|
41
|
-
#with(soap_body) # expects Savon to send a given SOAP body
|
42
|
-
#raises_soap_fault # raises or acts like there was a SOAP fault
|
43
|
-
#returns(response) # returns the given response
|
83
|
+
You can also pass a block to the `#with` method and receive the `Savon::SOAP::Request` before the POST request is executed.
|
84
|
+
Here's an example of a custom expectation:
|
44
85
|
|
45
|
-
|
86
|
+
``` ruby
|
87
|
+
savon.expects(:get_user).with do |request|
|
88
|
+
request.soap.body.should include(:id)
|
89
|
+
end
|
90
|
+
```
|
46
91
|
|
47
|
-
Savon::Spec works best with SOAP response fixtures (simple XML files) and a conventional folder structure:
|
48
92
|
|
49
|
-
|
50
|
-
|
51
|
-
~ get_user
|
52
|
-
- single_user.xml
|
53
|
-
- multiple_users.xml
|
54
|
-
+ models
|
55
|
-
+ controllers
|
56
|
-
+ helpers
|
57
|
-
+ views
|
93
|
+
Returns
|
94
|
+
-------
|
58
95
|
|
59
|
-
|
96
|
+
Instead of the default fake response, you can return a custom HTTP response by passing a Hash to the `#returns` method.
|
97
|
+
If you leave out any of these values, Savon::Spec will add the default values for you.
|
60
98
|
|
61
|
-
|
99
|
+
``` ruby
|
100
|
+
savon.expects(:get_user).returns(:code => 500, :headers => {}, :body => "save the unicorns")
|
101
|
+
```
|
62
102
|
|
63
|
-
|
103
|
+
Savon::Spec also works with SOAP response fixtures (simple XML files) and a conventional folder structure:
|
64
104
|
|
65
|
-
|
66
|
-
|
105
|
+
```
|
106
|
+
~ spec
|
107
|
+
~ fixtures
|
108
|
+
~ get_user
|
109
|
+
- single_user.xml
|
110
|
+
- multiple_users.xml
|
111
|
+
+ models
|
112
|
+
+ controllers
|
113
|
+
+ helpers
|
114
|
+
+ views
|
115
|
+
```
|
67
116
|
|
68
|
-
|
117
|
+
When used inside a Rails 3 application, Savon::Spec uses `Rails.root.join("spec", "fixtures")` to locate your fixture directory.
|
118
|
+
In any other case, you have to manually set the fixture path via:
|
69
119
|
|
70
|
-
|
120
|
+
``` ruby
|
121
|
+
Savon::Spec::Fixture.path = File.expand_path("../fixtures", __FILE__)
|
122
|
+
```
|
71
123
|
|
72
|
-
|
73
|
-
|
74
|
-
response.to_hash.map { |user_hash| new user_hash }
|
75
|
-
end
|
124
|
+
Directory names inside the fixtures directory map to SOAP actions and contain actual SOAP responses from your service(s).
|
125
|
+
You can use one of those fixtures for the HTTP response body like in the following example:
|
76
126
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
new response.to_hash
|
83
|
-
end
|
127
|
+
``` ruby
|
128
|
+
savon.expects(:get_user).with(:id => 1).returns(:single_user)
|
129
|
+
```
|
84
130
|
|
85
|
-
|
131
|
+
As you can see, Savon::Spec uses the name of your SOAP action and the Symbol passed to the `#returns` method to navigate inside
|
132
|
+
your fixtures directory and load the requested XML files.
|
86
133
|
|
87
|
-
user_spec.rb
|
88
134
|
|
89
|
-
|
135
|
+
Never
|
136
|
+
-----
|
90
137
|
|
91
|
-
|
92
|
-
before do
|
93
|
-
savon.expects(:get_all_users).returns(:multiple_users)
|
94
|
-
end
|
138
|
+
Savon::Spec can also verify that a certain SOAP request was not executed:
|
95
139
|
|
96
|
-
|
97
|
-
|
98
|
-
|
140
|
+
``` ruby
|
141
|
+
savon.expects(:get_user).never
|
142
|
+
```
|
99
143
|
|
100
|
-
it "should return exactly 7 Users" do
|
101
|
-
User.all.should have(7).items
|
102
|
-
end
|
103
|
-
end
|
104
144
|
|
105
|
-
|
106
|
-
|
107
|
-
savon.expects(:get_user).with(:id => 1).returns(:single_user)
|
108
|
-
end
|
145
|
+
RSpec
|
146
|
+
-----
|
109
147
|
|
110
|
-
|
111
|
-
|
112
|
-
end
|
113
|
-
end
|
148
|
+
This library is optimized to work with RSpec, but it could be tweaked to work with any other testing library.
|
149
|
+
Savon::Spec installs an after filter to clear out its Savon hooks after each example.
|
114
150
|
|
115
|
-
end
|
data/Rakefile
CHANGED
@@ -1,39 +1,8 @@
|
|
1
|
-
require "
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
2
3
|
|
3
|
-
|
4
|
-
require "yard"
|
5
|
-
|
6
|
-
YARD::Rake::YardocTask.new do |t|
|
7
|
-
t.files = ["README.md", "lib/**/*.rb"]
|
8
|
-
end
|
9
|
-
rescue LoadError
|
10
|
-
desc message = %{"gem install yard" to generate documentation}
|
11
|
-
task("yard") { abort message }
|
12
|
-
end
|
13
|
-
|
14
|
-
begin
|
15
|
-
require "metric_fu"
|
16
|
-
|
17
|
-
MetricFu::Configuration.run do |c|
|
18
|
-
c.metrics = [:churn, :flog, :flay, :reek, :roodi, :saikuro] # :rcov seems to be broken
|
19
|
-
c.graphs = [:flog, :flay, :reek, :roodi]
|
20
|
-
c.flay = { :dirs_to_flay => ["lib"], :minimum_score => 20 }
|
21
|
-
c.rcov[:rcov_opts] << "-Ilib -Ispec"
|
22
|
-
end
|
23
|
-
rescue LoadError
|
24
|
-
desc message = %{"gem install metric_fu" to generate metrics}
|
25
|
-
task("metrics:all") { abort message }
|
26
|
-
end
|
27
|
-
|
28
|
-
begin
|
29
|
-
require "rspec/core/rake_task"
|
30
|
-
|
31
|
-
RSpec::Core::RakeTask.new do |t|
|
32
|
-
t.rspec_opts = %w(-fd -c)
|
33
|
-
end
|
34
|
-
rescue LoadError
|
35
|
-
desc message = %{"gem install rspec" to run the specs}
|
36
|
-
task(:spec) { abort message }
|
37
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new
|
38
5
|
|
39
6
|
task :default => :spec
|
7
|
+
task :test => :spec
|
8
|
+
|
data/lib/savon/spec.rb
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
require "savon"
|
2
2
|
require "rspec"
|
3
|
-
require "mocha"
|
4
3
|
|
5
|
-
|
6
|
-
|
4
|
+
module Savon
|
5
|
+
module Spec
|
6
|
+
|
7
|
+
autoload :Macros, "savon/spec/macros"
|
8
|
+
autoload :Mock, "savon/spec/mock"
|
9
|
+
autoload :Fixture, "savon/spec/fixture"
|
10
|
+
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
|
-
|
10
|
-
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.after { Savon.config.hooks.reject!(Savon::Spec::Mock::HOOKS) }
|
16
|
+
end
|
data/lib/savon/spec/fixture.rb
CHANGED
@@ -3,13 +3,13 @@ module Savon
|
|
3
3
|
|
4
4
|
# = Savon::Spec::Fixture
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# Manages SOAP response fixtures.
|
7
7
|
class Fixture
|
8
8
|
class << self
|
9
9
|
|
10
10
|
def path
|
11
11
|
@path ||= Rails.root.join("spec", "fixtures").to_s if defined? Rails
|
12
|
-
|
12
|
+
|
13
13
|
raise ArgumentError, "Savon::Spec::Fixture.path needs to be specified" unless @path
|
14
14
|
@path
|
15
15
|
end
|
@@ -18,7 +18,7 @@ module Savon
|
|
18
18
|
|
19
19
|
def load(*args)
|
20
20
|
file = args.map { |arg| arg.to_s.snakecase }.join("/")
|
21
|
-
fixtures[file] ||=
|
21
|
+
fixtures[file] ||= read_file(file)
|
22
22
|
end
|
23
23
|
|
24
24
|
alias [] load
|
@@ -29,10 +29,10 @@ module Savon
|
|
29
29
|
@fixtures ||= {}
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def read_file(file)
|
33
33
|
full_path = File.expand_path File.join(path, "#{file}.xml")
|
34
34
|
raise ArgumentError, "Unable to load: #{full_path}" unless File.exist? full_path
|
35
|
-
|
35
|
+
|
36
36
|
File.read full_path
|
37
37
|
end
|
38
38
|
|
data/lib/savon/spec/macros.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
-
require "savon/spec/mock"
|
2
|
-
|
3
1
|
module Savon
|
4
2
|
module Spec
|
5
3
|
|
6
4
|
# = Savon::Spec::Macros
|
7
5
|
#
|
8
|
-
# Include this module into your RSpec tests to mock
|
6
|
+
# Include this module into your RSpec tests to mock Savon SOAP requests.
|
9
7
|
module Macros
|
10
8
|
|
11
9
|
def savon
|
12
|
-
|
10
|
+
Mock.new
|
13
11
|
end
|
14
12
|
|
15
13
|
end
|
data/lib/savon/spec/mock.rb
CHANGED
@@ -1,77 +1,98 @@
|
|
1
|
-
require "savon/spec/fixture"
|
2
|
-
|
3
1
|
module Savon
|
4
2
|
module Spec
|
5
3
|
|
4
|
+
class ExpectationError < RuntimeError; end
|
5
|
+
|
6
6
|
# = Savon::Spec::Mock
|
7
7
|
#
|
8
|
-
# Mocks
|
8
|
+
# Mocks Savon SOAP requests.
|
9
9
|
class Mock
|
10
10
|
|
11
|
-
#
|
12
|
-
|
13
|
-
setup :expects, soap_action
|
14
|
-
self
|
15
|
-
end
|
11
|
+
# Hooks registered by Savon::Spec.
|
12
|
+
HOOKS = [:spec_action, :spec_body, :spec_response, :spec_never]
|
16
13
|
|
17
|
-
#
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
# Expects that a given +action+ should be called.
|
15
|
+
def expects(expected)
|
16
|
+
self.action = expected
|
17
|
+
|
18
|
+
Savon.config.hooks.define(:spec_action, :soap_request) do |request|
|
19
|
+
actual = request.soap.input[1]
|
20
|
+
raise ExpectationError, "expected #{action.inspect} to be called, got: #{actual.inspect}" unless actual == action
|
21
|
+
|
22
|
+
respond_with
|
23
|
+
end
|
22
24
|
|
23
|
-
# Expects a given SOAP body Hash to be used.
|
24
|
-
def with(soap_body)
|
25
|
-
Savon::SOAP::XML.any_instance.expects(:body=).with(soap_body) if mock_method == :expects
|
26
25
|
self
|
27
26
|
end
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
# Accepts a SOAP +body+ to check if it was set. Also accepts a +block+
|
29
|
+
# which receives the <tt>Savon::SOAP::Request</tt> to set up custom expectations.
|
30
|
+
def with(body = nil, &block)
|
31
|
+
Savon.config.hooks.define(:spec_body, :soap_request) do |request|
|
32
|
+
if block
|
33
|
+
block.call(request)
|
34
|
+
else
|
35
|
+
actual = request.soap.body
|
36
|
+
raise ExpectationError, "expected #{body.inspect} to be sent, got: #{actual.inspect}" unless actual == body
|
37
|
+
end
|
38
|
+
|
39
|
+
respond_with
|
40
|
+
end
|
41
|
+
|
31
42
|
self
|
32
43
|
end
|
33
44
|
|
34
|
-
#
|
45
|
+
# Expects a given +response+ to be returned.
|
35
46
|
def returns(response = nil)
|
36
|
-
http =
|
37
|
-
|
38
|
-
|
39
|
-
when Symbol then http[:body] = Fixture[soap_action, response]
|
40
|
-
when Hash then http.merge! response
|
41
|
-
when String then http[:body] = response
|
47
|
+
http = case response
|
48
|
+
when Symbol then { :body => Fixture[action, response] }
|
49
|
+
when Hash then response
|
42
50
|
end
|
43
|
-
|
44
|
-
|
51
|
+
|
52
|
+
Savon.config.hooks.define(:spec_response, :soap_request) do |request|
|
53
|
+
respond_with(http)
|
54
|
+
end
|
55
|
+
|
45
56
|
self
|
46
57
|
end
|
47
58
|
|
48
|
-
#
|
49
|
-
def
|
50
|
-
Savon
|
59
|
+
# Expects that the +action+ doesn't get called.
|
60
|
+
def never
|
61
|
+
Savon.config.hooks.reject!(:spec_action)
|
62
|
+
|
63
|
+
Savon.config.hooks.define(:spec_never, :soap_request) do |request|
|
64
|
+
actual = request.soap.input[1]
|
65
|
+
raise ExpectationError, "expected #{action.inspect} never to be called, but it was!" if actual == action
|
66
|
+
|
67
|
+
respond_with
|
68
|
+
end
|
69
|
+
|
51
70
|
self
|
52
71
|
end
|
53
72
|
|
54
73
|
private
|
55
74
|
|
56
|
-
def
|
57
|
-
|
58
|
-
self.soap_action = soap_action
|
59
|
-
self.httpi_mock = new_httpi_mock
|
75
|
+
def action=(action)
|
76
|
+
@action = lower_camelcase(action.to_s).to_sym
|
60
77
|
end
|
61
78
|
|
62
|
-
|
79
|
+
attr_reader :action
|
63
80
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
81
|
+
def respond_with(http = {})
|
82
|
+
defaults = { :code => 200, :headers => {}, :body => "" }
|
83
|
+
http = defaults.merge(http)
|
67
84
|
|
68
|
-
|
69
|
-
|
70
|
-
def new_httpi_mock
|
71
|
-
HTTPI.send(mock_method, :post).with { |http| http.body =~ /<\/(.+:)?#{soap_action}>/ }
|
85
|
+
HTTPI::Response.new(http[:code], http[:headers], http[:body])
|
72
86
|
end
|
73
87
|
|
74
|
-
|
88
|
+
# Extracted from CoreExt of Savon 0.9.9
|
89
|
+
def lower_camelcase(source_str)
|
90
|
+
str = source_str.dup
|
91
|
+
str.gsub!(/\/(.?)/) { "::#{$1.upcase}" }
|
92
|
+
str.gsub!(/(?:_+|-+)([a-z])/) { $1.upcase }
|
93
|
+
str.gsub!(/(\A|\s)([A-Z])/) { $1 + $2.downcase }
|
94
|
+
str
|
95
|
+
end
|
75
96
|
|
76
97
|
end
|
77
98
|
end
|
data/lib/savon/spec/version.rb
CHANGED
data/lib/savon_spec.rb
CHANGED
data/savon_spec.gemspec
CHANGED
@@ -1,25 +1,27 @@
|
|
1
|
-
|
2
|
-
$:.
|
3
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
4
3
|
require "savon/spec/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
9
|
-
s.authors
|
10
|
-
s.email
|
11
|
-
s.homepage
|
12
|
-
s.summary
|
13
|
-
s.description =
|
6
|
+
s.name = "savon_spec"
|
7
|
+
s.version = Savon::Spec::VERSION
|
8
|
+
s.authors = "Daniel Harrington"
|
9
|
+
s.email = "me@rubiii.com"
|
10
|
+
s.homepage = "http://github.com/rubiii/#{s.name}"
|
11
|
+
s.summary = "Savon testing library"
|
12
|
+
s.description = s.summary
|
14
13
|
|
15
14
|
s.rubyforge_project = s.name
|
16
15
|
|
17
|
-
s.add_dependency "savon", "
|
16
|
+
s.add_dependency "savon", "~> 0.9.10"
|
18
17
|
s.add_dependency "rspec", ">= 2.0.0"
|
19
|
-
s.add_dependency "mocha", ">= 0.9.8"
|
20
18
|
|
21
19
|
s.add_development_dependency "httpclient", "~> 2.1.5"
|
22
|
-
s.add_development_dependency "webmock",
|
20
|
+
s.add_development_dependency "webmock", "~> 1.4.0"
|
21
|
+
|
22
|
+
s.add_development_dependency "autotest"
|
23
|
+
s.add_development_dependency "rake"
|
24
|
+
s.add_development_dependency "ZenTest", "4.5.0"
|
23
25
|
|
24
26
|
s.files = `git ls-files`.split("\n")
|
25
27
|
s.require_path = "lib"
|
@@ -3,43 +3,50 @@ require "spec_helper"
|
|
3
3
|
describe Savon::Spec::Fixture do
|
4
4
|
|
5
5
|
describe ".path" do
|
6
|
-
|
7
|
-
|
8
|
-
Savon::Spec::Fixture.path
|
9
|
-
|
6
|
+
|
7
|
+
it "returns a specified path" do
|
8
|
+
Savon::Spec::Fixture.path = "/Users/dr_who/some_app/spec/fixtures"
|
9
|
+
Savon::Spec::Fixture.path.should == "/Users/dr_who/some_app/spec/fixtures"
|
10
|
+
|
10
11
|
Savon::Spec::Fixture.path = nil # reset to default
|
11
12
|
end
|
12
13
|
|
13
|
-
it "
|
14
|
-
|
14
|
+
it "raises an ArgumentError when accessed before specified" do
|
15
|
+
expect { Savon::Spec::Fixture.path }.to raise_error(ArgumentError)
|
15
16
|
end
|
16
17
|
|
17
|
-
it "
|
18
|
-
Rails = Class.new
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
it "defaults to spec/fixtures when used in a Rails app" do
|
19
|
+
Rails = Class.new do
|
20
|
+
def self.root
|
21
|
+
Pathname.new("/Users/dr_who/another_app")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Savon::Spec::Fixture.path.should == "/Users/dr_who/another_app/spec/fixtures"
|
26
|
+
|
23
27
|
Object.send(:remove_const, "Rails")
|
24
28
|
end
|
29
|
+
|
25
30
|
end
|
26
31
|
|
27
32
|
describe ".load" do
|
33
|
+
|
28
34
|
around do |example|
|
29
35
|
Savon::Spec::Fixture.path = "spec/fixtures"
|
30
36
|
example.run
|
31
37
|
Savon::Spec::Fixture.path = nil # reset to default
|
32
38
|
end
|
33
39
|
|
34
|
-
it "
|
40
|
+
it "returns a fixture for the given arguments" do
|
35
41
|
fixture = Savon::Spec::Fixture.load :get_user, :success
|
36
42
|
fixture.should == File.read("spec/fixtures/get_user/success.xml")
|
37
43
|
end
|
38
44
|
|
39
|
-
it "
|
45
|
+
it "memoizes the fixtures" do
|
40
46
|
Savon::Spec::Fixture.load(:get_user, :success).
|
41
47
|
should equal(Savon::Spec::Fixture.load(:get_user, :success))
|
42
48
|
end
|
49
|
+
|
43
50
|
end
|
44
51
|
|
45
52
|
end
|
@@ -1,13 +1,9 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
Savon.configure do |config|
|
4
|
-
config.log = false
|
5
|
-
end
|
6
|
-
|
7
3
|
describe Savon::Spec::Mock do
|
8
4
|
include Savon::Spec::Macros
|
9
5
|
|
10
|
-
let
|
6
|
+
let(:client) do
|
11
7
|
Savon::Client.new do
|
12
8
|
wsdl.endpoint = "http://example.com"
|
13
9
|
wsdl.namespace = "http://users.example.com"
|
@@ -15,125 +11,122 @@ describe Savon::Spec::Mock do
|
|
15
11
|
end
|
16
12
|
|
17
13
|
describe "#expects" do
|
18
|
-
before { savon.expects(:get_user).returns }
|
19
14
|
|
20
|
-
|
21
|
-
|
15
|
+
before do
|
16
|
+
savon.expects(:get_user)
|
22
17
|
end
|
23
18
|
|
24
|
-
it "
|
25
|
-
|
26
|
-
Mocha::ExpectationError,
|
27
|
-
/expected exactly once, not yet invoked: HTTPI.post/
|
28
|
-
)
|
29
|
-
|
30
|
-
teardown_mocks_for_rspec
|
19
|
+
it "does not execute a POST request (verified via WebMock)" do
|
20
|
+
client.request(:get_user)
|
31
21
|
end
|
32
22
|
|
33
|
-
it "
|
34
|
-
expect {
|
35
|
-
|
36
|
-
|
23
|
+
it "fails when a different SOAP action was called" do
|
24
|
+
expect { client.request(:get_user_by_id) }.to raise_error(
|
25
|
+
Savon::Spec::ExpectationError,
|
26
|
+
"expected :getUser to be called, got: :getUserById"
|
37
27
|
)
|
38
|
-
|
39
|
-
teardown_mocks_for_rspec
|
40
28
|
end
|
29
|
+
|
41
30
|
end
|
42
31
|
|
43
|
-
describe "#
|
44
|
-
|
32
|
+
describe "#with" do
|
33
|
+
|
34
|
+
context "a Hash" do
|
45
35
|
|
46
|
-
|
47
|
-
|
48
|
-
soap.body = { :id => 1 }
|
36
|
+
before do
|
37
|
+
savon.expects(:get_user).with(:id => 1)
|
49
38
|
end
|
50
|
-
end
|
51
39
|
|
52
|
-
|
53
|
-
|
40
|
+
it "expects Savon to send a specific SOAP body" do
|
41
|
+
client.request :get_user, :body => { :id => 1 }
|
42
|
+
end
|
54
43
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
44
|
+
it "fails when the SOAP body was not set" do
|
45
|
+
expect { client.request(:get_user) }.to raise_error(
|
46
|
+
Savon::Spec::ExpectationError,
|
47
|
+
"expected {:id=>1} to be sent, got: nil"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "fails when the SOAP body did not match the expected value" do
|
52
|
+
expect { client.request :get_user, :body => { :id => 2 } }.to raise_error(
|
53
|
+
Savon::Spec::ExpectationError,
|
54
|
+
"expected {:id=>1} to be sent, got: {:id=>2}"
|
55
|
+
)
|
56
|
+
end
|
59
57
|
|
60
|
-
teardown_mocks_for_rspec
|
61
58
|
end
|
62
|
-
end
|
63
59
|
|
64
|
-
|
65
|
-
before { savon.expects(:noop).never }
|
60
|
+
context "a block" do
|
66
61
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
62
|
+
before do
|
63
|
+
savon.expects(:get_user).with do |request|
|
64
|
+
request.soap.body.should include(:id)
|
65
|
+
end
|
66
|
+
end
|
72
67
|
|
73
|
-
|
74
|
-
|
75
|
-
|
68
|
+
it "works with a custom expectation" do
|
69
|
+
client.request :get_user, :body => { :id => 1 }
|
70
|
+
end
|
76
71
|
|
77
|
-
|
78
|
-
|
72
|
+
it "fails when the expectation was not met" do
|
73
|
+
begin
|
74
|
+
client.request :get_user, :body => { :name => "Dr. Who" }
|
75
|
+
rescue Spec::Expectations::ExpectationNotMetError => e
|
76
|
+
e.message.should =~ /expected \{:name=>"Dr. Who"\} to include :id/
|
77
|
+
end
|
78
|
+
end
|
79
79
|
|
80
|
-
it "should set up HTTPI to stub POST requests for a given SOAP action" do
|
81
|
-
client.request :get_user
|
82
80
|
end
|
83
81
|
|
84
|
-
it "should not complain about requests not being executed" do
|
85
|
-
expect { verify_mocks_for_rspec }.to_not raise_error(Mocha::ExpectationError)
|
86
|
-
teardown_mocks_for_rspec
|
87
|
-
end
|
88
82
|
end
|
89
83
|
|
90
|
-
describe "#
|
91
|
-
before { savon.stubs(:get_user).with(:id => 1).returns }
|
84
|
+
describe "#never" do
|
92
85
|
|
93
|
-
|
94
|
-
|
86
|
+
before do
|
87
|
+
savon.expects(:noop).never
|
95
88
|
end
|
89
|
+
|
90
|
+
it "expects Savon to never call a specific SOAP action" do
|
91
|
+
expect { client.request(:noop) }.to raise_error(
|
92
|
+
Savon::Spec::ExpectationError,
|
93
|
+
"expected :noop never to be called, but it was!"
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
96
97
|
end
|
97
98
|
|
98
99
|
describe "#returns" do
|
99
|
-
context "without arguments" do
|
100
|
-
let(:response) { client.request :get_user }
|
101
|
-
|
102
|
-
before { savon.expects(:get_user).returns }
|
103
100
|
|
104
|
-
|
105
|
-
response.http.code.should == 200
|
106
|
-
end
|
101
|
+
context "without arguments" do
|
107
102
|
|
108
|
-
|
109
|
-
|
103
|
+
let(:response) do
|
104
|
+
client.request(:get_user)
|
110
105
|
end
|
111
106
|
|
112
|
-
|
113
|
-
|
107
|
+
before do
|
108
|
+
savon.expects(:get_user)
|
114
109
|
end
|
115
|
-
end
|
116
110
|
|
117
|
-
|
118
|
-
let(:response) { client.request :get_user }
|
119
|
-
|
120
|
-
before { savon.expects(:get_user).returns("<soap>response</soap>") }
|
121
|
-
|
122
|
-
it "should return a response code of 200" do
|
111
|
+
it "returns a response code of 200" do
|
123
112
|
response.http.code.should == 200
|
124
113
|
end
|
125
114
|
|
126
|
-
it "
|
115
|
+
it "does not return any response headers" do
|
127
116
|
response.http.headers.should == {}
|
128
117
|
end
|
129
118
|
|
130
|
-
it "
|
131
|
-
response.http.body.should == "
|
119
|
+
it "returns an empty response body" do
|
120
|
+
response.http.body.should == ""
|
132
121
|
end
|
122
|
+
|
133
123
|
end
|
134
124
|
|
135
125
|
context "with a Symbol" do
|
136
|
-
|
126
|
+
|
127
|
+
let(:response) do
|
128
|
+
client.request(:get_user)
|
129
|
+
end
|
137
130
|
|
138
131
|
around do |example|
|
139
132
|
Savon::Spec::Fixture.path = "spec/fixtures"
|
@@ -144,56 +137,48 @@ describe Savon::Spec::Mock do
|
|
144
137
|
Savon::Spec::Fixture.path = nil # reset to default
|
145
138
|
end
|
146
139
|
|
147
|
-
it "
|
140
|
+
it "returns a response code of 200" do
|
148
141
|
response.http.code.should == 200
|
149
142
|
end
|
150
143
|
|
151
|
-
it "
|
144
|
+
it "does not return any response headers" do
|
152
145
|
response.http.headers.should == {}
|
153
146
|
end
|
154
147
|
|
155
|
-
it "
|
148
|
+
it "returns the :success fixture for the :get_user action" do
|
156
149
|
response.http.body.should == File.read("spec/fixtures/get_user/success.xml")
|
157
150
|
end
|
151
|
+
|
158
152
|
end
|
159
153
|
|
160
154
|
context "with a Hash" do
|
161
|
-
let(:response) { client.request :get_user }
|
162
155
|
|
163
|
-
|
164
|
-
|
165
|
-
savon.expects(:get_user).returns(@hash)
|
156
|
+
let(:response) do
|
157
|
+
client.request(:get_user)
|
166
158
|
end
|
167
159
|
|
168
|
-
|
169
|
-
|
160
|
+
let(:http) do
|
161
|
+
{ :code => 201, :headers => { "Set-Cookie" => "ID=1; Max-Age=3600;" }, :body => "<with>cookie</with>" }
|
170
162
|
end
|
171
163
|
|
172
|
-
|
173
|
-
|
164
|
+
before do
|
165
|
+
savon.expects(:get_user).returns(http)
|
174
166
|
end
|
175
167
|
|
176
|
-
it "
|
177
|
-
response.http.
|
168
|
+
it "returns the given response code" do
|
169
|
+
response.http.code.should == http[:code]
|
178
170
|
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe "#with_soap_fault" do
|
183
|
-
before { savon.expects(:get_user).raises_soap_fault.returns }
|
184
|
-
|
185
|
-
it "should raise a SOAP fault" do
|
186
|
-
expect { client.request :get_user }.to raise_error(Savon::SOAP::Fault)
|
187
|
-
end
|
188
171
|
|
189
|
-
|
190
|
-
|
172
|
+
it "returns the given response headers" do
|
173
|
+
response.http.headers.should == http[:headers]
|
174
|
+
end
|
191
175
|
|
192
|
-
response
|
193
|
-
|
176
|
+
it "returns the given response body" do
|
177
|
+
response.http.body.should == http[:body]
|
178
|
+
end
|
194
179
|
|
195
|
-
Savon.raise_errors = true # reset to default
|
196
180
|
end
|
181
|
+
|
197
182
|
end
|
198
183
|
|
199
184
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: savon_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
-
- 0
|
8
7
|
- 1
|
9
|
-
-
|
10
|
-
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Harrington
|
@@ -15,29 +15,26 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
18
|
+
date: 2012-06-06 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
22
|
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
26
|
+
hash: 47
|
30
27
|
segments:
|
31
28
|
- 0
|
32
|
-
-
|
33
|
-
-
|
34
|
-
version: 0.
|
29
|
+
- 9
|
30
|
+
- 10
|
31
|
+
version: 0.9.10
|
32
|
+
name: savon
|
35
33
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: rspec
|
39
34
|
prerelease: false
|
40
|
-
requirement:
|
35
|
+
requirement: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
38
|
none: false
|
42
39
|
requirements:
|
43
40
|
- - ">="
|
@@ -48,28 +45,12 @@ dependencies:
|
|
48
45
|
- 0
|
49
46
|
- 0
|
50
47
|
version: 2.0.0
|
48
|
+
name: rspec
|
51
49
|
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: mocha
|
55
50
|
prerelease: false
|
56
|
-
requirement:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 43
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 9
|
65
|
-
- 8
|
66
|
-
version: 0.9.8
|
67
|
-
type: :runtime
|
68
|
-
version_requirements: *id003
|
51
|
+
requirement: *id002
|
69
52
|
- !ruby/object:Gem::Dependency
|
70
|
-
|
71
|
-
prerelease: false
|
72
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
73
54
|
none: false
|
74
55
|
requirements:
|
75
56
|
- - ~>
|
@@ -80,12 +61,12 @@ dependencies:
|
|
80
61
|
- 1
|
81
62
|
- 5
|
82
63
|
version: 2.1.5
|
64
|
+
name: httpclient
|
83
65
|
type: :development
|
84
|
-
version_requirements: *id004
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: webmock
|
87
66
|
prerelease: false
|
88
|
-
requirement:
|
67
|
+
requirement: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
89
70
|
none: false
|
90
71
|
requirements:
|
91
72
|
- - ~>
|
@@ -96,9 +77,55 @@ dependencies:
|
|
96
77
|
- 4
|
97
78
|
- 0
|
98
79
|
version: 1.4.0
|
80
|
+
name: webmock
|
99
81
|
type: :development
|
100
|
-
|
101
|
-
|
82
|
+
prerelease: false
|
83
|
+
requirement: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
version: "0"
|
94
|
+
name: autotest
|
95
|
+
type: :development
|
96
|
+
prerelease: false
|
97
|
+
requirement: *id005
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
108
|
+
name: rake
|
109
|
+
type: :development
|
110
|
+
prerelease: false
|
111
|
+
requirement: *id006
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - "="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 43
|
119
|
+
segments:
|
120
|
+
- 4
|
121
|
+
- 5
|
122
|
+
- 0
|
123
|
+
version: 4.5.0
|
124
|
+
name: ZenTest
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
requirement: *id007
|
128
|
+
description: Savon testing library
|
102
129
|
email: me@rubiii.com
|
103
130
|
executables: []
|
104
131
|
|
@@ -109,6 +136,7 @@ extra_rdoc_files: []
|
|
109
136
|
files:
|
110
137
|
- .gitignore
|
111
138
|
- .rspec
|
139
|
+
- .travis.yml
|
112
140
|
- Gemfile
|
113
141
|
- README.md
|
114
142
|
- Rakefile
|
@@ -124,7 +152,6 @@ files:
|
|
124
152
|
- spec/savon/spec/macros_spec.rb
|
125
153
|
- spec/savon/spec/mock_spec.rb
|
126
154
|
- spec/spec_helper.rb
|
127
|
-
has_rdoc: true
|
128
155
|
homepage: http://github.com/rubiii/savon_spec
|
129
156
|
licenses: []
|
130
157
|
|
@@ -154,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
181
|
requirements: []
|
155
182
|
|
156
183
|
rubyforge_project: savon_spec
|
157
|
-
rubygems_version: 1.
|
184
|
+
rubygems_version: 1.8.21
|
158
185
|
signing_key:
|
159
186
|
specification_version: 3
|
160
187
|
summary: Savon testing library
|