diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec/controllers/admin_public_body_headings_controller_spec.rb | 517 | ||||
-rw-r--r-- | spec/integration/admin_public_body_heading_edit_spec.rb | 58 | ||||
-rw-r--r-- | spec/models/public_body_heading_spec.rb | 108 |
3 files changed, 577 insertions, 106 deletions
diff --git a/spec/controllers/admin_public_body_headings_controller_spec.rb b/spec/controllers/admin_public_body_headings_controller_spec.rb index afbe0fa30..ccdfdecfb 100644 --- a/spec/controllers/admin_public_body_headings_controller_spec.rb +++ b/spec/controllers/admin_public_body_headings_controller_spec.rb @@ -2,161 +2,466 @@ require 'spec_helper' describe AdminPublicBodyHeadingsController do - context 'when showing the form for a new public body category' do - it 'should assign a new public body heading to the view' do + describe :new do + + it 'responds successfully' do get :new - assigns[:heading].should be_a(PublicBodyHeading) + expect(response).to be_success end - it 'renders the new template' do + it 'builds a new PublicBodyHeading' do get :new - expect(response).to render_template('new') + expect(assigns(:heading)).to be_new_record end + + it 'builds new translations for all locales' do + get :new + + translations = assigns(:heading).translations.map{ |t| t.locale.to_s }.sort + available = I18n.available_locales.map{ |l| l.to_s }.sort + + expect(translations).to eq(available) + end + + it 'renders the new template' do + get :new + expect(response).to render_template('new') + end + end - context 'when creating a public body heading' do - it "creates a new public body heading in one locale" do - n = PublicBodyHeading.count - post :create, { - :public_body_heading => { - :name => 'New Heading' - } - } - PublicBodyHeading.count.should == n + 1 - - heading = PublicBodyHeading.find_by_name("New Heading") - response.should redirect_to(admin_categories_path) - end + describe :create do - it 'creates a new public body heading with multiple locales' do - n = PublicBodyHeading.count - post :create, { - :public_body_heading => { - :name => 'New Heading', - :translated_versions => [{ :locale => "es", - :name => "Mi Nuevo Heading" }] - } - } - PublicBodyHeading.count.should == n + 1 - - heading = PublicBodyHeading.find_by_name("New Heading") - heading.translations.map {|t| t.locale.to_s}.sort.should == ["en", "es"] - I18n.with_locale(:en) do - heading.name.should == "New Heading" + context 'on success' do + + before(:each) do + PublicBodyHeading.destroy_all + @params = { :translations_attributes => { + 'en' => { :locale => 'en', + :name => 'New Heading' } + } } end - I18n.with_locale(:es) do - heading.name.should == "Mi Nuevo Heading" + + it 'creates a new heading in the default locale' do + expect { + post :create, :public_body_heading => @params + }.to change{ PublicBodyHeading.count }.from(0).to(1) end - response.should redirect_to(admin_categories_path) - end + it 'notifies the admin that the heading was created' do + post :create, :public_body_heading => @params + expect(flash[:notice]).to eq('Heading was successfully created.') + end + + it 'redirects to the categories index' do + post :create, :public_body_heading => @params + expect(response).to redirect_to(admin_categories_path) + end - it "renders the form if creating the record was unsuccessful" do - post :create, :public_body_heading => { :name => '' } - expect(response).to render_template('new') end - end + context 'on success for multiple locales' do - context 'when editing a public body heading' do - before do - @heading = FactoryGirl.create(:public_body_heading) - end + before(:each) do + PublicBodyHeading.destroy_all + @params = { :translations_attributes => { + 'en' => { :locale => 'en', + :name => 'New Heading' }, + 'es' => { :locale => 'es', + :name => 'Mi Nuevo Heading' } + } } + end - render_views + it 'saves the heading' do + expect { + post :create, :public_body_heading => @params + }.to change{ PublicBodyHeading.count }.from(0).to(1) + end - it "finds the requested heading" do - get :edit, :id => @heading.id - expect(assigns[:heading]).to eq(@heading) - end + it 'saves the default locale translation' do + post :create, :public_body_heading => @params - it "renders the edit template" do - get :edit, :id => @heading.id - expect(assigns[:heading]).to render_template('edit') - end - end + heading = PublicBodyHeading.find_by_name('New Heading') + + I18n.with_locale(:en) do + expect(heading.name).to eq('New Heading') + end + end + + it 'saves the alternative locale translation' do + post :create, :public_body_heading => @params + + heading = PublicBodyHeading.find_by_name('New Heading') + + I18n.with_locale(:es) do + expect(heading.name).to eq('Mi Nuevo Heading') + end + end - context 'when updating a public body heading' do - before do - @heading = FactoryGirl.create(:public_body_heading) - @name = @heading.name end - it "saves edits to a public body heading" do - post :update, { :id => @heading.id, - :public_body_heading => { :name => "Renamed" } } - request.flash[:notice].should include('successful') - found_heading = PublicBodyHeading.find(@heading.id) - found_heading.name.should == "Renamed" + context 'on failure' do + + it 'renders the form if creating the record was unsuccessful' do + post :create, :public_body_heading => { :name => '' } + expect(response).to render_template('new') + end + + it 'is rebuilt with the given params' do + post :create, :public_body_heading => { :name => 'Need a description' } + expect(assigns(:heading).name).to eq('Need a description') + end + end - it "saves edits to a public body heading in another locale" do - I18n.with_locale(:es) do - post :update, { - :id => @heading.id, - :public_body_heading => { - :name => @name, - :translated_versions => { - @heading.id => {:locale => "es", - :name => "Renamed"} - } - } - } - request.flash[:notice].should include('successful') + context 'on failure for multiple locales' do + + before(:each) do + @params = { :translations_attributes => { + 'en' => { :locale => 'en', + :name => 'Need a description' }, + 'es' => { :locale => 'es', + :name => 'Mi Nuevo Heading' } + } } + end + + it 'is rebuilt with the default locale translation' do + post :create, :public_body_heading => @params + expect(assigns(:heading).name).to eq('Need a description') end - heading = PublicBodyHeading.find(@heading.id) - I18n.with_locale(:es) do - heading.name.should == "Renamed" + it 'is rebuilt with the alternative locale translation' do + post :create, :public_body_heading => @params + + I18n.with_locale(:es) do + expect(assigns(:heading).name).to eq('Mi Nuevo Heading') + end end - I18n.with_locale(:en) do - heading.name.should == @name + + end + + end + + describe :edit do + + before do + @heading = FactoryGirl.create(:public_body_heading) + I18n.with_locale('es') do + @heading.name = 'Los heading' + @heading.save! end end - it "redirects to the edit page after a successful update" do - post :update, { :id => @heading.id, - :public_body_heading => { :name => "Renamed" } } + it 'responds successfully' do + get :edit, :id => @heading.id + expect(response).to be_success + end - expect(response).to redirect_to(edit_admin_heading_path(@heading)) + it 'finds the requested heading' do + get :edit, :id => @heading.id + expect(assigns[:heading]).to eq(@heading) end - it "re-renders the edit form after an unsuccessful update" do - post :update, { :id => @heading.id, - :public_body_heading => { :name => '' } } + it 'builds new translations if the body does not already have a translation in the specified locale' do + get :edit, :id => @heading.id + expect(assigns[:heading].translations.map(&:locale)).to include(:fr) + end + it 'renders the edit template' do + get :edit, :id => @heading.id expect(response).to render_template('edit') end end - context 'when destroying a public body heading' do + describe :update do + + before do + @heading = FactoryGirl.create(:public_body_heading) + I18n.with_locale('es') do + @heading.name = 'Los heading' + @heading.save! + end + @params = { :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) }, + 'es' => { :id => @heading.translation_for(:es).id, + :locale => 'es', + :title => @heading.name(:es) } + } } + end + + it 'finds the heading to update' do + post :update, :id => @heading.id, + :public_body_category => @params + expect(assigns(:heading)).to eq(@heading) + end + + context 'on success' do + + before(:each) do + @params = { :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :name => 'Renamed' } + } + } + } + end + + it 'saves edits to a public body heading' do + post :update, @params + heading = PublicBodyHeading.find(@heading.id) + expect(heading.name).to eq('Renamed') + end + + it 'notifies the admin that the heading was updated' do + post :update, @params + expect(flash[:notice]).to eq('Heading was successfully updated.') + end + + it 'redirects to the heading edit page' do + post :update, @params + expect(response).to redirect_to(edit_admin_heading_path(@heading)) + end + + end + + context 'on success for multiple locales' do + + it 'saves edits to a public body heading in another locale' do + @heading.name(:es).should == 'Los heading' + post :update, :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) }, + 'es' => { :id => @heading.translation_for(:es).id, + :locale => 'es', + :name => 'Renamed' } + } + } + + heading = PublicBodyHeading.find(@heading.id) + expect(heading.name(:es)).to eq('Renamed') + expect(heading.name(:en)).to eq(@heading.name(:en)) + end + + it 'adds a new translation' do + @heading.translation_for(:es).destroy + @heading.reload + + put :update, { + :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) }, + 'es' => { :locale => "es", + :name => "Example Public Body Heading ES" } + } + } + } + + request.flash[:notice].should include('successful') + + heading = PublicBodyHeading.find(@heading.id) + + I18n.with_locale(:es) do + expect(heading.name).to eq('Example Public Body Heading ES') + end + end + + it 'adds new translations' do + @heading.translation_for(:es).destroy + @heading.reload + + post :update, { + :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) }, + 'es' => { :locale => "es", + :name => "Example Public Body Heading ES" }, + 'fr' => { :locale => "fr", + :name => "Example Public Body Heading FR" } + } + } + } + + request.flash[:notice].should include('successful') + + heading = PublicBodyHeading.find(@heading.id) + + I18n.with_locale(:es) do + expect(heading.name).to eq('Example Public Body Heading ES') + end + I18n.with_locale(:fr) do + expect(heading.name).to eq('Example Public Body Heading FR') + end + end + + it 'updates an existing translation and adds a third translation' do + post :update, { + :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) }, + # Update existing translation + 'es' => { :id => @heading.translation_for(:es).id, + :locale => "es", + :name => "Renamed Example Public Body Heading ES" }, + # Add new translation + 'fr' => { :locale => "fr", + :name => "Example Public Body Heading FR" } + } + } + } + + request.flash[:notice].should include('successful') + + heading = PublicBodyHeading.find(@heading.id) + + I18n.with_locale(:es) do + expect(heading.name).to eq('Renamed Example Public Body Heading ES') + end + I18n.with_locale(:fr) do + expect(heading.name).to eq('Example Public Body Heading FR') + end + end + + it "redirects to the edit page after a successful update" do + post :update, :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => @heading.name(:en) } + } } + + expect(response).to redirect_to(edit_admin_heading_path(@heading)) + end + + end + + context 'on failure' do + + it 'renders the form if creating the record was unsuccessful' do + post :update, :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => '' } + } } + expect(response).to render_template('edit') + end + + it 'is rebuilt with the given params' do + post :update, :id => @heading.id, + :public_body_heading => { + :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => 'Need a description' } + } } + expect(assigns(:heading).name).to eq('Need a description') + end + + end + + context 'on failure for multiple locales' do + + before(:each) do + @params = { :translations_attributes => { + 'en' => { :id => @heading.translation_for(:en).id, + :locale => 'en', + :name => '' }, + 'es' => { :id => @heading.translation_for(:es).id, + :locale => 'es', + :name => 'Mi Nuevo Heading' } + } } + end + + it 'is rebuilt with the default locale translation' do + post :update, :id => @heading.id, + :public_body_heading => @params + expect(assigns(:heading).name(:en)).to eq('') + end + + it 'is rebuilt with the alternative locale translation' do + post :update, :id => @heading.id, + :public_body_heading => @params + + I18n.with_locale(:es) do + expect(assigns(:heading).name).to eq('Mi Nuevo Heading') + end + end + + end + + end + + describe :destroy do + + it 'uses the current locale by default' do + heading = FactoryGirl.create(:public_body_heading) + post :destroy, :id => heading.id + expect(assigns(:locale)).to eq(I18n.locale.to_s) + end - before do - @heading = FactoryGirl.create(:public_body_heading) + it 'sets the locale if the show_locale param is passed' do + heading = FactoryGirl.create(:public_body_heading) + post :destroy, :id => heading.id, :show_locale => 'es' + expect(assigns(:locale)).to eq('es') end - it "destroys a public body heading that has associated categories" do + it 'destroys the public body heading' do + PublicBodyHeading.destroy_all + + heading = FactoryGirl.create(:public_body_heading) + + expect{ + post :destroy, :id => heading.id + }.to change{ PublicBodyHeading.count }.from(1).to(0) + end + + it 'destroys a heading that has associated categories' do + PublicBodyHeading.destroy_all + PublicBodyCategory.destroy_all + + heading = FactoryGirl.create(:public_body_heading) category = FactoryGirl.create(:public_body_category) link = FactoryGirl.create(:public_body_category_link, :public_body_category => category, - :public_body_heading => @heading, + :public_body_heading => heading, :category_display_order => 0) - n = PublicBodyHeading.count - n_links = PublicBodyCategoryLink.count - post :destroy, { :id => @heading.id } - response.should redirect_to(admin_categories_path) - PublicBodyHeading.count.should == n - 1 - PublicBodyCategoryLink.count.should == n_links - 1 + expect{ + post :destroy, :id => heading.id + }.to change{ PublicBodyHeading.count }.from(1).to(0) + end + + it 'notifies the admin that the heading was destroyed' do + heading = FactoryGirl.create(:public_body_heading) + post :destroy, :id => heading.id + expect(flash[:notice]).to eq('Heading was successfully destroyed.') end - it "destroys an empty public body heading" do - n = PublicBodyHeading.count - post :destroy, { :id => @heading.id } - response.should redirect_to(admin_categories_path) - PublicBodyHeading.count.should == n - 1 + it 'redirects to the categories index' do + heading = FactoryGirl.create(:public_body_heading) + post :destroy, :id => heading.id + expect(response).to redirect_to(admin_categories_path) end + end context 'when reordering public body headings' do diff --git a/spec/integration/admin_public_body_heading_edit_spec.rb b/spec/integration/admin_public_body_heading_edit_spec.rb new file mode 100644 index 000000000..6c7a5a74b --- /dev/null +++ b/spec/integration/admin_public_body_heading_edit_spec.rb @@ -0,0 +1,58 @@ +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') + +describe 'Editing a Public Body Heading' do + before do + AlaveteliConfiguration.stub!(:skip_admin_auth).and_return(false) + + confirm(:admin_user) + @admin = login(:admin_user) + @heading = FactoryGirl.create(:public_body_heading) + end + + it 'can edit the default locale' do + @admin.visit edit_admin_heading_path(@heading) + @admin.fill_in 'public_body_heading_name__en', :with => 'New Heading EN' + @admin.click_button 'Save' + + @heading.reload + expect(@heading.name).to eq('New Heading EN') + end + + it 'can add a translation for a single locale' do + expect(@heading.find_translation_by_locale('fr')).to be_nil + + @admin.visit edit_admin_heading_path(@heading) + @admin.fill_in 'public_body_heading_translations_attributes_fr_name__fr', :with => 'New Heading FR' + @admin.click_button 'Save' + + @heading.reload + I18n.with_locale(:fr) do + expect(@heading.name).to eq('New Heading FR') + end + end + + it 'can add a translation for multiple locales' do + # Add FR translation + expect(@heading.find_translation_by_locale('fr')).to be_nil + @admin.visit edit_admin_heading_path(@heading) + @admin.fill_in 'public_body_heading_translations_attributes_fr_name__fr', :with => 'New Heading FR' + @admin.click_button 'Save' + + # Add ES translation + expect(@heading.find_translation_by_locale('es')).to be_nil + @admin.visit edit_admin_heading_path(@heading) + @admin.fill_in 'public_body_heading_translations_attributes_es_name__es', :with => 'New Heading ES' + @admin.click_button 'Save' + + @heading.reload + I18n.with_locale(:fr) do + expect(@heading.name).to eq('New Heading FR') + end + + I18n.with_locale(:es) do + expect(@heading.name).to eq('New Heading ES') + end + 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 |