savon_spec 0.1.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://secure.travis-ci.org/rubiii/savon_spec.png)](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
|