ZenTest 3.6.0 → 3.6.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.
@@ -1,3 +1,14 @@
1
+ === 3.6.1 / 2007-07-23
2
+
3
+ * 4 minor enhancements:
4
+ * Test::Rails::ViewTestCase now uses assert_select.
5
+ * assert_form and friends now work with blocks like assert_select
6
+ does.
7
+ * Allow path_parameters in view tests to be ammended, making working
8
+ with routes easier.
9
+ * New version of autotest/notify.rb uses notify-send.
10
+ * Fixed rdoc formatting on autotest and a couple plugins.
11
+
1
12
  === 3.6.0 / 2007-05-25
2
13
 
3
14
  * 4 major enhancements:
@@ -48,12 +48,12 @@ $TESTING = false unless defined? $TESTING
48
48
  #
49
49
  # Strategy:
50
50
  #
51
- # 1) find all files and associate them from impl <-> test
52
- # 2) run all tests
53
- # 3) scan for failures
54
- # 4) detect changes in ANY (ruby?) file, rerun all failures + changed files
55
- # 5) until 0 defects, goto 3
56
- # 6) when 0 defects, goto 2
51
+ # 1. Find all files and associate them from impl <-> test.
52
+ # 2. Run all tests.
53
+ # 3. Scan for failures.
54
+ # 4. Detect changes in ANY (ruby?. file, rerun all failures + changed files.
55
+ # 5. Until 0 defects, goto 3.
56
+ # 6. When 0 defects, goto 2.
57
57
 
58
58
  class Autotest
59
59
 
@@ -1,38 +1,34 @@
1
- # libnotify plugin for autotest
2
-
3
- begin require 'rubygems'; rescue LoadError; end
4
- require 'libnotify'
5
-
6
- module Autotest::LibNotify
7
-
8
- LibNotify.init("autotest")
9
-
10
- def self.notify title, msg, ico = :info
11
- LibNotify::Notification.new(title, msg, "gtk-#{ico}", nil).show
1
+ module Autotest::Notify
2
+ def self.notify(title, message, priority='critical')
3
+ icon = if priority == 'critical'
4
+ 'dialog-error'
5
+ else
6
+ 'dialog-information'
7
+ end
8
+ system "notify-send -u #{priority} -t 10000 -i #{icon} '#{title}' '#{message.inspect}'"
12
9
  end
13
10
 
14
11
  Autotest.add_hook :red do |at|
