diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/public_body_category_spec.rb | 140 | ||||
-rw-r--r-- | spec/models/public_body_heading_spec.rb | 108 | ||||
-rw-r--r-- | spec/models/public_body_spec.rb | 185 |
3 files changed, 335 insertions, 98 deletions
diff --git a/spec/models/public_body_category_spec.rb b/spec/models/public_body_category_spec.rb index c16c9b8a1..297bd096a 100644 --- a/spec/models/public_body_category_spec.rb +++ b/spec/models/public_body_category_spec.rb @@ -34,5 +34,145 @@ describe PublicBodyCategory do category.should_not be_valid category.errors[:description].should == ["Description can't be blank"] end + + it 'validates the translations' do + category = FactoryGirl.build(:public_body_category) + translation = category.translations.build + expect(category).to_not be_valid + end + + it 'uses the base model validation for the default locale' do + category = PublicBodyCategory.new + translation = category.translations.build(:locale => 'en', + :description => 'No title') + category.valid? + translation.valid? + + expect(category).to have(1).error_on(:title) + expect(translation).to have(0).errors_on(:title) + end + end + + describe :save do + + it 'saves translations' do + category = FactoryGirl.build(:public_body_category) + category.translations_attributes = { :es => { :locale => 'es', + :title => 'El Category', + :description => 'Spanish description' } } + + category.save + expect(PublicBodyCategory.find(category.id).translations.size).to eq(2) + end + + end + + describe :translations_attributes= do + + context 'translation_attrs is a Hash' do + + it 'does not persist translations' do + category = FactoryGirl.create(:public_body_category) + category.translations_attributes = { :es => { :locale => 'es', + :title => 'El Category', + :description => 'Spanish description' } } + + expect(PublicBodyCategory.find(category.id).translations.size).to eq(1) + end + + it 'creates a new translation' do + category = FactoryGirl.create(:public_body_category) + category.translations_attributes = { :es => { :locale => 'es', + :title => 'El Category', + :description => 'Spanish description' } } + category.save + category.reload + expect(category.title(:es)).to eq('El Category') + end + + it 'updates an existing translation' do + category = FactoryGirl.create(:public_body_category) + category.translations_attributes = { 'es' => { :locale => 'es', + :title => 'Name', + :description => 'Desc' } } + category.save + + category.translations_attributes = { 'es' => { :id => category.translation_for(:es).id, + :locale => 'es', + :title => 'Renamed', + :description => 'Desc' } } + category.save + expect(category.title(:es)).to eq('Renamed') + end + + it 'updates an existing translation and creates a new translation' do + category = FactoryGirl.create(:public_body_category) + category.translations.create(:locale => 'es', + :title => 'Los Category', + :description => 'ES Description') + + expect(category.translations.size).to eq(2) + + category.translations_attributes = { + 'es' => { :id => category.translation_for(:es).id, + :locale => 'es', + :title => 'Renamed' }, + 'fr' => { :locale => 'fr', + :title => 'Le Category' } + } + + expect(category.translations.size).to eq(3) + I18n.with_locale(:es) { expect(category.title).to eq('Renamed') } + I18n.with_locale(:fr) { expect(category.title).to eq('Le Category') } + end + + it 'skips empty translations' do + category = FactoryGirl.create(:public_body_category) + category.translations.create(:locale => 'es', + :title => 'Los Category', + :description => 'ES Description') + + expect(category.translations.size).to eq(2) + + category.translations_attributes = { + 'es' => { :id => category.translation_for(:es).id, + :locale => 'es', + :title => 'Renamed' }, + 'fr' => { :locale => 'fr' } + } + + expect(category.translations.size).to eq(2) + end + + end + end + +end + +describe PublicBodyCategory::Translation do + + it 'requires a locale' do + translation = PublicBodyCategory::Translation.new + translation.valid? + expect(translation.errors[:locale]).to eq(["can't be blank"]) + end + + it 'is valid if no required attributes are assigned' do + translation = PublicBodyCategory::Translation.new(:locale => I18n.default_locale) + expect(translation).to be_valid + end + + it 'requires a title if another required attribute is assigned' do + translation = PublicBodyCategory::Translation.new(:description => 'spec') + translation.valid? + expect(translation.errors[:title]).to eq(["Title can't be blank"]) + end + + it 'requires a description if another required attribute is assigned' do + translation = PublicBodyCategory::Translation.new(:title => 'spec') + translation.valid? + expect(translation.errors[:description]).to eq(["Description can't be blank"]) + end + end diff --git a/spec/models/public_body_heading_spec.rb b/spec/models/public_body_heading_spec.rb index 620f7da9c..be3e7c7d2 100644 --- a/spec/models/public_body_heading_spec.rb +++ b/spec/models/public_body_heading_spec.rb @@ -30,6 +30,13 @@ describe PublicBodyHeading do heading.valid? heading.display_order.should == PublicBodyHeading.next_display_order end + + it 'validates the translations' do + heading = FactoryGirl.build(:public_body_heading) + translation = heading.translations.build + expect(heading).to_not be_valid + end + end context 'when setting a display order' do @@ -43,4 +50,105 @@ describe PublicBodyHeading do PublicBodyHeading.next_display_order.should == 1 end end + + describe :save do + + it 'saves translations' do + heading = FactoryGirl.build(:public_body_heading) + heading.translations_attributes = { :es => { :locale => 'es', + :name => 'El Heading' } } + + heading.save + expect(PublicBodyHeading.find(heading.id).translations.size).to eq(2) + end + + end + + describe :translations_attributes= do + + context 'translation_attrs is a Hash' do + + it 'does not persist translations' do + heading = FactoryGirl.create(:public_body_heading) + heading.translations_attributes = { :es => { :locale => 'es', + :name => 'El Heading' } } + + expect(PublicBodyHeading.find(heading.id).translations.size).to eq(1) + end + + it 'creates a new translation' do + heading = FactoryGirl.create(:public_body_heading) + heading.translations_attributes = { :es => { :locale => 'es', + :name => 'El Heading' } } + heading.save + heading.reload + expect(heading.name(:es)).to eq('El Heading') + end + + it 'updates an existing translation' do + heading = FactoryGirl.create(:public_body_heading) + heading.translations_attributes = { 'es' => { :locale => 'es', + :name => 'Name' } } + heading.save + + heading.translations_attributes = { 'es' => { :id => heading.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' } } + heading.save + expect(heading.name(:es)).to eq('Renamed') + end + + it 'updates an existing translation and creates a new translation' do + heading = FactoryGirl.create(:public_body_heading) + heading.translations.create(:locale => 'es', + :name => 'Los Heading') + + expect(heading.translations.size).to eq(2) + + heading.translations_attributes = { + 'es' => { :id => heading.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr', + :name => 'Le Heading' } + } + + expect(heading.translations.size).to eq(3) + I18n.with_locale(:es) { expect(heading.name).to eq('Renamed') } + I18n.with_locale(:fr) { expect(heading.name).to eq('Le Heading') } + end + + it 'skips empty translations' do + heading = FactoryGirl.create(:public_body_heading) + heading.translations.create(:locale => 'es', + :name => 'Los Heading') + + expect(heading.translations.size).to eq(2) + + heading.translations_attributes = { + 'es' => { :id => heading.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr' } + } + + expect(heading.translations.size).to eq(2) + end + end + end +end + +describe PublicBodyHeading::Translation do + + it 'requires a locale' do + translation = PublicBodyHeading::Translation.new + translation.valid? + expect(translation.errors[:locale]).to eq(["can't be blank"]) + end + + it 'is valid if all required attributes are assigned' do + translation = PublicBodyHeading::Translation.new(:locale => I18n.default_locale) + expect(translation).to be_valid + end + end diff --git a/spec/models/public_body_spec.rb b/spec/models/public_body_spec.rb index d91021315..7b55efda1 100644 --- a/spec/models/public_body_spec.rb +++ b/spec/models/public_body_spec.rb @@ -30,106 +30,81 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBody do - describe :translations_attributes= do - - context 'translation_attrs is a Hash' do - - it 'takes the correct code path for a Hash' do - attrs = {} - attrs.should_receive(:each_value) - PublicBody.new().translations_attributes = attrs - end - - it 'updates an existing translation' do - body = public_bodies(:geraldine_public_body) - translation = body.translation_for(:es) - params = { 'es' => { :locale => 'es', - :name => 'Renamed' } } - - body.translations_attributes = params - I18n.with_locale(:es) { expect(body.name).to eq('Renamed') } - end - - it 'updates an existing translation and creates a new translation' do - body = public_bodies(:geraldine_public_body) - translation = body.translation_for(:es) - - expect(body.translations.size).to eq(2) - - body.translations_attributes = { - 'es' => { :locale => 'es', - :name => 'Renamed' }, - 'fr' => { :locale => 'fr', - :name => 'Le Geraldine Quango' } - } - - expect(body.translations.size).to eq(3) - I18n.with_locale(:es) { expect(body.name).to eq('Renamed') } - I18n.with_locale(:fr) { expect(body.name).to eq('Le Geraldine Quango') } - end - - it 'skips empty translations' do - body = public_bodies(:geraldine_public_body) - translation = body.translation_for(:es) - - expect(body.translations.size).to eq(2) - - body.translations_attributes = { - 'es' => { :locale => 'es', - :name => 'Renamed' }, - 'fr' => { :locale => 'fr' } - } - - expect(body.translations.size).to eq(2) - end - - end - - context 'translation_attrs is an Array' do - - it 'takes the correct code path for an Array' do - attrs = [] - attrs.should_receive(:each) - PublicBody.new().translations_attributes = attrs - end - - it 'creates a new translation' do - body = public_bodies(:geraldine_public_body) - body.translation_for(:es).destroy - body.reload - - expect(body.translations.size).to eq(1) - - body.translations_attributes = [ { - :locale => 'es', - :name => 'Renamed' - } - ] - - expect(body.translations.size).to eq(2) - I18n.with_locale(:es) { expect(body.name).to eq('Renamed') } - end - - it 'skips empty translations' do - body = public_bodies(:geraldine_public_body) - body.translation_for(:es).destroy - body.reload - - expect(body.translations.size).to eq(1) - - body.translations_attributes = [ - { :locale => 'empty' } - ] - - expect(body.translations.size).to eq(1) - end - - end - - end - + describe :translations_attributes= do + + context 'translation_attrs is a Hash' do + + it 'does not persist translations' do + body = FactoryGirl.create(:public_body) + body.translations_attributes = { :es => { :locale => 'es', + :name => 'El Body' } } + + expect(PublicBody.find(body.id).translations.size).to eq(1) + end + + it 'creates a new translation' do + body = FactoryGirl.create(:public_body) + body.translations_attributes = { :es => { :locale => 'es', + :name => 'El Body' } } + body.save + body.reload + expect(body.name(:es)).to eq('El Body') + end + + it 'updates an existing translation' do + body = FactoryGirl.create(:public_body) + body.translations_attributes = { 'es' => { :locale => 'es', + :name => 'El Body' } } + body.save + + body.translations_attributes = { 'es' => { :id => body.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' } } + body.save + expect(body.name(:es)).to eq('Renamed') + end + + it 'updates an existing translation and creates a new translation' do + body = FactoryGirl.create(:public_body) + body.translations.create(:locale => 'es', + :name => 'El Body') + + expect(body.translations.size).to eq(2) + + body.translations_attributes = { + 'es' => { :id => body.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr', + :name => 'Le Body' } + } + + expect(body.translations.size).to eq(3) + I18n.with_locale(:es) { expect(body.name).to eq('Renamed') } + I18n.with_locale(:fr) { expect(body.name).to eq('Le Body') } + end + + it 'skips empty translations' do + body = FactoryGirl.create(:public_body) + body.translations.create(:locale => 'es', + :name => 'El Body') + + expect(body.translations.size).to eq(2) + + body.translations_attributes = { + 'es' => { :id => body.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr' } + } + + expect(body.translations.size).to eq(2) + end + end + end end + describe PublicBody, " using tags" do before do @public_body = PublicBody.new(:name => 'Aardvark Monitoring Service', @@ -1264,3 +1239,17 @@ describe PublicBody do end +describe PublicBody::Translation do + + it 'requires a locale' do + translation = PublicBody::Translation.new + translation.valid? + expect(translation.errors[:locale]).to eq(["can't be blank"]) + end + + it 'is valid if all required attributes are assigned' do + translation = PublicBody::Translation.new(:locale => I18n.default_locale) + expect(translation).to be_valid + end + +end |