aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin_censor_rule_controller_spec.rb471
-rw-r--r--spec/factories/censor_rules.rb32
2 files changed, 503 insertions, 0 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/factories/censor_rules.rb b/spec/factories/censor_rules.rb
new file mode 100644
index 000000000..2c0b2c822
--- /dev/null
+++ b/spec/factories/censor_rules.rb
@@ -0,0 +1,32 @@
+FactoryGirl.define do
+
+ factory :censor_rule do
+ text 'some text to redact'
+ replacement '[REDACTED]'
+ last_edit_editor 'FactoryGirl'
+ last_edit_comment 'Modified by rspec'
+
+ factory :regexp_censor_rule do
+ text '\w+@\w+'
+ regexp true
+ end
+
+ factory :info_request_censor_rule do
+ info_request
+ end
+
+ factory :public_body_censor_rule do
+ public_body
+ end
+
+ factory :user_censor_rule do
+ user
+ end
+
+ factory :global_censor_rule do
+ initialize_with { CensorRule.new(:allow_global => true) }
+ end
+
+ end
+
+end