aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin_censor_rule_controller.rb55
-rw-r--r--app/views/admin_censor_rule/_form.html.erb2
-rw-r--r--app/views/admin_censor_rule/_show.html.erb14
-rw-r--r--app/views/admin_censor_rule/new.html.erb6
-rw-r--r--config/routes.rb18
-rw-r--r--spec/controllers/admin_censor_rule_controller_spec.rb471
-rw-r--r--spec/factories/censor_rules.rb32
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