# encoding: UTF-8 require 'rails_helper' describe 'DryCrud::Form::Builder' do include FormatHelper include FormHelper include UtilityHelper include I18nHelper include CrudTestHelper before(:all) do reset_db setup_db create_test_data end after(:all) { reset_db } let(:entry) { CrudTestModel.first } let(:form) { DryCrud::Form::Builder.new(:entry, entry, self, {}) } describe '#input_field' do it 'dispatches name attr to string field' do expect(form).to receive(:string_field) .with(:name, required: 'required') .and_return('') form.input_field(:name) end it { expect(form.input_field(:name)).to be_html_safe } { password: :password_field, email: :email_field, remarks: :text_area, children: :integer_field, human: :boolean_field, birthdate: :date_field, gets_up_at: :time_field, last_seen: :datetime_field, companion_id: :belongs_to_field, other_ids: :has_many_field, more_ids: :has_many_field }.each do |attr, method| it 'dispatches #{attr} attr to #{method}' do expect(form).to receive(method).with(attr, {}) form.input_field(attr) end it { expect(form.input_field(attr)).to be_html_safe } end end describe '#labeled_input_fields' do subject { form.labeled_input_fields(:name, :remarks, :children) } it { is_expected.to be_html_safe } it { is_expected.to include(form.input_field(:name, required: 'required')) } it { is_expected.to include(form.input_field(:remarks)) } it { is_expected.to include(form.input_field(:children)) } end describe '#labeled_input_field' do context 'when required' do subject { form.labeled_input_field(:name) } it { is_expected.to include('input-group-addon') } end context 'when not required' do subject { form.labeled_input_field(:remarks) } it { is_expected.not_to include('input-group-addon') } end context 'with help text' do subject { form.labeled_input_field(:name, help: 'Some Help') } it { is_expected.to include(form.help_block('Some Help')) } end end describe '#belongs_to_field' do it 'has all options by default' do f = form.belongs_to_field(:companion_id) expect_n_options(f, 7) end it 'with has options from :list option' do list = CrudTestModel.all f = form.belongs_to_field(:companion_id, list: [list.first, list.second]) expect_n_options(f, 3) end it 'with empty instance list has no select' do assign(:companions, []) @companions = [] f = form.belongs_to_field(:companion_id) expect(f).to match t('global.associations.none_available') expect_n_options(f, 0) end end describe '#has_and_belongs_to_many_field' do let(:others) { OtherCrudTestModel.all[0..1] } it 'has all options by default' do f = form.has_many_field(:other_ids) expect_n_options(f, 6) end it 'uses options from :list option if given' do f = form.has_many_field(:other_ids, list: others) expect_n_options(f, 2) end it 'uses options form instance variable if given' do assign(:others, others) @others = others f = form.has_many_field(:other_ids) expect_n_options(f, 2) end it 'displays a message for an empty list' do @others = [] f = form.has_many_field(:other_ids) expect(f).to match t('global.associations.none_available') expect_n_options(f, 0) end end describe '#string_field' do it 'sets maxlength if attr has a limit' do expect(form.string_field(:name)).to match(/maxlength="50"/) end end describe '#label' do context 'only with attr' do subject { form.label(:gugus_dada) } it { is_expected.to be_html_safe } it 'provides the same interface as rails' do is_expected.to match(/label [^>]*for.+Gugus dada/) end end context 'with attr and text' do subject { form.label(:gugus_dada, 'hoho') } it { is_expected.to be_html_safe } it 'provides the same interface as rails' do is_expected.to match(/label [^>]*for.+hoho/) end end end describe '#labeled' do context 'in labeled_ method' do subject { form.labeled_string_field(:name) } it { is_expected.to be_html_safe } it 'provides the same interface as rails' do is_expected.to match(/label [^>]*for.+input/m) end end context 'with custom content in argument' do subject do form.labeled('gugus', "".html_safe) end it { is_expected.to be_html_safe } it { is_expected.to match(/label [^>]*for.+".html_safe end end it { is_expected.to be_html_safe } it { is_expected.to match(/label [^>]*for.+".html_safe, caption: 'Caption') end it { is_expected.to be_html_safe } it { is_expected.to match(/label [^>]*for.+>Caption<\/label>.*".html_safe end end it { is_expected.to be_html_safe } it { is_expected.to match(/label [^>]*for.+>Caption<\/label>.*').size).to eq(n) end end