173 lines
5.4 KiB
Ruby
173 lines
5.4 KiB
Ruby
# frozen_string_literal: true
|
|
require 'test_helper'
|
|
|
|
class FormHelperTest < ActionView::TestCase
|
|
|
|
test 'SimpleForm for yields an instance of FormBuilder' do
|
|
simple_form_for :user do |f|
|
|
assert f.instance_of?(SimpleForm::FormBuilder)
|
|
end
|
|
end
|
|
|
|
test 'SimpleForm adds default class to form' do
|
|
with_concat_form_for(:user)
|
|
assert_select 'form.simple_form'
|
|
end
|
|
|
|
test 'SimpleForm allows overriding default form class' do
|
|
swap SimpleForm, default_form_class: "my_custom_class" do
|
|
with_concat_form_for :user, html: { class: "override_class" }
|
|
assert_no_select 'form.my_custom_class'
|
|
assert_select 'form.override_class'
|
|
end
|
|
end
|
|
|
|
# Remove this test when SimpleForm.form_class is removed in 4.x
|
|
test 'SimpleForm allows overriding default form class, but not form class' do
|
|
ActiveSupport::Deprecation.silence do
|
|
swap SimpleForm, form_class: "fixed_class", default_form_class: "my_custom_class" do
|
|
with_concat_form_for :user, html: { class: "override_class" }
|
|
assert_no_select 'form.my_custom_class'
|
|
assert_select 'form.fixed_class.override_class'
|
|
end
|
|
end
|
|
end
|
|
|
|
test 'SimpleForm uses default browser validations by default' do
|
|
with_concat_form_for(:user)
|
|
assert_no_select 'form[novalidate]'
|
|
end
|
|
|
|
test 'SimpleForm does not use default browser validations if specified in the configuration options' do
|
|
swap SimpleForm, browser_validations: false do
|
|
with_concat_form_for(:user)
|
|
assert_select 'form[novalidate="novalidate"]'
|
|
end
|
|
end
|
|
|
|
test 'disabled browser validations overrides default configuration' do
|
|
with_concat_form_for(:user, html: { novalidate: true })
|
|
assert_select 'form[novalidate="novalidate"]'
|
|
end
|
|
|
|
test 'enabled browser validations overrides disabled configuration' do
|
|
swap SimpleForm, browser_validations: false do
|
|
with_concat_form_for(:user, html: { novalidate: false })
|
|
assert_no_select 'form[novalidate]'
|
|
end
|
|
end
|
|
|
|
test 'SimpleForm adds object name as css class to form when object is not present' do
|
|
with_concat_form_for(:user, html: { novalidate: true })
|
|
assert_select 'form.simple_form.user'
|
|
end
|
|
|
|
test 'SimpleForm adds :as option as css class to form when object is not present' do
|
|
with_concat_form_for(:user, as: 'superuser')
|
|
assert_select 'form.simple_form.superuser'
|
|
end
|
|
|
|
test 'SimpleForm adds object class name with new prefix as css class to form if record is not persisted' do
|
|
@user.new_record!
|
|
with_concat_form_for(@user)
|
|
assert_select 'form.simple_form.new_user'
|
|
end
|
|
|
|
test 'SimpleForm adds :as option with new prefix as css class to form if record is not persisted' do
|
|
@user.new_record!
|
|
with_concat_form_for(@user, as: 'superuser')
|
|
assert_select 'form.simple_form.new_superuser'
|
|
end
|
|
|
|
test 'SimpleForm adds edit class prefix as css class to form if record is persisted' do
|
|
with_concat_form_for(@user)
|
|
assert_select 'form.simple_form.edit_user'
|
|
end
|
|
|
|
test 'SimpleForm adds :as options with edit prefix as css class to form if record is persisted' do
|
|
with_concat_form_for(@user, as: 'superuser')
|
|
assert_select 'form.simple_form.edit_superuser'
|
|
end
|
|
|
|
test 'SimpleForm adds last object name as css class to form when there is array of objects' do
|
|
with_concat_form_for([Company.new, @user])
|
|
assert_select 'form.simple_form.edit_user'
|
|
end
|
|
|
|
test 'SimpleForm does not add object class to form if css_class is specified' do
|
|
with_concat_form_for(:user, html: { class: nil })
|
|
assert_no_select 'form.user'
|
|
end
|
|
|
|
test 'SimpleForm adds custom class to form if css_class is specified' do
|
|
with_concat_form_for(:user, html: { class: 'my_class' })
|
|
assert_select 'form.my_class'
|
|
end
|
|
|
|
test 'passes options to SimpleForm' do
|
|
with_concat_form_for(:user, url: '/account', html: { id: 'my_form' })
|
|
assert_select 'form#my_form'
|
|
assert_select 'form[action="/account"]'
|
|
end
|
|
|
|
test 'form_for yields an instance of FormBuilder' do
|
|
with_concat_form_for(:user) do |f|
|
|
assert f.instance_of?(SimpleForm::FormBuilder)
|
|
end
|
|
end
|
|
|
|
test 'fields_for with a hash like model yields an instance of FormBuilder' do
|
|
with_concat_fields_for(:author, HashBackedAuthor.new) do |f|
|
|
assert f.instance_of?(SimpleForm::FormBuilder)
|
|
f.input :name
|
|
end
|
|
|
|
assert_select "input[name='author[name]'][value='hash backed author']"
|
|
end
|
|
|
|
test 'custom error proc is not destructive' do
|
|
swap_field_error_proc do
|
|
result = nil
|
|
simple_form_for :user do |f|
|
|
result = simple_fields_for 'address' do
|
|
'hello'
|
|
end
|
|
end
|
|
|
|
assert_equal 'hello', result
|
|
end
|
|
end
|
|
|
|
test 'custom error proc survives an exception' do
|
|
swap_field_error_proc do
|
|
begin
|
|
simple_form_for :user do |f|
|
|
simple_fields_for 'address' do
|
|
raise 'an exception'
|
|
end
|
|
end
|
|
rescue StandardError
|
|
end
|
|
end
|
|
end
|
|
|
|
test 'SimpleForm for swaps default action view field_error_proc' do
|
|
expected_error_proc = -> {}
|
|
swap SimpleForm, field_error_proc: expected_error_proc do
|
|
simple_form_for :user do |f|
|
|
assert_equal expected_error_proc, ::ActionView::Base.field_error_proc
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def swap_field_error_proc(expected_error_proc = -> {})
|
|
swap ActionView::Base, field_error_proc: expected_error_proc do
|
|
yield
|
|
|
|
assert_equal expected_error_proc, ActionView::Base.field_error_proc
|
|
end
|
|
end
|
|
end
|