capybara-mechanize 0.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/README.mdown +51 -0
- data/lib/capybara/driver/mechanize.rb +67 -0
- data/lib/capybara/mechanize.rb +1 -0
- data/lib/capybara/mechanize/cucumber.rb +5 -0
- data/spec/driver/mechanize_spec.rb +60 -0
- data/spec/session/mechanize_spec.rb +34 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +19 -0
- metadata +121 -0
data/README.mdown
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
Capybara-mechanize
|
2
|
+
==================
|
3
|
+
|
4
|
+
This gems makes it possible to use Capybara for (partially) remote testing. It inherits most functionality from the RackTest driver and only uses [Mechanize](http://github.com/tenderlove/mechanize) for remote requests.
|
5
|
+
|
6
|
+
It is currently in use to test the integration between a Rails application and Twitter authorization and sharing.
|
7
|
+
|
8
|
+
This gem is a [Capybara](http://github.com/jnicklas/capybara) extension. I have been inspired by the Capybara driver and some earlier efforts for a Mechanize driver.
|
9
|
+
|
10
|
+
Thanks to [Pinkelstar](http://www.pinkelstar.com) for giving me the time and the need to develop this gem.
|
11
|
+
|
12
|
+
### Installation
|
13
|
+
|
14
|
+
gem install capybara-mechanize
|
15
|
+
|
16
|
+
### Usage without Cucumber
|
17
|
+
|
18
|
+
require 'capybara/mechanize'
|
19
|
+
|
20
|
+
### Usage with Cucumber and tags
|
21
|
+
|
22
|
+
A @mechanize tag is added to your hooks when you add the following line to your env.rb
|
23
|
+
|
24
|
+
require 'capybara/mechanize/cucumber'
|
25
|
+
|
26
|
+
The following scenario will then be using the Mechanize driver
|
27
|
+
|
28
|
+
@mechanize
|
29
|
+
Scenario: do something remote
|
30
|
+
When I click the remote link
|
31
|
+
|
32
|
+
Todo
|
33
|
+
----
|
34
|
+
* Make the redirect specs pass
|
35
|
+
* Add specs for local to remote redirect (functionality is there though and works in our case)
|
36
|
+
* Test this driver with non-rack/non-ruby projects
|
37
|
+
|
38
|
+
Note on Patches/Pull Requests
|
39
|
+
-----------------------------
|
40
|
+
|
41
|
+
* Fork the project.
|
42
|
+
* Make your feature addition or bug fix.
|
43
|
+
* Add tests for it. This is important so I don't break it in a
|
44
|
+
future version unintentionally.
|
45
|
+
* Commit, do not mess with rakefile, version, or history.
|
46
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
47
|
+
* Send me a pull request. Bonus points for topic branches.
|
48
|
+
|
49
|
+
Copyright
|
50
|
+
---------
|
51
|
+
Copyright (c) 2010 Jeroen van Dijk. See LICENSE for details.
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'mechanize'
|
2
|
+
|
3
|
+
class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
super
|
7
|
+
@agent = ::Mechanize.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def visit(url)
|
11
|
+
get url
|
12
|
+
end
|
13
|
+
|
14
|
+
def response
|
15
|
+
response_proxy || super
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(url, params = {}, headers = {})
|
19
|
+
process_remote_request(:get, url) || super
|
20
|
+
end
|
21
|
+
|
22
|
+
def post(url, params = {}, headers = {})
|
23
|
+
process_remote_request(:post, url, params, headers) || super
|
24
|
+
end
|
25
|
+
|
26
|
+
def remote?(url)
|
27
|
+
if !Capybara.app_host.nil?
|
28
|
+
true
|
29
|
+
elsif Capybara.default_host.nil?
|
30
|
+
false
|
31
|
+
else
|
32
|
+
host = URI.parse(url).host
|
33
|
+
!(host.nil? || host.include?(Capybara.default_host))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def process_remote_request(method, url, *options)
|
40
|
+
if remote?(url)
|
41
|
+
reset_cache
|
42
|
+
@agent.send *( [method, url] + options)
|
43
|
+
follow_redirects!
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def response_proxy
|
49
|
+
ResponseProxy.new(@agent.current_page) if @agent.current_page
|
50
|
+
end
|
51
|
+
|
52
|
+
class ResponseProxy
|
53
|
+
def initialize(page)
|
54
|
+
@page = page
|
55
|
+
end
|
56
|
+
|
57
|
+
def redirect?
|
58
|
+
%w(301 302).include?(@page.code)
|
59
|
+
end
|
60
|
+
|
61
|
+
def method_missing(method, *args, &block)
|
62
|
+
@page.send(method, *args, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'capybara/driver/mechanize'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Capybara::Driver::Mechanize do
|
4
|
+
before do
|
5
|
+
@driver = Capybara::Driver::Mechanize.new(TestApp)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should throw an error when no rack app is given" do
|
9
|
+
running do
|
10
|
+
Capybara::Driver::Mechanize.new(nil)
|
11
|
+
end.should raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
|
14
|
+
it_should_behave_like "driver"
|
15
|
+
it_should_behave_like "driver with header support"
|
16
|
+
it_should_behave_like "driver with status code support"
|
17
|
+
it_should_behave_like "driver with cookies support"
|
18
|
+
|
19
|
+
# Pending:
|
20
|
+
# it_should_behave_like "driver with infinite redirect detection"
|
21
|
+
|
22
|
+
|
23
|
+
it "should default to local mode" do
|
24
|
+
@driver.remote?('http://www.local.com').should be false
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with an app_host" do
|
28
|
+
|
29
|
+
before do
|
30
|
+
Capybara.app_host = 'remote.com'
|
31
|
+
end
|
32
|
+
|
33
|
+
after do
|
34
|
+
Capybara.app_host = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should treat urls as remote" do
|
38
|
+
@driver.remote?('http://www.remote.com').should be true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "with a default url, no app host" do
|
43
|
+
before :each do
|
44
|
+
Capybara.default_host = 'local.com'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should treat urls with the same host names as local" do
|
48
|
+
@driver.remote?('http://www.local.com').should be false
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should treat other urls as remote" do
|
52
|
+
@driver.remote?('http://www.remote.com').should be true
|
53
|
+
end
|
54
|
+
|
55
|
+
after :each do
|
56
|
+
Capybara.default_host = nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Capybara::Session do
|
4
|
+
context 'with mechanize driver' do
|
5
|
+
before do
|
6
|
+
@session = Capybara::Session.new(:mechanize, TestApp)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#driver' do
|
10
|
+
it "should be a mechanize driver" do
|
11
|
+
@session.driver.should be_an_instance_of(Capybara::Driver::Mechanize)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#mode' do
|
16
|
+
it "should remember the mode" do
|
17
|
+
@session.mode.should == :mechanize
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#click_link' do
|
22
|
+
it "should use data-method if available" do
|
23
|
+
@session.visit "/with_html"
|
24
|
+
@session.click_link "A link with data-method"
|
25
|
+
@session.body.should == 'The requested object was deleted'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it_should_behave_like "session"
|
30
|
+
it_should_behave_like "session without javascript support"
|
31
|
+
it_should_behave_like "session with headers support"
|
32
|
+
it_should_behave_like "session with status code support"
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --backtrace
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'capybara'
|
2
|
+
require 'capybara/mechanize'
|
3
|
+
|
4
|
+
require 'sinatra'
|
5
|
+
require 'spec'
|
6
|
+
|
7
|
+
# TODO move this stuff into capybara
|
8
|
+
require 'capybara/spec/driver'
|
9
|
+
require 'capybara/spec/session'
|
10
|
+
|
11
|
+
alias :running :lambda
|
12
|
+
|
13
|
+
Capybara.default_wait_time = 0 # less timeout so tests run faster
|
14
|
+
|
15
|
+
Spec::Runner.configure do |config|
|
16
|
+
config.after do
|
17
|
+
Capybara.default_selector = :xpath
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capybara-mechanize
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jeroen van Dijk
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-12 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mechanize
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: capybara
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 1
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 3
|
49
|
+
- 9
|
50
|
+
version: 0.3.9
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - "="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 27
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 3
|
65
|
+
- 0
|
66
|
+
version: 1.3.0
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: RackTest driver for Capybara, but with remote request support thanks to mechanize
|
70
|
+
email: jeroen@jeevidee.nl
|
71
|
+
executables: []
|
72
|
+
|
73
|
+
extensions: []
|
74
|
+
|
75
|
+
extra_rdoc_files: []
|
76
|
+
|
77
|
+
files:
|
78
|
+
- lib/capybara/driver/mechanize.rb
|
79
|
+
- lib/capybara/mechanize/cucumber.rb
|
80
|
+
- lib/capybara/mechanize.rb
|
81
|
+
- spec/driver/mechanize_spec.rb
|
82
|
+
- spec/session/mechanize_spec.rb
|
83
|
+
- spec/spec.opts
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
- README.mdown
|
86
|
+
has_rdoc: true
|
87
|
+
homepage: http://github.com/jeroenvandijk/capybara-mechanize
|
88
|
+
licenses: []
|
89
|
+
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options:
|
92
|
+
- --charset=UTF-8
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 3
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
requirements: []
|
114
|
+
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 1.3.7
|
117
|
+
signing_key:
|
118
|
+
specification_version: 3
|
119
|
+
summary: RackTest driver for Capybara with remote request support
|
120
|
+
test_files: []
|
121
|
+
|