# spec/support/examples/multiparameter_attributes.rb shared_examples_for 'a model with multiparameter date attributes' do |factory, *attributes| subject { build factory } attributes.each do |attribute| it 'should assign date when all date parts are valid' do subject.assign_attributes(multiparameter_date(attribute, 2006, 12, 1)) expect( subject.send(attribute) ).to eq Date.new(2006, 12, 1) end it 'should not assign date when missing year part' do subject.assign_attributes(multiparameter_date(attribute, nil, 12, 1)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing month part' do subject.assign_attributes(multiparameter_date(attribute, 2006, nil, 1)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing day part' do subject.assign_attributes(multiparameter_date(attribute, 2006, 12, nil)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing year and month parts' do subject.assign_attributes(multiparameter_date(attribute, nil, nil, 1)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing year and day parts' do subject.assign_attributes(multiparameter_date(attribute, nil, 12, nil)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing month and day parts' do subject.assign_attributes(multiparameter_date(attribute, 2006, nil, nil)) expect( subject.send(attribute) ).to be_nil end it 'should not assign date when missing all date parts' do subject.assign_attributes(multiparameter_date(attribute, nil, nil, nil)) expect( subject.send(attribute) ).to be_nil end it 'should raise error when month part is invalid' do expect { subject.assign_attributes(multiparameter_date(attribute, 2006, 99, 1)) }.to raise_error ActiveModel::MultiparameterAssignmentErrors end it 'should raise error when day part is invalid' do expect { subject.assign_attributes(multiparameter_date(attribute, 2006, 12, 99)) }.to raise_error ActiveModel::MultiparameterAssignmentErrors end end it 'should raise error when assigning to invalid attribute' do expect { subject.assign_attributes(multiparameter_date(:some_unreasonably_existing_attribute, 2006, 12, 1)) }.to raise_error ActiveModel::MultiparameterAssignmentErrors end private def multiparameter_date(attribute, year, month, day) { "#{attribute}(1i)" => year.to_s, "#{attribute}(2i)" => month.to_s, "#{attribute}(3i)" => day.to_s, } end end