capybara 1.1.4 → 2.0.0.beta2
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/History.txt +100 -0
- data/License.txt +22 -0
- data/README.md +829 -0
- data/lib/capybara.rb +124 -6
- data/lib/capybara/cucumber.rb +2 -5
- data/lib/capybara/driver/base.rb +5 -5
- data/lib/capybara/driver/node.rb +2 -2
- data/lib/capybara/dsl.rb +3 -121
- data/lib/capybara/node/actions.rb +12 -28
- data/lib/capybara/node/base.rb +5 -13
- data/lib/capybara/node/element.rb +21 -21
- data/lib/capybara/node/finders.rb +27 -89
- data/lib/capybara/node/matchers.rb +107 -69
- data/lib/capybara/node/simple.rb +11 -13
- data/lib/capybara/query.rb +78 -0
- data/lib/capybara/rack_test/browser.rb +16 -27
- data/lib/capybara/rack_test/driver.rb +11 -1
- data/lib/capybara/rack_test/node.rb +17 -1
- data/lib/capybara/result.rb +84 -0
- data/lib/capybara/rspec/matchers.rb +28 -63
- data/lib/capybara/selector.rb +97 -33
- data/lib/capybara/selenium/driver.rb +14 -61
- data/lib/capybara/selenium/node.rb +6 -15
- data/lib/capybara/server.rb +32 -27
- data/lib/capybara/session.rb +54 -30
- data/lib/capybara/spec/public/jquery-ui.js +791 -0
- data/lib/capybara/spec/public/jquery.js +9046 -0
- data/lib/capybara/spec/public/test.js +4 -1
- data/lib/capybara/spec/session.rb +56 -27
- data/lib/capybara/spec/session/all_spec.rb +8 -4
- data/lib/capybara/spec/session/attach_file_spec.rb +12 -9
- data/lib/capybara/spec/session/check_spec.rb +6 -3
- data/lib/capybara/spec/session/choose_spec.rb +4 -1
- data/lib/capybara/spec/session/click_button_spec.rb +5 -14
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +2 -1
- data/lib/capybara/spec/session/click_link_spec.rb +3 -17
- data/lib/capybara/spec/session/current_url_spec.rb +77 -9
- data/lib/capybara/spec/session/fill_in_spec.rb +8 -18
- data/lib/capybara/spec/session/find_spec.rb +19 -46
- data/lib/capybara/spec/session/first_spec.rb +2 -34
- data/lib/capybara/spec/session/has_css_spec.rb +1 -1
- data/lib/capybara/spec/session/has_field_spec.rb +28 -0
- data/lib/capybara/spec/session/has_select_spec.rb +84 -31
- data/lib/capybara/spec/session/has_table_spec.rb +7 -69
- data/lib/capybara/spec/session/has_text_spec.rb +168 -0
- data/lib/capybara/spec/session/javascript.rb +65 -81
- data/lib/capybara/spec/session/node_spec.rb +115 -0
- data/lib/capybara/spec/session/screenshot.rb +29 -0
- data/lib/capybara/spec/session/select_spec.rb +12 -12
- data/lib/capybara/spec/session/text_spec.rb +9 -4
- data/lib/capybara/spec/session/unselect_spec.rb +12 -6
- data/lib/capybara/spec/session/visit_spec.rb +76 -0
- data/lib/capybara/spec/session/within_frame_spec.rb +33 -0
- data/lib/capybara/spec/session/within_spec.rb +47 -58
- data/lib/capybara/spec/session/within_window_spec.rb +40 -0
- data/lib/capybara/spec/test_app.rb +27 -3
- data/lib/capybara/spec/views/form.erb +11 -10
- data/lib/capybara/spec/views/host_links.erb +2 -2
- data/lib/capybara/spec/views/tables.erb +6 -66
- data/lib/capybara/spec/views/with_html.erb +3 -3
- data/lib/capybara/spec/views/with_js.erb +11 -8
- data/lib/capybara/util/save_and_open_page.rb +4 -3
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +15 -3
- data/spec/dsl_spec.rb +12 -10
- data/spec/rack_test_spec.rb +152 -0
- data/spec/rspec/features_spec.rb +0 -2
- data/spec/rspec/matchers_spec.rb +164 -89
- data/spec/rspec_spec.rb +0 -2
- data/spec/selenium_spec.rb +67 -0
- data/spec/server_spec.rb +35 -23
- data/spec/spec_helper.rb +18 -2
- metadata +30 -30
- data/README.rdoc +0 -722
- data/lib/capybara/spec/driver.rb +0 -301
- data/lib/capybara/spec/session/current_host_spec.rb +0 -68
- data/lib/capybara/spec/session/has_content_spec.rb +0 -106
- data/lib/capybara/util/timeout.rb +0 -27
- data/spec/driver/rack_test_driver_spec.rb +0 -89
- data/spec/driver/selenium_driver_spec.rb +0 -37
- data/spec/session/rack_test_session_spec.rb +0 -55
- data/spec/session/selenium_session_spec.rb +0 -26
- data/spec/string_spec.rb +0 -77
- data/spec/timeout_spec.rb +0 -28
@@ -27,6 +27,9 @@ $(function() {
|
|
27
27
|
$('#with_focus_event').focus(function() {
|
28
28
|
$('body').append('<p id="focus_event_triggered">Focus Event triggered</p>');
|
29
29
|
});
|
30
|
+
$('#with_change_event').change(function() {
|
31
|
+
if($(this).val() == '') $(this).val("Can't be empty");
|
32
|
+
});
|
30
33
|
$('#checkbox_with_event').click(function() {
|
31
34
|
$('body').append('<p id="checkbox_event_triggered">Checkbox event triggered</p>');
|
32
35
|
});
|
@@ -37,7 +40,7 @@ $(function() {
|
|
37
40
|
});
|
38
41
|
$('#reload-link').click(function() {
|
39
42
|
setTimeout(function() {
|
40
|
-
$('#reload-me').replaceWith('<div id="reload-me"><em><a>
|
43
|
+
$('#reload-me').replaceWith('<div id="reload-me"><em><a>RELOADED</a></em></div>');
|
41
44
|
}, 250)
|
42
45
|
});
|
43
46
|
$('#reload-list').click(function() {
|
@@ -3,30 +3,56 @@ require 'nokogiri'
|
|
3
3
|
|
4
4
|
Dir[File.dirname(__FILE__)+'/session/*'].each { |group| require group }
|
5
5
|
|
6
|
+
module Quietly
|
7
|
+
def silence_stream(stream)
|
8
|
+
old_stream = stream.dup
|
9
|
+
stream.reopen(RbConfig::CONFIG['host_os'] =~ /rmswin|mingw/ ? 'NUL:' : '/dev/null')
|
10
|
+
stream.sync = true
|
11
|
+
yield
|
12
|
+
ensure
|
13
|
+
stream.reopen(old_stream)
|
14
|
+
end
|
15
|
+
|
16
|
+
def quietly
|
17
|
+
silence_stream(STDOUT) do
|
18
|
+
silence_stream(STDERR) do
|
19
|
+
yield
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
6
25
|
shared_examples_for "session" do
|
7
26
|
def extract_results(session)
|
8
|
-
YAML.load Nokogiri::HTML(session.body).xpath("//pre[@id='results']").first.text
|
27
|
+
YAML.load Nokogiri::HTML(session.body).xpath("//pre[@id='results']").first.text.lstrip
|
9
28
|
end
|
10
29
|
|
30
|
+
include Quietly
|
31
|
+
|
11
32
|
after do
|
12
33
|
@session.reset_session!
|
13
34
|
end
|
14
35
|
|
15
|
-
describe '#visit' do
|
16
|
-
it "should fetch a response from the driver" do
|
17
|
-
@session.visit('/')
|
18
|
-
@session.body.should include('Hello world!')
|
19
|
-
@session.visit('/foo')
|
20
|
-
@session.body.should include('Another World')
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
36
|
describe '#body' do
|
25
37
|
it "should return the unmodified page body" do
|
26
38
|
@session.visit('/')
|
27
39
|
@session.body.should include('Hello world!')
|
28
40
|
end
|
29
|
-
|
41
|
+
|
42
|
+
if "".respond_to?(:encoding)
|
43
|
+
context "encoding of response between ascii and utf8" do
|
44
|
+
it "should be valid with html entities" do
|
45
|
+
@session.visit('/with_html_entities')
|
46
|
+
lambda { @session.body.encode!("UTF-8") }.should_not raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be valid without html entities" do
|
50
|
+
@session.visit('/with_html')
|
51
|
+
lambda { @session.body.encode!("UTF-8") }.should_not raise_error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
30
56
|
|
31
57
|
describe '#html' do
|
32
58
|
it "should return the unmodified page body" do
|
@@ -34,7 +60,7 @@ shared_examples_for "session" do
|
|
34
60
|
# method(:html) == method(:body) because these shared examples get run
|
35
61
|
# against the DSL, which uses forwarding methods. So we test behavior.
|
36
62
|
@session.visit('/')
|
37
|
-
@session.
|
63
|
+
@session.html.should include('Hello world!')
|
38
64
|
end
|
39
65
|
end
|
40
66
|
|
@@ -56,19 +82,15 @@ shared_examples_for "session" do
|
|
56
82
|
@session.body.should_not include('test_cookie')
|
57
83
|
end
|
58
84
|
|
59
|
-
it "resets current host" do
|
60
|
-
@session.visit
|
61
|
-
@session.
|
85
|
+
it "resets current url, host, path" do
|
86
|
+
@session.visit '/foo'
|
87
|
+
@session.current_url.should_not be_empty
|
88
|
+
@session.current_host.should_not be_empty
|
89
|
+
@session.current_path.should == '/foo'
|
62
90
|
|
63
91
|
@session.reset_session!
|
92
|
+
[nil, '', 'about:blank'].should include @session.current_url
|
64
93
|
@session.current_host.should be_nil
|
65
|
-
end
|
66
|
-
|
67
|
-
it "resets current path" do
|
68
|
-
@session.visit('/with_html')
|
69
|
-
@session.current_path.should == '/with_html'
|
70
|
-
|
71
|
-
@session.reset_session!
|
72
94
|
@session.current_path.should be_nil
|
73
95
|
end
|
74
96
|
|
@@ -81,8 +103,19 @@ shared_examples_for "session" do
|
|
81
103
|
@session.body.should_not include('This is a test')
|
82
104
|
@session.should have_no_selector('.//h1')
|
83
105
|
end
|
106
|
+
|
107
|
+
it "raises any errors caught inside the server" do
|
108
|
+
expect do
|
109
|
+
quietly { @session.visit("/error") }
|
110
|
+
@session.reset_session!
|
111
|
+
end.to raise_error(TestApp::TestAppError)
|
112
|
+
@session.visit("/")
|
113
|
+
@session.current_path.should == "/"
|
114
|
+
end
|
84
115
|
end
|
85
116
|
|
117
|
+
it_should_behave_like "node"
|
118
|
+
it_should_behave_like "visit"
|
86
119
|
it_should_behave_like "all"
|
87
120
|
it_should_behave_like "first"
|
88
121
|
it_should_behave_like "attach_file"
|
@@ -97,8 +130,7 @@ shared_examples_for "session" do
|
|
97
130
|
it_should_behave_like "find_link"
|
98
131
|
it_should_behave_like "find_by_id"
|
99
132
|
it_should_behave_like "find"
|
100
|
-
it_should_behave_like "
|
101
|
-
it_should_behave_like "has_css"
|
133
|
+
it_should_behave_like "has_text"
|
102
134
|
it_should_behave_like "has_css"
|
103
135
|
it_should_behave_like "has_selector"
|
104
136
|
it_should_behave_like "has_xpath"
|
@@ -113,7 +145,6 @@ shared_examples_for "session" do
|
|
113
145
|
it_should_behave_like "unselect"
|
114
146
|
it_should_behave_like "within"
|
115
147
|
it_should_behave_like "current_url"
|
116
|
-
it_should_behave_like "current_host"
|
117
148
|
|
118
149
|
it "should encode complex field names, like array[][value]" do
|
119
150
|
@session.visit('/form')
|
@@ -139,10 +170,8 @@ shared_examples_for "session" do
|
|
139
170
|
addresses[1]["city"].should == 'Mikolaiv'
|
140
171
|
addresses[1]["country"].should == 'Ukraine'
|
141
172
|
end
|
142
|
-
|
143
173
|
end
|
144
174
|
|
145
|
-
|
146
175
|
describe Capybara::Session do
|
147
176
|
context 'with non-existant driver' do
|
148
177
|
it "should raise an error" do
|
@@ -21,6 +21,10 @@ shared_examples_for "all" do
|
|
21
21
|
@result.should include('Smith', 'John', 'John Smith')
|
22
22
|
end
|
23
23
|
|
24
|
+
it "should raise an error when given invalid options" do
|
25
|
+
expect { @session.all('//p', :schmoo => "foo") }.to raise_error(ArgumentError)
|
26
|
+
end
|
27
|
+
|
24
28
|
context "with css selectors" do
|
25
29
|
it "should find all elements using the given selector" do
|
26
30
|
@session.all(:css, 'h1').first.text.should == 'This is a test'
|
@@ -51,15 +55,15 @@ shared_examples_for "all" do
|
|
51
55
|
context "with visible filter" do
|
52
56
|
after { Capybara.ignore_hidden_elements = false }
|
53
57
|
it "should only find visible nodes" do
|
54
|
-
@session.all("
|
55
|
-
@session.all("
|
58
|
+
@session.all(:css, "a.simple").should have(2).elements
|
59
|
+
@session.all(:css, "a.simple", :visible => true).should have(1).elements
|
56
60
|
Capybara.ignore_hidden_elements = true
|
57
|
-
@session.all("
|
61
|
+
@session.all(:css, "a.simple").should have(1).elements
|
58
62
|
end
|
59
63
|
|
60
64
|
it "should only find invisible nodes" do
|
61
65
|
Capybara.ignore_hidden_elements = true
|
62
|
-
@session.all("
|
66
|
+
@session.all(:css, "a.simple", :visible => false).should have(2).elements
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
@@ -24,30 +24,30 @@ shared_examples_for "attach_file" do
|
|
24
24
|
context "with multipart form" do
|
25
25
|
it "should set a file path by id" do
|
26
26
|
@session.attach_file "form_document", @test_file_path
|
27
|
-
@session.click_button('Upload')
|
27
|
+
@session.click_button('Upload Single')
|
28
28
|
@session.body.should include(File.read(@test_file_path))
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should set a file path by label" do
|
32
|
-
@session.attach_file "Document", @test_file_path
|
33
|
-
@session.click_button('Upload')
|
32
|
+
@session.attach_file "Single Document", @test_file_path
|
33
|
+
@session.click_button('Upload Single')
|
34
34
|
@session.body.should include(File.read(@test_file_path))
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should not break if no file is submitted" do
|
38
|
-
@session.click_button('Upload')
|
38
|
+
@session.click_button('Upload Single')
|
39
39
|
@session.body.should include('No file uploaded')
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should send content type text/plain when uploading a text file" do
|
43
|
-
@session.attach_file "Document", @test_file_path
|
44
|
-
@session.click_button 'Upload'
|
43
|
+
@session.attach_file "Single Document", @test_file_path
|
44
|
+
@session.click_button 'Upload Single'
|
45
45
|
@session.body.should include('text/plain')
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should send content type image/jpeg when uploading an image" do
|
49
|
-
@session.attach_file "Document", @test_jpg_file_path
|
50
|
-
@session.click_button 'Upload'
|
49
|
+
@session.attach_file "Single Document", @test_jpg_file_path
|
50
|
+
@session.click_button 'Upload Single'
|
51
51
|
@session.body.should include('image/jpeg')
|
52
52
|
end
|
53
53
|
|
@@ -60,7 +60,10 @@ shared_examples_for "attach_file" do
|
|
60
60
|
|
61
61
|
context "with a locator that doesn't exist" do
|
62
62
|
it "should raise an error" do
|
63
|
-
|
63
|
+
msg = "Unable to find file field \"does not exist\""
|
64
|
+
running do
|
65
|
+
@session.attach_file('does not exist', @test_file_path)
|
66
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
@@ -4,13 +4,13 @@ shared_examples_for "check" do
|
|
4
4
|
before do
|
5
5
|
@session.visit('/form')
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
describe "'checked' attribute" do
|
9
9
|
it "should be true if checked" do
|
10
10
|
@session.check("Terms of Use")
|
11
11
|
@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked'].should be_true
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "should be false if unchecked" do
|
15
15
|
@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked'].should be_false
|
16
16
|
end
|
@@ -58,7 +58,10 @@ shared_examples_for "check" do
|
|
58
58
|
|
59
59
|
context "with a locator that doesn't exist" do
|
60
60
|
it "should raise an error" do
|
61
|
-
|
61
|
+
msg = "Unable to find checkbox \"does not exist\""
|
62
|
+
running do
|
63
|
+
@session.check('does not exist')
|
64
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
62
65
|
end
|
63
66
|
end
|
64
67
|
end
|
@@ -19,7 +19,10 @@ shared_examples_for "choose" do
|
|
19
19
|
|
20
20
|
context "with a locator that doesn't exist" do
|
21
21
|
it "should raise an error" do
|
22
|
-
|
22
|
+
msg = "Unable to find radio button \"does not exist\""
|
23
|
+
running do
|
24
|
+
@session.choose('does not exist')
|
25
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
@@ -27,7 +27,7 @@ shared_examples_for "click_button" do
|
|
27
27
|
extract_results(@session)['no_action'].should == 'No Action'
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
context "with value given on a submit button" do
|
32
32
|
context "on a form with HTML5 fields" do
|
33
33
|
before do
|
@@ -138,7 +138,7 @@ shared_examples_for "click_button" do
|
|
138
138
|
@session.body.should include('You landed')
|
139
139
|
end
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
context "with title given on a submit button" do
|
143
143
|
it "should submit the associated form" do
|
144
144
|
@session.click_button('What an Awesome Button')
|
@@ -204,11 +204,6 @@ shared_examples_for "click_button" do
|
|
204
204
|
@session.click_button('Click')
|
205
205
|
extract_results(@session)['first_name'].should == 'John'
|
206
206
|
end
|
207
|
-
|
208
|
-
it "should prefer exact matches over partial matches" do
|
209
|
-
@session.click_button('Just an input')
|
210
|
-
extract_results(@session)['button'].should == 'button_second'
|
211
|
-
end
|
212
207
|
end
|
213
208
|
|
214
209
|
context "with id given on a button defined by <button> tag" do
|
@@ -236,11 +231,6 @@ shared_examples_for "click_button" do
|
|
236
231
|
@session.click_button('ck_me')
|
237
232
|
extract_results(@session)['first_name'].should == 'John'
|
238
233
|
end
|
239
|
-
|
240
|
-
it "should prefer exact matches over partial matches" do
|
241
|
-
@session.click_button('Just a button')
|
242
|
-
extract_results(@session)['button'].should == 'Just a button'
|
243
|
-
end
|
244
234
|
end
|
245
235
|
|
246
236
|
context "with title given on a button defined by <button> tag" do
|
@@ -256,9 +246,10 @@ shared_examples_for "click_button" do
|
|
256
246
|
end
|
257
247
|
context "with a locator that doesn't exist" do
|
258
248
|
it "should raise an error" do
|
249
|
+
msg = "Unable to find button \"does not exist\""
|
259
250
|
running do
|
260
251
|
@session.click_button('does not exist')
|
261
|
-
end.should raise_error(Capybara::ElementNotFound)
|
252
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
262
253
|
end
|
263
254
|
end
|
264
255
|
|
@@ -267,7 +258,7 @@ shared_examples_for "click_button" do
|
|
267
258
|
@results = extract_results(@session)
|
268
259
|
@results['no_value'].should_not be_nil
|
269
260
|
end
|
270
|
-
|
261
|
+
|
271
262
|
it "should not send image buttons that were not clicked" do
|
272
263
|
@session.click_button('Click me!')
|
273
264
|
@results = extract_results(@session)
|
@@ -27,9 +27,10 @@ shared_examples_for "click_link_or_button" do
|
|
27
27
|
context "with a locator that doesn't exist" do
|
28
28
|
it "should raise an error" do
|
29
29
|
@session.visit('/with_html')
|
30
|
+
msg = "Unable to find link or button \"does not exist\""
|
30
31
|
running do
|
31
32
|
@session.click_link_or_button('does not exist')
|
32
|
-
end.should raise_error(Capybara::ElementNotFound)
|
33
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -21,11 +21,6 @@ shared_examples_for "click_link" do
|
|
21
21
|
@session.click_link('abo')
|
22
22
|
@session.body.should include('Bar')
|
23
23
|
end
|
24
|
-
|
25
|
-
it "should prefer exact matches over partial matches" do
|
26
|
-
@session.click_link('A link')
|
27
|
-
@session.body.should include('Bar')
|
28
|
-
end
|
29
24
|
end
|
30
25
|
|
31
26
|
context "with title given" do
|
@@ -38,11 +33,6 @@ shared_examples_for "click_link" do
|
|
38
33
|
@session.click_link('some tit')
|
39
34
|
@session.body.should include('Bar')
|
40
35
|
end
|
41
|
-
|
42
|
-
it "should prefer exact matches over partial matches" do
|
43
|
-
@session.click_link('a fine link')
|
44
|
-
@session.body.should include('Bar')
|
45
|
-
end
|
46
36
|
end
|
47
37
|
|
48
38
|
context "with alternative text given to a contained image" do
|
@@ -55,18 +45,14 @@ shared_examples_for "click_link" do
|
|
55
45
|
@session.click_link('some imag')
|
56
46
|
@session.body.should include('Bar')
|
57
47
|
end
|
58
|
-
|
59
|
-
it "should prefer exact matches over partial matches" do
|
60
|
-
@session.click_link('fine image')
|
61
|
-
@session.body.should include('Bar')
|
62
|
-
end
|
63
48
|
end
|
64
49
|
|
65
50
|
context "with a locator that doesn't exist" do
|
66
51
|
it "should raise an error" do
|
52
|
+
msg = "Unable to find link \"does not exist\""
|
67
53
|
running do
|
68
54
|
@session.click_link('does not exist')
|
69
|
-
end.should raise_error(Capybara::ElementNotFound)
|
55
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
70
56
|
end
|
71
57
|
end
|
72
58
|
|
@@ -93,7 +79,7 @@ shared_examples_for "click_link" do
|
|
93
79
|
|
94
80
|
it "should do nothing on anchor links" do
|
95
81
|
@session.fill_in("test_field", :with => 'blah')
|
96
|
-
@session.click_link('Anchor')
|
82
|
+
@session.click_link('Normal Anchor')
|
97
83
|
@session.find_field("test_field").value.should == 'blah'
|
98
84
|
@session.click_link('Blank Anchor')
|
99
85
|
@session.find_field("test_field").value.should == 'blah'
|
@@ -1,15 +1,83 @@
|
|
1
1
|
shared_examples_for "current_url" do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
before :all do
|
3
|
+
@servers = 2.times.map { Capybara::Server.new(TestApp.clone).boot }
|
4
|
+
# sanity check
|
5
|
+
@servers[0].port.should_not == @servers[1].port
|
6
|
+
@servers.map { |s| s.port }.should_not include 80
|
7
|
+
end
|
8
|
+
|
9
|
+
def bases
|
10
|
+
@servers.map { |s| "http://#{s.host}:#{s.port}" }
|
7
11
|
end
|
8
12
|
|
9
|
-
describe '#current_path' do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
describe '#current_url, #current_path, #current_host' do
|
14
|
+
def should_be_on server_index, path="/host", scheme="http"
|
15
|
+
# Check that we are on /host on the given server
|
16
|
+
s = @servers[server_index]
|
17
|
+
@session.current_url.chomp('?').should == "#{scheme}://#{s.host}:#{s.port}#{path}"
|
18
|
+
@session.current_host.should == "#{scheme}://#{s.host}" # no port
|
19
|
+
@session.current_path.should == path
|
20
|
+
if path == '/host'
|
21
|
+
# Server should agree with us
|
22
|
+
@session.body.should include("Current host is #{scheme}://#{s.host}:#{s.port}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def visit_host_links
|
27
|
+
@session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "is affected by visiting a page directly" do
|
31
|
+
@session.visit("#{bases[0]}/host")
|
32
|
+
should_be_on 0
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns to the app host when visiting a relative url" do
|
36
|
+
Capybara.app_host = bases[1]
|
37
|
+
@session.visit("#{bases[0]}/host")
|
38
|
+
should_be_on 0
|
39
|
+
@session.visit('/host')
|
40
|
+
should_be_on 1
|
41
|
+
Capybara.app_host = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it "is affected by setting Capybara.app_host" do
|
45
|
+
Capybara.app_host = bases[0]
|
46
|
+
@session.visit("/host")
|
47
|
+
should_be_on 0
|
48
|
+
Capybara.app_host = bases[1]
|
49
|
+
@session.visit("/host")
|
50
|
+
should_be_on 1
|
51
|
+
Capybara.app_host = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "is unaffected by following a relative link" do
|
55
|
+
visit_host_links
|
56
|
+
@session.click_link("Relative Host")
|
57
|
+
should_be_on 0
|
58
|
+
end
|
59
|
+
|
60
|
+
it "is affected by following an absolute link" do
|
61
|
+
visit_host_links
|
62
|
+
@session.click_link("Absolute Host")
|
63
|
+
should_be_on 1
|
64
|
+
end
|
65
|
+
|
66
|
+
it "is unaffected by posting through a relative form" do
|
67
|
+
visit_host_links
|
68
|
+
@session.click_button("Relative Host")
|
69
|
+
should_be_on 0
|
70
|
+
end
|
71
|
+
|
72
|
+
it "is affected by posting through an absolute form" do
|
73
|
+
visit_host_links
|
74
|
+
@session.click_button("Absolute Host")
|
75
|
+
should_be_on 1
|
76
|
+
end
|
77
|
+
|
78
|
+
it "is affected by following a redirect" do
|
79
|
+
@session.visit("#{bases[0]}/redirect")
|
80
|
+
should_be_on 0, "/landed"
|
13
81
|
end
|
14
82
|
end
|
15
83
|
end
|