kookaburra 0.16.1 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/kookaburra.gemspec +3 -3
- data/lib/kookaburra/json_api_driver.rb +16 -2
- data/lib/kookaburra/rack_driver.rb +44 -0
- data/spec/kookaburra/json_api_driver_spec.rb +19 -17
- data/spec/kookaburra/rack_driver_spec.rb +29 -23
- data/spec/kookaburra_integration_spec.rb +9 -9
- metadata +6 -5
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ Jeweler::Tasks.new do |gem|
|
|
20
20
|
gem.summary = %Q{WindowDriver testing pattern for Ruby apps}
|
21
21
|
gem.description = %Q{Cucumber + Capybara = Kookaburra? It made sense at the time.}
|
22
22
|
gem.email = "johnwilger@gmail.com"
|
23
|
-
gem.authors = ["John Wilger", "Sam Livingston-Gray"]
|
23
|
+
gem.authors = ["John Wilger", "Sam Livingston-Gray", "Ravi Gadad"]
|
24
24
|
# dependencies defined in Gemfile
|
25
25
|
end
|
26
26
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.17.0
|
data/kookaburra.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "kookaburra"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.17.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["John Wilger", "Sam Livingston-Gray"]
|
12
|
-
s.date = "2012-03-
|
11
|
+
s.authors = ["John Wilger", "Sam Livingston-Gray", "Ravi Gadad"]
|
12
|
+
s.date = "2012-03-16"
|
13
13
|
s.description = "Cucumber + Capybara = Kookaburra? It made sense at the time."
|
14
14
|
s.email = "johnwilger@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -65,12 +65,26 @@ class Kookaburra
|
|
65
65
|
# api.create_widget(:name => 'Foo')
|
66
66
|
# #=> {:id => 1, :name => 'Foo', :description => ''}
|
67
67
|
def post(path, data)
|
68
|
+
do_json_request(:post, path, data)
|
69
|
+
end
|
70
|
+
|
71
|
+
def put(path, data)
|
72
|
+
do_json_request(:put, path, data)
|
73
|
+
end
|
74
|
+
|
75
|
+
def get(path, data)
|
76
|
+
do_json_request(:get, path, data)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def do_json_request(method, path, data)
|
68
82
|
json_request_headers = {
|
69
83
|
'Content-Type' => 'application/json',
|
70
84
|
'Accept' => 'application/json'
|
71
85
|
}
|
72
|
-
response = @app_driver.
|
73
|
-
J.decode(response)
|
86
|
+
response = @app_driver.send(method.to_sym, path, J.encode(data), json_request_headers)
|
87
|
+
J.decode(response)
|
74
88
|
end
|
75
89
|
end
|
76
90
|
end
|
@@ -37,6 +37,50 @@ class Kookaburra
|
|
37
37
|
last_response.body
|
38
38
|
end
|
39
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
|
+
|
40
84
|
private
|
41
85
|
|
42
86
|
def check_response_status!(verb, expected_status, path)
|
@@ -1,24 +1,26 @@
|
|
1
1
|
require 'kookaburra/json_api_driver'
|
2
2
|
|
3
3
|
describe Kookaburra::JsonApiDriver do
|
4
|
-
describe '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -5,32 +5,38 @@ describe Kookaburra::RackDriver do
|
|
5
5
|
Kookaburra::RackDriver.should include(Rack::Test::Methods)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
{
|
9
|
+
'post' => {:success => 201, :unexpected => 200},
|
10
|
+
'put' => {:success => 200, :unexpected => 404},
|
11
|
+
'get' => {:success => 200, :unexpected => 404}
|
12
|
+
}.each_pair do |method, codes|
|
13
|
+
describe "##{method}" do
|
14
|
+
it 'returns the response body' do
|
15
|
+
app = stub('Rack App', :call => [codes[:success], {}, 'response body'])
|
16
|
+
driver = Kookaburra::RackDriver.new(app)
|
17
|
+
driver.send(method.to_sym, '/foo', 'req body').should == 'response body'
|
18
|
+
end
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
it 'sets the specified headers on the request' do
|
21
|
+
app = mock('Rack App')
|
22
|
+
driver = Kookaburra::RackDriver.new(app)
|
23
|
+
app.should_receive(:call) do |env|
|
24
|
+
env['HTTP_HEADER_A'].should == 'foo'
|
25
|
+
env['HTTP_HEADER_B'].should == 'bar'
|
26
|
+
[codes[:success], {}, 'foo']
|
27
|
+
end
|
28
|
+
driver.send(method.to_sym, '/foo', 'req body', 'header-a' => 'foo', 'header-b' => 'bar')
|
22
29
|
end
|
23
|
-
driver.post('/foo', 'req body', 'header-a' => 'foo', 'header-b' => 'bar')
|
24
|
-
end
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
it "raises a Kookabura::UnexpectedResponse if response status is not #{codes[:success]}" do
|
32
|
+
app_response = [codes[:unexpected], {'Content-Type' => 'application/json'}, 'Here is the response body']
|
33
|
+
app = stub('Rack App', :call => app_response)
|
34
|
+
driver = Kookaburra::RackDriver.new(app)
|
35
|
+
lambda { driver.send(method, '/foo', {:bar => :baz}) } \
|
36
|
+
.should raise_error(Kookaburra::UnexpectedResponse,
|
37
|
+
"#{method} to /foo unexpectedly responded with an HTTP status of #{codes[:unexpected]}:\n" \
|
38
|
+
+ 'Here is the response body')
|
39
|
+
end
|
34
40
|
end
|
35
41
|
end
|
36
42
|
end
|
@@ -20,13 +20,13 @@ describe 'Kookaburra Integration' do
|
|
20
20
|
|
21
21
|
class MyGivenDriver < Kookaburra::GivenDriver
|
22
22
|
def a_user(name)
|
23
|
-
user = {
|
23
|
+
user = {'email' => 'bob@example.com', 'password' => '12345'}
|
24
24
|
result = api.create_user(user)
|
25
25
|
test_data.users[name] = result
|
26
26
|
end
|
27
27
|
|
28
28
|
def a_widget(name, attributes = {})
|
29
|
-
widget = {
|
29
|
+
widget = {'name' => 'Foo'}.merge(attributes)
|
30
30
|
result = api.create_widget(widget)
|
31
31
|
test_data.widgets[name] = result
|
32
32
|
end
|
@@ -42,8 +42,8 @@ describe 'Kookaburra Integration' do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def sign_in(user_data)
|
45
|
-
fill_in 'Email:', :with => user_data[
|
46
|
-
fill_in 'Password:', :with => user_data[
|
45
|
+
fill_in 'Email:', :with => user_data['email']
|
46
|
+
fill_in 'Password:', :with => user_data['password']
|
47
47
|
click_button 'Sign In'
|
48
48
|
end
|
49
49
|
end
|
@@ -73,15 +73,15 @@ describe 'Kookaburra Integration' do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def choose_to_delete_widget(widget_data)
|
76
|
-
find("#delete_#{widget_data[
|
76
|
+
find("#delete_#{widget_data['id']}").click_button('Delete')
|
77
77
|
end
|
78
78
|
|
79
79
|
private
|
80
80
|
|
81
81
|
def extract_widget_data(element)
|
82
82
|
{
|
83
|
-
|
84
|
-
|
83
|
+
'id' => element.find('.id').text,
|
84
|
+
'name' => element.find('.name').text
|
85
85
|
}
|
86
86
|
end
|
87
87
|
end
|
@@ -92,7 +92,7 @@ describe 'Kookaburra Integration' do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def submit(widget_data)
|
95
|
-
fill_in 'Name:', :with => widget_data[
|
95
|
+
fill_in 'Name:', :with => widget_data['name']
|
96
96
|
click_on 'Save'
|
97
97
|
end
|
98
98
|
end
|
@@ -110,7 +110,7 @@ describe 'Kookaburra Integration' do
|
|
110
110
|
def create_new_widget(name, attributes = {})
|
111
111
|
widget_list.show
|
112
112
|
widget_list.choose_to_create_new_widget
|
113
|
-
widget_form.submit(
|
113
|
+
widget_form.submit('name' => 'My Widget')
|
114
114
|
test_data.widgets[name] = widget_list.last_widget_created
|
115
115
|
end
|
116
116
|
|
metadata
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kookaburra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 91
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 17
|
9
|
+
- 0
|
10
|
+
version: 0.17.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Wilger
|
14
14
|
- Sam Livingston-Gray
|
15
|
+
- Ravi Gadad
|
15
16
|
autorequire:
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2012-03-
|
20
|
+
date: 2012-03-16 00:00:00 Z
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|