diff options
Diffstat (limited to 'spec/controllers')
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 |