indirect-webrat 0.7.4

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 (218) hide show
  1. data/.document +4 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +14 -0
  4. data/History.txt +470 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +143 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +94 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +30 -0
  14. data/lib/webrat/adapters/rails.rb +77 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +114 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +438 -0
  21. data/lib/webrat/core/elements/form.rb +127 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +82 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +85 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +124 -0
  43. data/lib/webrat/core/methods.rb +73 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +362 -0
  47. data/lib/webrat/core/session.rb +318 -0
  48. data/lib/webrat/core/xml.rb +44 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_query_string.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rack.rb +9 -0
  57. data/lib/webrat/integrations/rails.rb +25 -0
  58. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  59. data/lib/webrat/integrations/selenium.rb +11 -0
  60. data/lib/webrat/merb.rb +9 -0
  61. data/lib/webrat/rspec-rails.rb +2 -0
  62. data/lib/webrat/selenium.rb +70 -0
  63. data/lib/webrat/selenium/application_server_factory.rb +43 -0
  64. data/lib/webrat/selenium/application_servers.rb +5 -0
  65. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  66. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  67. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  68. data/lib/webrat/selenium/application_servers/rack.rb +51 -0
  69. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  70. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  75. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  76. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  77. data/lib/webrat/selenium/matchers.rb +4 -0
  78. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  79. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  80. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  81. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  82. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  83. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  84. data/lib/webrat/selenium/selenium_session.rb +276 -0
  85. data/lib/webrat/selenium/silence_stream.rb +18 -0
  86. data/spec/fakes/test_adapter.rb +33 -0
  87. data/spec/integration/mechanize/Rakefile +7 -0
  88. data/spec/integration/mechanize/config.ru +2 -0
  89. data/spec/integration/mechanize/sample_app.rb +35 -0
  90. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  91. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  92. data/spec/integration/merb/.gitignore +21 -0
  93. data/spec/integration/merb/Rakefile +35 -0
  94. data/spec/integration/merb/app/controllers/application.rb +2 -0
  95. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  96. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  97. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  98. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  99. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  100. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  101. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  102. data/spec/integration/merb/config/environments/development.rb +15 -0
  103. data/spec/integration/merb/config/environments/rake.rb +11 -0
  104. data/spec/integration/merb/config/environments/test.rb +14 -0
  105. data/spec/integration/merb/config/init.rb +25 -0
  106. data/spec/integration/merb/config/rack.rb +11 -0
  107. data/spec/integration/merb/config/router.rb +34 -0
  108. data/spec/integration/merb/spec/spec.opts +1 -0
  109. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  110. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  111. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  112. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  113. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  114. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  115. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  116. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  117. data/spec/integration/rack/Rakefile +5 -0
  118. data/spec/integration/rack/app.rb +89 -0
  119. data/spec/integration/rack/test/helper.rb +20 -0
  120. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  121. data/spec/integration/rails/.gitignore +3 -0
  122. data/spec/integration/rails/Rakefile +30 -0
  123. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  124. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  126. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  127. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  128. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  129. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  130. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  131. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  132. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  133. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  134. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  135. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  136. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  137. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  138. data/spec/integration/rails/config/boot.rb +109 -0
  139. data/spec/integration/rails/config/environment.rb +12 -0
  140. data/spec/integration/rails/config/environments/development.rb +17 -0
  141. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  142. data/spec/integration/rails/config/environments/test.rb +22 -0
  143. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  144. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  145. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  146. data/spec/integration/rails/config/locales/en.yml +5 -0
  147. data/spec/integration/rails/config/routes.rb +19 -0
  148. data/spec/integration/rails/public/404.html +30 -0
  149. data/spec/integration/rails/public/422.html +30 -0
  150. data/spec/integration/rails/public/500.html +33 -0
  151. data/spec/integration/rails/script/about +4 -0
  152. data/spec/integration/rails/script/console +3 -0
  153. data/spec/integration/rails/script/dbconsole +3 -0
  154. data/spec/integration/rails/script/destroy +3 -0
  155. data/spec/integration/rails/script/generate +3 -0
  156. data/spec/integration/rails/script/performance/benchmarker +3 -0
  157. data/spec/integration/rails/script/performance/profiler +3 -0
  158. data/spec/integration/rails/script/performance/request +3 -0
  159. data/spec/integration/rails/script/plugin +3 -0
  160. data/spec/integration/rails/script/process/inspector +3 -0
  161. data/spec/integration/rails/script/process/reaper +3 -0
  162. data/spec/integration/rails/script/process/spawner +3 -0
  163. data/spec/integration/rails/script/runner +3 -0
  164. data/spec/integration/rails/script/server +3 -0
  165. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  166. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  167. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  168. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  169. data/spec/integration/rails/test/test_helper.rb +27 -0
  170. data/spec/integration/sinatra/Rakefile +5 -0
  171. data/spec/integration/sinatra/classic_app.rb +63 -0
  172. data/spec/integration/sinatra/modular_app.rb +15 -0
  173. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  174. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  175. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  176. data/spec/private/core/configuration_spec.rb +87 -0
  177. data/spec/private/core/field_spec.rb +83 -0
  178. data/spec/private/core/form_spec.rb +51 -0
  179. data/spec/private/core/link_spec.rb +24 -0
  180. data/spec/private/core/session_spec.rb +182 -0
  181. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  182. data/spec/private/nokogiri_spec.rb +77 -0
  183. data/spec/private/rails/attaches_file_spec.rb +114 -0
  184. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  185. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  186. data/spec/public/basic_auth_spec.rb +35 -0
  187. data/spec/public/check_spec.rb +191 -0
  188. data/spec/public/choose_spec.rb +118 -0
  189. data/spec/public/click_area_spec.rb +106 -0
  190. data/spec/public/click_button_spec.rb +494 -0
  191. data/spec/public/click_link_spec.rb +544 -0
  192. data/spec/public/fill_in_spec.rb +224 -0
  193. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  194. data/spec/public/locators/field_labeled_spec.rb +172 -0
  195. data/spec/public/locators/field_with_id_spec.rb +16 -0
  196. data/spec/public/matchers/contain_spec.rb +118 -0
  197. data/spec/public/matchers/have_selector_spec.rb +146 -0
  198. data/spec/public/matchers/have_tag_spec.rb +39 -0
  199. data/spec/public/matchers/have_xpath_spec.rb +165 -0
  200. data/spec/public/reload_spec.rb +10 -0
  201. data/spec/public/save_and_open_spec.rb +49 -0
  202. data/spec/public/select_date_spec.rb +112 -0
  203. data/spec/public/select_datetime_spec.rb +137 -0
  204. data/spec/public/select_spec.rb +474 -0
  205. data/spec/public/select_time_spec.rb +100 -0
  206. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  207. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  208. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  209. data/spec/public/set_hidden_field_spec.rb +5 -0
  210. data/spec/public/submit_form_spec.rb +56 -0
  211. data/spec/public/visit_spec.rb +58 -0
  212. data/spec/public/within_spec.rb +177 -0
  213. data/spec/rcov.opts +1 -0
  214. data/spec/spec.opts +2 -0
  215. data/spec/spec_helper.rb +53 -0
  216. data/vendor/selenium-server.jar +0 -0
  217. data/webrat.gemspec +355 -0
  218. metadata +424 -0
