diff options
-rw-r--r-- | app/controllers/admin_censor_rule_controller.rb | 55 | ||||
-rw-r--r-- | app/views/admin_censor_rule/_form.html.erb | 2 | ||||
-rw-r--r-- | app/views/admin_censor_rule/_show.html.erb | 14 | ||||
-rw-r--r-- | app/views/admin_censor_rule/new.html.erb | 6 | ||||
-rw-r--r-- | config/routes.rb | 18 | ||||
-rw-r--r-- | spec/controllers/admin_censor_rule_controller_spec.rb | 471 | ||||
-rw-r--r-- | spec/factories/censor_rules.rb | 32 |
7 files changed, 575 insertions, 23 deletions
diff --git a/app/controllers/admin_censor_rule_controller.rb b/app/controllers/admin_censor_rule_controller.rb index 6f79b5ba1..68ca57510 100644 --- a/app/controllers/admin_censor_rule_controller.rb +++ b/app/controllers/admin_censor_rule_controller.rb @@ -8,23 +8,49 @@ class AdminCensorRuleController < AdminController def new if params[:info_request_id] @info_request = InfoRequest.find(params[:info_request_id]) + @censor_rule = @info_request.censor_rules.build + @form_url = admin_info_request_censor_rules_path(@info_request) end + if params[:user_id] @censor_user = User.find(params[:user_id]) + @censor_rule = @censor_user.censor_rules.build + @form_url = admin_user_censor_rules_path(@censor_user) end + + @censor_rule ||= CensorRule.new + @form_url ||= admin_rule_create_path end def create - params[:censor_rule][:last_edit_editor] = admin_current_user() - @censor_rule = CensorRule.new(params[:censor_rule]) + params[:censor_rule][:last_edit_editor] = admin_current_user + + if params[:info_request_id] + @info_request = InfoRequest.find(params[:info_request_id]) + @censor_rule = @info_request.censor_rules.build(params[:censor_rule]) + @form_url = admin_info_request_censor_rules_path(@info_request) + end + + if params[:user_id] + @censor_user = User.find(params[:user_id]) + @censor_rule = @censor_user.censor_rules.build(params[:censor_rule]) + @form_url = admin_user_censor_rules_path(@censor_user) + end + + @censor_rule ||= CensorRule.new(params[:censor_rule]) + @form_url ||= admin_rule_create_path + if @censor_rule.save if !@censor_rule.info_request.nil? expire_for_request(@censor_rule.info_request) end + if !@censor_rule.user.nil? expire_requests_for_user(@censor_rule.user) end + flash[:notice] = 'CensorRule was successfully created.' + if !@censor_rule.info_request.nil? redirect_to admin_request_show_url(@censor_rule.info_request) elsif !@censor_rule.user.nil? @@ -42,16 +68,20 @@ class AdminCensorRuleController < AdminController end def update - params[:censor_rule][:last_edit_editor] = admin_current_user() + params[:censor_rule][:last_edit_editor] = admin_current_user @censor_rule = CensorRule.find(params[:id]) + if @censor_rule.update_attributes(params[:censor_rule]) - if !@censor_rule.info_request.nil? + unless @censor_rule.info_request.nil? expire_for_request(@censor_rule.info_request) end - if !@censor_rule.user.nil? + + unless @censor_rule.user.nil? expire_requests_for_user(@censor_rule.user) end + flash[:notice] = 'CensorRule was successfully updated.' + if !@censor_rule.info_request.nil? redirect_to admin_request_show_url(@censor_rule.info_request) elsif !@censor_rule.user.nil? @@ -65,19 +95,22 @@ class AdminCensorRuleController < AdminController end def destroy - censor_rule = CensorRule.find(params[:censor_rule_id]) - info_request = censor_rule.info_request - user = censor_rule.user + @censor_rule = CensorRule.find(params[:censor_rule_id]) + info_request = @censor_rule.info_request + user = @censor_rule.user - censor_rule.destroy - if !info_request.nil? + @censor_rule.destroy + + unless info_request.nil? expire_for_request(info_request) end - if !user.nil? + + unless user.nil? expire_requests_for_user(user) end flash[:notice] = "CensorRule was successfully destroyed." + if !info_request.nil? redirect_to admin_request_show_url(info_request) elsif !user.nil? diff --git a/app/views/admin_censor_rule/_form.html.erb b/app/views/admin_censor_rule/_form.html.erb index 5035238d6..3f602d2e4 100644 --- a/app/views/admin_censor_rule/_form.html.erb +++ b/app/views/admin_censor_rule/_form.html.erb @@ -4,11 +4,9 @@ <%=_("Applies to")%> <% unless info_request.nil? %> <%= request_both_links(info_request) %> - <%= hidden_field 'censor_rule', 'info_request_id', { :value => info_request.id } %> <% end %> <% unless user.nil? %> <%= user_both_links(user) %> - <%= hidden_field 'censor_rule', 'user_id', { :value => user.id } %> <% end %> </div> diff --git a/app/views/admin_censor_rule/_show.html.erb b/app/views/admin_censor_rule/_show.html.erb index 0d4cece93..46904b3b9 100644 --- a/app/views/admin_censor_rule/_show.html.erb +++ b/app/views/admin_censor_rule/_show.html.erb @@ -1,18 +1,17 @@ - <% if censor_rules.size > 0 %> <table class="table table-condensed"> <tr> <th>Id</th> - <% for column in CensorRule.content_columns %> + <% CensorRule.content_columns.each do |column| %> <th><%= column.human_name %></th> <% end %> <th>Actions</th> </tr> - <% for censor_rule in censor_rules %> + <% censor_rules.each do |censor_rule| %> <tr class="<%= cycle('odd', 'even') %>"> <td><%=h censor_rule.id %></td> - <% for column in CensorRule.content_columns.map { |c| c.name } %> + <% CensorRule.content_columns.map { |c| c.name }.each do |column| %> <td><%=h censor_rule.send(column) %></td> <% end %> <td> @@ -26,10 +25,11 @@ <% end %> <% if defined? info_request %> - <%= link_to "New censor rule (for this request only)", admin_rule_new_path(:info_request_id => info_request.id), :class => "btn btn-info" %> + <%= link_to "New censor rule", new_admin_info_request_censor_rule_path(info_request), :class => "btn btn-info" %> + <span class="label label-info">for this request only</span> <% end %> <% if defined? user %> - <%= link_to "New censor rule", admin_rule_new_path(:user_id => user.id), :class => "btn btn-info" %> <span class="label label-info">for all requests by this user</span> + <%= link_to "New censor rule", new_admin_user_censor_rule_path(user), :class => "btn btn-info" %> + <span class="label label-info">for all requests by this user</span> <% end %> - diff --git a/app/views/admin_censor_rule/new.html.erb b/app/views/admin_censor_rule/new.html.erb index 77d22990c..26b3212be 100644 --- a/app/views/admin_censor_rule/new.html.erb +++ b/app/views/admin_censor_rule/new.html.erb @@ -1,11 +1,11 @@ <% @title = _('New censor rule') %> -<h1><%=@title%></h1> +<h1><%= @title %></h1> -<%= form_tag admin_rule_create_path, :class => "form form-horizontal" do %> +<%= form_for @censor_rule, :url => @form_url, :class => "form form-horizontal" do %> <%= render :partial => 'form', :locals => { :info_request => @info_request, :user => @censor_user } %> + <div class="form-actions"> <%= submit_tag "Create", :class => "btn btn-primary" %> </div> <% end %> - diff --git a/config/routes.rb b/config/routes.rb index eabfb9053..4b2eb5695 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -268,6 +268,24 @@ Alaveteli::Application.routes.draw do match '/admin/censor/edit/:id' => 'admin_censor_rule#edit', :as => :admin_rule_edit match '/admin/censor/update/:id' => 'admin_censor_rule#update', :as => :admin_rule_update match '/admin/censor/destroy/:censor_rule_id' => 'admin_censor_rule#destroy', :as => :admin_rule_destroy + + scope '/admin', :as => 'admin' do + resources :info_requests, :only => [] do + resources :censor_rules, + :controller => 'admin_censor_rule', + :only => [:new, :create], + :name_prefix => 'info_request_' + end + end + + scope '/admin', :as => 'admin' do + resources :users, :only => [] do + resources :censor_rules, + :controller => 'admin_censor_rule', + :only => [:new, :create], + :name_prefix => 'user_' + end + end #### #### AdminSpamAddresses controller 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 |