kookaburra 0.18.3 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,126 @@
1
+ require 'kookaburra/api_driver'
2
+
3
+ describe Kookaburra::APIDriver do
4
+ let(:api) { Kookaburra::APIDriver.new(:http_client => client) }
5
+
6
+ let(:response) {
7
+ stub('Patron::Response', :body => 'foo', :status => 200, :url => '/foo')
8
+ }
9
+
10
+ let(:client) {
11
+ mock('Patron::Session', :post => response, :get => response,
12
+ :put => response, :delete => response)
13
+ }
14
+
15
+ describe '#initialize' do
16
+ it 'instantiates a new http client if no :http_client option is passed' do
17
+ Patron::Session.should_receive(:new).and_return(stub.as_null_object)
18
+ Kookaburra::APIDriver.new({})
19
+ end
20
+
21
+ it 'does not instantiate a new http client if an :http_client option is passed' do
22
+ Patron::Session.should_receive(:new).never
23
+ Kookaburra::APIDriver.new(:http_client => stub.as_null_object)
24
+ end
25
+ end
26
+
27
+ describe '#post' do
28
+ before(:each) do
29
+ response.stub!(:status => 201)
30
+ end
31
+
32
+ it 'delegates to the http client' do
33
+ client.should_receive(:post).with('/foo', 'bar', {}) \
34
+ .and_return(response)
35
+ api.post('/foo', 'bar')
36
+ end
37
+
38
+ it 'returns the response body' do
39
+ api.post('/foo', 'bar').should == 'foo'
40
+ end
41
+
42
+ it 'does not raise an UnexpectedResponse if the response status matches the specified expectation' do
43
+ response.stub!(:status => 666)
44
+ lambda { api.post('/foo', 'bar', :expected_response_status => 666) } \
45
+ .should_not raise_error
46
+ end
47
+
48
+ it 'raises an UnexpectedResponse if the response status is not the specified status' do
49
+ lambda { api.post('/foo', 'bar', :expected_response_status => 666) } \
50
+ .should raise_error(Kookaburra::UnexpectedResponse,
51
+ "POST to /foo responded with 201 status, not 666 as expected\n\nfoo")
52
+ end
53
+ end
54
+
55
+ describe '#put' do
56
+ it 'delegates to the http client' do
57
+ client.should_receive(:put).with('/foo', 'bar', {}) \
58
+ .and_return(response)
59
+ api.put('/foo', 'bar')
60
+ end
61
+
62
+ it 'returns the response body' do
63
+ api.put('/foo', 'bar').should == 'foo'
64
+ end
65
+
66
+ it 'does not raise an UnexpectedResponse if the response status matches the specified expectation' do
67
+ response.stub!(:status => 666)
68
+ lambda { api.put('/foo', 'bar', :expected_response_status => 666) } \
69
+ .should_not raise_error
70
+ end
71
+
72
+ it 'raises an UnexpectedResponse if the response status is not the specified status' do
73
+ lambda { api.put('/foo', 'bar', :expected_response_status => 666) } \
74
+ .should raise_error(Kookaburra::UnexpectedResponse,
75
+ "PUT to /foo responded with 200 status, not 666 as expected\n\nfoo")
76
+ end
77
+ end
78
+
79
+ describe '#get' do
80
+ it 'delegates to the http client' do
81
+ client.should_receive(:get).with('/foo', {}) \
82
+ .and_return(response)
83
+ api.get('/foo')
84
+ end
85
+
86
+ it 'returns the response body' do
87
+ api.get('/foo').should == 'foo'
88
+ end
89
+
90
+ it 'does not raise an UnexpectedResponse if the response status matches the specified expectation' do
91
+ response.stub!(:status => 666)
92
+ lambda { api.get('/foo', :expected_response_status => 666) } \
93
+ .should_not raise_error
94
+ end
95
+
96
+ it 'raises an UnexpectedResponse if the response status is not the specified status' do
97
+ lambda { api.get('/foo', :expected_response_status => 666) } \
98
+ .should raise_error(Kookaburra::UnexpectedResponse,
99
+ "GET to /foo responded with 200 status, not 666 as expected\n\nfoo")
100
+ end
101
+ end
102
+
103
+ describe '#delete' do
104
+ it 'delegates to the http client' do
105
+ client.should_receive(:delete).with('/foo', {}) \
106
+ .and_return(response)
107
+ api.delete('/foo')
108
+ end
109
+
110
+ it 'returns the response body' do
111
+ api.delete('/foo').should == 'foo'
112
+ end
113
+
114
+ it 'does not raise an UnexpectedResponse if the response status matches the specified expectation' do
115
+ response.stub!(:status => 666)
116
+ lambda { api.delete('/foo', :expected_response_status => 666) } \
117
+ .should_not raise_error
118
+ end
119
+
120
+ it 'raises an UnexpectedResponse if the response status is not the specified status' do
121
+ lambda { api.delete('/foo', :expected_response_status => 666) } \
122
+ .should raise_error(Kookaburra::UnexpectedResponse,
123
+ "DELETE to /foo responded with 200 status, not 666 as expected\n\nfoo")
124
+ end
125
+ end
126
+ end
@@ -1,36 +1,91 @@
1
1
  require 'kookaburra/json_api_driver'
