aboutsummaryrefslogtreecommitdiffstats
path: root/spec/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers')
-rw-r--r--spec/controllers/admin_censor_rule_controller_spec.rb471
-rw-r--r--spec/controllers/admin_public_body_categories_controller_spec.rb60
-rw-r--r--spec/controllers/admin_public_body_headings_controller_spec.rb43
-rw-r--r--spec/controllers/help_controller_spec.rb9
-rw-r--r--spec/controllers/public_body_controller_spec.rb5
-rw-r--r--spec/controllers/request_controller_spec.rb17
6 files changed, 587 insertions, 18 deletions
diff --git a/spec/controllers/admin_censor_rule_controller_spec.rb b/spec/controllers/admin_censor_rule_controller_spec.rb
index 37ffd9764..4df56a92b 100644
--- a/spec/controllers/admin_censor_rule_controller_spec.rb
+++ b/spec/controllers/admin_censor_rule_controller_spec.rb
@@ -1,5 +1,476 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+describe AdminCensorRuleController do
+ before(:each) { basic_auth_login(@request) }
+
+ describe 'GET new' do
+
+ it 'returns a successful response' do
+ get :new
+ expect(response).to be_success
+ end
+
+ it 'initializes a new censor rule' do
+ get :new
+ expect(assigns[:censor_rule]).to be_new_record
+ end
+
+ it 'renders the correct template' do
+ get :new
+ expect(response).to render_template('new')
+ end
+
+ it 'sets the URL for the form to POST to' do
+ get :new
+ expect(assigns[:form_url]).to eq(admin_rule_create_path)
+ end
+
+ context 'info_request_id param' do
+
+ it 'finds an info request if the info_request_id param is supplied' do
+ info_request = FactoryGirl.create(:info_request)
+ get :new, :info_request_id => info_request.id
+ expect(assigns[:info_request]).to eq(info_request)
+ end
+
+ it 'associates the info request with the new censor rule' do
+ info_request = FactoryGirl.create(:info_request)
+ get :new, :info_request_id => info_request.id
+ expect(assigns[:censor_rule].info_request).to eq(info_request)
+ end
+
+ it 'sets the URL for the form to POST to' do
+ info_request = FactoryGirl.create(:info_request)
+ get :new, :info_request_id => info_request.id
+ expect(assigns[:form_url]).to eq(admin_info_request_censor_rules_path(info_request))
+ end
+
+ it 'does not find an info request if no info_request_id param is supplied' do
+ get :new
+ expect(assigns[:info_request]).to be_nil
+ end
+
+ end
+
+ context 'user_id param' do
+
+ it 'finds a user if the user_id param is supplied' do
+ user = FactoryGirl.create(:user)
+ get :new, :user_id => user.id
+ expect(assigns[:censor_user]).to eq(user)
+ end
+
+ it 'associates the user with the new censor rule' do
+ user = FactoryGirl.create(:user)
+ get :new, :user_id => user.id
+ expect(assigns[:censor_rule].user).to eq(user)
+ end
+
+ it 'sets the URL for the form to POST to' do
+ user = FactoryGirl.create(:user)
+ get :new, :user_id => user.id
+ expect(assigns[:form_url]).to eq(admin_user_censor_rules_path(user))
+ end
+
+ it 'does not find a user if no user_id param is supplied' do
+ get :new
+ expect(assigns[:censor_user]).to be_nil
+ end
+
+ end
+
+ end
+
+ describe 'POST create' do
+
+ before(:each) do
+ @censor_rule_params = FactoryGirl.build(:global_censor_rule).serializable_hash
+ # last_edit_editor gets set in the controller
+ @censor_rule_params.delete(:last_edit_editor)
+ end
+
+ it 'sets the last_edit_editor to the current admin' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:censor_rule].last_edit_editor).to eq('*unknown*')
+ end
+
+ it 'sets the URL for the form to POST to' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:form_url]).to eq(admin_rule_create_path)
+ end
+
+ context 'info_request_id param' do
+
+ it 'finds an info request if the info_request_id param is supplied' do
+ info_request = FactoryGirl.create(:info_request)
+ post :create, :info_request_id => info_request.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:info_request]).to eq(info_request)
+ end
+
+ it 'associates the info request with the new censor rule' do
+ info_request = FactoryGirl.create(:info_request)
+ post :create, :info_request_id => info_request.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:censor_rule].info_request).to eq(info_request)
+ end
+
+ it 'sets the URL for the form to POST to' do
+ info_request = FactoryGirl.create(:info_request)
+ post :create, :info_request_id => info_request.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:form_url]).to eq(admin_info_request_censor_rules_path(info_request))
+ end
+
+ it 'does not find an info request if no info_request_id param is supplied' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:info_request]).to be_nil
+ end
+
+ end
+
+ context 'user_id param' do
+
+ it 'finds a user if the user_id param is supplied' do
+ user = FactoryGirl.create(:user)
+ post :create, :user_id => user.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:censor_user]).to eq(user)
+ end
+
+ it 'associates the user with the new censor rule' do
+ user = FactoryGirl.create(:user)
+ post :create, :user_id => user.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:censor_rule].user).to eq(user)
+ end
+
+ it 'sets the URL for the form to POST to' do
+ user = FactoryGirl.create(:user)
+ post :create, :user_id => user.id,
+ :censor_rule => @censor_rule_params
+ expect(assigns[:form_url]).to eq(admin_user_censor_rules_path(user))
+ end
+
+ it 'does not find a user if no user_id param is supplied' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:censor_user]).to be_nil
+ end
+
+ end
+
+ context 'successfully saving the censor rule' do
+
+ before(:each) do
+ CensorRule.any_instance.stub(:save).and_return(true)
+ end
+
+ it 'persists the censor rule' do
+ pending("This raises an internal error in most cases")
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:censor_rule]).to be_persisted
+ end
+
+ it 'confirms the censor rule is created' do
+ pending("This raises an internal error in most cases")
+ post :create, :censor_rule => @censor_rule_params
+ msg = 'CensorRule was successfully created.'
+ expect(flash[:notice]).to eq(msg)
+ end
+
+ it 'raises an error after creating the rule' do
+ expect {
+ post :create, :censor_rule => @censor_rule_params
+ }.to raise_error 'internal error'
+ end
+
+ context 'a CensorRule with an associated InfoRequest' do
+
+ before(:each) do
+ @censor_rule_params = FactoryGirl.build(:info_request_censor_rule).serializable_hash
+ # last_edit_editor gets set in the controller
+ @censor_rule_params.delete(:last_edit_editor)
+ end
+
+ it 'purges the cache for the info request' do
+ censor_rule = CensorRule.new(@censor_rule_params)
+ @controller.should_receive(:expire_for_request).
+ with(censor_rule.info_request)
+
+ post :create, :censor_rule => @censor_rule_params
+ end
+
+ it 'redirects to the associated info request' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(response).to redirect_to(
+ admin_request_show_path(assigns[:censor_rule].info_request)
+ )
+ end
+
+ end
+
+ context 'a CensorRule with an associated User' do
+
+ before(:each) do
+ @censor_rule_params = FactoryGirl.build(:user_censor_rule).serializable_hash
+ # last_edit_editor gets set in the controller
+ @censor_rule_params.delete(:last_edit_editor)
+ end
+
+ it 'purges the cache for the info request' do
+ censor_rule = CensorRule.new(@censor_rule_params)
+ @controller.should_receive(:expire_requests_for_user).
+ with(censor_rule.user)
+
+ post :create, :censor_rule => @censor_rule_params
+ end
+
+ it 'redirects to the associated info request' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(response).to redirect_to(
+ admin_user_show_path(assigns[:censor_rule].user)
+ )
+ end
+
+ end
+
+ end
+
+ context 'unsuccessfully saving the censor rule' do
+
+ before(:each) do
+ CensorRule.any_instance.stub(:save).and_return(false)
+ end
+
+ it 'does not persist the censor rule' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(assigns[:censor_rule]).to be_new_record
+ end
+
+ it 'renders the form' do
+ post :create, :censor_rule => @censor_rule_params
+ expect(response).to render_template('new')
+ end
+
+ end
+
+ end
+
+ describe 'GET edit' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:global_censor_rule)
+ end
+
+ it 'returns a successful response' do
+ get :edit, :id => @censor_rule.id
+ expect(response).to be_success
+ end
+
+ it 'renders the correct template' do
+ get :edit, :id => @censor_rule.id
+ expect(response).to render_template('edit')
+ end
+
+ it 'finds the correct censor rule to edit' do
+ get :edit, :id => @censor_rule.id
+ expect(assigns[:censor_rule]).to eq(@censor_rule)
+ end
+
+ end
+
+ describe 'PUT update' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:global_censor_rule)
+ end
+
+ it 'finds the correct censor rule to edit' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ expect(assigns[:censor_rule]).to eq(@censor_rule)
+ end
+
+ it 'sets the last_edit_editor to the current admin' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ expect(assigns[:censor_rule].last_edit_editor).to eq('*unknown*')
+ end
+
+ context 'successfully saving the censor rule' do
+
+ before(:each) do
+ CensorRule.any_instance.stub(:save).and_return(true)
+ end
+
+ it 'updates the censor rule' do
+ pending("This raises an internal error in most cases")
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+ @censor_rule.reload
+ expect(@censor_rule.text).to eq('different text')
+ end
+
+ it 'confirms the censor rule is updated' do
+ pending("This raises an internal error in most cases")
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ msg = 'CensorRule was successfully updated.'
+ expect(flash[:notice]).to eq(msg)
+ end
+
+ it 'raises an error after updating the rule' do
+ expect {
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+ }.to raise_error 'internal error'
+ end
+
+ context 'a CensorRule with an associated InfoRequest' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:info_request_censor_rule)
+ end
+
+ it 'purges the cache for the info request' do
+ @controller.should_receive(:expire_for_request).
+ with(@censor_rule.info_request)
+
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+ end
+
+ it 'redirects to the associated info request' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ expect(response).to redirect_to(
+ admin_request_show_path(assigns[:censor_rule].info_request)
+ )
+ end
+
+ end
+
+ context 'a CensorRule with an associated User' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:user_censor_rule)
+ end
+
+ it 'purges the cache for the info request' do
+ @controller.should_receive(:expire_requests_for_user).
+ with(@censor_rule.user)
+
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+ end
+
+ it 'redirects to the associated info request' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ expect(response).to redirect_to(
+ admin_user_show_path(assigns[:censor_rule].user)
+ )
+ end
+
+ end
+
+ end
+
+ context 'unsuccessfully saving the censor rule' do
+
+ before(:each) do
+ CensorRule.any_instance.stub(:save).and_return(false)
+ end
+
+ it 'does not update the censor rule' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+ @censor_rule.reload
+ expect(@censor_rule.text).to eq('some text to redact')
+ end
+
+ it 'renders the form' do
+ put :update, :id => @censor_rule.id,
+ :censor_rule => { :text => 'different text' }
+
+ expect(response).to render_template('edit')
+ end
+
+ end
+
+ end
+
+ describe 'DELETE destroy' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:global_censor_rule)
+ end
+
+ it 'finds the correct censor rule to destroy' do
+ pending("This raises an internal error in most cases")
+ # TODO: Replace :censor_rule_id with :id
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ expect(assigns[:censor_rule]).to eq(@censor_rule)
+ end
+
+ it 'raises an error after destroying the rule' do
+ expect {
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ }.to raise_error 'internal error'
+ end
+
+ it 'confirms the censor rule is destroyed in all cases' do
+ pending("This actually raises an internal error anyway")
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ msg = 'CensorRule was successfully destroyed.'
+ expect(flash[:notice]).to eq(msg)
+ end
+
+ context 'a CensorRule with an associated InfoRequest' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:info_request_censor_rule)
+ end
+
+ it 'purges the cache for the info request' do
+ @controller.should_receive(:expire_for_request).with(@censor_rule.info_request)
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ end
+
+ it 'redirects to the associated info request' do
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ expect(response).to redirect_to(admin_request_show_path(@censor_rule.info_request))
+ end
+
+ end
+
+ context 'a CensorRule with an associated User' do
+
+ before(:each) do
+ @censor_rule = FactoryGirl.create(:user_censor_rule)
+ end
+
+ it 'purges the cache for the user' do
+ @controller.should_receive(:expire_requests_for_user).with(@censor_rule.user)
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ end
+
+ it 'redirects to the associated info request' do
+ delete :destroy, :censor_rule_id => @censor_rule.id
+ expect(response).to redirect_to(admin_user_show_path(@censor_rule.user))
+ end
+
+ end
+
+ end
+
+end
+
describe AdminCensorRuleController, "when making censor rules from the admin interface" do
render_views
before { basic_auth_login @request }
diff --git a/spec/controllers/admin_public_body_categories_controller_spec.rb b/spec/controllers/admin_public_body_categories_controller_spec.rb
index 35454990d..4c641bd75 100644
--- a/spec/controllers/admin_public_body_categories_controller_spec.rb
+++ b/spec/controllers/admin_public_body_categories_controller_spec.rb
@@ -6,6 +6,7 @@ describe AdminPublicBodyCategoriesController do
it 'shows the index page' do
get :index
+ expect(response).to be_success
end
end
@@ -14,6 +15,12 @@ describe AdminPublicBodyCategoriesController do
get :new
assigns[:category].should be_a(PublicBodyCategory)
end
+
+ it 'renders the new template' do
+ get :new
+ expect(response).to render_template('new')
+ end
+
end
context 'when creating a public body category' do
@@ -44,7 +51,6 @@ describe AdminPublicBodyCategoriesController do
category.public_body_headings.should == [heading]
end
-
it 'creates a new public body category with multiple locales' do
n = PublicBodyCategory.count
post :create, {
@@ -69,6 +75,12 @@ describe AdminPublicBodyCategoriesController do
response.should redirect_to(admin_categories_path)
end
+
+ it "renders the form if creating the record was unsuccessful" do
+ post :create, :public_body_category => { :title => '' }
+ expect(response).to render_template('new')
+ end
+
end
context 'when editing a public body category' do
@@ -82,14 +94,21 @@ describe AdminPublicBodyCategoriesController do
render_views
- it "edits a public body category" do
+ it "finds the requested category" do
get :edit, :id => @category.id
+ expect(assigns[:category]).to eq(@category)
+ end
+
+ it "renders the edit template" do
+ get :edit, :id => @category.id
+ expect(assigns[:category]).to render_template('edit')
end
it "edits a public body in another locale" do
- get :edit, {:id => @category.id, :locale => :en}
+ get :edit, { :id => @category.id, :locale => :en }
- # When editing a body, the controller returns all available translations
+ # When editing a body, the controller returns all available
+ # translations
assigns[:category].find_translation_by_locale("es").title.should == 'Los category'
response.should render_template('edit')
end
@@ -161,7 +180,9 @@ describe AdminPublicBodyCategoriesController do
body = FactoryGirl.create(:public_body, :tag_string => @tag)
post :update, { :id => @category.id,
:public_body_category => { :category_tag => "renamed" } }
- request.flash[:notice].should include('can\'t')
+
+ msg = "There are authorities associated with this category, so the tag can't be renamed"
+ request.flash[:error].should == msg
pbc = PublicBodyCategory.find(@category.id)
pbc.category_tag.should == @tag
end
@@ -175,18 +196,39 @@ describe AdminPublicBodyCategoriesController do
pbc = PublicBodyCategory.find(category.id)
pbc.category_tag.should == "renamed"
end
+
+ it "redirects to the edit page after a successful update" do
+ post :update, { :id => @category.id,
+ :public_body_category => { :title => "Renamed" } }
+
+ expect(response).to redirect_to(edit_admin_category_path(@category))
+ end
+
+ it "re-renders the edit form after an unsuccessful update" do
+ post :update, { :id => @category.id,
+ :public_body_category => { :title => '' } }
+
+ expect(response).to render_template('edit')
+ end
+
end
context 'when destroying a public body category' do
-
- it "destroys a public body category" do
+ it "destroys empty public body categories" do
pbc = PublicBodyCategory.create(:title => "Empty Category", :category_tag => "empty", :description => "-")
n = PublicBodyCategory.count
post :destroy, { :id => pbc.id }
response.should redirect_to(admin_categories_path)
PublicBodyCategory.count.should == n - 1
end
- end
-
+ it "destroys non-empty public body categories" do
+ authority = FactoryGirl.create(:public_body)
+ pbc = PublicBodyCategory.create(:title => "In-Use Category", :category_tag => "empty", :description => "-", :authorities => [authority])
+ n = PublicBodyCategory.count
+ post :destroy, { :id => pbc.id }
+ response.should redirect_to(admin_categories_path)
+ PublicBodyCategory.count.should == n - 1
+ end
+ end
end
diff --git a/spec/controllers/admin_public_body_headings_controller_spec.rb b/spec/controllers/admin_public_body_headings_controller_spec.rb
index 31517d238..afbe0fa30 100644
--- a/spec/controllers/admin_public_body_headings_controller_spec.rb
+++ b/spec/controllers/admin_public_body_headings_controller_spec.rb
@@ -7,6 +7,11 @@ describe AdminPublicBodyHeadingsController do
get :new
assigns[:heading].should be_a(PublicBodyHeading)
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
@@ -45,6 +50,12 @@ describe AdminPublicBodyHeadingsController do
response.should 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 'when editing a public body heading' do
@@ -54,8 +65,14 @@ describe AdminPublicBodyHeadingsController do
render_views
- it "edits a public body heading" do
+ it "finds the requested heading" do
get :edit, :id => @heading.id
+ expect(assigns[:heading]).to eq(@heading)
+ end
+
+ it "renders the edit template" do
+ get :edit, :id => @heading.id
+ expect(assigns[:heading]).to render_template('edit')
end
end
@@ -96,6 +113,21 @@ describe AdminPublicBodyHeadingsController do
heading.name.should == @name
end
end
+
+ it "redirects to the edit page after a successful update" do
+ post :update, { :id => @heading.id,
+ :public_body_heading => { :name => "Renamed" } }
+
+ expect(response).to redirect_to(edit_admin_heading_path(@heading))
+ end
+
+ it "re-renders the edit form after an unsuccessful update" do
+ post :update, { :id => @heading.id,
+ :public_body_heading => { :name => '' } }
+
+ expect(response).to render_template('edit')
+ end
+
end
context 'when destroying a public body heading' do
@@ -104,16 +136,19 @@ describe AdminPublicBodyHeadingsController do
@heading = FactoryGirl.create(:public_body_heading)
end
- it "does not destroy a public body heading that has associated categories" do
+ it "destroys a public body heading that has associated categories" do
category = FactoryGirl.create(:public_body_category)
link = FactoryGirl.create(:public_body_category_link,
:public_body_category => category,
:public_body_heading => @heading,
:category_display_order => 0)
n = PublicBodyHeading.count
+ n_links = PublicBodyCategoryLink.count
+
post :destroy, { :id => @heading.id }
- response.should redirect_to(edit_admin_heading_path(@heading))
- PublicBodyHeading.count.should == n
+ response.should redirect_to(admin_categories_path)
+ PublicBodyHeading.count.should == n - 1
+ PublicBodyCategoryLink.count.should == n_links - 1
end
it "destroys an empty public body heading" do
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index f92323f50..9453c9461 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -4,6 +4,15 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe HelpController do
render_views
+ describe :index do
+
+ it 'redirects to the about page' do
+ get :index
+ expect(response).to redirect_to(help_about_path)
+ end
+
+ end
+
describe :about do
it 'shows the about page' do
diff --git a/spec/controllers/public_body_controller_spec.rb b/spec/controllers/public_body_controller_spec.rb
index fc7143522..840b4bb28 100644
--- a/spec/controllers/public_body_controller_spec.rb
+++ b/spec/controllers/public_body_controller_spec.rb
@@ -7,7 +7,6 @@ describe PublicBodyController, "when showing a body" do
render_views
before(:each) do
- PublicBodyCategory.stub!(:load_categories)
load_raw_emails_data
get_fixtures_xapian_index
end
@@ -76,10 +75,6 @@ end
describe PublicBodyController, "when listing bodies" do
render_views
- before(:each) do
- PublicBodyCategory.stub!(:load_categories)
- end
-
it "should be successful" do
get :list
response.should be_success
diff --git a/spec/controllers/request_controller_spec.rb b/spec/controllers/request_controller_spec.rb
index 6c0f4573e..4d0070470 100644
--- a/spec/controllers/request_controller_spec.rb
+++ b/spec/controllers/request_controller_spec.rb
@@ -2380,6 +2380,23 @@ describe RequestController, "when doing type ahead searches" do
get :search_typeahead, :q => "dog -chicken"
assigns[:xapian_requests].results.size.should == 1
end
+
+ it 'can filter search results by public body' do
+ get :search_typeahead, :q => 'boring', :requested_from => 'dfh'
+ expect(assigns[:query]).to eq('requested_from:dfh boring')
+ end
+
+ it 'defaults to 25 results per page' do
+ get :search_typeahead, :q => 'boring'
+ expect(assigns[:per_page]).to eq(25)
+ end
+
+ it 'can limit the number of searches returned' do
+ get :search_typeahead, :q => 'boring', :per_page => '1'
+ expect(assigns[:per_page]).to eq(1)
+ expect(assigns[:xapian_requests].results.size).to eq(1)
+ end
+
end
describe RequestController, "when showing similar requests" do