mkuklis-webrat 0.5.1

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.
Files changed (213) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +413 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +188 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat/adapters/mechanize.rb +78 -0
  10. data/lib/webrat/adapters/merb.rb +11 -0
  11. data/lib/webrat/adapters/rack.rb +25 -0
  12. data/lib/webrat/adapters/rails.rb +81 -0
  13. data/lib/webrat/adapters/sinatra.rb +9 -0
  14. data/lib/webrat/core/configuration.rb +92 -0
  15. data/lib/webrat/core/elements/area.rb +31 -0
  16. data/lib/webrat/core/elements/element.rb +33 -0
  17. data/lib/webrat/core/elements/field.rb +487 -0
  18. data/lib/webrat/core/elements/form.rb +103 -0
  19. data/lib/webrat/core/elements/label.rb +31 -0
  20. data/lib/webrat/core/elements/link.rb +93 -0
  21. data/lib/webrat/core/elements/select_option.rb +48 -0
  22. data/lib/webrat/core/locators/area_locator.rb +38 -0
  23. data/lib/webrat/core/locators/button_locator.rb +54 -0
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  26. data/lib/webrat/core/locators/field_locator.rb +25 -0
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  28. data/lib/webrat/core/locators/form_locator.rb +19 -0
  29. data/lib/webrat/core/locators/label_locator.rb +34 -0
  30. data/lib/webrat/core/locators/link_locator.rb +74 -0
  31. data/lib/webrat/core/locators/locator.rb +20 -0
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  33. data/lib/webrat/core/locators.rb +20 -0
  34. data/lib/webrat/core/logging.rb +23 -0
  35. data/lib/webrat/core/matchers/have_content.rb +68 -0
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  39. data/lib/webrat/core/matchers.rb +4 -0
  40. data/lib/webrat/core/methods.rb +64 -0
  41. data/lib/webrat/core/mime.rb +18 -0
  42. data/lib/webrat/core/save_and_open_page.rb +48 -0
  43. data/lib/webrat/core/scope.rb +365 -0
  44. data/lib/webrat/core/session.rb +306 -0
  45. data/lib/webrat/core/xml.rb +72 -0
  46. data/lib/webrat/core.rb +13 -0
  47. data/lib/webrat/core_extensions/blank.rb +58 -0
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  53. data/lib/webrat/integrations/merb.rb +10 -0
  54. data/lib/webrat/integrations/rails.rb +25 -0
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -0
  56. data/lib/webrat/integrations/selenium.rb +11 -0
  57. data/lib/webrat/merb.rb +9 -0
  58. data/lib/webrat/rspec-rails.rb +2 -0
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  60. data/lib/webrat/selenium/application_servers/base.rb +54 -0
  61. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  62. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  63. data/lib/webrat/selenium/application_servers/rails.rb +67 -0
  64. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  65. data/lib/webrat/selenium/application_servers.rb +5 -0
  66. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  67. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
  68. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  72. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  73. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  74. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  75. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  76. data/lib/webrat/selenium/matchers.rb +4 -0
  77. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  78. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  79. data/lib/webrat/selenium/selenium_session.rb +272 -0
  80. data/lib/webrat/selenium/silence_stream.rb +18 -0
  81. data/lib/webrat/selenium.rb +70 -0
  82. data/lib/webrat.rb +18 -0
  83. data/spec/fakes/test_adapter.rb +37 -0
  84. data/spec/integration/mechanize/Rakefile +7 -0
  85. data/spec/integration/mechanize/config.ru +2 -0
  86. data/spec/integration/mechanize/sample_app.rb +20 -0
  87. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  88. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  89. data/spec/integration/merb/.gitignore +21 -0
  90. data/spec/integration/merb/Rakefile +35 -0
  91. data/spec/integration/merb/app/controllers/application.rb +2 -0
  92. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  93. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  94. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  95. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  96. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  97. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  98. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  99. data/spec/integration/merb/config/environments/development.rb +15 -0
  100. data/spec/integration/merb/config/environments/rake.rb +11 -0
  101. data/spec/integration/merb/config/environments/test.rb +14 -0
  102. data/spec/integration/merb/config/init.rb +25 -0
  103. data/spec/integration/merb/config/rack.rb +11 -0
  104. data/spec/integration/merb/config/router.rb +34 -0
  105. data/spec/integration/merb/spec/spec.opts +1 -0
  106. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  107. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  108. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  109. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  110. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  111. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  112. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  113. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  114. data/spec/integration/rack/Rakefile +5 -0
  115. data/spec/integration/rack/app.rb +89 -0
  116. data/spec/integration/rack/test/helper.rb +21 -0
  117. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  118. data/spec/integration/rails/.gitignore +3 -0
  119. data/spec/integration/rails/Rakefile +30 -0
  120. data/spec/integration/rails/app/controllers/application.rb +15 -0
  121. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  122. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  123. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  124. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  125. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  126. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  128. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  129. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  131. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  132. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  133. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  134. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  135. data/spec/integration/rails/config/boot.rb +109 -0
  136. data/spec/integration/rails/config/environment.rb +12 -0
  137. data/spec/integration/rails/config/environments/development.rb +17 -0
  138. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  139. data/spec/integration/rails/config/environments/test.rb +22 -0
  140. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  141. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  142. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  143. data/spec/integration/rails/config/locales/en.yml +5 -0
  144. data/spec/integration/rails/config/routes.rb +19 -0
  145. data/spec/integration/rails/public/404.html +30 -0
  146. data/spec/integration/rails/public/422.html +30 -0
  147. data/spec/integration/rails/public/500.html +33 -0
  148. data/spec/integration/rails/script/about +4 -0
  149. data/spec/integration/rails/script/console +3 -0
  150. data/spec/integration/rails/script/dbconsole +3 -0
  151. data/spec/integration/rails/script/destroy +3 -0
  152. data/spec/integration/rails/script/generate +3 -0
  153. data/spec/integration/rails/script/performance/benchmarker +3 -0
  154. data/spec/integration/rails/script/performance/profiler +3 -0
  155. data/spec/integration/rails/script/performance/request +3 -0
  156. data/spec/integration/rails/script/plugin +3 -0
  157. data/spec/integration/rails/script/process/inspector +3 -0
  158. data/spec/integration/rails/script/process/reaper +3 -0
  159. data/spec/integration/rails/script/process/spawner +3 -0
  160. data/spec/integration/rails/script/runner +3 -0
  161. data/spec/integration/rails/script/server +3 -0
  162. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  163. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  164. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  165. data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
  166. data/spec/integration/rails/test/test_helper.rb +26 -0
  167. data/spec/integration/sinatra/Rakefile +5 -0
  168. data/spec/integration/sinatra/classic_app.rb +64 -0
  169. data/spec/integration/sinatra/modular_app.rb +16 -0
  170. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  171. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  172. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  173. data/spec/private/core/configuration_spec.rb +87 -0
  174. data/spec/private/core/field_spec.rb +85 -0
  175. data/spec/private/core/link_spec.rb +24 -0
  176. data/spec/private/core/session_spec.rb +200 -0
  177. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
  178. data/spec/private/nokogiri_spec.rb +77 -0
  179. data/spec/private/rails/attaches_file_spec.rb +81 -0
  180. data/spec/private/rails/rails_adapter_spec.rb +86 -0
  181. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  182. data/spec/public/basic_auth_spec.rb +24 -0
  183. data/spec/public/check_spec.rb +191 -0
  184. data/spec/public/choose_spec.rb +118 -0
  185. data/spec/public/click_area_spec.rb +106 -0
  186. data/spec/public/click_button_spec.rb +494 -0
  187. data/spec/public/click_link_spec.rb +511 -0
  188. data/spec/public/fill_in_spec.rb +224 -0
  189. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  190. data/spec/public/locators/field_labeled_spec.rb +172 -0
  191. data/spec/public/locators/field_with_id_spec.rb +16 -0
  192. data/spec/public/matchers/contain_spec.rb +114 -0
  193. data/spec/public/matchers/have_selector_spec.rb +146 -0
  194. data/spec/public/matchers/have_tag_spec.rb +39 -0
  195. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  196. data/spec/public/reload_spec.rb +10 -0
  197. data/spec/public/save_and_open_spec.rb +70 -0
  198. data/spec/public/select_date_spec.rb +112 -0
  199. data/spec/public/select_datetime_spec.rb +137 -0
  200. data/spec/public/select_spec.rb +455 -0
  201. data/spec/public/select_time_spec.rb +100 -0
  202. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  203. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  204. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  205. data/spec/public/set_hidden_field_spec.rb +5 -0
  206. data/spec/public/submit_form_spec.rb +5 -0
  207. data/spec/public/visit_spec.rb +58 -0
  208. data/spec/public/within_spec.rb +177 -0
  209. data/spec/rcov.opts +1 -0
  210. data/spec/spec.opts +2 -0
  211. data/spec/spec_helper.rb +54 -0
  212. data/vendor/selenium-server.jar +0 -0
  213. metadata +409 -0