2
2
 
3
3
  describe Kookaburra::JsonApiDriver do
4
- describe 'protected methods (for use by subclasses)' do
5
- ['post', 'put', 'get'].each do |method|
6
- describe "##{method}" do
7
- it "sends a #{method} request with JSON data to the specified path within the application" do
8
- app_driver = mock('RackDriver')
9
- app_driver.should_receive(method.to_sym) \
10
- .with('/foo', '{"bar":"baz"}',
11
- 'Content-Type' => 'application/json',
12
- 'Accept' => 'application/json') \
13
- .and_return('{"foo":"bar"}')
14
- driver = Kookaburra::JsonApiDriver.new(app_driver)
15
- driver.send(method.to_sym, '/foo', {:bar => :baz})
16
- end
17
-
18
- it 'returns the response body parsed from JSON' do
19
- app_driver = stub('RackDriver', method.to_sym => '{"ham":"spam"}')
20
- driver = Kookaburra::JsonApiDriver.new(app_driver)
21
- driver.send(method.to_sym, '/foo', {:bar => :baz}) \
22
- .should == {'ham' => 'spam'}
23
- end
24
- end
25
- end
26
-
27
- describe '#authorize' do
28
- it 'sets the authorization credentials on the app driver' do
29
- app_driver = mock('RackDriver')
30
- app_driver.should_receive(:authorize).with('a user', 'a password')
31
- driver = Kookaburra::JsonApiDriver.new(app_driver)
32
- driver.send(:authorize, 'a user', 'a password')
33
- end
4
+ let(:response) { '{"foo":"bar"}' }
5
+
6
+ let(:api) {
7
+ stub('APIDriver', :get => response, :post => response, :put => response,
8
+ :delete => response, :headers => {})
9
+ }
10
+
11
+ let(:json) { Kookaburra::JsonApiDriver.new(:api_driver => api) }
12
+
13
+ describe '#initialize' do
14
+ it 'instantiates a new APIDriver if no :api_driver option is passed' do
15
+ Kookaburra::APIDriver.should_receive(:new).and_return(stub.as_null_object)
16
+ Kookaburra::JsonApiDriver.new({})
17
+ end
18
+
19
+ it 'does not instantiate a new APIDriver if an :api_driver option is passed' do
20
+ Kookaburra::APIDriver.should_receive(:new).never
21
+ Kookaburra::JsonApiDriver.new(:api_driver => stub.as_null_object)
22
+ end
23
+
24
+ it 'sets appropriate headers for a JSON API request' do
25
+ Kookaburra::JsonApiDriver.new(:api_driver => api)
26
+ api.headers.should == {
27
+ 'Content-Type' => 'application/json',
28
+ 'Accept' => 'application/json'
29
+ }
30
+ end
31
+ end
32
+
33
+ it 'delegates to a Kookaburra::APIDriver by default' do
34
+ delegate = stub('Kookaburra::APIDriver', :foo => :bar).as_null_object
35
+ Kookaburra::APIDriver.should_receive(:new).once.and_return(delegate)
36
+ json = Kookaburra::JsonApiDriver.new
37
+ json.foo.should == :bar
38
+ end
39
+
40
+ describe '#post' do
41
+ it 'delegates to the api driver as a JSON request' do
42
+ api.should_receive(:post) \
43
+ .with('/foo', '{"foo":"bar"}') \
44
+ .and_return('{"baz":"bam"}')
45
+ json.post('/foo', 'foo' => 'bar')
46
+ end
47
+
48
+ it 'returns the JSON-decoded response body' do
49
+ json.post('/foo', 'bar').should == {'foo' => 'bar'}
50
+ end
51
+ end
52
+
53
+ describe '#put' do
54
+ it 'delegates to the api driver as a JSON request' do
55
+ api.should_receive(:put) \
56
+ .with('/foo', '{"foo":"bar"}') \
57
+ .and_return('{"baz":"bam"}')
58
+ json.put('/foo', 'foo' => 'bar')
59
+ end
60
+
61
+ it 'returns the JSON-decoded response body' do
62
+ json.put('/foo', 'bar').should == {'foo' => 'bar'}
63
+ end
64
+ end
65
+
66
+ describe '#get' do
67
+ it 'delegates to the api driver as a JSON request' do
68
+ api.should_receive(:get) \
69
+ .with('/foo') \
70
+ .and_return('{"baz":"bam"}')
71
+ json.get('/foo')
72
+ end
73
+
74
+ it 'returns the JSON-decoded response body' do
75
+ json.get('/foo').should == {'foo' => 'bar'}
76
+ end
77
+ end
78
+
79
+ describe '#delete' do
80
+ it 'delegates to the api driver as a JSON request' do
81
+ api.should_receive(:delete) \
82
+ .with('/foo') \
83
+ .and_return('{"baz":"bam"}')
84
+ json.delete('/foo')
85
+ end
86
+
87
+ it 'returns the JSON-decoded response body' do
88
+ json.delete('/foo').should == {'foo' => 'bar'}
34
89
  end
