aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin_public_body_controller_spec.rb545
-rw-r--r--spec/models/public_body_spec.rb185
2 files changed, 432 insertions, 298 deletions
diff --git a/spec/controllers/admin_public_body_controller_spec.rb b/spec/controllers/admin_public_body_controller_spec.rb
index 3ab58317a..50a373d9d 100644
--- a/spec/controllers/admin_public_body_controller_spec.rb
+++ b/spec/controllers/admin_public_body_controller_spec.rb
@@ -39,9 +39,14 @@ end
describe AdminPublicBodyController, 'when showing the form for a new public body' do
+ it 'responds successfully' do
+ get :new
+ expect(response).to be_success
+ end
+
it 'should assign a new public body to the view' do
get :new
- assigns[:public_body].should be_a(PublicBody)
+ expect(assigns(:public_body)).to be_new_record
end
it "builds new translations for all locales" do
@@ -53,6 +58,11 @@ describe AdminPublicBodyController, 'when showing the form for a new public body
expect(translations).to eq(available)
end
+ it 'renders the new template' do
+ get :new
+ expect(response).to render_template('new')
+ end
+
context 'when passed a change request id as a param' do
render_views
@@ -76,51 +86,127 @@ end
describe AdminPublicBodyController, "when creating a public body" do
render_views
- it "creates a new public body in one locale" do
- n = PublicBody.count
- post :create, { :public_body => { :name => "New Quango",
- :short_name => "",
- :tag_string => "blah",
- :request_email => 'newquango@localhost',
- :last_edit_comment => 'From test code' } }
- PublicBody.count.should == n + 1
+ context 'on success' do
+
+ before(:each) do
+ @params = { :public_body => { :name => 'New Quango',
+ :short_name => 'nq',
+ :request_email => 'newquango@localhost',
+ :tag_string => 'spec',
+ :last_edit_comment => 'From test code' } }
+ end
+
+ it 'creates a new body in the default locale' do
+ # FIXME: Can't call PublicBody.destroy_all because database
+ # database contstraints prevent them being deleted.
+ existing = PublicBody.count
+ expected = existing + 1
+ expect {
+ post :create, @params
+ }.to change{ PublicBody.count }.from(existing).to(expected)
+ end
+
+ it 'notifies the admin that the body was created' do
+ post :create, @params
+ expect(flash[:notice]).to eq('PublicBody was successfully created.')
+ end
+
+ it 'redirects to the admin page of the body' do
+ post :create, @params
+ expect(response).to redirect_to(admin_body_path(assigns(:public_body)))
+ end
- body = PublicBody.find_by_name("New Quango")
- response.should redirect_to(:controller=>'admin_public_body', :action=>'show', :id=>body.id)
end
- it "creates a new public body with multiple locales" do
- n = PublicBody.count
- post :create, {
- :public_body => { :name => "New Quango",
- :short_name => "",
- :tag_string => "blah",
- :request_email => 'newquango@localhost',
- :last_edit_comment => 'From test code',
- :translations_attributes => {
- 'es' => { :locale => "es",
- :name => "Mi Nuevo Quango",
- :short_name => "",
- :request_email => 'newquango@localhost' }
- }
- }
- }
- PublicBody.count.should == n + 1
+ context 'on success for multiple locales' do
+
+ before(:each) do
+ @params = { :public_body => { :name => 'New Quango',
+ :short_name => 'nq',
+ :request_email => 'newquango@localhost',
+ :tag_string => 'spec',
+ :last_edit_comment => 'From test code',
+ :translations_attributes => {
+ 'es' => { :locale => 'es',
+ :name => 'Los Quango' }
+ } } }
+ end
+
+ it 'saves the body' do
+ # FIXME: Can't call PublicBody.destroy_all because database
+ # database contstraints prevent them being deleted.
+ existing = PublicBody.count
+ expected = existing + 1
+ expect {
+ post :create, @params
+ }.to change{ PublicBody.count }.from(existing).to(expected)
+ end
+
+ it 'saves the default locale translation' do
+ post :create, @params
- body = PublicBody.find_by_name("New Quango")
- body.translations.map {|t| t.locale.to_s}.sort.should == ["en", "es"]
- I18n.with_locale(:en) do
- body.name.should == "New Quango"
- body.url_name.should == "new_quango"
- body.first_letter.should == "N"
+ body = PublicBody.find_by_name('New Quango')
+
+ I18n.with_locale(:en) do
+ expect(body.name).to eq('New Quango')
+ end
+ end
+
+ it 'saves the alternative locale translation' do
+ post :create, @params
+
+ body = PublicBody.find_by_name('New Quango')
+
+ I18n.with_locale(:es) do
+ expect(body.name).to eq('Los Quango')
+ end
+ end
+
+ end
+
+ context 'on failure' do
+
+ it 'renders the form if creating the record was unsuccessful' do
+ post :create, :public_body => { :name => '',
+ :translations_attributes => {} }
+ expect(response).to render_template('new')
end
- I18n.with_locale(:es) do
- body.name.should == "Mi Nuevo Quango"
- body.url_name.should == "mi_nuevo_quango"
- body.first_letter.should == "M"
+
+ it 'is rebuilt with the given params' do
+ post :create, :public_body => { :name => '',
+ :request_email => 'newquango@localhost',
+ :translations_attributes => {} }
+ expect(assigns(:public_body).request_email).to eq('newquango@localhost')
+ end
+
+ end
+
+ context 'on failure for multiple locales' do
+
+ before(:each) do
+ @params = { :public_body => { :name => '',
+ :request_email => 'newquango@localhost',
+ :translations_attributes => {
+ 'es' => { :locale => 'es',
+ :name => 'Los Quango' }
+ } } }
+ end
+
+ it 'is rebuilt with the default locale translation' do
+ post :create, @params
+ expect(assigns(:public_body)).to_not be_persisted
+ expect(assigns(:public_body).request_email).to eq('newquango@localhost')
+ end
+
+ it 'is rebuilt with the alternative locale translation' do
+ post :create, @params
+
+ expect(assigns(:public_body)).to_not be_persisted
+ I18n.with_locale(:es) do
+ expect(assigns(:public_body).name).to eq('Los Quango')
+ end
end
- response.should redirect_to(:controller=>'admin_public_body', :action=>'show', :id=>body.id)
end
context 'when the body is being created as a result of a change request' do
@@ -157,10 +243,34 @@ end
describe AdminPublicBodyController, "when editing a public body" do
render_views
- it "edits a public body" do
- get :edit, :id => 2
+ before do
+ @body = FactoryGirl.create(:public_body)
+ I18n.with_locale('es') do
+ @body.name = 'Los Body'
+ @body.save!
+ end
+ end
+
+ it 'responds successfully' do
+ get :edit, :id => @body.id
+ expect(response).to be_success
+ end
+
+ it 'finds the requested body' do
+ get :edit, :id => @body.id
+ expect(assigns[:public_body]).to eq(@body)
end
+ it 'builds new translations if the body does not already have a translation in the specified locale' do
+ get :edit, :id => @body.id
+ expect(assigns[:public_body].translations.map(&:locale)).to include(:fr)
+ end
+
+ it 'renders the edit template' do
+ get :edit, :id => @body.id
+ expect(response).to render_template('edit')
+ end
+
it "edits a public body in another locale" do
get :edit, {:id => 3, :locale => :en}
@@ -170,12 +280,6 @@ describe AdminPublicBodyController, "when editing a public body" do
response.should render_template('edit')
end
- it "builds new translations if the body does not already have a translation in the specified locale" do
- public_body = FactoryGirl.create(:public_body)
- get :edit, :id => public_body.id
- expect(assigns[:public_body].translations.map(&:locale)).to include(:fr)
- end
-
context 'when passed a change request id as a param' do
render_views
@@ -201,159 +305,200 @@ end
describe AdminPublicBodyController, "when updating a public body" do
render_views
- it "saves edits to a public body" do
- public_bodies(:humpadink_public_body).name.should == "Department for Humpadinking"
- post :update, { :id => 3, :public_body => { :name => "Renamed",
- :short_name => "",
- :tag_string => "some tags",
- :request_email => 'edited@localhost',
- :last_edit_comment => 'From test code' } }
- request.flash[:notice].should include('successful')
- pb = PublicBody.find(public_bodies(:humpadink_public_body).id)
- pb.name.should == "Renamed"
- end
-
- it 'adds a new translation' do
- pb = public_bodies(:humpadink_public_body)
- pb.translation_for(:es).destroy
- pb.reload
-
- post :update, {
- :id => pb.id,
- :public_body => {
- :name => "Department for Humpadinking",
- :short_name => "",
- :tag_string => "some tags",
- :request_email => 'edited@localhost',
- :last_edit_comment => 'From test code',
- :translations_attributes => {
- 'es' => { :locale => "es",
- :name => "El Department for Humpadinking",
- :short_name => "",
- :request_email => 'edited@localhost' }
- }
- }
- }
-
- request.flash[:notice].should include('successful')
-
- pb = PublicBody.find(public_bodies(:humpadink_public_body).id)
-
- I18n.with_locale(:es) do
- expect(pb.name).to eq('El Department for Humpadinking')
- end
- end
-
- it 'adds new translations' do
- pb = public_bodies(:humpadink_public_body)
- pb.translation_for(:es).destroy
- pb.reload
-
- post :update, {
- :id => pb.id,
- :public_body => {
- :name => "Department for Humpadinking",
- :short_name => "",
- :tag_string => "some tags",
- :request_email => 'edited@localhost',
- :last_edit_comment => 'From test code',
- :translations_attributes => {
- 'es' => { :locale => "es",
- :name => "El Department for Humpadinking",
- :short_name => "",
- :request_email => 'edited@localhost' },
- 'fr' => { :locale => "fr",
- :name => "Le Department for Humpadinking",
- :short_name => "",
- :request_email => 'edited@localhost' }
- }
- }
- }
-
- request.flash[:notice].should include('successful')
-
- pb = PublicBody.find(public_bodies(:humpadink_public_body).id)
-
- I18n.with_locale(:es) do
- expect(pb.name).to eq('El Department for Humpadinking')
- end
-
- I18n.with_locale(:fr) do
- expect(pb.name).to eq('Le Department for Humpadinking')
- end
- end
-
- it 'updates an existing translation and adds a third translation' do
- pb = public_bodies(:humpadink_public_body)
-
- put :update, {
- :id => pb.id,
- :public_body => {
- :name => "Department for Humpadinking",
- :short_name => "",
- :tag_string => "some tags",
- :request_email => 'edited@localhost',
- :last_edit_comment => 'From test code',
- :translations_attributes => {
- # Update existing translation
- 'es' => { :locale => "es",
- :name => "Renamed Department for Humpadinking",
- :short_name => "",
- :request_email => 'edited@localhost' },
- # Add new translation
- 'fr' => { :locale => "fr",
- :name => "Le Department for Humpadinking",
- :short_name => "",
- :request_email => 'edited@localhost' }
- }
- }
- }
-
- request.flash[:notice].should include('successful')
-
- pb = PublicBody.find(public_bodies(:humpadink_public_body).id)
-
- I18n.with_locale(:es) do
- expect(pb.name).to eq('Renamed Department for Humpadinking')
- end
-
- I18n.with_locale(:fr) do
- expect(pb.name).to eq('Le Department for Humpadinking')
- end
-
- end
-
- it "saves edits to a public body in another locale" do
- I18n.with_locale(:es) do
- pb = PublicBody.find(id=3)
- pb.name.should == "El Department for Humpadinking"
- post :update, {
- :id => 3,
- :public_body => {
- :name => "Department for Humpadinking",
- :short_name => "",
- :tag_string => "some tags",
- :request_email => 'edited@localhost',
- :last_edit_comment => 'From test code',
- :translations_attributes => {
- 'es' => { :locale => "es",
- :name => "Renamed",
- :short_name => "",
- :request_email => 'edited@localhost' }
- }
- }
- }
- request.flash[:notice].should include('successful')
- end
-
- pb = PublicBody.find(public_bodies(:humpadink_public_body).id)
-
- I18n.with_locale(:es) do
- expect(pb.name).to eq('Renamed')
- end
-
- I18n.with_locale(:en) do
- expect(pb.name).to eq('Department for Humpadinking')
+ before do
+ @body = FactoryGirl.create(:public_body)
+ I18n.with_locale('es') do
+ @body.name = 'Los Quango'
+ @body.save!
+ end
+
+ @params = { :id => @body.id,
+ :public_body => { :name => 'Renamed',
+ :short_name => @body.short_name,
+ :request_email => @body.request_email,
+ :tag_string => @body.tag_string,
+ :last_edit_comment => 'From test code',
+ :translations_attributes => {
+ 'es' => { :id => @body.translation_for(:es).id,
+ :locale => 'es',
+ :title => @body.name(:es) }
+ } } }
+ end
+
+ it 'finds the heading to update' do
+ post :update, @params
+ expect(assigns(:heading)).to eq(@heading)
+ end
+
+ context 'on success' do
+
+ it 'saves edits to a public body heading' do
+ post :update, @params
+ body = PublicBody.find(@body.id)
+ expect(body.name).to eq('Renamed')
+ end
+
+ it 'notifies the admin that the body was updated' do
+ post :update, @params
+ expect(flash[:notice]).to eq('PublicBody was successfully updated.')
+ end
+
+ it 'redirects to the admin body page' do
+ post :update, @params
+ expect(response).to redirect_to(admin_body_path(@body))
+ end
+
+ end
+
+ context 'on success for multiple locales' do
+
+ it 'saves edits to a public body heading in another locale' do
+ @body.name(:es).should == 'Los Quango'
+ post :update, :id => @body.id,
+ :public_body => {
+ :name => @body.name(:en),
+ :translations_attributes => {
+ 'es' => { :id => @body.translation_for(:es).id,
+ :locale => 'es',
+ :name => 'Renamed' }
+ }
+ }
+
+ body = PublicBody.find(@body.id)
+ expect(body.name(:es)).to eq('Renamed')
+ expect(body.name(:en)).to eq(@body.name(:en))
+ end
+
+ it 'adds a new translation' do
+ @body.translation_for(:es).destroy
+ @body.reload
+
+ put :update, {
+ :id => @body.id,
+ :public_body => {
+ :name => @body.name(:en),
+ :translations_attributes => {
+ 'es' => { :locale => "es",
+ :name => "Example Public Body ES" }
+ }
+ }
+ }
+
+ request.flash[:notice].should include('successful')
+
+ body = PublicBody.find(@body.id)
+
+ I18n.with_locale(:es) do
+ expect(body.name).to eq('Example Public Body ES')
+ end
+ end
+
+ it 'adds new translations' do
+ @body.translation_for(:es).destroy
+ @body.reload
+
+ post :update, {
+ :id => @body.id,
+ :public_body => {
+ :name => @body.name(:en),
+ :translations_attributes => {
+ 'es' => { :locale => "es",
+ :name => "Example Public Body ES" },
+ 'fr' => { :locale => "fr",
+ :name => "Example Public Body FR" }
+ }
+ }
+ }
+
+ request.flash[:notice].should include('successful')
+
+ body = PublicBody.find(@body.id)
+
+ I18n.with_locale(:es) do
+ expect(body.name).to eq('Example Public Body ES')
+ end
+ I18n.with_locale(:fr) do
+ expect(body.name).to eq('Example Public Body FR')
+ end
+ end
+
+ it 'updates an existing translation and adds a third translation' do
+ post :update, {
+ :id => @body.id,
+ :public_body => {
+ :name => @body.name(:en),
+ :translations_attributes => {
+ # Update existing translation
+ 'es' => { :id => @body.translation_for(:es).id,
+ :locale => "es",
+ :name => "Renamed Example Public Body ES" },
+ # Add new translation
+ 'fr' => { :locale => "fr",
+ :name => "Example Public Body FR" }
+ }
+ }
+ }
+
+ request.flash[:notice].should include('successful')
+
+ body = PublicBody.find(@body.id)
+
+ I18n.with_locale(:es) do
+ expect(body.name).to eq('Renamed Example Public Body ES')
+ end
+ I18n.with_locale(:fr) do
+ expect(body.name).to eq('Example Public Body FR')
+ end
+ end
+
+ end
+
+ context 'on failure' do
+
+ it 'renders the form if creating the record was unsuccessful' do
+ post :update, :id => @body.id,
+ :public_body => {
+ :name => '',
+ :translations_attributes => {}
+ }
+ expect(response).to render_template('edit')
+ end
+
+ it 'is rebuilt with the given params' do
+ post :update, :id => @body.id,
+ :public_body => {
+ :name => '',
+ :request_email => 'updated@localhost',
+ :translations_attributes => {}
+ }
+ expect(assigns(:public_body).request_email).to eq('updated@localhost')
+ end
+
+ end
+
+ context 'on failure for multiple locales' do
+
+ before(:each) do
+ @params = { :id => @body.id,
+ :public_body => { :name => '',
+ :translations_attributes => {
+ 'es' => { :id => @body.translation_for(:es).id,
+ :locale => 'es',
+ :name => 'Mi Nuevo Body' }
+ } } }
+ end
+
+ it 'is rebuilt with the default locale translation' do
+ post :update, @params
+ expect(assigns(:public_body).name(:en)).to eq('')
+ end
+
+ it 'is rebuilt with the alternative locale translation' do
+ post :update, @params
+
+ I18n.with_locale(:es) do
+ expect(assigns(:public_body).name).to eq('Mi Nuevo Body')
+ end
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