# encoding: UTF-8 require 'test_helper' require 'support/crud_test_helper' require 'support/crud_test_model' require 'support/crud_controller_test_helper' # Tests all actions of the CrudController based on a dummy model # (CrudTestModel). This is useful to test the general behavior # of CrudController. class CrudTestModelsControllerTest < ActionController::TestCase include CrudControllerTestHelper include CrudTestHelper attr_accessor :models setup :reset_db, :setup_db, :create_test_data, :special_routing teardown :reset_db def test_setup assert_equal 6, CrudTestModel.count assert_equal CrudTestModelsController, @controller.class assert_recognizes({ controller: 'crud_test_models', action: 'index' }, '/crud_test_models') assert_recognizes({ controller: 'crud_test_models', action: 'show', id: '1' }, '/crud_test_models/1') end def test_index super assert_equal 6, entries.size assert_equal entries.sort_by(&:name), entries assert_equal({}, session[:list_params]) assert_equal entries, assigns(:crud_test_models) assert_respond_to assigns(:crud_test_models), :klass end def test_index_js xhr :get, :index, test_params assert_response :success assert_equal 'index js', @response.body assert entries.present? end def test_index_search super assert_equal 1, entries.size assert_equal({ q: 'AAAA' }, session[:list_params]['/crud_test_models']) end def test_index_with_custom_options get :index, filter: true assert_response :success assert_template 'index' assert entries.present? assert_equal 2, entries.size assert_equal entries.sort_by(&:children).reverse, entries end def test_index_search_with_custom_options get :index, q: 'DDD', filter: true assert_response :success assert_template 'index' assert entries.present? assert_equal 1, entries.size assert_equal [CrudTestModel.find_by_name('BBBBB')], entries assert_equal({ q: 'DDD' }, session[:list_params]['/crud_test_models']) end def test_sort_given_column get :index, sort: 'children', sort_dir: 'asc' assert_response :success assert_template 'index' assert entries.present? assert_equal 6, entries.size assert_equal CrudTestModel.all.sort_by(&:children), entries assert_equal({ sort: 'children', sort_dir: 'asc' }, session[:list_params]['/crud_test_models']) end def test_sort_virtual_column get :index, sort: 'chatty', sort_dir: 'desc' assert_response :success assert_template 'index' assert entries.present? assert_equal 6, entries.size assert_equal({ sort: 'chatty', sort_dir: 'desc' }, session[:list_params]['/crud_test_models']) # sort order is ambiguous, use index names = entries.map(&:name) assert names.index('BBBBB') < names.index('AAAAA') assert names.index('BBBBB') < names.index('DDDDD') assert names.index('EEEEE') < names.index('AAAAA') assert names.index('EEEEE') < names.index('DDDDD') assert names.index('AAAAA') < names.index('CCCCC') assert names.index('DDDDD') < names.index('CCCCC') end def test_sort_with_search get :index, q: 'DDD', sort: 'chatty', sort_dir: 'asc' assert_response :success assert_template 'index' assert entries.present? assert_equal 3, entries.size assert_equal %w(CCCCC DDDDD BBBBB), entries.map(&:name) assert_equal({ sort: 'chatty', sort_dir: 'asc', q: 'DDD' }, session[:list_params]['/crud_test_models']) end def test_index_returning session[:list_params] = {} session[:list_params]['/crud_test_models'] = { q: 'DDD', sort: 'chatty', sort_dir: 'desc' } get :index, returning: true assert_response :success assert_template 'index' assert entries.present? assert_equal 3, entries.size assert_equal %w(BBBBB DDDDD CCCCC), entries.map(&:name) assert_equal 'DDD', @controller.params[:q] assert_equal 'chatty', @controller.params[:sort] assert_equal 'desc', @controller.params[:sort_dir] end def test_new super assert assigns(:companions) assert_equal @controller.send(:entry), assigns(:crud_test_model) assert_equal [:before_render_new, :before_render_form], @controller.called_callbacks end def test_show super assert_equal @controller.send(:entry), assigns(:crud_test_model) end def test_show_with_custom get :show, test_params(id: crud_test_models(:BBBBB).id) assert_response :success assert_equal 'custom html', @response.body end def test_create super assert_match(/model got created/, flash[:notice]) assert flash[:alert].blank? assert_equal [:before_create, :before_save, :after_save, :after_create], @controller.called_callbacks end def test_edit super assert_equal @controller.send(:entry), assigns(:crud_test_model) assert_equal [:before_render_edit, :before_render_form], @controller.called_callbacks end def test_update super assert_equal I18n.t('crud.update.flash.success', model: 'Crud Test Model foo'), flash[:notice] assert flash[:alert].blank? assert_equal @controller.send(:entry), assigns(:crud_test_model) assert_equal [:before_update, :before_save, :after_save, :after_update], @controller.called_callbacks end def test_destroy super assert_equal [:before_destroy, :after_destroy], @controller.called_callbacks assert_equal I18n.t('crud.destroy.flash.success', model: 'Crud Test Model AAAAA'), flash[:notice] end def test_create_with_before_callback assert_no_difference('CrudTestModel.count') do post :create, crud_test_model: { name: 'illegal', children: 2 } end assert_response :success assert_template 'new' assert entry.new_record? assert assigns(:companions).present? assert flash[:alert].present? assert_equal 'illegal', entry.name assert_equal [:before_render_new, :before_render_form], @controller.called_callbacks end def test_create_with_before_callback_redirect @controller.should_redirect = true assert_no_difference('CrudTestModel.count') do post :create, crud_test_model: { name: 'illegal', children: 2 } end assert_redirected_to action: 'index' assert_nil @controller.called_callbacks end def test_new_with_before_render_callback_redirect_does_not_set_companions @controller.should_redirect = true get :new assert_redirected_to action: 'index' assert_nil assigns(:companions) end def test_create_with_failure assert_no_difference('CrudTestModel.count') do post :create, crud_test_model: { children: 2 } end assert_response :success assert_template 'new' assert entry.new_record? assert assigns(:companions) assert flash[:notice].blank?, flash[:notice].to_s assert flash[:alert].blank?, flash[:alert].to_s assert entry.name.blank? assert_equal [:before_create, :before_save, :before_render_new, :before_render_form], @controller.called_callbacks end def test_create_with_failure_json assert_no_difference('CrudTestModel.count') do post :create, crud_test_model: { children: 2 }, format: 'json' end assert_response :unprocessable_entity assert entry.new_record? assert_match(/errors/, @response.body) assert_equal [:before_create, :before_save], @controller.called_callbacks end def test_update_with_failure put :update, id: test_entry.id, crud_test_model: { rating: 20 } assert_response :success assert_template 'edit' assert entry.changed? assert flash[:notice].blank? assert flash[:alert].blank? assert_equal 20, entry.rating assert_equal [:before_update, :before_save, :before_render_edit, :before_render_form], @controller.called_callbacks end def test_update_with_failure_json put :update, id: test_entry.id, crud_test_model: { rating: 20 }, format: 'json' assert_response :unprocessable_entity assert entry.changed? assert_match(/errors/, @response.body) assert flash[:notice].blank? assert_equal 20, entry.rating assert_equal [:before_update, :before_save], @controller.called_callbacks end def test_destroy_failure assert_no_difference("#{model_class.name}.count") do @request.env['HTTP_REFERER'] = crud_test_model_url(crud_test_models(:BBBBB)) delete :destroy, test_params(id: crud_test_models(:BBBBB).id) end assert_redirected_to_show(entry) assert_match(/companion/, flash[:alert]) assert flash[:notice].blank? end def test_destroy_failure_callback e = crud_test_models(:AAAAA) e.update_attribute :name, 'illegal' assert_no_difference("#{model_class.name}.count") do delete :destroy, test_params(id: e.id) end assert_redirected_to_index assert_match(/illegal name/, flash[:alert]) assert flash[:notice].blank? end def test_destroy_failure_json assert_no_difference("#{model_class.name}.count") do delete :destroy, test_params(id: crud_test_models(:BBBBB).id, format: 'json') end assert_response :unprocessable_entity assert_match(/errors/, @response.body) assert flash[:notice].blank? end def test_models_label assert_equal 'Crud Test Models', @controller.models_label assert_equal 'Crud Test Model', @controller.models_label(false) end private def test_entry crud_test_models(:AAAAA) end def new_entry_attrs { name: 'foo', children: 42, companion_id: 3, rating: 8.5, income: 2.42, birthdate: '31-12-1999'.to_date, human: true, remarks: "some custom\n\tremarks" } end def edit_entry_attrs { name: 'foo', children: 42, rating: 8.5, income: 2.42, birthdate: '31-12-1999'.to_date, human: true, remarks: "some custom\n\tremarks" } end end