35
90
  end
36
91
  end
@@ -1,9 +1,9 @@
1
- require 'kookaburra/test_data'
1
+ require 'kookaburra/mental_model'
2
2
 
3
- describe Kookaburra::TestData do
3
+ describe Kookaburra::MentalModel do
4
4
  describe '#method_missing' do
5
5
  it 'returns a Collection' do
6
- subject.foo.should be_kind_of(Kookaburra::TestData::Collection)
6
+ subject.foo.should be_kind_of(Kookaburra::MentalModel::Collection)
7
7
  end
8
8
 
9
9
  it 'returns different Collections for different messages' do
@@ -11,8 +11,8 @@ describe Kookaburra::TestData do
11
11
  end
12
12
  end
13
13
 
14
- describe Kookaburra::TestData::Collection do
15
- let(:collection) { Kookaburra::TestData::Collection.new('widgets') }
14
+ describe Kookaburra::MentalModel::Collection do
15
+ let(:collection) { Kookaburra::MentalModel::Collection.new('widgets') }
16
16
 
17
17
  describe '#slice' do
18
18
  it 'returns an array of items matching the specified keys' do
@@ -25,7 +25,7 @@ describe Kookaburra::TestData do
25
25
 
26
26
  it 'raises a Kookaburra::UnknownKeyError exception for #[] with a missing key' do
27
27
  lambda { collection[:foo] }.should \
28
- raise_error(Kookaburra::UnknownKeyError, "Can't find test_data.widgets[:foo]. Did you forget to set it?")
28
+ raise_error(Kookaburra::UnknownKeyError, "Can't find mental_model.widgets[:foo]. Did you forget to set it?")
29
29
  end
30
30
  end
31
31
  end
@@ -6,14 +6,16 @@ describe Kookaburra::UIDriver do
6
6
  it 'adds an accessor method for the named component that defaults to an instance of the specified class' do
7
7
  foo_component_class = mock(Class)
8
8
  foo_component_class.should_receive(:new) \
9
- .with(:browser => :a_browser, :server_error_detection => :server_error_detection) \
9
+ .with(:browser => :a_browser, :server_error_detection => :server_error_detection,
10
+ :app_host => :a_url) \
10
11
  .and_return(:a_foo_component)
11
12
 
12
13
  ui_driver_class = Class.new(Kookaburra::UIDriver) do
13
14
  ui_component :foo, foo_component_class
14
15
  end
15
16
 
16
- ui = ui_driver_class.new(:browser => :a_browser, :server_error_detection => :server_error_detection)
17
+ ui = ui_driver_class.new(:browser => :a_browser, :server_error_detection => :server_error_detection,
18
+ :app_host => :a_url)
17
19
  ui.foo.should == :a_foo_component
18
20
  end
19
21
  end
@@ -21,6 +23,6 @@ describe Kookaburra::UIDriver do
21
23
  describe 'dependency accessors' do
22
24
  let(:subject_class) { Kookaburra::UIDriver }
