aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin_incoming_message_controller.rb54
-rw-r--r--app/controllers/admin_request_controller.rb52
-rw-r--r--config/routes.rb7
-rw-r--r--spec/controllers/admin_incoming_message_controller_spec.rb51
-rw-r--r--spec/controllers/admin_request_controller_spec.rb74
-rw-r--r--spec/integration/admin_spec.rb51
-rw-r--r--spec/integration/alaveteli_dsl.rb6
7 files changed, 165 insertions, 130 deletions
diff --git a/app/controllers/admin_incoming_message_controller.rb b/app/controllers/admin_incoming_message_controller.rb
new file mode 100644
index 000000000..a6d5fc542
--- /dev/null
+++ b/app/controllers/admin_incoming_message_controller.rb
@@ -0,0 +1,54 @@
+class AdminIncomingMessageController < AdminController
+
+ def destroy_incoming
+ @incoming_message = IncomingMessage.find(params[:incoming_message_id])
+ @info_request = @incoming_message.info_request
+ incoming_message_id = @incoming_message.id
+
+ @incoming_message.fully_destroy
+ @incoming_message.info_request.log_event("destroy_incoming",
+ { :editor => admin_current_user(), :deleted_incoming_message_id => incoming_message_id })
+ # expire cached files
+ expire_for_request(@info_request)
+ flash[:notice] = 'Incoming message successfully destroyed.'
+ redirect_to admin_request_show_url(@info_request)
+ end
+
+ def redeliver_incoming
+ incoming_message = IncomingMessage.find(params[:redeliver_incoming_message_id])
+ message_ids = params[:url_title].split(",").each {|x| x.strip}
+ previous_request = incoming_message.info_request
+ destination_request = nil
+ ActiveRecord::Base.transaction do
+ for m in message_ids
+ if m.match(/^[0-9]+$/)
+ destination_request = InfoRequest.find_by_id(m.to_i)
+ else
+ destination_request = InfoRequest.find_by_url_title!(m)
+ end
+ if destination_request.nil?
+ flash[:error] = "Failed to find destination request '" + m + "'"
+ return redirect_to admin_request_show_url(previous_request)
+ end
+
+ raw_email_data = incoming_message.raw_email.data
+ mail = MailHandler.mail_from_raw_email(raw_email_data)
+ destination_request.receive(mail, raw_email_data, true)
+
+ incoming_message_id = incoming_message.id
+ incoming_message.info_request.log_event("redeliver_incoming", {
+ :editor => admin_current_user(),
+ :destination_request => destination_request.id,
+ :deleted_incoming_message_id => incoming_message_id
+ })
+
+ flash[:notice] = "Message has been moved to request(s). Showing the last one:"
+ end
+ # expire cached files
+ expire_for_request(previous_request)
+ incoming_message.fully_destroy
+ end
+ redirect_to admin_request_show_url(destination_request)
+ end
+
+end
diff --git a/app/controllers/admin_request_controller.rb b/app/controllers/admin_request_controller.rb
index d965b86b0..62d7a0b39 100644
--- a/app/controllers/admin_request_controller.rb
+++ b/app/controllers/admin_request_controller.rb
@@ -130,58 +130,6 @@ class AdminRequestController < AdminController
end
end
-
- def destroy_incoming
- @incoming_message = IncomingMessage.find(params[:incoming_message_id])
- @info_request = @incoming_message.info_request
- incoming_message_id = @incoming_message.id
-
- @incoming_message.fully_destroy
- @incoming_message.info_request.log_event("destroy_incoming",
- { :editor => admin_current_user(), :deleted_incoming_message_id => incoming_message_id })
- # expire cached files
- expire_for_request(@info_request)
- flash[:notice] = 'Incoming message successfully destroyed.'
- redirect_to admin_request_show_url(@info_request)
- end
-
- def redeliver_incoming
- incoming_message = IncomingMessage.find(params[:redeliver_incoming_message_id])
- message_ids = params[:url_title].split(",").each {|x| x.strip}
- previous_request = incoming_message.info_request
- destination_request = nil
- ActiveRecord::Base.transaction do
- for m in message_ids
- if m.match(/^[0-9]+$/)
- destination_request = InfoRequest.find_by_id(m.to_i)
- else
- destination_request = InfoRequest.find_by_url_title!(m)
- end
- if destination_request.nil?
- flash[:error] = "Failed to find destination request '" + m + "'"
- return redirect_to admin_request_show_url(previous_request)
- end
-
- raw_email_data = incoming_message.raw_email.data
- mail = MailHandler.mail_from_raw_email(raw_email_data)
- destination_request.receive(mail, raw_email_data, true)
-
- incoming_message_id = incoming_message.id
- incoming_message.info_request.log_event("redeliver_incoming", {
- :editor => admin_current_user(),
- :destination_request => destination_request.id,
- :deleted_incoming_message_id => incoming_message_id
- })
-
- flash[:notice] = "Message has been moved to request(s). Showing the last one:"
- end
- # expire cached files
- expire_for_request(previous_request)
- incoming_message.fully_destroy
- end
- redirect_to admin_request_show_url(destination_request)
- end
-
# change user or public body of a request magically
def move_request
info_request = InfoRequest.find(params[:info_request_id])
diff --git a/config/routes.rb b/config/routes.rb
index cbebe85f3..9bba3d854 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -189,8 +189,6 @@ Alaveteli::Application.routes.draw do
match '/admin/request/destroy/:id' => 'admin_request#fully_destroy', :as => :admin_request_destroy
match '/admin/request/edit_comment/:id' => 'admin_request#edit_comment', :as => :admin_request_edit_comment
match '/admin/request/update_comment/:id' => 'admin_request#update_comment', :as => :admin_request_update_comment
- match '/admin/request/destroy_incoming' => 'admin_request#destroy_incoming', :as => :admin_request_destroy_incoming
- match '/admin/request/redeliver_incoming' => 'admin_request#redeliver_incoming', :as => :admin_request_redeliver_incoming
match '/admin/request/move_request' => 'admin_request#move_request', :as => :admin_request_move_request
match '/admin/request/generate_upload_url/:id' => 'admin_request#generate_upload_url', :as => :admin_request_generate_upload_url
match '/admin/request/show_raw_email/:id' => 'admin_request#show_raw_email', :as => :admin_request_show_raw_email
@@ -199,6 +197,11 @@ Alaveteli::Application.routes.draw do
match '/admin/request/hide/:id' => 'admin_request#hide_request', :as => :admin_request_hide
####
+ #### AdminIncomingMessage controller
+ match '/admin/request/destroy_incoming' => 'admin_incoming_message#destroy_incoming', :as => :admin_request_destroy_incoming
+ match '/admin/request/redeliver_incoming' => 'admin_incoming_message#redeliver_incoming', :as => :admin_request_redeliver_incoming
+ ####
+
#### AdminOutgoingMessage controller
match '/admin/request/edit_outgoing/:id' => 'admin_outgoing_message#edit', :as => :admin_request_edit_outgoing
match '/admin/request/destroy_outgoing/:id' => 'admin_outgoing_message#destroy', :as => :admin_request_destroy_outgoing
diff --git a/spec/controllers/admin_incoming_message_controller_spec.rb b/spec/controllers/admin_incoming_message_controller_spec.rb
new file mode 100644
index 000000000..7439197ef
--- /dev/null
+++ b/spec/controllers/admin_incoming_message_controller_spec.rb
@@ -0,0 +1,51 @@
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe AdminIncomingMessageController, "when administering incoming messages" do
+
+ before(:each) do
+ basic_auth_login @request
+ load_raw_emails_data
+ end
+
+ describe 'when destroying an incoming message' do
+
+ before do
+ @im = incoming_messages(:useless_incoming_message)
+ @controller.stub!(:expire_for_request)
+ end
+
+ it "destroys the raw email file" do
+ raw_email = @im.raw_email.filepath
+ assert_equal File.exists?(raw_email), true
+ post :destroy_incoming, :incoming_message_id => @im.id
+ assert_equal File.exists?(raw_email), false
+ end
+
+ it 'asks the incoming message to fully destroy itself' do
+ IncomingMessage.stub!(:find).and_return(@im)
+ @im.should_receive(:fully_destroy)
+ post :destroy_incoming, :incoming_message_id => @im.id
+ end
+
+ it 'expires the file cache for the associated info_request' do
+ @controller.should_receive(:expire_for_request).with(@im.info_request)
+ post :destroy_incoming, :incoming_message_id => @im.id
+ end
+
+ end
+
+ describe 'when redelivering an incoming message' do
+
+ it 'expires the file cache for the previous request' do
+ current_info_request = info_requests(:fancy_dog_request)
+ destination_info_request = info_requests(:naughty_chicken_request)
+ incoming_message = incoming_messages(:useless_incoming_message)
+ @controller.should_receive(:expire_for_request).with(current_info_request)
+ post :redeliver_incoming, :redeliver_incoming_message_id => incoming_message.id,
+ :url_title => destination_info_request.url_title
+ end
+
+
+ end
+
+end
diff --git a/spec/controllers/admin_request_controller_spec.rb b/spec/controllers/admin_request_controller_spec.rb
index ed9327f25..42b4bcbc1 100644
--- a/spec/controllers/admin_request_controller_spec.rb
+++ b/spec/controllers/admin_request_controller_spec.rb
@@ -81,55 +81,6 @@ describe AdminRequestController, "when administering the holding pen" do
response.should contain "Only the authority can reply to this request"
end
- it "allows redelivery even to a closed request" do
- ir = info_requests(:fancy_dog_request)
- ir.allow_new_responses_from = 'nobody'
- ir.handle_rejected_responses = 'holding_pen'
- ir.save!
- InfoRequest.holding_pen_request.incoming_messages.length.should == 0
- ir.incoming_messages.length.should == 1
- receive_incoming_mail('incoming-request-plain.email', ir.incoming_email, "frob@nowhere.com")
- InfoRequest.holding_pen_request.incoming_messages.length.should == 1
- new_im = InfoRequest.holding_pen_request.incoming_messages[0]
- ir.incoming_messages.length.should == 1
- post :redeliver_incoming, :redeliver_incoming_message_id => new_im.id, :url_title => ir.url_title
- ir = InfoRequest.find_by_url_title(ir.url_title)
- ir.incoming_messages.length.should == 2
- response.should redirect_to(:controller=>'admin_request', :action=>'show', :id=>101)
- InfoRequest.holding_pen_request.incoming_messages.length.should == 0
- end
-
- it "allows redelivery to more than one request" do
- ir1 = info_requests(:fancy_dog_request)
- ir1.allow_new_responses_from = 'nobody'
- ir1.handle_rejected_responses = 'holding_pen'
- ir1.save!
- ir1.incoming_messages.length.should == 1
- ir2 = info_requests(:another_boring_request)
- ir2.incoming_messages.length.should == 1
-
- receive_incoming_mail('incoming-request-plain.email', ir1.incoming_email, "frob@nowhere.com")
- InfoRequest.holding_pen_request.incoming_messages.length.should == 1
-
- new_im = InfoRequest.holding_pen_request.incoming_messages[0]
- post :redeliver_incoming, :redeliver_incoming_message_id => new_im.id, :url_title => "#{ir1.url_title},#{ir2.url_title}"
- ir1.reload
- ir1.incoming_messages.length.should == 2
- ir2.reload
- ir2.incoming_messages.length.should == 2
- response.should redirect_to(:controller=>'admin_request', :action=>'show', :id=>ir2.id)
- InfoRequest.holding_pen_request.incoming_messages.length.should == 0
- end
-
- it 'expires the file cache for the previous request' do
- current_info_request = info_requests(:fancy_dog_request)
- destination_info_request = info_requests(:naughty_chicken_request)
- incoming_message = incoming_messages(:useless_incoming_message)
- @controller.should_receive(:expire_for_request).with(current_info_request)
- post :redeliver_incoming, :redeliver_incoming_message_id => incoming_message.id,
- :url_title => destination_info_request.url_title
- end
-
it "guesses a misdirected request" do
ir = info_requests(:fancy_dog_request)
ir.handle_rejected_responses = 'holding_pen'
@@ -146,32 +97,7 @@ describe AdminRequestController, "when administering the holding pen" do
assigns[:info_requests][0].should == ir
end
- describe 'when destroying an incoming message' do
- before do
- @im = incoming_messages(:useless_incoming_message)
- @controller.stub!(:expire_for_request)
- end
-
- it "destroys the raw email file" do
- raw_email = @im.raw_email.filepath
- assert_equal File.exists?(raw_email), true
- post :destroy_incoming, :incoming_message_id => @im.id
- assert_equal File.exists?(raw_email), false
- end
-
- it 'asks the incoming message to fully destroy itself' do
- IncomingMessage.stub!(:find).and_return(@im)
- @im.should_receive(:fully_destroy)
- post :destroy_incoming, :incoming_message_id => @im.id
- end
-
- it 'expires the file cache for the associated info_request' do
- @controller.should_receive(:expire_for_request).with(@im.info_request)
- post :destroy_incoming, :incoming_message_id => @im.id
- end
-
- end
it "shows a suitable default 'your email has been hidden' message" do
ir = info_requests(:fancy_dog_request)
diff --git a/spec/integration/admin_spec.rb b/spec/integration/admin_spec.rb
index 25872fb4a..5842eeb00 100644
--- a/spec/integration/admin_spec.rb
+++ b/spec/integration/admin_spec.rb
@@ -13,15 +13,62 @@ describe "When administering the site" do
admin = login(:admin_user)
# Now fetch the "log in as" link to log in as Bob
- admin.get_via_redirect "/admin/user/login_as/#{users(:bob_smith_user).id}"
+ admin.get_via_redirect "/en/admin/user/login_as/#{users(:bob_smith_user).id}"
admin.response.should be_success
admin.session[:user_id].should == users(:bob_smith_user).id
end
it 'does not allow a non-admin user to login as another user' do
robin = login(:robin_user)
- robin.get_via_redirect "/admin/user/login_as/#{users(:bob_smith_user).id}"
+ robin.get_via_redirect "/en/admin/user/login_as/#{users(:bob_smith_user).id}"
robin.response.should be_success
robin.session[:user_id].should_not == users(:bob_smith_user).id
end
+
+ it "allows redelivery of an incoming message to a closed request" do
+ confirm(:admin_user)
+ admin = login(:admin_user)
+ ir = info_requests(:fancy_dog_request)
+ close_request(ir)
+ InfoRequest.holding_pen_request.incoming_messages.length.should == 0
+ ir.incoming_messages.length.should == 1
+ receive_incoming_mail('incoming-request-plain.email', ir.incoming_email, "frob@nowhere.com")
+ InfoRequest.holding_pen_request.incoming_messages.length.should == 1
+ new_im = InfoRequest.holding_pen_request.incoming_messages[0]
+ ir.incoming_messages.length.should == 1
+ post_params = {'redeliver_incoming_message_id' => new_im.id,
+ 'url_title' => ir.url_title}
+ admin.post '/en/admin/request/redeliver_incoming', post_params
+ admin.response.location.should == 'http://www.example.com/en/admin/request/show/101'
+ ir = InfoRequest.find_by_url_title(ir.url_title)
+ ir.incoming_messages.length.should == 2
+
+ InfoRequest.holding_pen_request.incoming_messages.length.should == 0
+ end
+
+ it "allows redelivery of an incoming message to more than one request" do
+ confirm(:admin_user)
+ admin = login(:admin_user)
+
+ ir1 = info_requests(:fancy_dog_request)
+ close_request(ir1)
+ ir1.incoming_messages.length.should == 1
+ ir2 = info_requests(:another_boring_request)
+ ir2.incoming_messages.length.should == 1
+
+ receive_incoming_mail('incoming-request-plain.email', ir1.incoming_email, "frob@nowhere.com")
+ InfoRequest.holding_pen_request.incoming_messages.length.should == 1
+
+ new_im = InfoRequest.holding_pen_request.incoming_messages[0]
+ post_params = {'redeliver_incoming_message_id' => new_im.id,
+ 'url_title' => "#{ir1.url_title},#{ir2.url_title}"}
+ admin.post '/en/admin/request/redeliver_incoming', post_params
+ ir1.reload
+ ir1.incoming_messages.length.should == 2
+ ir2.reload
+ ir2.incoming_messages.length.should == 2
+ admin.response.location.should == 'http://www.example.com/en/admin/request/show/106'
+ InfoRequest.holding_pen_request.incoming_messages.length.should == 0
+ end
+
end
diff --git a/spec/integration/alaveteli_dsl.rb b/spec/integration/alaveteli_dsl.rb
index 7e7ffcf07..65cc6dde4 100644
--- a/spec/integration/alaveteli_dsl.rb
+++ b/spec/integration/alaveteli_dsl.rb
@@ -49,3 +49,9 @@ def confirm(user)
u.email_confirmed = true
u.save!
end
+
+def close_request(request)
+ request.allow_new_responses_from = 'nobody'
+ request.handle_rejected_responses = 'holding_pen'
+ request.save!
+end