15
- failed_tests = at.files_to_test.inject(0){ |s,a| k,v = a; s + v.size}
16
- notify "Tests Failed", "#{failed_tests} tests failed", :no
12
+ tests = 0
13
+ assertions = 0
14
+ failures = 0
15
+ errors = 0
16
+ at.results.scan(/(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/) do |t, a, f, e|
17
+ tests += t.to_i
18
+ assertions += a.to_i
19
+ failures += f.to_i
20
+ errors += e.to_i
21
+ end
22
+ message = "%d tests, %d assertions, %d failures, %d errors" %
23
+ [tests, assertions, failures, errors]
24
+ notify("Tests Failed", message)
17
25
  end
18
26
 
19
27
  Autotest.add_hook :green do |at|
20
- notify "Tests Passed", "All tests passed", :yes
21
- end
22
-
23
- Autotest.add_hook :run do |at|
24
- notify "autotest", "autotest was started" unless $TESTING
25
- end
26
-
27
- Autotest.add_hook :interrupt do |at|
28
- notify "autotest", "autotest was reset" unless $TESTING
29
- end
30
-
31
- Autotest.add_hook :quit do |at|
32
- notify "autotest", "autotest is exiting" unless $TESTING
28
+ notify("Tests Passed", "Outstanding tests passed", 'low') if at.tainted
33
29
  end
34
30
 
35
31
  Autotest.add_hook :all do |at|_hook
36
- notify "autotest", "Tests have fully passed", :yes unless $TESTING
32
+ notify("autotest", "Tests have fully passed", 'low')
37
33
  end
38
34
  end
@@ -1,15 +1,16 @@
1
- class Autotest::Screen
2
- # Autotest::Screen is test result notify GUN Screen's statusline.
3
- #
4
- # === screenshots
5
- # * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015543.png" />
6
- # * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015522.png" />
7
- #
8
- # == SYNOPSIS
9
- # require 'autotest/screen'
10
- # # Autotest::Screen.statusline = '%H %`%-w%{=b bw}%n %t%{-}%+w (your statusline)'
11
- #
1
+ ##
2
+ # Autotest::Screen is test result notify GUN Screen's statusline.
3
+ #
4
+ # === screenshots
5
+ # * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015543.png" />
6
+ # * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015522.png" />
7
+ #
8
+ # == SYNOPSIS
9
+ # require 'autotest/screen'
10
+ # # Autotest::Screen.statusline = '%H %`%-w%{=b bw}%n %t%{-}%+w (your statusline)'
11
+ #
12
12
 
13
+ class Autotest::Screen
13
14
  DEFAULT_STATUSLINE = '%H %`%-w%{=b bw}%n %t%{-}%+w'
14
15
  DEFAULT_SCREEN_CMD = 'screen'
15
16
 
@@ -247,7 +247,7 @@ $TESTING = true
247
247
  # The test target no longer runs all tests, it stops on the first
248
248
  # failure. This way a failure in a unit test doesn't fill your screen
249
249
  # with less important errors because the underlying failure also
250
- # affected your controllers and views.
250
+ # affected your controllers and views.
251
251
  #
252
252
  # The stats target is updated to account for controller and view tests.
253
253
 
@@ -1,4 +1,4 @@
1
- $TESTING_RTC = defined? $TESTING_RTC
1
+ $TESTING_RTC = defined?($TESTING_RTC) && $TESTING_RTC
2
2
 
3
3
  ##
4
4
  # FunctionalTestCase is an abstract class that sets up a controller instance
@@ -11,18 +11,18 @@
11
11
  #
12
12
  # = Naming
13
13
  #
14
- # The test class must be named after your controller class name, so if
15
- # you're testing views for the +RouteController+ you would name your
16
- # test case +RouteViewTest+. The test case will expect to find your
17
- # view files in <tt>app/views/route</tt>.
14
+ # The test class must be named after your controller class name, so if you're
15
+ # testing views for the +RouteController+ you would name your test case
16
+ # +RouteViewTest+. The test case will expect to find your view files in
17
+ # <tt>app/views/route</tt>.
18
18
  #
19
- # The test names should be in the form of +test_view_edgecase+ where
20
- # 'view' corresponds to the name of the view file, and 'edgecase'
21
- # describes the scenario you are testing.
19
+ # The test names should be in the form of +test_view_edgecase+ where 'view'
20
+ # corresponds to the name of the view file, and 'edgecase' describes the
21
+ # scenario you are testing.
22
22
  #
23
- # If you are testing a view file named 'show.rhtml' your test should
24
- # be named +test_show+. If your view is behaves differently depending
25
- # upon its parameters then you can make the test name descriptive like
23
+ # If you are testing a view file named 'show.rhtml' your test should be named
24
+ # +test_show+. If your view is behaves differently depending upon its
25
+ # parameters then you can make the test name descriptive like
26
26
  # +test_show_photos+ and +test_show_no_photos+.
27
27
  #
28
28
  # = Examples
@@ -42,12 +42,13 @@
42
42
  # render
43
43
  #
44
44
  # # assert that there's a form with an action of "/route/destroy"
45
- # form_url = '/route/destroy'
46
- # assert_post_form form_url
47
- # # with a hidden id field
48
- # assert_input form_url, :hidden, :id
49
- # # And a submit button that says 'Delete!'
50
- # assert_submit form_url, 'Delete!'
45
+ # assert_form form_url, :post do
46
+ # # with a hidden id field
47
+ # assert_input :hidden, :id
48
+ # # And a submit button that says 'Delete!'
49
+ # assert_submit 'Delete!'
50
+ # end
51
+ #
51
52
  # # And a link back to the route so you don't delete it
52
53
  # assert_links_to "/route/show/#{routes(:work).id}", 'No, I do not!'
53
54
  # end
@@ -65,7 +66,7 @@
65
66
  # class LayoutsViewTest < Test::Rails::ViewTestCase
66
67
  #
67
68
  # fixtures :users, :routes, :points, :photos
68
- #
69
+ #
69
70
  # def test_default
70
71
  # # Template set-up
71
72
  # @request.request_uri = '/foo'
@@ -77,12 +78,20 @@
77
78
  # # Assert content just like a regular view test.
78
79
  # assert_links_to '/', 'Home'
79
80
  # assert_links_to '/user', 'Login'
80
- # deny_links_to '/user/logout', 'Logout'
81
- # assert_tag :tag => 'title', :content => 'Hello &amp; Goodbye'
82
- # assert_tag :tag => 'h1', :content => 'Hello &amp; Goodbye'
81
+ # deny_links_to '/user/logout', 'Logout'
82
+ # assert_title 'Hello &amp; Goodbye'
83
+ # assert_h 1, 'Hello &amp; Goodbye'
83
84
  # end
84
- #
85
+ #
85
86
  # end
87
+ #
88
+ # = Deprecated Features
89
+ #
90
+ # Form assertions are now using assert_select, so you don't need to pass URLs
91
+ # around everywhere and can instead use a block. (See above example).
92
+ #
93
+ # The form assertions will still work using the old syntax, but in a future
94
+ # release they will give warnings, then will be removed.
86
95
 
87
96
  class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
88
97
 
@@ -95,6 +104,8 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
95
104
  def setup
96
105
  return if self.class == Test::Rails::ViewTestCase
97
106
 
107
+ @path_parameters ||= {}
108
+
98
109
  klass_name = self.class.name.sub(/View/, 'Controller')
99
110
  @controller_class_name ||= klass_name.sub 'Test', ''
100
111
 
@@ -135,7 +146,37 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
135
146
  #
136
147
  # render :template => 'profile/index'
137
148
  #
138
- # For this test:
149
+ # A test's path parameters may be overridden, allowing routes with
150
+ # additional parameters to work.
151
+ #
152
+ # == Working with Routes
153
+ #
154
+ # By default, a view tests sets the controller and action of a test to the
155
+ # controller name and action name for the test. This may be overriden.
156
+ #
157
+ # A test involving routes like:
158
+ #
159
+ # map.workspace '/users/:owner/workspace/:action',
160
+ # :controller => 'workspace', :action => 'workspace'
161
+ #
162
+ # Can be invoked by setting @path_parameters like this:
163
+ #
164
+ # def test__app_entry
165
+ # @path_parameters[:owner] = 'bob'
166
+ # @path_parameters[:action] = 'apps'
167
+ #
168
+ # render :partial => 'apps/app_entry'
169
+ #
170
+ # # ...
171
+ # end
172
+ #
173
+ # == View Lookup
174
+ #
175
+ # render strips off words trailing an _ in the test name one at a time until
176
+ # it finds a matching action. It tries the extensions 'rhtml', 'rxml',
177
+ # 'rjs', and 'mab' in order for each action until a view is found.
178
+ #
179
+ # With this test case:
139
180
  #
140
181
  # class RouteViewTest < Test::Rails::ViewTestCase
141
182
  # def test_show_photos
@@ -146,19 +187,20 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
146
187
  # end
147
188
  # end
148
189
  #
149
- # For test_show_photos will look for:
190
+ # In test_show_photos, render will look for:
150
191
  # * app/views/route/show_photos.rhtml
151
192
  # * app/views/route/show_photos.rxml
152
- # * app/views/route/show.rhtml
153
- # * app/views/route/show.rxml
193
+ # * app/views/route/show_photos.rjs
194
+ # * app/views/route/show_photos.mab
195
+ # * app/views/route/show.[...]
154
196
  #
155
- # And test_show_no_photos will look for:
197
+ # And in test_show_no_photos, render will look for:
156
198
  # * app/views/route/show_no_photos.rhtml
157
199
  # * app/views/route/show_no_photos.rxml
158
- # * app/views/route/show_no.rhtml
159
- # * app/views/route/show_no.rxml
160
- # * app/views/route/show.rhtml
161
- # * app/views/route/show.rxml
200
+ # * app/views/route/show_no_photos.rjs
201
+ # * app/views/route/show_no_photos.mab
202
+ # * app/views/route/show_no.[...]
203
+ # * app/views/route/show.[...]
162
204
  #
163
205
  # If a view cannot be found the test will flunk.
164
206
 
@@ -166,11 +208,15 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
166
208
  @action_name = action_name caller[0] if options.empty?
167
209
  assigns[:action_name] = @action_name
168
210
 
169
- @request.path_parameters = {
211
+ default_path_parameters = {
170
212
  :controller => @controller.controller_name,
171
- :action => @action_name,
213
+ :action => @action_name
172
214
  }
173
215
 
216
+ path_parameters = default_path_parameters.merge(@path_parameters)
217
+
218
+ @request.path_parameters = path_parameters
219
+
174
220
  defaults = { :layout => false }
175
221
  options = defaults.merge options
176
222
 
@@ -203,16 +249,12 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
203
249
 
204
250
  def assert_error_on(field, type)
205
251
  error_message = ActiveRecord::Errors.default_error_messages[type]
206
- assert_tag :tag => 'div', :attributes => { :class => 'errorExplanation' },
207
- :descendant => {
208
- :tag => 'li',
209
- :content => /^#{field} #{error_message}/i }
252
+ assert_select "div.errorExplanation li",
253
+ :text => /^#{field} #{error_message}/i
210
254
  end
211
255
 
212
256
  ##
213
- # Asserts that a form with +form_action+ has an input element of +type+ with
214
- # a name of "+model+[+column+]" and has a label with a for attribute of
215
- # "+model+_+column+".
257
+ # A wrapper assert that calls both assert_input and assert_label.
216
258
  #
217
259
  # view:
218
260
  # <%= start_form_tag :controller => 'game', :action => 'save' %>
@@ -222,13 +264,46 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
222
264
  # test:
223
265
  # assert_field '/game/save', :text, :game, :amount
224
266
 
225
- def assert_field(form_action, type, model, column, value = nil)
226
- assert_input form_action, type, "#{model}[#{column}]", value
227
- assert_label form_action, "#{model}_#{column}", false
267
+ def assert_field(*args)
268
+ form_action, type, model, column, value =
269
+ Symbol === args.first ? [nil, *args] : args
270
+
271
+ if form_action then # HACK deprecate
272
+ assert_input form_action, type, "#{model}[#{column}]", value
273
+ assert_label form_action, "#{model}_#{column}"
274
+ else
275
+ assert_input type, "#{model}[#{column}]", value
276
+ assert_label "#{model}_#{column}"
277
+ end
278
+ end
279
+
280
+ ##
281
+ # Asserts that there is a form whose action is +form_action+. Optionally,
282
+ # +method+ and +enctype+ may be specified. If a block is given, assert_form
283
+ # behaves like assert_select, so assert_input and friends may be scoped to
284
+ # the selected form.
285
+ #
286
+ # view:
287
+ # <%= start_form_tag :action => 'create_file' %>
288
+ # # ...
289
+ #
290
+ # test:
291
+ # assert_form '/game/save'
292
+ #
293
+ # or:
294
+ # assert_form '/game/save' do
295
+ # # ...
296
+ # end
297
+
298
+ def assert_form(form_action, method = nil, enctype = nil, &block)
299
+ selector = "form[action='#{form_action}']"
300
+ selector << "[method='#{method}']" if method
301
+ selector << "[enctype='#{enctype}']" if enctype
302
+ assert_select selector, &block
228
303
  end
229
304
 
230
305
  ##
231
- # Asserts a h tag of level +level+ exists and contains +content+.
306
+ # Asserts a hN tag of level +level+ exists and contains +content+.
232
307
  #
233
308
  # view:
234
309
  # <h3>Recent Builds</h3>
@@ -237,7 +312,7 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
237
312
  # assert_h 3, 'Recent Builds'
238
313
 
239
314
  def assert_h(level, content)
240
- assert_tag :tag => "h#{level}", :content => content
315
+ assert_select "h#{level}", :text => content
241
316
  end
242
317
 
243
318
  ##
@@ -250,45 +325,52 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
250
325
  # assert_image '/images/bucket.jpg'
251
326
 
252
327
  def assert_image(src)
253
- assert_tag :tag => 'img', :attributes => { :src => src }
328
+ assert_select "img[src='#{src}']"
254
329
  end
255
330
 
256
331
  ##
257
- # Asserts that a form with +form_action+ has an input element of +type+ with
258
- # a name of +name+.
332
+ # Asserts that an input element of +type+ with a name of +name+, and
333
+ # optionally a value of +value+ exists.
259
334
  #
260
335
  # view:
261
- # <%= start_form_tag :controller => 'game', :action => 'save' %>
262
336
  # <%= text_field 'game', 'amount' %>
263
337
  #
264
338
  # test:
265
- # assert_input '/game/save', :text, "game[amount]"
339
+ # assert_input :text, "game[amount]"
340
+
341
+ def assert_input(*args)
342
+ action, type, name, value = Symbol === args.first ? [nil, *args] : args
343
+
344
+ raise ArgumentError, 'supply type and name' if type.nil? or name.nil?
266
345
 
267
- def assert_input(form_action, type, name, value = nil)
268
- attrs = { :type => type.to_s, :name => name.to_s }
269
- attrs[:value] = value unless value.nil?
270
- assert_tag_in_form form_action, :tag => 'input', :attributes => attrs
346
+ input_selector = "input[type='#{type}'][name='#{name}']"
347
+ input_selector << "[value='#{value}']" if value
348
+
349
+ assert_select_in_form action do assert_select input_selector end
271
350
  end
272
351
 
273
352
  ##
274
- # Asserts that a form with +form_action+ has a label with a for attribute of
275
- # "+model+_+column+".
353
+ # Asserts that a label with a for attribute of +for_attribute+ exists.
276
354
  #
277
355
  # view:
278
356
  # <%= start_form_tag :controller => 'game', :action => 'save' %>
279
357
  # <label for="game_amount">Amount:</label>
280
358
  #
281
359
  # test:
282
- # assert_label '/game/save', :game, :amount
360
+ # assert_label 'game_amount'
361
+
362
+ def assert_label(*args)
363
+ action, for_attribute = args.length == 1 ? [nil, *args] : args
283
364
 
284
- def assert_label(form_action, name, include_f = true)
285
- for_attribute = (include_f ? 'f_' : '') << name
286
- assert_tag_in_form form_action, :tag => 'label', :attributes => {
287
- :for => for_attribute }
365
+ raise ArgumentError, 'supply for_attribute' if for_attribute.nil?
366
+
367
+ label_selector = "label[for='#{for_attribute}']"
368
+
369
+ assert_select_in_form action do assert_select label_selector end
288
370
  end
289
371
 
290
372
  ##
291
- # Asserts that there is an anchor tag with an href of +href+ and optionally
373
+ # Asserts that there is an anchor tag with an href of +href+ that optionally
292
374
  # has +content+.
293
375
  #
294
376
  # view:
@@ -298,7 +380,7 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
298
380
  # assert_links_to '/players/show/1', 'drbrain'
299
381
 
300
382
  def assert_links_to(href, content = nil)
301
- assert_tag links_to_options_for(href, content)
383
+ assert_select(*links_to_options_for(href, content))
302
384
  end
303
385
 
304
386
  ##
@@ -312,12 +394,16 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
312
394
  # deny_links_to '/players/show/1'
313
395
 
314
396
  def deny_links_to(href, content = nil)
315
- assert_no_tag links_to_options_for(href, content)
397
+ selector, options = links_to_options_for(href, content)
398
+ options[:count] = 0
399
+
400
+ assert_select selector, options
316
401
  end
317
402
 
318
403
  ##
319
404
  # Asserts that there is a form using the 'POST' method whose action is
320
- # +form_action+ and uses the multipart content type.
405
+ # +form_action+ and uses the multipart content type. If passed a block,
406
+ # works like assert_form.
321
407
  #
322
408
  # view:
323
409
  # <%= start_form_tag({ :action => 'create_file' }, :multipart => true) %>
@@ -325,14 +411,13 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
325
411
  # test:
326
412
  # assert_multipart_form '/game/save'
327
413
 
328
- def assert_multipart_form(form_action)
329
- assert_tag :tag => 'form', :attributes => { :action => form_action,
330
- :method => 'post', :enctype => 'multipart/form-data' }
414
+ def assert_multipart_form(form_action, &block)
415
+ assert_form(form_action, :post, 'multipart/form-data', &block)
331
416
  end
332
417
 
333
418
  ##
334
419
  # Asserts that there is a form using the 'POST' method whose action is
335
- # +form_action+.
420
+ # +form_action+. If passed a block, works like assert_form.
336
421
  #
337
422
  # view:
338
423
  # <%= start_form_tag :action => 'create_file' %>
@@ -340,57 +425,58 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
340
425
  # test:
341
426
  # assert_post_form '/game/save'
342
427
 
343
- def assert_post_form(form_action)
344
- assert_tag :tag => 'form', :attributes => { :action => form_action,
345
- :method => 'post' }
428
+ def assert_post_form(form_action, &block)
429
+ assert_form(form_action, :post, &block)
346
430
  end
347
431
 
348
432
  ##
349
- # Asserts that a form with +form_action+ has a select element with a name of
350
- # "+model+[+column+]" and options with specified names and values.
433
+ # Asserts that a select element with a name of "+model+[+column+]" and
434
+ # +options+ with specified names and values exists.
351
435
  #
352
436
  # view:
353
- # <%= start_form_tag :action => 'save' %>
354
437
  # <%= collection_select :game, :location_id, @locations, :id, :name %>
355
438
  #
356
439
  # test:
357
- # assert_select_tag '/games/save', :game, :location_id,
358
- # 'Ballet' => 1, 'Guaymas' => 2
440
+ # assert_select_tag :game, :location_id, 'Ballet' => 1, 'Guaymas' => 2
441
+
442
+ def assert_select_tag(*args)
443
+ action, model, column, options = Symbol === args.first ? [nil, *args] : args
359
444
 
360
- def assert_select_tag(form_action, model, column, options)
361
445
  assert_kind_of Hash, options, "options needs to be a Hash"
362
446
  deny options.empty?, "options must not be empty"
363
- options.each do |option_name, option_id|
364
- assert_tag_in_form(form_action,
365
- :tag => 'select',
366
- :attributes => { :name => "#{model}[#{column}]" },
367
- :child => {
368
- :tag => 'option',
369
- :attributes => { :value => option_id },
370
- :content => option_name
371
- })
447
+
448
+ select_selector = "select[name='#{model}[#{column}]']"
449
+
450
+ options.each do |option_name, option_value|
451
+ option_selector = "option[value='#{option_value}']"
452
+ selector = "#{select_selector} #{option_selector}"
453
+
454
+ assert_select_in_form action do
455
+ assert_select selector, :text => option_name
456
+ end
372
457
  end
373
458
  end
374
459
 
375
460
  ##
376
- # Asserts that a form with +form_action+ has a submit element with a value
377
- # of +value+.
461
+ # Asserts that a submit element with a value of +value+ exists.
378
462
  #
379
463
  # view:
380
- # <%= start_form_tag :action => 'save' %>
381
464
  # <input type="submit" value="Create!" %>
382
465
  #
383
466
  # test:
384
- # assert_submit '/route/save', 'Create!'
467
+ # assert_submit 'Create!'
468
+
469
+ def assert_submit(*args)
470
+ action, value = args.length == 1 ? [nil, *args] : args
385
471
 
386
- def assert_submit(form_action, value)
387
- assert_tag_in_form form_action, :tag => 'input', :attributes => {
388
- :type => "submit", :value => value }
472
+ submit_selector = "input[type='submit'][value='#{value}']"
473
+
474
+ assert_select_in_form action do assert_select submit_selector end
389
475
  end
390
476
 
391
477
  ##
392
478
  # Asserts that a form with +form_action+ has a descendent that matches
393
- # +options+.
479
+ # +options+ exists.
394
480
  #
395
481
  # Typically this is not used directly in tests. Instead use it to build
396
482
  # expressive tests that assert which fields are in what form.
@@ -408,14 +494,13 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
408
494
  end
409
495
 
410
496
  ##
411
- # Asserts that a form with +form_action+ has a textarea with name +name+ and
412
- # optionally +value?.
497
+ # Asserts that a textarea with name +name+ and optionally +value+ exists.
413
498
  #
414
499
  # view:
415
500
  # <%= text_area 'post', 'body' %>
416
501
  #
417
502
  # test:
418
- # assert_text_area '/post/save', 'post[body]'
503
+ # assert_text_area 'post[body]'
419
504
  #
420
505
  # view:
421
506
  # <textarea id="post_body" name="post[body]">
@@ -423,17 +508,21 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
423
508
  # </textarea>
424
509
  #
425
510
  # test:
426
- # assert_text_area '/post/save', 'post[body]', posts(:post).body
511
+ # assert_text_area 'post[body]', posts(:post).body
427
512
 
428
- def assert_text_area(form_action, name, value = nil)
429
- attribs = {
430
- :tag => 'textarea',
431
- :attributes => { :name => name },
432
- }
433
- attribs[:content] = value if value
434
- assert_tag_in_form form_action, attribs
513
+ def assert_text_area(*args)
514
+ action, name, value = args.first !~ /\A\// ? [nil, *args] : args
515
+
516
+ raise ArgumentError, 'supply name' if name.nil?
517
+
518
+ text_area_selector = ["textarea[name='#{name}']"]
519
+ text_area_selector << { :text => value } if value
520
+
521
+ assert_select_in_form action do assert_select(*text_area_selector) end
435
522
  end
436
523
 
524
+ alias assert_textarea assert_text_area
525
+
437
526
  ##
438
527
  # Asserts that a title with +title+ exists.
439
528
  #
@@ -442,11 +531,18 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
442
531
  #
443
532
  # test:
444
533
  # assert_title 'some content'
445
-
534
+
446
535
  def assert_title(title)
447
- assert_tag :tag => 'title', :content => title
536
+ assert_select 'title', :text => title
537
+ end
538
+
539
+ ##
540
+ # Opposite of assert_select.
541
+
542
+ def deny_select(selector)
543
+ assert_select selector, false
448
544
  end
449
-
545
+
450
546
  ##
451
547
  # Creates a new Paginator that uses the current controller. +item_count+,
452
548
  # +items_per_page+ and +page_number+ are passed straight through.
@@ -456,19 +552,27 @@ class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
456
552
  items_per_page, page_number)
457
553
  end
458
554
 
459
- protected
555
+ ##
556
+ # Utility method for compatibility with old-style assert_tag form
557
+ # assertions.
558
+
559
+ def assert_select_in_form(action, &block) # :nodoc:
560
+ if action then
561
+ assert_form(action, &block)
562
+ else
563
+ block.call
564
+ end
565
+ end
460
566
 
461
567
  ##
462
568
  # Creates an assertion options hash for +href+ and +content+.
463
569
 
464
570
  def links_to_options_for(href, content = nil)
465
- options = { :tag => 'a', :attributes => { :href => href } }
466
- options[:content] = content unless content.nil?
467
- return options
571
+ selector = "a[href='#{href}']"
572
+ equality = content ? { :text => content } : {}
573
+ return selector, equality
468
574
  end
469
575
 
470
- private
471
-
472
576
  ##
473
577
  # Returns the action_name based on a backtrace line passed in as +test+.
474
578
 
@@ -56,7 +56,7 @@ end
56
56
 
57
57
  class ZenTest
58
58
 
59
- VERSION = '3.6.0'
59
+ VERSION = '3.6.1'
60
60
 
61
61
  include ZenTestMapping
62
62
 
@@ -3,59 +3,267 @@ require 'test/zentest_assertions'
3
3
 
4
4
  $TESTING_RTC = true
5
5
 
6
+ module Rails
7
+ module VERSION
8
+ STRING = '99.99.99'
9
+ end
10
+ end
11
+
6
12
  begin
7
13
  require 'test/rails'
8
14
  rescue LoadError, NameError
9
15
  $TESTING_RTC = false
10
16
  end
11
17
 
12
- class View; end
13
-
14
18
  class TestRailsViewTestCase < Test::Rails::ViewTestCase
15
19
 
16
20
  def setup
17
- # override
18
- @request = Object.new
19
- def @request.body; @body; end
20
- def @request.body=(body); @body = body; end
21
-
22
21
  @assert_tag = []
22
+ @assert_no_tag = []
23
+
24
+ @assert_select = []
23
25
  end
24
26
 
25
- def test_assert_text_area
26
- @request.body = '
27
- <form action="/post/save">
28
- <textarea id="post_body" name="post[body]">
29
- OMG he like hates me and he\'s like going out with this total skank!~ oh noes!!~
30
- </textarea>
31
- </form>
32
- '
27
+ def test_assert_field
28
+ assert_field :text, :game, :amount
33
29
 
34
- assert_text_area '/post/save', 'post[body]'
30
+ assert_equal 2, @assert_select.length
31
+
32
+ expected = ["input[type='text'][name='game[amount]']"]
33
+
34
+ assert_equal expected, @assert_select.first
35
+
36
+ expected = ["label[for='game_amount']"]
37
+
38
+ assert_equal expected, @assert_select.last
39
+ end
40
+
41
+ def test_assert_field_form
42
+ assert_field '/game/save', :text, :game, :amount
43
+
44
+ assert_equal 4, @assert_select.length
45
+
46
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
47
+ assert_equal ["input[type='text'][name='game[amount]']"],
48
+ @assert_select.shift
49
+
50
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
51
+ assert_equal ["label[for='game_amount']"], @assert_select.shift
52
+ end
53
+
54
+ def test_assert_form
55
+ assert_form '/game/save'
56
+
57
+ assert_equal 1, @assert_select.length
58
+ assert_equal ["form[action='/game/save']"], @assert_select.first
59
+ end
60
+
61
+ def test_assert_form_method
62
+ assert_form '/game/save', :post
63
+
64
+ assert_equal 1, @assert_select.length
65
+ assert_equal ["form[action='/game/save'][method='post']"],
66
+ @assert_select.first
67
+ end
68
+
69
+ def test_assert_form_enctype
70
+ assert_form '/game/save', nil, 'multipart/form-data'
71
+
72
+ assert_equal 1, @assert_select.length
73
+ assert_equal ["form[action='/game/save'][enctype='multipart/form-data']"],
74
+ @assert_select.first
75
+ end
76
+
77
+ def test_assert_h
78
+ assert_h 1, 'hi'
79
+
80
+ assert_equal [['h1', { :text => 'hi' }]], @assert_select
81
+ end
82
+
83
+ def test_assert_img
84
+ assert_image '/images/bucket.jpg'
85
+
86
+ assert_equal [["img[src='/images/bucket.jpg']"]], @assert_select
87
+ end
88
+
89
+ def test_assert_input
90
+ assert_input :text, 'game[amount]'
91
+
92
+ assert_equal 1, @assert_select.length
93
+ assert_equal ["input[type='text'][name='game[amount]']"],
94
+ @assert_select.first
95
+ end
96
+
97
+ def test_assert_input_form
98
+ assert_input '/game/save', :text, 'game[amount]'
99
+
100
+ assert_equal 2, @assert_select.length
101
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
102
+ assert_equal ["input[type='text'][name='game[amount]']"],
103
+ @assert_select.shift
104
+ end
105
+
106
+ def test_assert_input_value
107
+ assert_input :text, 'game[amount]', 5
108
+
109
+ expected = ["input[type='text'][name='game[amount]'][value='5']"]
110
+
111
+ assert_equal 1, @assert_select.length
112
+ assert_equal expected, @assert_select.first
113
+ end
114
+
115
+ def test_assert_label
116
+ assert_label 'game_amount'
117
+
118
+ expected = ["label[for='game_amount']"]
119
+
120
+ assert_equal 1, @assert_select.length
121
+ assert_equal expected, @assert_select.first
122
+ end
123
+
124
+ def test_assert_label_form
125
+ assert_label '/game/save', 'game_amount'
126
+
127
+ assert_equal 2, @assert_select.length
128
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
129
+ assert_equal ["label[for='game_amount']"], @assert_select.shift
130
+ end
131
+
132
+ def test_assert_links_to
133
+ assert_links_to '/game/show/1', 'hi'
134
+
135
+ expected = ["a[href='/game/show/1']", { :text => 'hi' }]
136
+
137
+
138
+ assert_equal 1, @assert_select.length
139
+ assert_equal expected, @assert_select.first
140
+ end
141
+
142
+ def test_assert_multipart_form
143
+ assert_multipart_form '/game/save'
144
+
145
+ expected = [
146
+ "form[action='/game/save'][method='post'][enctype='multipart/form-data']"
147
+ ]
148
+
149
+ assert_equal 1, @assert_select.length
150
+ assert_equal expected, @assert_select.first
151
+ end
152
+
153
+ def test_assert_post_form
154
+ assert_post_form '/game/save'
155
+
156
+ expected = ["form[action='/game/save'][method='post']"]
157
+
158
+ assert_equal 1, @assert_select.length
159
+ assert_equal expected, @assert_select.first
160
+ end
161
+
162
+ def test_assert_select_tag
163
+ assert_select_tag :game, :location_id,
164
+ 'Ballet' => 1, 'Guaymas' => 2
165
+
166
+ assert_equal 2, @assert_select.length
167
+
168
+ assert_equal ["select[name='game[location_id]'] option[value='2']",
169
+ { :text => 'Guaymas' }], @assert_select.shift
170
+ assert_equal ["select[name='game[location_id]'] option[value='1']",
171
+ { :text => 'Ballet' }], @assert_select.shift
172
+ end
173
+
174
+ def test_assert_select_tag_form
175
+ assert_select_tag '/game/save', :game, :location_id,
176
+ 'Ballet' => 1, 'Guaymas' => 2
177
+
178
+ assert_equal 4, @assert_select.length
179
+
180
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
181
+ assert_equal ["select[name='game[location_id]'] option[value='2']",
182
+ { :text => 'Guaymas' }], @assert_select.shift
183
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
184
+ assert_equal ["select[name='game[location_id]'] option[value='1']",
185
+ { :text => 'Ballet' }], @assert_select.shift
186
+ end
187
+
188
+ def test_assert_submit
189
+ assert_submit 'Save!'
190
+
191
+ assert_equal 1, @assert_select.length
192
+ assert_equal ["input[type='submit'][value='Save!']"], @assert_select.first
193
+ end
194
+
195
+ def test_assert_submit_form
196
+ assert_submit '/game/save', 'Save!'
197
+
198
+ assert_equal 2, @assert_select.length
199
+ assert_equal ["form[action='/game/save']"], @assert_select.shift
200
+ assert_equal ["input[type='submit'][value='Save!']"], @assert_select.shift
201
+ end
202
+
203
+ def test_assert_tag_in_form
204
+ assert_tag_in_form '/game/save', :tag => 'input'
35
205
 
36
206
  expected = {
37
- :tag => 'form', :attributes => { :action => '/post/save' },
38
- :descendant => {
39
- :tag => 'textarea', :attributes => { :name => 'post[body]' } } }
207
+ :tag => "form",
208
+ :attributes => { :action => "/game/save" },
209
+ :descendant => { :tag => "input" },
210
+ }
40
211
 
212
+ assert_equal 1, @assert_tag.length
41
213
  assert_equal expected, @assert_tag.first
214
+ end
215
+
216
+ def test_assert_text_area
217
+ assert_text_area 'post[body]'
42
218
 
43
- assert_text_area '/post/save', 'post[body]',
44
- "OMG he like hates me and he's like going out with this total skank!~ oh noes!!~"
219
+ assert_equal 1, @assert_select.length
220
+ assert_equal ["textarea[name='post[body]']"], @assert_select.shift
221
+ end
45
222
 
46
- expected = {
47
- :tag => 'form', :attributes => { :action => '/post/save' },
48
- :descendant => {
49
- :tag => 'textarea', :attributes => { :name => 'post[body]' },
50
- :content =>
51
- "OMG he like hates me and he's like going out with this total skank!~ oh noes!!~" } }
223
+ def test_assert_text_area_body
224
+ assert_text_area 'post[body]', 'OMG!1! that skank stole my BF!~1!'
225
+
226
+ assert_equal 1, @assert_select.length
227
+ assert_equal ["textarea[name='post[body]']",
228
+ { :text => 'OMG!1! that skank stole my BF!~1!' }],
229
+ @assert_select.shift
230
+ end
231
+
232
+ def test_assert_text_area_form
233
+ assert_text_area '/post/save', 'post[body]'
234
+
235
+ assert_equal 2, @assert_select.length
236
+ assert_equal ["form[action='/post/save']"], @assert_select.shift
237
+ assert_equal ["textarea[name='post[body]']"], @assert_select.shift
238
+ end
239
+
240
+ def test_assert_title
241
+ assert_title 'hi'
242
+
243
+ assert_equal [['title', { :text => 'hi' }]], @assert_select
244
+ end
52
245
 
53
- assert_equal expected, @assert_tag.last
246
+ def test_deny_links_to
247
+ deny_links_to '/game/show/1', 'hi'
248
+
249
+ expected = ["a[href='/game/show/1']", { :text => 'hi', :count => 0 }]
250
+
251
+ assert_equal 1, @assert_select.length
252
+ assert_equal expected, @assert_select.first
54
253
  end
55
254
 
56
255
  def assert_tag(arg)
57
256
  @assert_tag << arg
58
257
  end
59
258
 
259
+ def assert_no_tag(arg)
260
+ @assert_no_tag << arg
261
+ end
262
+
263
+ def assert_select(*args)
264
+ @assert_select << args
265
+ yield if block_given?
266
+ end
267
+
60
268
  end if $TESTING_RTC
61
269
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ZenTest
5
5
  version: !ruby/object:Gem::Version
6
- version: 3.6.0
7
- date: 2007-05-25 00:00:00 -07:00
6
+ version: 3.6.1
7
+ date: 2007-07-23 00:00:00 -07:00
8
8
  summary: "ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails."
9
9
  require_paths:
10
10
  - lib
@@ -134,5 +134,5 @@ dependencies:
134
134
  requirements:
135
135
  - - ">="
136
136
  - !ruby/object:Gem::Version
137
- version: 1.2.1
137
+ version: 1.2.2
138
138
  version: