diabolo-webrat 0.4.3 → 0.4.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 (81) hide show
  1. data/History.txt +8 -0
  2. data/Rakefile +5 -1
  3. data/lib/webrat/core/locators/field_labeled_locator.rb +1 -1
  4. data/lib/webrat/core/locators/label_locator.rb +1 -1
  5. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  6. data/lib/webrat/selenium/application_server.rb +71 -0
  7. data/lib/webrat/selenium/merb_application_server.rb +48 -0
  8. data/lib/webrat/selenium/rails_application_server.rb +42 -0
  9. data/lib/webrat/selenium/selenium_rc_server.rb +80 -0
  10. data/lib/webrat/selenium/sinatra_application_server.rb +35 -0
  11. data/spec/fakes/test_session.rb +34 -0
  12. data/spec/integration/merb/app/controllers/application.rb +2 -0
  13. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  14. data/spec/integration/merb/app/controllers/testing.rb +18 -0
  15. data/spec/integration/merb/config/environments/development.rb +15 -0
  16. data/spec/integration/merb/config/environments/rake.rb +11 -0
  17. data/spec/integration/merb/config/environments/test.rb +14 -0
  18. data/spec/integration/merb/config/init.rb +25 -0
  19. data/spec/integration/merb/config/rack.rb +11 -0
  20. data/spec/integration/merb/config/router.rb +33 -0
  21. data/spec/integration/merb/spec/spec_helper.rb +24 -0
  22. data/spec/integration/merb/spec/webrat_spec.rb +32 -0
  23. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  24. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  25. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  26. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  27. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  28. data/spec/integration/rails/app/controllers/application.rb +15 -0
  29. data/spec/integration/rails/app/controllers/webrat_controller.rb +39 -0
  30. data/spec/integration/rails/config/boot.rb +109 -0
  31. data/spec/integration/rails/config/environment.rb +12 -0
  32. data/spec/integration/rails/config/environments/development.rb +17 -0
  33. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  34. data/spec/integration/rails/config/environments/test.rb +22 -0
  35. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  36. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  37. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  38. data/spec/integration/rails/config/routes.rb +14 -0
  39. data/spec/integration/rails/test/integration/webrat_test.rb +80 -0
  40. data/spec/integration/rails/test/test_helper.rb +25 -0
  41. data/spec/integration/sinatra/classic_app.rb +64 -0
  42. data/spec/integration/sinatra/modular_app.rb +16 -0
  43. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  44. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  45. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  46. data/spec/private/core/configuration_spec.rb +104 -0
  47. data/spec/private/core/field_spec.rb +67 -0
  48. data/spec/private/core/link_spec.rb +24 -0
  49. data/spec/private/core/logging_spec.rb +10 -0
  50. data/spec/private/core/session_spec.rb +198 -0
  51. data/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  52. data/spec/private/merb/merb_session_spec.rb +42 -0
  53. data/spec/private/nokogiri_spec.rb +77 -0
  54. data/spec/private/rails/attaches_file_spec.rb +81 -0
  55. data/spec/private/rails/rails_session_spec.rb +110 -0
  56. data/spec/public/basic_auth_spec.rb +24 -0
  57. data/spec/public/check_spec.rb +191 -0
  58. data/spec/public/choose_spec.rb +118 -0
  59. data/spec/public/click_area_spec.rb +106 -0
  60. data/spec/public/click_button_spec.rb +502 -0
  61. data/spec/public/click_link_spec.rb +541 -0
  62. data/spec/public/fill_in_spec.rb +209 -0
  63. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  64. data/spec/public/locators/field_labeled_spec.rb +172 -0
  65. data/spec/public/locators/field_with_id_spec.rb +16 -0
  66. data/spec/public/matchers/contain_spec.rb +114 -0
  67. data/spec/public/matchers/have_selector_spec.rb +135 -0
  68. data/spec/public/matchers/have_tag_spec.rb +39 -0
  69. data/spec/public/matchers/have_xpath_spec.rb +123 -0
  70. data/spec/public/reload_spec.rb +10 -0
  71. data/spec/public/save_and_open_spec.rb +51 -0
  72. data/spec/public/select_date_spec.rb +112 -0
  73. data/spec/public/select_datetime_spec.rb +137 -0
  74. data/spec/public/select_spec.rb +261 -0
  75. data/spec/public/select_time_spec.rb +100 -0
  76. data/spec/public/set_hidden_field_spec.rb +5 -0
  77. data/spec/public/submit_form_spec.rb +5 -0
  78. data/spec/public/visit_spec.rb +58 -0
  79. data/spec/public/within_spec.rb +177 -0
  80. data/spec/spec_helper.rb +50 -0
  81. metadata +90 -25
@@ -0,0 +1,209 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "fill_in" do
4
+ it "should work with textareas" do
5
+ with_html <<-HTML
6
+ <html>
7
+ <form method="post" action="/login">
8
+ <label for="user_text">User Text</label>
9
+ <textarea id="user_text" name="user[text]"></textarea>
10
+ <input type="submit" />
11
+ </form>
12
+ </html>
13
+ HTML
14
+ webrat_session.should_receive(:post).with("/login", "user" => {"text" => "filling text area"})
15
+ fill_in "User Text", :with => "filling text area"
16
+ click_button
17
+ end
18
+
19
+ it "should work with password fields" do
20
+ with_html <<-HTML
21
+ <html>
22
+ <form method="post" action="/login">
23
+ <input id="user_text" name="user[text]" type="password" />
24
+ <input type="submit" />
25
+ </form>
26
+ </html>
27
+ HTML
28
+ webrat_session.should_receive(:post).with("/login", "user" => {"text" => "pass"})
29
+ fill_in "user_text", :with => "pass"
30
+ click_button
31
+ end
32
+
33
+ it "should fail if input not found" do
34
+ with_html <<-HTML
35
+ <html>
36
+ <form method="get" action="/login">
37
+ </form>
38
+ </html>
39
+ HTML
40
+
41
+ lambda { fill_in "Email", :with => "foo@example.com" }.should raise_error(Webrat::NotFoundError)
42
+ end
43
+
44
+ it "should fail if input is disabled" do
45
+ with_html <<-HTML
46
+ <html>
47
+ <form method="get" action="/login">
48
+ <label for="user_email">Email</label>
49
+ <input id="user_email" name="user[email]" type="text" disabled="disabled" />
50
+ <input type="submit" />
51
+ </form>
52
+ </html>
53
+ HTML
54
+
55
+ lambda { fill_in "Email", :with => "foo@example.com" }.should raise_error(Webrat::DisabledFieldError)
56
+ end
57
+
58
+ it "should allow overriding default form values" do
59
+ with_html <<-HTML
60
+ <html>
61
+ <form method="post" action="/login">
62
+ <label for="user_email">Email</label>
63
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
64
+ <input type="submit" />
65
+ </form>
66
+ </html>
67
+ HTML
68
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
69
+ fill_in "user[email]", :with => "foo@example.com"
70
+ click_button
71
+ end
72
+
73
+ it "should choose the shortest label match" do
74
+ with_html <<-HTML
75
+ <html>
76
+ <form method="post" action="/login">
77
+ <label for="user_mail1">Some other mail</label>
78
+ <input id="user_mail1" name="user[mail1]" type="text" />
79
+ <label for="user_mail2">Some mail</label>
80
+ <input id="user_mail2" name="user[mail2]" type="text" />
81
+ <input type="submit" />
82
+ </form>
83
+ </html>
84
+ HTML
85
+
86
+ webrat_session.should_receive(:post).with("/login", "user" => {"mail1" => "", "mail2" => "value"})
87
+ fill_in "Some", :with => "value"
88
+ click_button
89
+ end
90
+
91
+ it "should choose the first label match if closest is a tie" do
92
+ with_html <<-HTML
93
+ <html>
94
+ <form method="post" action="/login">
95
+ <label for="user_mail1">Some mail one</label>
96
+ <input id="user_mail1" name="user[mail1]" type="text" />
97
+ <label for="user_mail2">Some mail two</label>
98
+ <input id="user_mail2" name="user[mail2]" type="text" />
99
+ <input type="submit" />
100
+ </form>
101
+ </html>
102
+ HTML
103
+
104
+ webrat_session.should_receive(:post).with("/login", "user" => {"mail1" => "value", "mail2" => ""})
105
+ fill_in "Some mail", :with => "value"
106
+ click_button
107
+ end
108
+
109
+ it "should anchor label matches to start of label" do
110
+ with_html <<-HTML
111
+ <html>
112
+ <form method="post" action="/login">
113
+ <label for="user_email">Some mail</label>
114
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
115
+ </form>
116
+ </html>
117
+ HTML
118
+
119
+ lambda { fill_in "mail", :with => "value" }.should raise_error(Webrat::NotFoundError)
120
+ end
121
+
122
+ it "should anchor label matches to word boundaries" do
123
+ with_html <<-HTML
124
+ <html>
125
+ <form method="post" action="/login">
126
+ <label for="user_email">Emailtastic</label>
127
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
128
+ </form>
129
+ </html>
130
+ HTML
131
+
132
+ lambda { fill_in "Email", :with => "value" }.should raise_error(Webrat::NotFoundError)
133
+ end
134
+
135
+ it "should work with inputs nested in labels" do
136
+ with_html <<-HTML
137
+ <html>
138
+ <form method="post" action="/login">
139
+ <label>
140
+ Email
141
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
142
+ </label>
143
+ <input type="submit" />
144
+ </form>
145
+ </html>
146
+ HTML
147
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
148
+ fill_in "Email", :with => "foo@example.com"
149
+ click_button
150
+ end
151
+
152
+ it "should work with full input names" do
153
+ with_html <<-HTML
154
+ <html>
155
+ <form method="post" action="/login">
156
+ <input id="user_email" name="user[email]" type="text" />
157
+ <input type="submit" />
158
+ </form>
159
+ </html>
160
+ HTML
161
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
162
+ fill_in "user[email]", :with => "foo@example.com"
163
+ click_button
164
+ end
165
+
166
+ it "should work if the input type is not set" do
167
+ with_html <<-HTML
168
+ <html>
169
+ <form method="post" action="/login">
170
+ <input id="user_email" name="user[email]" />
171
+ <input type="submit" />
172
+ </form>
173
+ </html>
174
+ HTML
175
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
176
+ fill_in "user[email]", :with => "foo@example.com"
177
+ click_button
178
+ end
179
+
180
+ it "should work with symbols" do
181
+ with_html <<-HTML
182
+ <html>
183
+ <form method="post" action="/login">
184
+ <label for="user_email">Email</label>
185
+ <input id="user_email" name="user[email]" type="text" />
186
+ <input type="submit" />
187
+ </form>
188
+ </html>
189
+ HTML
190
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
191
+ fill_in :email, :with => "foo@example.com"
192
+ click_button
193
+ end
194
+
195
+ it "should escape field values" do
196
+ with_html <<-HTML
197
+ <html>
198
+ <form method="post" action="/users">
199
+ <label for="user_phone">Phone</label>
200
+ <input id="user_phone" name="user[phone]" type="text" />
201
+ <input type="submit" />
202
+ </form>
203
+ </html>
204
+ HTML
205
+ webrat_session.should_receive(:post).with("/users", "user" => {"phone" => "+1 22 33"})
206
+ fill_in 'Phone', :with => "+1 22 33"
207
+ click_button
208
+ end
209
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_by_xpath" do
5
+ it "should work" do
6
+ with_html <<-HTML
7
+ <html>
8
+ <form>
9
+ <label for="element_42">The Label</label>
10
+ <input type="text" id="element_42">
11
+ </form>
12
+ </html>
13
+ HTML
14
+
15
+ field = field_by_xpath(".//input")
16
+ field.should_not be_nil
17
+ field.id.should == "element_42"
18
+ end
19
+ end
@@ -0,0 +1,172 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_labeled" do
5
+ class << self
6
+ def using_this_html html
7
+ before(:each) do
8
+ with_html(html)
9
+ end
10
+ end
11
+
12
+ def field_labeled(label)
13
+ @label = label
14
+ yield
15
+ end
16
+
17
+ def should_return_a type, opts
18
+ it "should return a textfield" do
19
+ field_labeled(opts[:for]).should be_an_instance_of(type)
20
+ end
21
+ end
22
+
23
+ def with_an_id_of id, opts
24
+ it "should return an element with the correct id" do
25
+ field_labeled(opts[:for]).should match_id(id)
26
+ end
27
+ end
28
+
29
+ def should_raise_error_matching regexp, opts
30
+ it "should raise with wrong label" do
31
+ lambda {
32
+ field_labeled(opts[:for])
33
+ }.should raise_error(regexp)
34
+ end
35
+ end
36
+ end
37
+
38
+ def match_id(id)
39
+ simple_matcher "element with id #{id.inspect}" do |element, matcher|
40
+ if id.is_a?(Regexp)
41
+ element.id =~ id
42
+ else
43
+ element.id == id.to_s
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "finding a text field" do
49
+ using_this_html <<-HTML
50
+ <html>
51
+ <form>
52
+ <label for="element_42">The Label</label>
53
+ <input type="text" id="element_42">
54
+ </form>
55
+ </html>
56
+ HTML
57
+
58
+ should_return_a Webrat::TextField, :for => "The Label"
59
+ with_an_id_of "element_42", :for => "The Label"
60
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
61
+ end
62
+
63
+ describe "finding a hidden field" do
64
+ using_this_html <<-HTML
65
+ <html>
66
+ <form>
67
+ <label for="element_42">The Label</label>
68
+ <input type="hidden" id="element_42">
69
+ </form>
70
+ </html>
71
+ HTML
72
+
73
+ should_return_a Webrat::HiddenField, :for => "The Label"
74
+ with_an_id_of "element_42", :for => "The Label"
75
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
76
+ end
77
+
78
+ describe "finding a checkbox" do
79
+ using_this_html <<-HTML
80
+ <html>
81
+ <form>
82
+ <label for="element_42">The Label</label>
83
+ <input type="checkbox" id="element_42">
84
+ </form>
85
+ </html>
86
+ HTML
87
+
88
+ should_return_a Webrat::CheckboxField, :for => "The Label"
89
+ with_an_id_of "element_42", :for => "The Label"
90
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
91
+ end
92
+
93
+ describe "finding a radio button" do
94
+ using_this_html <<-HTML
95
+ <html>
96
+ <form>
97
+ <label for="element_42">The Label</label>
98
+ <input type="radio" id="element_42">
99
+ </form>
100
+ </html>
101
+ HTML
102
+
103
+ should_return_a Webrat::RadioField, :for => "The Label"
104
+ with_an_id_of "element_42", :for => "The Label"
105
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
106
+ end
107
+
108
+
109
+ describe "finding a text area" do
110
+ using_this_html <<-HTML
111
+ <html>
112
+ <form>
113
+ <label for="element_42">The Label</label>
114
+ <textarea id="element_42"></textarea>
115
+ </form>
116
+ </html>
117
+ HTML
118
+
119
+ should_return_a Webrat::TextareaField, :for => "The Label"
120
+ with_an_id_of "element_42", :for => "The Label"
121
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
122
+ end
123
+
124
+ describe "finding a field with it's label containing newlines" do
125
+ using_this_html <<-HTML
126
+ <html>
127
+ <form>
128
+ <label for="element_42">
129
+ A label with
130
+ <a>a link on it's own line</a>
131
+ </label>
132
+ <input type="text" id="element_42">
133
+ </form>
134
+ </html>
135
+ HTML
136
+
137
+ should_return_a Webrat::TextField, :for => "A label with a link on it's own line"
138
+ with_an_id_of "element_42", :for => "A label with a link on it's own line"
139
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
140
+ end
141
+
142
+ describe "finding a field when labels without fields also match" do
143
+ using_this_html <<-HTML
144
+ <html>
145
+ <label>The Label</label>
146
+ <form>
147
+ <label for="element_42">The Label</label>
148
+ <input type="text" id="element_42">
149
+ </form>
150
+ </html>
151
+ HTML
152
+
153
+ should_return_a Webrat::TextField, :for => "The Label"
154
+ with_an_id_of "element_42", :for => "The Label"
155
+ end
156
+
157
+ describe "finding a field whose label ends with an non word character" do
158
+ using_this_html <<-HTML
159
+ <html>
160
+ <form>
161
+ <label for="element_42">License #</label>
162
+ <input type="text" id="element_42">
163
+ </form>
164
+ </html>
165
+ HTML
166
+
167
+ should_return_a Webrat::TextField, :for => "License #"
168
+ with_an_id_of "element_42", :for => "License #"
169
+ should_raise_error_matching /Could not find .* "Other License #"/, :for => "Other License #"
170
+ end
171
+
172
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_with_id" do
5
+ it "should work when there is a single quote in the ID" do
6
+ with_html <<-HTML
7
+ <html>
8
+ <form>
9
+ <input type="text" id="user's name">
10
+ </form>
11
+ </html>
12
+ HTML
13
+
14
+ field_with_id("user's name").id.should == "user's name"
15
+ end
16
+ end
@@ -0,0 +1,114 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "contain" do
4
+ include Webrat::Matchers
5
+
6
+ before(:each) do
7
+ @body = <<-HTML
8
+ <div id='main'>
9
+ <div class='inner'>hello, world!</div>
10
+ <h2>Welcome "Bryan"</h2>
11
+ <h3>Welcome 'Bryan'</h3>
12
+ <h4>Welcome 'Bryan"</h4>
13
+ <ul>
14
+ <li>First</li>
15
+ <li>Second</li>
16
+ </ul>
17
+ </div>
18
+ HTML
19
+ end
20
+
21
+ before(:each) do
22
+ @body = <<-EOF
23
+ <div id='main'>
24
+ <div class='inner'>hello, world!</div>
25
+ </div>
26
+ EOF
27
+ end
28
+
29
+ describe "#matches?" do
30
+ it "should call element#contains? when the argument is a string" do
31
+ @body.should contain("hello, world!")
32
+ end
33
+
34
+ it "should call element#matches? when the argument is a regular expression" do
35
+ @body.should contain(/hello, world/)
36
+ end
37
+ end
38
+
39
+ describe "asserts for contains," do
40
+ include Test::Unit::Assertions
41
+
42
+ before(:each) do
43
+ should_receive(:response_body).and_return @body
44
+ require 'test/unit'
45
+ end
46
+
47
+ describe "assert_contain" do
48
+ it "should pass when containing the text" do
49
+ assert_contain("hello, world")
50
+ end
51
+
52
+ it "should pass when containing the regexp" do
53
+ assert_contain(/hello, world/)
54
+ end
55
+
56
+ it "should throw an exception when the body doesnt contain the text" do
57
+ lambda {
58
+ assert_contain("monkeys")
59
+ }.should raise_error(Test::Unit::AssertionFailedError)
60
+ end
61
+
62
+ it "should throw an exception when the body doesnt contain the regexp" do
63
+ lambda {
64
+ assert_contain(/monkeys/)
65
+ }.should raise_error(Test::Unit::AssertionFailedError)
66
+ end
67
+ end
68
+
69
+ describe "assert_not_contain" do
70
+ it "should pass when not containing the text" do
71
+ assert_not_contain("monkeys")
72
+ end
73
+
74
+ it "should pass when not containing the regexp" do
75
+ assert_not_contain(/monkeys/)
76
+ end
77
+
78
+ it "should throw an exception when the body does contain the text" do
79
+ lambda {
80
+ assert_not_contain("hello, world")
81
+ }.should raise_error(Test::Unit::AssertionFailedError)
82
+ end
83
+
84
+ it "should throw an exception when the body does contain the regexp" do
85
+ lambda {
86
+ assert_not_contain(/hello, world/)
87
+ }.should raise_error(Test::Unit::AssertionFailedError)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "#failure_message" do
93
+ it "should include the content string" do
94
+ hc = Webrat::Matchers::HasContent.new("hello, world!")
95
+ hc.matches?(@body)
96
+
97
+ hc.failure_message.should include("\"hello, world!\"")
98
+ end
99
+
100
+ it "should include the content regular expresson" do
101
+ hc = Webrat::Matchers::HasContent.new(/hello,\sworld!/)
102
+ hc.matches?(@body)
103
+
104
+ hc.failure_message.should include("/hello,\\sworld!/")
105
+ end
106
+
107
+ it "should include the element's inner content" do
108
+ hc = Webrat::Matchers::HasContent.new(/hello,\sworld!/)
109
+ hc.matches?(@body)
110
+
111
+ hc.failure_message.should include("hello, world!")
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,135 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "have_selector" do
4
+ include Webrat::Matchers
5
+
6
+ before(:each) do
7
+ @body = <<-HTML
8
+ <div id='main'>
9
+ <div class='inner'>hello, world!</div>
10
+ <h2>Welcome "Bryan"</h2>
11
+ <h3>Welcome 'Bryan'</h3>
12
+ <h4>Welcome 'Bryan"</h4>
13
+ <ul>
14
+ <li>First</li>
15
+ <li>Second</li>
16
+ </ul>
17
+ </div>
18
+ HTML
19
+ end
20
+
21
+ it "should be able to match a CSS selector" do
22
+ @body.should have_selector("div")
23
+ end
24
+
25
+ it "should not match a CSS selector that does not exist" do
26
+ @body.should_not have_selector("p")
27
+ end
28
+
29
+ describe "specifying attributes" do
30
+ it "should be able to specify the attributes of the tag" do
31
+ @body.should have_selector("div", :class => "inner")
32
+ end
33
+ end
34
+
35
+ describe "specifying content" do
36
+ it "should be able to specify the content of the tag" do
37
+ @body.should have_selector("div", :content => "hello, world!")
38
+ end
39
+
40
+ it "should be able to specify the content of the tag with double quotes in it" do
41
+ @body.should have_selector("h2", :content => 'Welcome "Bryan"')
42
+ end
43
+
44
+ it "should be able to specify the content of the tag with single quotes in it" do
45
+ @body.should have_selector("h3", :content => "Welcome 'Bryan'")
46
+ end
47
+
48
+ it "should be able to specify the content of the tag with both kinds of quotes" do
49
+ @body.should have_selector("h4", :content => "Welcome 'Bryan\"")
50
+ end
51
+ end
52
+
53
+ describe "specifying counts" do
54
+ it "should be able to specify the number of occurences of the tag" do
55
+ @body.should have_selector("li", :count => 2)
56
+ end
57
+
58
+ it "should not match if the count is wrong" do
59
+ lambda {
60
+ @body.should have_selector("li", :count => 3)
61
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
62
+ end
63
+ end
64
+
65
+ describe "specifying nested elements" do
66
+ it "should be able to loop over all the matched elements" do
67
+ @body.should have_selector("div") do |node|
68
+ node.first.name.should == "div"
69
+ end
70
+ end
71
+
72
+ it "should not match of any of the matchers in the block fail" do
73
+ lambda {
74
+ @body.should have_selector("div") do |node|
75
+ node.first.name.should == "p"
76
+ end
77
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
78
+ end
79
+
80
+ it "should be able to use #have_selector in the block" do
81
+ @body.should have_selector("#main") do |node|
82
+ node.should have_selector(".inner")
83
+ end
84
+ end
85
+
86
+ it "should not match any parent tags in the block" do
87
+ lambda {
88
+ @body.should have_selector(".inner") do |node|
89
+ node.should have_selector("#main")
90
+ end
91
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
92
+ end
93
+
94
+ it "should work with items that have multiple child nodes" do
95
+ @body.should have_selector("ul") do |n|
96
+ n.should have_selector("li", :content => "First")
97
+ n.should have_selector("li", :content => "Second")
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "Test::Unit assertions" do
103
+ include Test::Unit::Assertions
104
+
105
+ before(:each) do
106
+ require 'test/unit'
107
+ should_receive(:response_body).and_return @body
108
+ end
109
+
110
+ describe "assert_have_selector" do
111
+ it "should pass when body contains the selection" do
112
+ assert_have_selector("div")
113
+ end
114
+
115
+ it "should throw an exception when the body doesnt have matching selection" do
116
+ lambda {
117
+ assert_have_selector("p")
118
+ }.should raise_error(Test::Unit::AssertionFailedError)
119
+ end
120
+ end
121
+
122
+ describe "assert_have_not_selector" do
123
+ it "should pass when the body doesn't contan the selection" do
124
+ assert_have_no_selector("p")
125
+ end
126
+
127
+ it "should throw an exception when the body does contain the selection" do
128
+ lambda {
129
+ assert_have_no_selector("div")
130
+ }.should raise_error(Test::Unit::AssertionFailedError)
131
+ end
132
+ end
133
+ end
134
+
135
+ end