@@ -0,0 +1,137 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "select_datetime" do
4
+ it "should send the values for each individual date and time components" do
5
+ with_html <<-HTML
6
+ <html>
7
+ <form action="/appointments" method="post">
8
+ <label for="appointment_time">Time</label><br />
9
+ <select id="appointment_time_1i" name="appointment[time(1i)]">
10
+ <option value="2003">2003</option>
11
+ </select>
12
+ <select id="appointment_time_2i" name="appointment[time(2i)]">
13
+ <option value="12">December</option>
14
+ </select>
15
+ <select id="appointment_time_3i" name="appointment[time(3i)]">
16
+ <option value="25">25</option>
17
+ </select>
18
+ <select id="appointment_time_4i" name="appointment[time(4i)]">
19
+ <option value="09">09</option>
20
+ </select>
21
+ : <select id="appointment_time_5i" name="appointment[time(5i)]">
22
+ <option value="30">30</option>
23
+ </select>
24
+ <input type="submit" />
25
+ </form>
26
+ </html>
27
+ HTML
28
+ webrat_session.should_receive(:post).with("/appointments",
29
+ "appointment" => {"time(1i)" => '2003', "time(2i)" => "12", "time(3i)" => "25", "time(4i)" => "09", "time(5i)" => "30"})
30
+ select_datetime "December 25, 2003 9:30", :from => "Time"
31
+ click_button
32
+ end
33
+
34
+ it "should accept a time object" do
35
+ with_html <<-HTML
36
+ <html>
37
+ <form action="/appointments" method="post">
38
+ <label for="appointment_time">Time</label><br />
39
+ <select id="appointment_time_1i" name="appointment[time(1i)]">
40
+ <option value="2003">2003</option>
41
+ </select>
42
+ <select id="appointment_time_2i" name="appointment[time(2i)]">
43
+ <option value="12">December</option>
44
+ </select>
45
+ <select id="appointment_time_3i" name="appointment[time(3i)]">
46
+ <option value="25">25</option>
47
+ </select>
48
+ <select id="appointment_time_4i" name="appointment[time(4i)]">
49
+ <option value="09">09</option>
50
+ </select>
51
+ : <select id="appointment_time_5i" name="appointment[time(5i)]">
52
+ <option value="30">30</option>
53
+ </select>
54
+ <input type="submit" />
55
+ </form>
56
+ </html>
57
+ HTML
58
+ webrat_session.should_receive(:post).with("/appointments",
59
+ "appointment" => {"time(1i)" => '2003', "time(2i)" => "12", "time(3i)" => "25", "time(4i)" => "09", "time(5i)" => "30"})
60
+ select_datetime Time.parse("December 25, 2003 9:30"), :from => "Time"
61
+ click_button
62
+ end
63
+
64
+ it "should work when the label ends in a non word character" do
65
+ with_html <<-HTML
66
+ <html>
67
+ <form action="/appointments" method="post">
68
+ <label for="appointment_time">Time ?</label><br />
69
+ <select id="appointment_time_1i" name="appointment[time(1i)]">
70
+ <option value="2003">2003</option>
71
+ </select>
72
+ <select id="appointment_time_2i" name="appointment[time(2i)]">
73
+ <option value="12">December</option>
74
+ </select>
75
+ <select id="appointment_time_3i" name="appointment[time(3i)]">
76
+ <option value="25">25</option>
77
+ </select>
78
+ <select id="appointment_time_4i" name="appointment[time(4i)]">
79
+ <option value="09">09</option>
80
+ </select>
81
+ : <select id="appointment_time_5i" name="appointment[time(5i)]">
82
+ <option value="30">30</option>
83
+ </select>
84
+ <input type="submit" />
85
+ </form>
86
+ </html>
87
+ HTML
88
+ webrat_session.should_receive(:post).with("/appointments",
89
+ "appointment" => {"time(1i)" => '2003', "time(2i)" => "12", "time(3i)" => "25", "time(4i)" => "09", "time(5i)" => "30"})
90
+ select_datetime "December 25, 2003 9:30", :from => "Time ?"
91
+ click_button
92
+ end
93
+
94
+
95
+ it "should work when no label is specified" do
96
+ with_html <<-HTML
97
+ <html>
98
+ <form action="/appointments" method="post">
99
+ <select id="appointment_time_1i" name="appointment[time(1i)]">
100
+ <option value="2003">2003</option>
101
+ </select>
102
+ <select id="appointment_time_2i" name="appointment[time(2i)]">
103
+ <option value="12">December</option>
104
+ </select>
105
+ <select id="appointment_time_3i" name="appointment[time(3i)]">
106
+ <option value="25">25</option>
107
+ </select>
108
+ <select id="appointment_time_4i" name="appointment[time(4i)]">
109
+ <option value="09">09</option>
110
+ </select>
111
+ : <select id="appointment_time_5i" name="appointment[time(5i)]">
112
+ <option value="30">30</option>
113
+ </select>
114
+ <input type="submit" />
115
+ </form>
116
+ </html>
117
+ HTML
118
+ webrat_session.should_receive(:post).with("/appointments",
119
+ "appointment" => {"time(1i)" => '2003', "time(2i)" => "12", "time(3i)" => "25", "time(4i)" => "09", "time(5i)" => "30"})
120
+ select_datetime "December 25, 2003 9:30"
121
+ click_button
122
+ end
123
+
124
+ it "should fail if the specified label is not found" do
125
+ with_html <<-HTML
126
+ <html>
127
+ <form method="post" action="/appointments">
128
+ <select name="month"><option>January</option></select>
129
+ <input type="submit" />
130
+ </form>
131
+ </html>
132
+ HTML
133
+
134
+ lambda { select_datetime "December 25, 2003 9:30", :from => "Time" }.should raise_error(Webrat::NotFoundError)
135
+ end
136
+
137
+ end
@@ -0,0 +1,474 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "select" do
4
+ it "should fail with a helpful message when option not found" do
5
+ with_html <<-HTML
6
+ <html>
7
+ <form method="get" action="/login">
8
+ <select name="month"><option value="1">January</option></select>
9
+ </form>
10
+ </html>
11
+ HTML
12
+
13
+ lambda { select "February", :from => "month" }.should raise_error(Webrat::NotFoundError,
14
+ "The 'February' option was not found in the \"month\" select box")
15
+ end
16
+
17
+ it "should fail if option not found in list specified by element name" do
18
+ with_html <<-HTML
19
+ <html>
20
+ <form method="get" action="/login">
21
+ <select name="month"><option value="1">January</option></select>
22
+ <select name="year"><option value="2008">2008</option></select>
23
+ </form>
24
+ </html>
25
+ HTML
26
+
27
+ lambda { select "February", :from => "year" }.should raise_error(Webrat::NotFoundError)
28
+ end
29
+
30
+ it "should fail if specified list not found" do
31
+ with_html <<-HTML
32
+ <html>
33
+ <form method="get" action="/login">
34
+ <select name="month"><option value="1">January</option></select>
35
+ </form>
36
+ </html>
37
+ HTML
38
+
39
+ lambda { select "February", :from => "year" }.should raise_error(Webrat::NotFoundError)
40
+ end
41
+
42
+
43
+ it "should fail if the select is disabled" do
44
+ with_html <<-HTML
45
+ <html>
46
+ <form method="post" action="/login">
47
+ <select name="month" disabled="disabled"><option value="1">January</option></select>
48
+ <input type="submit" />
49
+ </form>
50
+ </html>
51
+ HTML
52
+
53
+ lambda { select "January", :from => "month" }.should raise_error(Webrat::DisabledFieldError)
54
+ end
55
+
56
+ it "should send value from option" do
57
+ with_html <<-HTML
58
+ <html>
59
+ <form method="post" action="/login">
60
+ <select name="month"><option value="1">January</option></select>
61
+ <input type="submit" />
62
+ </form>
63
+ </html>
64
+ HTML
65
+ webrat_session.should_receive(:post).with("/login", "month" => "1")
66
+ select "January", :from => "month"
67
+ click_button
68
+ end
69
+
70
+ it "should send values with HTML encoded ampersands" do
71
+ with_html <<-HTML
72
+ <html>
73
+ <form method="post" action="/login">
74
+ <select name="encoded"><option value="A &amp; B">Encoded</option></select>
75
+ <input type="submit" />
76
+ </form>
77
+ </html>
78
+ HTML
79
+ webrat_session.should_receive(:post).with("/login", "encoded" => "A & B")
80
+ select "Encoded", :from => "encoded"
81
+ click_button
82
+ end
83
+
84
+ it "should work with empty select lists" do
85
+ with_html <<-HTML
86
+ <html>
87
+ <form method="post" action="/login">
88
+ <select name="month"></select>
89
+ <input type="submit" />
90
+ </form>
91
+ </html>
92
+ HTML
93
+ webrat_session.should_receive(:post).with("/login", 'month' => '')
94
+ click_button
95
+ end
96
+
97
+ it "should work without specifying the field name or label" do
98
+ with_html <<-HTML
99
+ <html>
100
+ <form method="post" action="/login">
101
+ <select name="month"><option value="1">January</option></select>
102
+ <input type="submit" />
103
+ </form>
104
+ </html>
105
+ HTML
106
+ webrat_session.should_receive(:post).with("/login", "month" => "1")
107
+ select "January"
108
+ click_button
109
+ end
110
+
111
+ it "should send value from option in list specified by name" do
112
+ with_html <<-HTML
113
+ <html>
114
+ <form method="post" action="/login">
115
+ <select name="start_month"><option value="s1">January</option></select>
116
+ <select name="end_month"><option value="e1">January</option></select>
117
+ <input type="submit" />
118
+ </form>
119
+ </html>
120
+ HTML
121
+ webrat_session.should_receive(:post).with("/login", "start_month" => "s1", "end_month" => "e1")
122
+ select "January", :from => "end_month"
123
+ click_button
124
+ end
125
+
126
+ it "should send value from option in list specified by label" do
127
+ with_html <<-HTML
128
+ <html>
129
+ <form method="post" action="/login">
130
+ <label for="start_month">Start Month</label>
131
+ <select id="start_month" name="start_month"><option value="s1">January</option></select>
132
+ <label for="end_month">End Month</label>
133
+ <select id="end_month" name="end_month"><option value="e1">January</option></select>
134
+ <input type="submit" />
135
+ </form>
136
+ </html>
137
+ HTML
138
+ webrat_session.should_receive(:post).with("/login", "start_month" => "s1", "end_month" => "e1")
139
+ select "January", :from => "End Month"
140
+ click_button
141
+ end
142
+
143
+ it "should use option text if no value" do
144
+ with_html <<-HTML
145
+ <html>
146
+ <form method="post" action="/login">
147
+ <select name="month"><option>January</option></select>
148
+ <input type="submit" />
149
+ </form>
150
+ </html>
151
+ HTML
152
+ webrat_session.should_receive(:post).with("/login", "month" => "January")
153
+ select "January", :from => "month"
154
+ click_button
155
+ end
156
+
157
+ it "should find option by regexp" do
158
+ with_html <<-HTML
159
+ <html>
160
+ <form method="post" action="/login">
161
+ <select name="month"><option>January</option></select>
162
+ <input type="submit" />
163
+ </form>
164
+ </html>
165
+ HTML
166
+ webrat_session.should_receive(:post).with("/login", "month" => "January")
167
+ select /jan/i
168
+ click_button
169
+ end
170
+
171
+ it "should find options by regexp with HTML entities" do
172
+ with_html <<-HTML
173
+ <html>
174
+ <form method="post" action="/login">
175
+ <select name="month"><option>Peanut butter &amp; jelly</option></select>
176
+ <input type="submit" />
177
+ </form>
178
+ </html>
179
+ HTML
180
+
181
+ webrat_session.should_receive(:post).with("/login", "month" => "Peanut butter & jelly")
182
+ select /Peanut butter & jelly/
183
+ click_button
184
+ end
185
+
186
+ it "should not find options by regexp with HTML entities in the regexp" do
187
+ with_html <<-HTML
188
+ <html>
189
+ <form method="post" action="/login">
190
+ <select name="month"><option>Peanut butter &amp; jelly</option></select>
191
+ <input type="submit" />
192
+ </form>
193
+ </html>
194
+ HTML
195
+
196
+ lambda {
197
+ select /Peanut butter &amp; jelly/
198
+ }.should raise_error(Webrat::NotFoundError)
199
+ end
200
+
201
+ it "should fail if no option matching the regexp exists" do
202
+ with_html <<-HTML
203
+ <html>
204
+ <form method="post" action="/login">
205
+ <select name="month"><option>January</option></select>
206
+ <input type="submit" />
207
+ </form>
208
+ </html>
209
+ HTML
210
+
211
+ lambda {
212
+ select /feb/i
213
+ }.should raise_error(Webrat::NotFoundError)
214
+ end
215
+
216
+ it "should find option by regexp in list specified by label" do
217
+ with_html <<-HTML
218
+ <html>
219
+ <form method="post" action="/login">
220
+ <label for="start_month">Start Month</label>
221
+ <select id="start_month" name="start_month"><option value="s1">January</option></select>
222
+ <label for="end_month">End Month</label>
223
+ <select id="end_month" name="end_month"><option value="e1">January</option></select>
224
+ <input type="submit" />
225
+ </form>
226
+ </html>
227
+ HTML
228
+ webrat_session.should_receive(:post).with("/login", "start_month" => "s1", "end_month" => "e1")
229
+ select /jan/i, :from => "End Month"
230
+ click_button
231
+ end
232
+
233
+ it "should properly handle submitting HTML entities in select values" do
234
+ with_html <<-HTML
235
+ <html>
236
+ <form method="post" action="/login">
237
+ <select name="month"><option>Peanut butter &amp; jelly</option></select>
238
+ <input type="submit" />
239
+ </form>
240
+ </html>
241
+ HTML
242
+
243
+ webrat_session.should_receive(:post).with("/login", "month" => "Peanut butter & jelly")
244
+ click_button
245
+ end
246
+
247
+ it "should properly handle locating with HTML entities in select values" do
248
+ with_html <<-HTML
249
+ <html>
250
+ <form method="post" action="/login">
251
+ <select name="month"><option>Peanut butter &amp; jelly</option></select>
252
+ <input type="submit" />
253
+ </form>
254
+ </html>
255
+ HTML
256
+
257
+ webrat_session.should_receive(:post).with("/login", "month" => "Peanut butter & jelly")
258
+ select "Peanut butter & jelly"
259
+ click_button
260
+ end
261
+
262
+ it "should not locate based on HTML entities" do
263
+ with_html <<-HTML
264
+ <html>
265
+ <form method="post" action="/login">
266
+ <select name="month"><option>Peanut butter &amp; jelly</option></select>
267
+ <input type="submit" />
268
+ </form>
269
+ </html>
270
+ HTML
271
+
272
+ lambda {
273
+ select "Peanut butter &amp; jelly"
274
+ }.should raise_error(Webrat::NotFoundError)
275
+ end
276
+
277
+ it "should submit duplicates selected options as a single value" do
278
+ with_html <<-HTML
279
+ <html>
280
+ <form method="post" action="/login">
281
+ <select name="clothes"><option value="pants" selected="selected">pants</option><option value="pants" selected="selected">pants</option></select>
282
+ <input type="submit" />
283
+ </form>
284
+ </html>
285
+ HTML
286
+
287
+ webrat_session.should_receive(:post).with("/login", "clothes" => "pants")
288
+ click_button
289
+ end
290
+
291
+ it "should allow fields to be unselected" do
292
+ with_html <<-HTML
293
+ <html>
294
+ <form method="post" action="/login">
295
+ <select name="clothes">
296
+ <option value="tshirt" selected="selected">tshirt</option>
297
+ <option value="pants">pants</option>
298
+ </select>
299
+ <input type="submit" />
300
+ </form>
301
+ </html>
302
+ HTML
303
+
304
+ webrat_session.should_receive(:post).with("/login", {"clothes"=>""})
305
+ unselect "tshirt"
306
+ click_button
307
+ end
308
+
309
+ #
310
+ # Mutliple Selection Fields
311
+ #
312
+
313
+ it "should not submit any values for multiples without any selected" do
314
+ with_html <<-HTML
315
+ <html>
316
+ <form method="post" action="/login">
317
+ <select name="clothes[]" multiple="multiple">
318
+ <option value="tshirt">tshirt</option>
319
+ <option value="pants">pants</option>
320
+ </select>
321
+ <input type="submit" />
322
+ </form>
323
+ </html>
324
+ HTML
325
+
326
+ webrat_session.should_receive(:post).with("/login", {})
327
+ click_button
328
+ end
329
+
330
+ it "should submit with preselected values" do
331
+ with_html <<-HTML
332
+ <html>
333
+ <form method="post" action="/login">
334
+ <select name="clothes[]" multiple="multiple">
335
+ <option value="tshirt" selected="selected">tshirt</option>
336
+ <option value="pants" selected="selected">pants</option>
337
+ </select>
338
+ <input type="submit" />
339
+ </form>
340
+ </html>
341
+ HTML
342
+
343
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['tshirt', 'pants'])
344
+ click_button
345
+ end
346
+
347
+ it "should allow selection of multiple fields" do
348
+ with_html <<-HTML
349
+ <html>
350
+ <form method="post" action="/login">
351
+ <select name="clothes[]" multiple="multiple">
352
+ <option value="tshirt">tshirt</option>
353
+ <option value="pants">pants</option>
354
+ </select>
355
+ <input type="submit" />
356
+ </form>
357
+ </html>
358
+ HTML
359
+
360
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['pants'])
361
+ select 'pants'
362
+ click_button
363
+ end
364
+
365
+ it "should allow selection of multiple fields when including from" do
366
+ with_html <<-HTML
367
+ <html>
368
+ <form method="post" action="/login">
369
+ <select name="clothes[]" multiple="multiple">
370
+ <option value="tshirt">tshirt</option>
371
+ <option value="pants">pants</option>
372
+ </select>
373
+ <input type="submit" />
374
+ </form>
375
+ </html>
376
+ HTML
377
+
378
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['pants'])
379
+ select 'pants', :from => 'clothes[]'
380
+ click_button
381
+ end
382
+
383
+
384
+ it "should not overwrite preselected multiples" do
385
+ with_html <<-HTML
386
+ <html>
387
+ <form method="post" action="/login">
388
+ <select name="clothes[]" multiple="multiple">
389
+ <option value="tshirt" selected="selected">tshirt</option>
390
+ <option value="pants">pants</option>
391
+ </select>
392
+ <input type="submit" />
393
+ </form>
394
+ </html>
395
+ HTML
396
+
397
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['tshirt', 'pants'])
398
+ select 'pants'
399
+ click_button
400
+ end
401
+
402
+ it "should allow fields that exist to be selected or throw errors" do
403
+ with_html <<-HTML
404
+ <html>
405
+ <form method="post" action="/login">
406
+ <select name="clothes[]" multiple="multiple">
407
+ <option value="top" selected="selected">shirt</option>
408
+ <option value="pants">trousers</option>
409
+ </select>
410
+ <input type="submit" />
411
+ </form>
412
+ </html>
413
+ HTML
414
+
415
+ lambda { select "shirt" }.should_not raise_error(Webrat::NotFoundError)
416
+ lambda { select "trousers" }.should_not raise_error(Webrat::NotFoundError)
417
+ lambda { select "shoes" }.should raise_error(Webrat::NotFoundError)
418
+ end
419
+
420
+ it "should allow selected fields to be unselected" do
421
+ with_html <<-HTML
422
+ <html>
423
+ <form method="post" action="/login">
424
+ <select name="clothes[]" multiple="multiple">
425
+ <option value="tshirt" selected="selected">tshirt</option>
426
+ <option value="pants" selected="selected">pants</option>
427
+ </select>
428
+ <input type="submit" />
429
+ </form>
430
+ </html>
431
+ HTML
432
+
433
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['pants'])
434
+ unselect 'tshirt'
435
+ click_button
436
+ end
437
+
438
+ it "should be able to select options with special characters" do
439
+ with_html <<-HTML
440
+ <html>
441
+ <form method="post" action="/login">
442
+ <select name="clothes[]" multiple="multiple">
443
+ <option>tshirt &amp; sweater</option>
444
+ <option>pants &amp; socks</option>
445
+ </select>
446
+ <input type="submit" />
447
+ </form>
448
+ </html>
449
+ HTML
450
+
451
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['pants & socks'])
452
+ select 'pants & socks'
453
+ click_button
454
+ end
455
+
456
+ it "should be able to unselect options with special characters" do
457
+ with_html <<-HTML
458
+ <html>
459
+ <form method="post" action="/login">
460
+ <select name="clothes[]" multiple="multiple">
461
+ <option selected="selected">tshirt &amp; sweater</option>
462
+ <option selected="selected">pants &amp; socks</option>
463
+ </select>
464
+ <input type="submit" />
465
+ </form>
466
+ </html>
467
+ HTML
468
+
469
+ webrat_session.should_receive(:post).with("/login", "clothes" => ['tshirt & sweater'])
470
+ unselect 'pants & socks'
471
+ click_button
472
+ end
473
+
474
+ end