diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index bc925e9c70..74adda0f54 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added assert_vaild. Reports the proper AR error messages as fail message when the passed record is invalid [Tobias Luetke] + * Add temporary support for passing locals to render using string keys [Nicholas Seckar] * Clean up error pages by providing better backtraces [Nicholas Seckar] diff --git a/actionpack/lib/action_controller/assertions.rb b/actionpack/lib/action_controller/assertions.rb index e5f03fd71a..b29a2864a7 100644 --- a/actionpack/lib/action_controller/assertions.rb +++ b/actionpack/lib/action_controller/assertions.rb @@ -283,6 +283,13 @@ module Test #:nodoc: assert_block(full_message) { expected_dom != actual_dom } end end + + # ensures that the passed record is valid by active record standards. returns the error messages if not + def assert_valid(record) + clean_backtrace do + assert record.valid?, record.errors.full_messages + end + end def clean_backtrace(&block) begin diff --git a/actionpack/test/controller/action_pack_assertions_test.rb b/actionpack/test/controller/action_pack_assertions_test.rb index 917ae330b6..6d5ade98bf 100644 --- a/actionpack/test/controller/action_pack_assertions_test.rb +++ b/actionpack/test/controller/action_pack_assertions_test.rb @@ -77,6 +77,41 @@ class ActionPackAssertionsController < ActionController::Base def raise_on_post raise "post" if @request.post? render_text "request method: #{@request.env['REQUEST_METHOD']}" + end + + def get_valid_record + @record = Class.new do + def valid? + true + end + + def errors + Class.new do + def full_messages; '...stuff...'; end + end.new + end + + end.new + + render :nothing => true + end + + + def get_invalid_record + @record = Class.new do + + def valid? + false + end + + def errors + Class.new do + def full_messages; '...stuff...'; end + end.new + end + end.new + + render :nothing => true end # 911 @@ -420,6 +455,21 @@ class ActionPackAssertionsControllerTest < Test::Unit::TestCase get :redirect_to_fellow_controller assert_redirected_to :controller => 'admin/user' + end + + def test_assert_valid + get :get_valid_record + assert_valid assigns('record') + end + + def test_assert_valid_failing + get :get_invalid_record + + begin + assert_valid assigns('record') + assert false + rescue Test::Unit::AssertionFailedError => e + end end end @@ -437,4 +487,4 @@ class ActionPackHeaderTest < Test::Unit::TestCase process :hello_xml_world assert_equal('application/pdf', @controller.headers['Content-Type']) end -end +end \ No newline at end of file diff --git a/actionpack/test/controller/active_record_assertions_test.rb b/actionpack/test/controller/active_record_assertions_test.rb index d4cbda80e9..a60df5a668 100644 --- a/actionpack/test/controller/active_record_assertions_test.rb +++ b/actionpack/test/controller/active_record_assertions_test.rb @@ -75,8 +75,7 @@ class ActiveRecordAssertionsController < ActionController::Base # the safety dance...... def rescue_action(e) raise; end end - - + class ActiveRecordAssertionsControllerTest < Test::Unit::TestCase def setup @request = ActionController::TestRequest.new