23
25
 
24
- it_behaves_like :it_has_a_dependency_accessor, :test_data
26
+ it_behaves_like :it_has_a_dependency_accessor, :mental_model
25
27
  end
26
28
  end
@@ -2,47 +2,15 @@ require 'kookaburra'
2
2
 
3
3
  describe Kookaburra do
4
4
  describe '#given' do
5
- context 'without a :rack_app specified' do
6
- it 'returns an instance of the configured GivenDriver' do
7
- my_api_driver_class = mock(Class)
8
- my_api_driver_class.should_receive(:new) \
9
- .with(nil) \
10
- .and_return(:an_api_driver)
11
-
12
- my_given_driver_class = mock(Class)
13
- my_given_driver_class.should_receive(:new) do |options|
14
- options[:api].should == :an_api_driver
15
- :a_given_driver
16
- end
17
-
18
- k = Kookaburra.new(:given_driver_class => my_given_driver_class,
19
- :api_driver_class => my_api_driver_class)
20
- k.given.should == :a_given_driver
5
+ it 'returns an instance of the configured GivenDriver' do
6
+ my_given_driver_class = mock(Class)
7
+ my_given_driver_class.should_receive(:new) do |options|
8
+ options[:mental_model].should be_kind_of(Kookaburra::MentalModel)
9
+ :a_given_driver
21
10
  end
22
- end
23
-
24
- context 'with a :rack_app specified' do
25
- it 'returns an instance of the configured GivenDriver' do
26
- Kookaburra::RackDriver.should_receive(:new) \
27
- .with(:a_rack_app) \
28
- .and_return(:a_rack_driver)
29
11
 
30
- my_api_driver_class = mock(Class)
31
- my_api_driver_class.should_receive(:new) \
32
- .with(:a_rack_driver) \
33
- .and_return(:an_api_driver)
34
-
35
- my_given_driver_class = mock(Class)
36
- my_given_driver_class.should_receive(:new) do |options|
37
- options[:api].should == :an_api_driver
38
- :a_given_driver
39
- end
40
-
41
- k = Kookaburra.new(:given_driver_class => my_given_driver_class,
42
- :api_driver_class => my_api_driver_class,
43
- :rack_app => :a_rack_app)
44
- k.given.should == :a_given_driver
45
- end
12
+ k = Kookaburra.new(:given_driver_class => my_given_driver_class)
13
+ k.given.should == :a_given_driver
46
14
  end
47
15
  end
48
16
 
@@ -65,8 +33,8 @@ describe Kookaburra do
65
33
  it 'returns a equivalent copy of the test data collection specified' do
66
34
  k = Kookaburra.new
67
35
  foos = {:spam => 'ham'}
68
- test_data = stub(:foos => foos)
69
- k.stub!(:test_data => test_data)
36
+ mental_model = stub(:foos => foos)
37
+ k.stub!(:mental_model => mental_model)
70
38
  k.get_data(:foos).should == foos
71
39
  end
72
40
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kookaburra
3
3
  version: !ruby/object:Gem::Version
4
- hash: 81
4
+ hash: 79
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 18
9
- - 3
10
- version: 0.18.3
8
+ - 20
9
+ - 0
10
+ version: 0.20.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - John Wilger
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2012-03-18 00:00:00 Z
20
+ date: 2012-03-22 00:00:00 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  version_requirements: &id001 !ruby/object:Gem::Requirement
@@ -72,7 +72,7 @@ dependencies:
72
72
  segments:
73
73
  - 0
74
74
  version: "0"
75
- name: rack-test
75
+ name: patron
76
76
  prerelease: false
77
77
  type: :runtime
78
78
  requirement: *id004
@@ -216,18 +216,16 @@ files:
216
216
  - lib/kookaburra/exceptions.rb
217
217
  - lib/kookaburra/given_driver.rb
218
218
  - lib/kookaburra/json_api_driver.rb
219
+ - lib/kookaburra/mental_model.rb
219
220
  - lib/kookaburra/null_browser.rb
220
- - lib/kookaburra/rack_driver.rb
221
- - lib/kookaburra/test_data.rb
222
221
  - lib/kookaburra/test_helpers.rb
223
222
  - lib/kookaburra/ui_driver.rb
224
223
  - lib/kookaburra/ui_driver/ui_component.rb
225
- - lib/kookaburra/utils/active_record_shared_connection.rb
226
224
  - spec/integration/test_a_rack_application_spec.rb
