require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe AdminRequestController, "when administering requests" do
integrate_views
before { basic_auth_login @request }
before(:each) do
load_raw_emails_data
@old_filters = ActionController::Routing::Routes.filters
ActionController::Routing::Routes.filters = RoutingFilter::Chain.new
end
after do
ActionController::Routing::Routes.filters = @old_filters
end
it "shows the index/list page" do
get :index
end
it "shows a public body" do
get :show, :id => info_requests(:fancy_dog_request)
end
it 'shows an external public body with no username' do
get :show, :id => info_requests(:anonymous_external_request)
response.should be_success
end
it "edits a public body" do
get :edit, :id => info_requests(:fancy_dog_request)
end
it "saves edits to a request" do
info_requests(:fancy_dog_request).title.should == "Why do you have & such a fancy dog?"
post :update, { :id => info_requests(:fancy_dog_request),
:info_request => { :title => "Renamed",
:prominence => "normal",
:described_state => "waiting_response",
:awaiting_description => false,
:allow_new_responses_from => 'anybody',
:handle_rejected_responses => 'bounce' } }
response.flash[:notice].should include('successful')
ir = InfoRequest.find(info_requests(:fancy_dog_request).id)
ir.title.should == "Renamed"
end
it 'expires the request cache when saving edits to it' do
info_request = info_requests(:fancy_dog_request)
@controller.should_receive(:expire_for_request).with(info_request)
post :update, { :id => info_request,
:info_request => { :title => "Renamed",
:prominence => "normal",
:described_state => "waiting_response",
:awaiting_description => false,
:allow_new_responses_from => 'anybody',
:handle_rejected_responses => 'bounce' } }
end
it "edits an outgoing message" do
get :edit_outgoing, :id => outgoing_messages(:useless_outgoing_message)
end
it "saves edits to an outgoing_message" do
outgoing_messages(:useless_outgoing_message).body.should include("fancy dog")
post :update_outgoing, { :id => outgoing_messages(:useless_outgoing_message), :outgoing_message => { :body => "Why do you have such a delicious cat?" } }
response.flash[:notice].should include('successful')
ir = OutgoingMessage.find(outgoing_messages(:useless_outgoing_message).id)
ir.body.should include("delicious cat")
end
describe 'when fully destroying a request' do
it 'expires the file cache for that request' do
info_request = info_requests(:badger_request)
@controller.should_receive(:expire_for_request).with(info_request)
get :fully_destroy, { :id => info_request }
end
end
end
describe AdminRequestController, "when administering the holding pen" do
integrate_views
before(:each) do
basic_auth_login @request
load_raw_emails_data
@old_filters = ActionController::Routing::Routes.filters
ActionController::Routing::Routes.filters = RoutingFilter::Chain.new
end
after do
ActionController::Routing::Routes.filters = @old_filters
end
it "shows a rejection reason for an incoming message from an invalid address" do
ir = info_requests(:fancy_dog_request)
ir.allow_new_responses_from = 'authority_only'
ir.handle_rejected_responses = 'holding_pen'
ir.save!
receive_incoming_mail('incoming-request-plain.email', ir.incoming_email, "frob@nowhere.com")
get :show_raw_email, :id => InfoRequest.holding_pen_request.get_last_response.raw_email.id
response.should have_text(/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'
ir.allow_new_responses_from = 'authority_only'
ir.save!
mail_to = "request-#{ir.id}-asdfg@example.com"
receive_incoming_mail('incoming-request-plain.email', mail_to)
interesting_email = InfoRequest.holding_pen_request.get_last_response.raw_email.id
# now we add another message to the queue, which we're not interested in
receive_incoming_mail('incoming-request-plain.email', ir.incoming_email, "")
InfoRequest.holding_pen_request.incoming_messages.length.should == 2
get :show_raw_email, :id => interesting_email
response.should have_text(/Could not identify the request/)
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)
get :show, :id => ir.id
assigns[:request_hidden_user_explanation].should include(ir.user.name)
assigns[:request_hidden_user_explanation].should include("vexatious")
get :show, :id => ir.id, :reason => "not_foi"
assigns[:request_hidden_user_explanation].should_not include("vexatious")
assigns[:request_hidden_user_explanation].should include("not a valid FOI")
end
describe 'when hiding requests' do
it "hides requests and sends a notification email that it has done so" do
ir = info_requests(:fancy_dog_request)
post :hide_request, :id => ir.id, :explanation => "Foo", :reason => "vexatious"
ir.reload
ir.prominence.should == "requester_only"
ir.described_state.should == "vexatious"
deliveries = ActionMailer::Base.deliveries
deliveries.size.should == 1
mail = deliveries[0]
mail.body.should =~ /Foo/
end
it 'expires the file cache for the request' do
ir = info_requests(:fancy_dog_request)
@controller.should_receive(:expire_for_request).with(ir)
post :hide_request, :id => ir.id, :explanation => "Foo", :reason => "vexatious"
end
describe 'when hiding an external request' do
before do
@controller.stub!(:expire_for_request)
@info_request = mock_model(InfoRequest, :prominence= => nil,
:log_event => nil,
:set_described_state => nil,
:save! => nil,
:user => nil,
:user_name => 'External User',
:is_external? => true)
InfoRequest.stub!(:find).with(@info_request.id.to_s).and_return(@info_request)
@default_params = { :id => @info_request.id,
:explanation => 'Foo',
:reason => 'vexatious' }
end
def make_request(params=@default_params)
post :hide_request, params
end
it 'should redirect the the admin page for the request' do
make_request
response.should redirect_to(:controller => 'admin_request',
:action => 'show',
:id => @info_request.id)
end
it 'should set the request prominence to "requester_only"' do
@info_request.should_receive(:prominence=).with('requester_only')
@info_request.should_receive(:save!)
make_request
end
it 'should not send a notification email' do
ContactMailer.should_not_receive(:deliver_from_admin_message)
make_request
end
it 'should add a notice to the flash saying that the request has been hidden' do
make_request
response.flash[:notice].should == "This external request has been hidden"
end
it 'should expire the file cache for the request' do
@controller.should_receive(:expire_for_request)
make_request
end
end
end
end