@@ -0,0 +1,16 @@
1
+ require "rubygems"
2
+ require "sinatra/base"
3
+
4
+ class MyModularApp < Sinatra::Default
5
+ get "/" do
6
+ "Hello World"
7
+ end
8
+
9
+ get "/redirect_absolute_url" do
10
+ redirect URI.join(request.url, "foo").to_s
11
+ end
12
+
13
+ get "/foo" do
14
+ "spam"
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+ require File.dirname(__FILE__) + "/../classic_app"
3
+
4
+ class MyClassicAppTest < Test::Unit::TestCase
5
+ def test_visits_pages
6
+ visit "/"
7
+ assert response_body.include?("visit")
8
+
9
+ click_link "there"
10
+ assert response_body.include?('<form method="post" action="/go">')
11
+ end
12
+
13
+ def test_submits_form
14
+ visit "/go"
15
+ fill_in "Name", :with => "World"
16
+ fill_in "Email", :with => "world@example.org"
17
+ click_button "Submit"
18
+
19
+ assert response_body.include?("Hello, World")
20
+ assert response_body.include?("Your email is: world@example.org")
21
+ end
22
+
23
+ def test_check_value_of_field
24
+ visit "/"
25
+ assert field_labeled("Prefilled").value, "text"
26
+ end
27
+
28
+ def test_follows_internal_redirects
29
+ visit "/internal_redirect"
30
+ assert response_body.include?("visit")
31
+ end
32
+
33
+ def test_does_not_follow_external_redirects
34
+ visit "/external_redirect"
35
+ assert response_code == 302
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+ require File.dirname(__FILE__) + "/../modular_app"
3
+
4
+ class MyModularAppTest < Test::Unit::TestCase
5
+ def app
6
+ MyModularApp
7
+ end
8
+
9
+ def test_it_works
10
+ visit "/"
11
+ assert_contain "Hello World"
12
+ end
13
+
14
+ def test_redirects
15
+ visit "/redirect_absolute_url"
16
+ assert_equal "spam", response_body
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ # require "redgreen"
4
+
5
+ $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../../../lib"
6
+ require "webrat"
7
+
8
+ Webrat.configure do |config|
9
+ config.mode = :sinatra
10
+ end
11
+
12
+ class Test::Unit::TestCase
13
+ include Webrat::Methods
14
+ include Webrat::Matchers
15
+
16
+ Webrat::Methods.delegate_to_session :response_code, :response_body
17
+ end
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe Webrat::Configuration do
4
+
5
+ Spec::Matchers.define :open_error_files do
6
+ match do |config|
7
+ config.open_error_files?
8
+ end
9
+ end
10
+
11
+ it "should have a mode" do
12
+ Webrat.configuration.should respond_to(:mode)
13
+ end
14
+
15
+ it "should open error files by default" do
16
+ config = Webrat::Configuration.new
17
+ config.should open_error_files
18
+ end
19
+
20
+ it "should detect infinite redirects after 10" do
21
+ config = Webrat::Configuration.new
22
+ config.infinite_redirect_limit.should == 10
23
+ end
24
+
25
+ it "should be configurable with a block" do
26
+ Webrat.configure do |config|
27
+ config.open_error_files = false
28
+ end
29
+
30
+ config = Webrat.configuration
31
+ config.should_not open_error_files
32
+ end
33
+
34
+ it "should be configurable with multiple blocks" do
35
+ Webrat.configure do |config|
36
+ config.open_error_files = false
37
+ end
38
+
39
+ Webrat.configure do |config|
40
+ config.selenium_server_port = 1234
41
+ end
42
+
43
+ config = Webrat.configuration
44
+ config.should_not open_error_files
45
+ config.selenium_server_port.should == 1234
46
+ end
47
+
48
+ describe "Selenium" do
49
+ before :each do
50
+ @config = Webrat::Configuration.new
51
+ end
52
+
53
+ it "should use 'test' as the application environment by default" do
54
+ @config.application_environment.should == :test
55
+ end
56
+
57
+ it "should use 3001 as the application port by default" do
58
+ @config.application_port.should == 3001
59
+ end
60
+
61
+ it 'should default application address to localhost' do
62
+ @config.application_address.should == 'localhost'
63
+ end
64
+
65
+ it 'should default selenium server address to nil' do
66
+ @config.selenium_server_address.should be_nil
67
+ end
68
+
69
+ it 'should default selenium server port to 4444' do
70
+ @config.selenium_server_port.should == 4444
71
+ end
72
+
73
+ it 'should default selenium browser key to *firefox' do
74
+ @config.selenium_browser_key.should == '*firefox'
75
+ end
76
+
77
+ it 'should default selenium browser startup timeout to 5 seconds' do
78
+ @config.selenium_browser_startup_timeout.should == 5
79
+ end
80
+
81
+ it 'should allow overriding of the browser startup timeout' do
82
+ @config.selenium_browser_startup_timeout = 10
83
+ @config.selenium_browser_startup_timeout.should == 10
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,85 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ module Webrat
4
+ describe Field do
5
+ unless RUBY_PLATFORM =~ /java/
6
+ it "should have nice inspect output" do
7
+ html = <<-HTML
8
+ <html>
9
+ <input type='checkbox' checked='checked' />
10
+ </html>
11
+ HTML
12
+
13
+ element = Webrat::XML.document(html).css("input").first
14
+ checkbox = CheckboxField.new(nil, element)
15
+ checkbox.inspect.should =~ /#<Webrat::CheckboxField @element=<input type=['"]checkbox['"] checked(=['"]checked['"])?\/?>>/
16
+ end
17
+ end
18
+ end
19
+
20
+ describe CheckboxField do
21
+ it "should say it is checked if it is" do
22
+ html = <<-HTML
23
+ <html>
24
+ <input type='checkbox' checked='checked' />
25
+ </html>
26
+ HTML
27
+
28
+ element = Webrat::XML.document(html).css("input").first
29
+ checkbox = CheckboxField.new(nil, element)
30
+ checkbox.should be_checked
31
+ end
32
+
33
+ it "should say it is not checked if it is not" do
34
+ html = <<-HTML
35
+ <html>
36
+ <input type='checkbox' />
37
+ </html>
38
+ HTML
39
+
40
+ element = Webrat::XML.document(html).css("input").first
41
+ checkbox = CheckboxField.new(nil, element)
42
+ checkbox.should_not be_checked
43
+ end
44
+ end
45
+
46
+ describe RadioField do
47
+ it "should say it is checked if it is" do
48
+ html = <<-HTML
49
+ <html>
50
+ <input type='radio' checked='checked' />
51
+ </html>
52
+ HTML
53
+
54
+ element = Webrat::XML.document(html).css("input").first
55
+ radio_button = RadioField.new(nil, element)
56
+ radio_button.should be_checked
57
+ end
58
+
59
+ it "should say it is not checked if it is not" do
60
+ html = <<-HTML
61
+ <html><input type='radio' /></html>
62
+ HTML
63
+
64
+ element = Webrat::XML.document(html).css("input").first
65
+ radio_button = RadioField.new(nil, element)
66
+ radio_button.should_not be_checked
67
+ end
68
+ end
69
+
70
+ describe TextField do
71
+ it 'should not escape values in mechanize mode' do
72
+ Webrat.configuration.mode = :mechanize
73
+
74
+ html = <<-HTML
75
+ <html>
76
+ <input type="text" name="email" value="user@example.com" />
77
+ </html>
78
+ HTML
79
+
80
+ element = Webrat::XML.document(html).css('input').first
81
+ text_field = TextField.new(nil, element)
82
+ text_field.to_param.should == { 'email' => 'user@example.com' }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe Webrat::Link do
4
+ # include Webrat::Link
5
+
6
+ before do
7
+ webrat_session = mock(Webrat::TestAdapter)
8
+ @link_text_with_nbsp = 'Link' + [0xA0].pack("U") + 'Text'
9
+ end
10
+
11
+ it "should pass through relative urls" do
12
+ link = Webrat::Link.new(webrat_session, {"href" => "/path"})
13
+ webrat_session.should_receive(:request_page).with("/path", :get, {})
14
+ link.click
15
+ end
16
+
17
+ it "shouldnt put base url onto " do
18
+ url = "https://www.example.com/path"
19
+ webrat_session.should_receive(:request_page).with(url, :get, {})
20
+ link = Webrat::Link.new(webrat_session, {"href" => url})
21
+ link.click
22
+ end
23
+
24
+ end
@@ -0,0 +1,200 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe Webrat::Session do
4
+
5
+ it "should not have a doc_root" do
6
+ session = Webrat::Session.new
7
+ session.doc_root.should be_nil
8
+ end
9
+
10
+ it "should expose the current_dom" do
11
+ session = Webrat::Session.new
12
+
13
+ def session.response
14
+ Object.new
15
+ end
16
+
17
+ def session.response_body
18
+ "<html></html>"
19
+ end
20
+
21
+ session.should respond_to(:current_dom)
22
+ end
23
+
24
+ it "should provide a current_page for backwards compatibility" do
25
+ session = Webrat::Session.new
26
+ current_page = session.current_page
27
+ current_page.should_not be_nil
28
+ current_page.should respond_to(:url)
29
+ end
30
+
31
+ it "should allow custom headers to be set" do
32
+ session = Webrat::Session.new
33
+ session.header('Accept', 'application/xml')
34
+
35
+ session.instance_variable_get(:@custom_headers)['Accept'].should == 'application/xml'
36
+ end
37
+
38
+ it "should return a copy of the headers to be sent" do
39
+ session = Webrat::Session.new
40
+ session.instance_eval {
41
+ @default_headers = {'HTTP_X_FORWARDED_FOR' => '192.168.1.1'}
42
+ @custom_headers = {'Accept' => 'application/xml'}
43
+ }
44
+ session.headers.should == {'HTTP_X_FORWARDED_FOR' => '192.168.1.1', 'Accept' => 'application/xml'}
45
+ end
46
+
47
+ describe "#http_accept" do
48
+ before(:each) do
49
+ webrat_session = Webrat::Session.new
50
+ end
51
+
52
+ it "should set the Accept header with the string Mime type" do
53
+ webrat_session.http_accept('application/xml')
54
+ webrat_session.headers['Accept'].should == 'application/xml'
55
+ end
56
+
57
+ it "should set the Accept head with the string value of the symbol Mime type" do
58
+ webrat_session.http_accept(:xml)
59
+ webrat_session.headers['Accept'].should == 'application/xml'
60
+ end
61
+
62
+ it "should raise an error if a symbol Mime type is passed that does not exist" do
63
+ lambda { webrat_session.http_accept(:oogabooga) }.should raise_error(ArgumentError)
64
+ end
65
+
66
+ it "should recognize a couple of webrat-specific formats" do
67
+ webrat_session.http_accept(:multipart_form).should == "multipart/form-data"
68
+ webrat_session.http_accept(:url_encoded_form).should == "application/x-www-form-urlencoded"
69
+ end
70
+ end
71
+
72
+ describe "#request_page" do
73
+ before(:each) do
74
+ webrat_session = Webrat::Session.new
75
+ end
76
+
77
+ it "should raise an error if the request is not a success" do
78
+ webrat_session.stub!(:get)
79
+ webrat_session.stub!(:response_body => "Exception caught")
80
+ webrat_session.stub!(:response_code => 500)
81
+ webrat_session.stub!(:formatted_error => "application error")
82
+ webrat_session.stub!(:save_and_open_page)
83
+
84
+ lambda { webrat_session.request_page('some url', :get, {}) }.should raise_error(Webrat::PageLoadError)
85
+ end
86
+
87
+ it "should raise an error but not open if the request is not a success and config quashes save_and_open" do
88
+ Webrat.configure do |config|
89
+ config.open_error_files = false
90
+ end
91
+ webrat_session.stub!(:get)
92
+ webrat_session.stub!(:response_body => "Exception caught")
93
+ webrat_session.stub!(:response_code => 500)
94
+ webrat_session.stub!(:formatted_error => "application error")
95
+ webrat_session.should_not_receive(:save_and_open_page)
96
+
97
+ lambda { webrat_session.request_page('some url', :get, {}) }.should raise_error(Webrat::PageLoadError)
98
+ end
99
+
100
+ it "should now follow external redirects" do
101
+ webrat_session.should_receive(:internal_redirect?).and_return(false)
102
+
103
+ webrat_session.request_page("/oldurl", :get, {})
104
+
105
+ webrat_session.current_url.should == "/oldurl"
106
+ end
107
+ end
108
+
109
+ describe "#redirect?" do
110
+ before(:each) do
111
+ webrat_session = Webrat::Session.new
112
+ end
113
+
114
+ it "should return true if the last response was a redirect and Fixnum#/ returns a Rational" do
115
+ # This happens if the ruby-units gem has been required
116
+ Fixnum.class_eval do
117
+ alias_method :original_divide, "/".to_sym
118
+
119
+ def /(other)
120
+ Rational(self, other)
121
+ end
122
+ end
123
+
124
+ webrat_session.stub!(:response_code => 301)
125
+ webrat_session.redirect?.should be_true
126
+
127
+ Fixnum.class_eval do
128
+ alias_method "/".to_sym, :original_divide
129
+ end
130
+ end
131
+
132
+ it "should return true if the last response was a redirect" do
133
+ webrat_session.stub!(:response_code => 301)
134
+ webrat_session.redirect?.should be_true
135
+ end
136
+
137
+ it "should return false if the last response wasn't a redirect" do
138
+ webrat_session.stub!(:response_code => 200)
139
+ webrat_session.redirect?.should be_false
140
+ end
141
+ end
142
+
143
+ describe "#internal_redirect?" do
144
+ before(:each) do
145
+ webrat_session = Webrat::Session.new
146
+ end
147
+
148
+ it "should return true if the last response was a redirect and the host of the current_url matches that of the response location" do
149
+ webrat_session.stub!(:redirect? => true)
150
+ webrat_session.stub!(:current_url => "http://example.com")
151
+ webrat_session.stub!(:response_location => "http://example.com")
152
+ webrat_session.internal_redirect?.should be_true
153
+ end
154
+
155
+ it "should return true if the last response was a redirect and the hosts are the same but the subdomains are different" do
156
+ webrat_session.stub!(:redirect? => true)
157
+ webrat_session.stub!(:current_url => "http://example.com")
158
+ webrat_session.stub!(:response_location => "http://myName.example.com")
159
+ webrat_session.internal_redirect?.should be_true
160
+ end
161
+
162
+ it "should return false if the last response was not a redirect" do
163
+ webrat_session.stub!(:redirect? => false)
164
+ webrat_session.internal_redirect?.should be_false
165
+ end
166
+
167
+ it "should return false if the last response was a redirect but the host of the current_url doesn't matches that of the response location" do
168
+ webrat_session.stub!(:redirect? => true)
169
+ webrat_session.stub!(:current_url => "http://example.com")
170
+ webrat_session.stub!(:response_location => "http://google.com")
171
+ webrat_session.internal_redirect?.should be_false
172
+ end
173
+
174
+ it "should return false if the last response was a redirect but the host of the current_url doesn't matches that of the response location, but they have the same subdomain" do
175
+ webrat_session.stub!(:redirect? => true)
176
+ webrat_session.stub!(:current_url => "http://login.example.com")
177
+ webrat_session.stub!(:response_location => "http://login.google.com")
178
+ webrat_session.internal_redirect?.should be_false
179
+ end
180
+ end
181
+
182
+ describe "#redirected_to" do
183
+ before(:each) do
184
+ webrat_session = Webrat::Session.new
185
+ end
186
+
187
+ it "should return nil if not redirected" do
188
+ webrat_session.stub!(:redirect? => false)
189
+ webrat_session.redirected_to.should be_nil
190
+ end
191
+
192
+ it "should return the response_location if redirected" do
193
+ webrat_session.stub!(:redirect? => true)
194
+ webrat_session.stub!(:response_location => "http://www.example.com")
195
+ webrat_session.redirected_to.should == "http://www.example.com"
196
+ end
197
+
198
+ end
199
+
200
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Webrat::MechanizeAdapter do
4
+ before :each do
5
+ Webrat.configuration.mode = :mechanize
6
+ end
7
+
8
+ before(:each) do
9
+ @mech = Webrat::MechanizeAdapter.new
10
+ end
11
+
12
+ describe "post" do
13
+ def url
14
+ 'http://test.host/users'
15
+ end
16
+
17
+ def data
18
+ {:user => {:first_name => 'Nancy', :last_name => 'Callahan'}}
19
+ end
20
+
21
+ def flattened_data
22
+ {'user[first_name]' => 'Nancy', 'user[last_name]' => 'Callahan'}
23
+ end
24
+
25
+ it "should flatten model post data" do
26
+ mechanize = mock(:mechanize)
27
+ WWW::Mechanize.stub!(:new => mechanize)
28
+ mechanize.should_receive(:post).with(url, flattened_data)
29
+ Webrat::MechanizeAdapter.new.post(url, data)
30
+ end
31
+ end
32
+
33
+ describe "#absolute_url" do
34
+ before(:each) do
35
+ @session = Webrat::MechanizeAdapter.new
36
+ @session.stub!(:current_url).and_return(absolute_url)
37
+ end
38
+
39
+ def absolute_url
40
+ 'http://test.host/users/fred/cabbages'
41
+ end
42
+
43
+ def rooted_url
44
+ '/users/fred/cabbages'
45
+ end
46
+
47
+ def relative_url
48
+ '../../wilma'
49
+ end
50
+
51
+ it "should return unmodified url if prefixed with scheme" do
52
+ @session.absolute_url(absolute_url).should == absolute_url
53
+ end
54
+
55
+ it "should prefix scheme and hostname if url begins with /" do
56
+ @session.absolute_url(rooted_url).should == absolute_url
57
+ end
58
+
59
+ it "should resolve sibling URLs relative to current path" do
60
+ @session.absolute_url(relative_url).should == 'http://test.host/users/wilma'
61
+ end
62
+
63
+ it "should cope with sibling URLs from root of site" do
64
+ @session.stub!(:current_url).and_return('http://test.host')
65
+ @session.absolute_url(relative_url).should == 'http://test.host/wilma'
66
+ end
67
+
68
+ it "should cope with https" do
69
+ @session.stub!(:current_url).and_return('https://test.host')
70
+ @session.absolute_url(relative_url).should == 'https://test.host/wilma'
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,77 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ # if defined?(Nokogiri::XML) && Webrat.configuration.parse_with_nokogiri?
4
+ describe "Nokogiri Extension" do
5
+ include Webrat::Matchers
6
+
7
+ def fail
8
+ raise_error(Spec::Expectations::ExpectationNotMetError)
9
+ end
10
+
11
+ before(:each) do
12
+ @text_and_password = <<-HTML
13
+ <div>
14
+ <input type="text"/>
15
+ <input type="password"/>
16
+ <span type="text"/>
17
+ </div>
18
+ HTML
19
+
20
+ @text_only = <<-HTML
21
+ <div>
22
+ <input type="text" disabled="disabled" />
23
+ </div>
24
+ HTML
25
+
26
+ @password_only = <<-HTML
27
+ <div>
28
+ <input type="password"/>
29
+ <div>
30
+ HTML
31
+ end
32
+
33
+ describe ":text" do
34
+ it "passes have_selector(:text) if a node with type=text exists" do
35
+ @text_and_password.should have_selector(":text")
36
+ end
37
+
38
+ it "passes not have_selector(:text) if no node with text=text exists" do
39
+ @password_only.should_not have_selector(":text")
40
+ end
41
+
42
+ it "fails have_selector(:text) if no node with type=text exists" do
43
+ lambda { @password_only.should have_selector(":text") }.should fail
44
+ end
45
+
46
+ it "fails not have_selector(:text) if a node with type=text exists" do
47
+ lambda { @text_only.should_not have_selector(":text") }.should fail
48
+ end
49
+
50
+ it "works together with other selectors" do
51
+ @text_and_password.should have_selector("input:text[type*='te']")
52
+ end
53
+ end
54
+
55
+ describe ":password" do
56
+ it "passes have_selector(:password) if a node with type=password exists" do
57
+ @text_and_password.should have_selector(":password")
58
+ end
59
+
60
+ it "passes not have_selector(:text) if no node with text=text exists" do
61
+ @text_only.should_not have_selector(":password")
62
+ end
63
+
64
+ it "fails have_selector(:password) if no node with type=password exists" do
65
+ lambda { @text_only.should have_selector(":password") }.should fail
66
+ end
67
+
68
+ it "fails not have_selector(:password) if a node with type=password exists" do
69
+ lambda { @password_only.should_not have_selector(":password") }.should fail
70
+ end
71
+
72
+ it "works together with other selectors" do
73
+ @text_and_password.should have_selector("input:password[type*='pa']")
74
+ end
75
+ end
76
+ end
77
+ # end