225
+ - spec/kookaburra/api_driver_spec.rb
227
226
  - spec/kookaburra/json_api_driver_spec.rb
227
+ - spec/kookaburra/mental_model_spec.rb
228
228
  - spec/kookaburra/null_browser_spec.rb
229
- - spec/kookaburra/rack_driver_spec.rb
230
- - spec/kookaburra/test_data_spec.rb
231
229
  - spec/kookaburra/test_helpers_spec.rb
232
230
  - spec/kookaburra/ui_driver/ui_component_spec.rb
233
231
  - spec/kookaburra/ui_driver_spec.rb
@@ -1,109 +0,0 @@
1
- require 'kookaburra/exceptions'
2
- require 'rack/test'
3
-
4
- class Kookaburra
5
- # This is a small wrapper around the `Rack::Test::Methods` which is used by
6
- # your {APIDriver}.
7
- class RackDriver
8
- include Rack::Test::Methods
9
-
10
- # This is the Rack application instance
11
- attr_reader :app
12
-
13
- # @param [#call] rack_app The Rack application object for the application under test
14
- def initialize(rack_app)
15
- @app = rack_app
16
- end
17
-
18
- # Sends a POST request to the application.
19
- #
20
- # Similar to `Rack::Test::Methods#post` except that it adds more convenient
21
- # access to setting request headers, it raises an exception if the response
22
- # status is not 201, and it returns the response body.
23
- #
24
- # @param [String] path The path portion of the URI to request from the
25
- # application
26
- # @param [Object] params The request params or body
27
- # @param [Hash] headers A hash of any additional HTTP headers to be set on
28
- # the request.
29
- # @param [Hash] env Additional environment variables that should be present
30
- # on the request.
31
- # @yield [Rack::Response] Yields the last response to the block if a
32
- # block is given.
33
- def post(path, params = {}, headers = {}, env = {}, &block)
34
- set_headers(headers)
35
- super path, params, env, &block
36
- check_response_status!(:post, 201, path)
37
- last_response.body
38
- end
39
-
40
- # Sends a PUT request to the application.
41
- #
42
- # Similar to `Rack::Test::Methods#put` except that it adds more convenient
43
- # access to setting request headers, it raises an exception if the response
44
- # status is not 200, and it returns the response body.
45
- #
46
- # @param [String] path The path portion of the URI to request from the
47
- # application
48
- # @param [Object] params The request params or body
49
- # @param [Hash] headers A hash of any additional HTTP headers to be set on
50
- # the request.
51
- # @param [Hash] env Additional environment variables that should be present
52
- # on the request.
53
- # @yield [Rack::Response] Yields the last response to the block if a
54
- # block is given.
55
- def put(path, params = {}, headers = {}, env = {}, &block)
56
- set_headers(headers)
57
- super path, params, env, &block
58
- check_response_status!(:put, 200, path)
59
- last_response.body
60
- end
61
-
62
- # Sends a GET request to the application.
63
- #
64
- # Similar to `Rack::Test::Methods#get` except that it adds more convenient
65
- # access to setting request headers, it raises an exception if the response
66
- # status is not 200, and it returns the response body.
67
- #
68
- # @param [String] path The path portion of the URI to request from the
69
- # application
70
- # @param [Object] params The request params or body
71
- # @param [Hash] headers A hash of any additional HTTP headers to be set on
72
- # the request.
73
- # @param [Hash] env Additional environment variables that should be present
74
- # on the request.
75
- # @yield [Rack::Response] Yields the last response to the block if a
76
- # block is given.
77
- def get(path, params = {}, headers = {}, env = {}, &block)
78
- set_headers(headers)
79
- super path, params, env, &block
80
- check_response_status!(:get, 200, path)
81
- last_response.body
82
- end
83
-
84
- private
85
-
86
- def check_response_status!(verb, expected_status, path)
87
- actual_status = response_status
88
- unless actual_status == expected_status
89
- raise UnexpectedResponse,
90
- "#{verb} to #{path} unexpectedly responded with an HTTP status of #{actual_status}:\n" \
91
- + response_body
92
- end
93
- end
94
-
95
- def response_status
96
- last_response.status
97
- end
98
-
99
- def response_body
100
- last_response.body
101
- end
102
-
103
- def set_headers(headers)
104
- headers.each do |name, value|
105
- header name, value
106
- end
107
- end
108
- end
109
- end