aboutsummaryrefslogtreecommitdiffstats
path: root/spec/controllers/request_controller_spec.rb
diff options
context:
space:
mode:
authorLouise Crow <louise.crow@gmail.com>2012-08-16 10:28:05 +0100
committerLouise Crow <louise.crow@gmail.com>2012-08-16 11:21:06 +0100
commitff42a5c115ddc82f60bec45c62c522b543e6b895 (patch)
tree82bd59b9a84bee9a4b5b5f4cf8951f7c902cefae /spec/controllers/request_controller_spec.rb
parented5770692dbc12b703c7b92c51eebca596900236 (diff)
When displaying attachments, only cache them out to files if they are visible to everyone, so can be served up from a file cache without authentication.
Diffstat (limited to 'spec/controllers/request_controller_spec.rb')
-rw-r--r--spec/controllers/request_controller_spec.rb417
1 files changed, 219 insertions, 198 deletions
diff --git a/spec/controllers/request_controller_spec.rb b/spec/controllers/request_controller_spec.rb
index 530e9b2c3..8cadbd238 100644
--- a/spec/controllers/request_controller_spec.rb
+++ b/spec/controllers/request_controller_spec.rb
@@ -7,7 +7,7 @@ describe RequestController, "when listing recent requests" do
load_raw_emails_data
rebuild_xapian_index
end
-
+
it "should be successful" do
get :list, :view => 'all'
response.should be_success
@@ -21,7 +21,7 @@ describe RequestController, "when listing recent requests" do
it "should filter requests" do
get :list, :view => 'all'
assigns[:list_results].map(&:info_request).should =~ InfoRequest.all
-
+
# default sort order is the request with the most recently created event first
assigns[:list_results].map(&:info_request).should == InfoRequest.all(
:order => "(select max(info_request_events.created_at) from info_request_events where info_request_events.info_request_id = info_requests.id) DESC")
@@ -45,15 +45,15 @@ describe RequestController, "when listing recent requests" do
it "should filter requests by date" do
# The semantics of the search are that it finds any InfoRequest
# that has any InfoRequestEvent created in the specified range
-
+
get :list, :view => 'all', :request_date_before => '13/10/2007'
assigns[:list_results].map(&:info_request).should =~ InfoRequest.all(
:conditions => "id in (select info_request_id from info_request_events where created_at < '2007-10-13'::date)")
-
+
get :list, :view => 'all', :request_date_after => '13/10/2007'
assigns[:list_results].map(&:info_request).should =~ InfoRequest.all(
:conditions => "id in (select info_request_id from info_request_events where created_at > '2007-10-13'::date)")
-
+
get :list, :view => 'all', :request_date_after => '13/10/2007', :request_date_before => '01/11/2007'
assigns[:list_results].map(&:info_request).should =~ InfoRequest.all(
:conditions => "id in (select info_request_id from info_request_events where created_at between '2007-10-13'::date and '2007-11-01'::date)")
@@ -74,7 +74,7 @@ describe RequestController, "when listing recent requests" do
it "should list internal_review requests as unresolved ones" do
get :list, :view => 'awaiting'
-
+
# This doesn’t precisely duplicate the logic of the actual
# query, but it is close enough to give the same result with
# the current set of test data.
@@ -88,22 +88,22 @@ describe RequestController, "when listing recent requests" do
where later_events.created_at > info_request_events.created_at
and later_events.info_request_id = info_request_events.info_request_id
)")
-
-
+
+
get :list, :view => 'awaiting'
assigns[:list_results].map(&:info_request).include?(info_requests(:fancy_dog_request)).should == false
-
+
event = info_request_events(:useless_incoming_message_event)
event.described_state = event.calculated_state = "internal_review"
event.save!
rebuild_xapian_index
-
+
get :list, :view => 'awaiting'
assigns[:list_results].map(&:info_request).include?(info_requests(:fancy_dog_request)).should == true
end
it "should assign the first page of results" do
- xap_results = mock_model(ActsAsXapian::Search,
+ xap_results = mock_model(ActsAsXapian::Search,
:results => (1..25).to_a.map { |m| { :model => m } },
:matches_estimated => 1000000)
@@ -115,7 +115,7 @@ describe RequestController, "when listing recent requests" do
assigns[:show_no_more_than].should == RequestController::MAX_RESULTS
end
it "should return 404 for pages we don't want to serve up" do
- xap_results = mock_model(ActsAsXapian::Search,
+ xap_results = mock_model(ActsAsXapian::Search,
:results => (1..25).to_a.map { |m| { :model => m } },
:matches_estimated => 1000000)
lambda {
@@ -172,7 +172,7 @@ describe RequestController, "when changing things that appear on the request pag
# XXX really, CensorRules should execute expiry logic as part
# of the after_save of the model. Currently this is part of
# the AdminCensorRuleController logic, so must be tested from
- # there. Leaving this stub test in place as a reminder
+ # there. Leaving this stub test in place as a reminder
end
it "should purge the downstream cache when something is hidden by an admin" do
ir = info_requests(:fancy_dog_request)
@@ -194,7 +194,7 @@ end
describe RequestController, "when showing one request" do
integrate_views
-
+
before(:each) do
load_raw_emails_data
FileUtils.rm_rf File.join(File.dirname(__FILE__), "../../cache/zips")
@@ -226,7 +226,7 @@ describe RequestController, "when showing one request" do
response.should redirect_to(:action => 'show', :url_title => info_requests(:naughty_chicken_request).url_title)
end
-
+
describe 'when handling an update_status parameter' do
it 'should assign the "update status" flag to the view as true if the parameter is present' do
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog', :update_status => 1
@@ -237,26 +237,26 @@ describe RequestController, "when showing one request" do
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
assigns[:update_status].should be_false
end
-
+
it 'should require login' do
session[:user_id] = nil
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog', :update_status => 1
post_redirect = PostRedirect.get_last_post_redirect
response.should redirect_to(:controller => 'user', :action => 'signin', :token => post_redirect.token)
end
-
+
it 'should work if logged in as the requester' do
session[:user_id] = users(:bob_smith_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog', :update_status => 1
response.should render_template "request/show"
end
-
+
it 'should not work if logged in as not the requester' do
session[:user_id] = users(:silly_name_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog', :update_status => 1
response.should render_template "user/wrong_user"
end
-
+
it 'should work if logged in as an admin user' do
session[:user_id] = users(:admin_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog', :update_status => 1
@@ -264,8 +264,8 @@ describe RequestController, "when showing one request" do
end
end
- describe 'when handling incoming mail' do
-
+ describe 'when handling incoming mail' do
+
integrate_views
it "should receive incoming messages, send email to creator, and show them" do
@@ -284,7 +284,7 @@ describe RequestController, "when showing one request" do
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
(assigns[:info_request_events].size - size_before).should == 1
end
-
+
it "should download attachments" do
ir = info_requests(:fancy_dog_request)
ir.incoming_messages.each { |x| x.parse_raw_email!(true) }
@@ -293,31 +293,43 @@ describe RequestController, "when showing one request" do
response.content_type.should == "text/html"
size_before = assigns[:info_request_events].size
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
(assigns[:info_request_events].size - size_before).should == 1
ir.reload
-
+
get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['hello.txt'], :skip_cache => 1
response.content_type.should == "text/plain"
response.should have_text(/Second hello/)
-
+
get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 3, :file_name => ['hello.txt'], :skip_cache => 1
response.content_type.should == "text/plain"
response.should have_text(/First hello/)
end
+ it 'should cache an attachment on a request with normal prominence' do
+ ir = info_requests(:fancy_dog_request)
+ receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
+ ir.reload
+ @controller.should_receive(:foi_fragment_cache_write)
+ get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id,
+ :id => ir.id,
+ :part => 2,
+ :file_name => ['hello.txt']
+
+ end
+
it "should convert message body to UTF8" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('iso8859_2_raw_email.email', ir.incoming_email)
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
response.should have_text(/tënde/u)
end
it "should generate valid HTML verson of plain text attachments" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
ir.reload
get :get_attachment_as_html, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['hello.txt.html'], :skip_cache => 1
@@ -336,7 +348,7 @@ describe RequestController, "when showing one request" do
#
# https://github.com/sebbacon/alaveteli/issues/351
it "should return 404 for ugly URLs containing a request id that isn't an integer" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
ir.reload
ugly_id = "55195"
@@ -362,7 +374,7 @@ describe RequestController, "when showing one request" do
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
ir.reload
ugly_id = "%d95" % [info_requests(:naughty_chicken_request).id]
-
+
lambda {
get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ugly_id, :part => 2, :file_name => ['hello.txt.html'], :skip_cache => 1
}.should raise_error(ActiveRecord::RecordNotFound)
@@ -382,7 +394,7 @@ describe RequestController, "when showing one request" do
end
it "should generate valid HTML verson of PDF attachments" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-pdf-attachment.email', ir.incoming_email)
ir.reload
get :get_attachment_as_html, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['fs_50379341.pdf.html'], :skip_cache => 1
@@ -391,7 +403,7 @@ describe RequestController, "when showing one request" do
end
it "should not cause a reparsing of the raw email, even when the result would be a 404" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
ir.reload
attachment = IncomingMessage.get_attachment_by_url_part_number(ir.incoming_messages[1].get_attachments_for_display, 2)
@@ -405,14 +417,14 @@ describe RequestController, "when showing one request" do
lambda {
get :get_attachment_as_html, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['hello.txt.baz.html'], :skip_cache => 1
}.should raise_error(ActiveRecord::RecordNotFound)
-
+
attachment = IncomingMessage.get_attachment_by_url_part_number(ir.incoming_messages[1].get_attachments_for_display, 2)
attachment.body.should have_text(/Second hello/)
# ...nor should asking for it by its correct filename...
get :get_attachment_as_html, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['hello.txt.html'], :skip_cache => 1
response.should_not have_text(/Third hello/)
-
+
# ...but if we explicitly ask for attachments to be extracted, then they should be
force = true
ir.incoming_messages[1].parse_raw_email!(force)
@@ -426,14 +438,14 @@ describe RequestController, "when showing one request" do
ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-attachment-unknown-extension.email', ir.incoming_email)
ir.reload
-
+
get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => ['hello.qwglhm'], :skip_cache => 1
response.content_type.should == "application/octet-stream"
response.should have_text(/an unusual sort of file/)
end
it "should not download attachments with wrong file name" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
lambda {
@@ -443,7 +455,7 @@ describe RequestController, "when showing one request" do
end
it "should censor attachments downloaded as binary" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
censor_rule = CensorRule.new()
censor_rule.text = "Second"
@@ -451,7 +463,7 @@ describe RequestController, "when showing one request" do
censor_rule.last_edit_editor = "unknown"
censor_rule.last_edit_comment = "none"
ir.censor_rules << censor_rule
-
+
begin
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
@@ -464,7 +476,7 @@ describe RequestController, "when showing one request" do
end
it "should censor with rules on the user (rather than the request)" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
censor_rule = CensorRule.new()
censor_rule.text = "Second"
@@ -486,7 +498,7 @@ describe RequestController, "when showing one request" do
end
it "should censor attachment names" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
# XXX this is horrid, but don't know a better way. If we
@@ -505,7 +517,7 @@ describe RequestController, "when showing one request" do
# so at this point, assigns[:info_request].incoming_messages[1].get_attachments_for_display is returning stuff, but the equivalent thing in the template isn't.
# but something odd is that the above is return a whole load of attachments which aren't there in the controller
- response.body.should have_tag("p.attachment strong", /hello.txt/m)
+ response.body.should have_tag("p.attachment strong", /hello.txt/m)
censor_rule = CensorRule.new()
censor_rule.text = "hello.txt"
@@ -523,7 +535,7 @@ describe RequestController, "when showing one request" do
it "should make a zipfile available, which has a different URL when it changes" do
title = 'why_do_you_have_such_a_fancy_dog'
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
session[:user_id] = ir.user.id # bob_smith_user
get :download_entire_request, :url_title => title
assigns[:url_path].should have_text(/#{title}.zip$/)
@@ -540,7 +552,7 @@ describe RequestController, "when showing one request" do
zipfile = Zip::ZipFile.open(File.join(File.dirname(__FILE__), "../../cache/zips", old_path)) { |zipfile|
zipfile.count.should == 3 # the message plus two "hello.txt" files
}
-
+
# The path of the zip file is based on the hash of the timestamp of the last request
# in the thread, so we wait for a second to make sure this one will have a different
# timestamp than the previous.
@@ -617,11 +629,20 @@ describe RequestController, "when changing prominence of a request" do
session[:user_id] = users(:admin_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
response.should render_template('show')
+ end
+ it 'should not cache an attachment on a request whose prominence is requester_only when showing
+ the request to the requester or admin' do
+ ir = info_requests(:fancy_dog_request)
+ ir.prominence = 'requester_only'
+ ir.save!
+ session[:user_id] = ir.user.id # bob_smith_user
+ @controller.should_not_receive(:foi_fragment_cache_write)
+ get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
end
it "should not download attachments if hidden" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
ir.prominence = 'hidden'
ir.save!
receive_incoming_mail('incoming-request-two-same-name.email', ir.incoming_email)
@@ -637,7 +658,7 @@ describe RequestController, "when changing prominence of a request" do
end
end
-
+
# XXX do this for invalid ids
# it "should render 404 file" do
# response.should render_template("#{Rails.root}/public/404.html")
@@ -651,11 +672,11 @@ describe RequestController, "when searching for an authority" do
before do
@user = users(:bob_smith_user)
end
-
+
it "should return nothing for the empty query string" do
session[:user_id] = @user.id
get :select_authority, :query => ""
-
+
response.should render_template('select_authority')
assigns[:xapian_requests].should == nil
end
@@ -663,7 +684,7 @@ describe RequestController, "when searching for an authority" do
it "should return matching bodies" do
session[:user_id] = @user.id
get :select_authority, :query => "Quango"
-
+
response.should render_template('select_authority')
assigns[:xapian_requests].results.size == 1
assigns[:xapian_requests].results[0][:model].name.should == public_bodies(:geraldine_public_body).name
@@ -691,7 +712,7 @@ describe RequestController, "when creating a new request" do
@user = users(:bob_smith_user)
@body = public_bodies(:geraldine_public_body)
end
-
+
it "should redirect to front page if no public body specified" do
get :new
response.should redirect_to(:controller => 'general', :action => 'frontpage')
@@ -725,7 +746,7 @@ describe RequestController, "when creating a new request" do
end
it "should redirect to sign in page when input is good and nobody is logged in" do
- params = { :info_request => { :public_body_id => @body.id,
+ params = { :info_request => { :public_body_id => @body.id,
:title => "Why is your quango called Geraldine?", :tag_string => "" },
:outgoing_message => { :body => "This is a silly letter. It is too short to be interesting." },
:submitted_new_request => 1, :preview => 0
@@ -738,7 +759,7 @@ describe RequestController, "when creating a new request" do
it "should show preview when input is good" do
session[:user_id] = @user.id
- post :new, { :info_request => { :public_body_id => @body.id,
+ post :new, { :info_request => { :public_body_id => @body.id,
:title => "Why is your quango called Geraldine?", :tag_string => "" },
:outgoing_message => { :body => "This is a silly letter. It is too short to be interesting." },
:submitted_new_request => 1, :preview => 1
@@ -757,7 +778,7 @@ describe RequestController, "when creating a new request" do
it "should create the request and outgoing message, and send the outgoing message by email, and redirect to request page when input is good and somebody is logged in" do
session[:user_id] = @user.id
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "Why is your quango called Geraldine?", :tag_string => "" },
:outgoing_message => { :body => "This is a silly letter. It is too short to be interesting." },
:submitted_new_request => 1, :preview => 0
@@ -784,7 +805,7 @@ describe RequestController, "when creating a new request" do
session[:user_id] = @user.id
# We use raw_body here, so white space is the same
- post :new, :info_request => { :public_body_id => info_requests(:fancy_dog_request).public_body_id,
+ post :new, :info_request => { :public_body_id => info_requests(:fancy_dog_request).public_body_id,
:title => info_requests(:fancy_dog_request).title },
:outgoing_message => { :body => info_requests(:fancy_dog_request).outgoing_messages[0].raw_body},
:submitted_new_request => 1, :preview => 0, :mouse_house => 1
@@ -794,12 +815,12 @@ describe RequestController, "when creating a new request" do
it "should let you submit another request with the same title" do
session[:user_id] = @user.id
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "Why is your quango called Geraldine?", :tag_string => "" },
:outgoing_message => { :body => "This is a silly letter. It is too short to be interesting." },
:submitted_new_request => 1, :preview => 0
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "Why is your quango called Geraldine?", :tag_string => "" },
:outgoing_message => { :body => "This is a sensible letter. It is too long to be boring." },
:submitted_new_request => 1, :preview => 0
@@ -814,32 +835,32 @@ describe RequestController, "when creating a new request" do
response.should redirect_to(:action => 'show', :url_title => ir2.url_title)
end
-
+
it 'should respect the rate limit' do
# Try to create three requests in succession.
# (The limit set in config/test.yml is two.)
session[:user_id] = users(:robin_user)
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "What is the answer to the ultimate question?", :tag_string => "" },
:outgoing_message => { :body => "Please supply the answer from your files." },
:submitted_new_request => 1, :preview => 0
response.should redirect_to(:action => 'show', :url_title => 'what_is_the_answer_to_the_ultima')
-
- post :new, :info_request => { :public_body_id => @body.id,
+
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "Why did the chicken cross the road?", :tag_string => "" },
:outgoing_message => { :body => "Please send me all the relevant documents you hold." },
:submitted_new_request => 1, :preview => 0
response.should redirect_to(:action => 'show', :url_title => 'why_did_the_chicken_cross_the_ro')
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "What's black and white and red all over?", :tag_string => "" },
:outgoing_message => { :body => "Please send all minutes of meetings and email records that address this question." },
:submitted_new_request => 1, :preview => 0
response.should render_template('user/rate_limited')
end
-
+
it 'should ignore the rate limit for specified users' do
# Try to create three requests in succession.
# (The limit set in config/test.yml is two.)
@@ -847,20 +868,20 @@ describe RequestController, "when creating a new request" do
users(:robin_user).no_limit = true
users(:robin_user).save!
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "What is the answer to the ultimate question?", :tag_string => "" },
:outgoing_message => { :body => "Please supply the answer from your files." },
:submitted_new_request => 1, :preview => 0
response.should redirect_to(:action => 'show', :url_title => 'what_is_the_answer_to_the_ultima')
-
- post :new, :info_request => { :public_body_id => @body.id,
+
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "Why did the chicken cross the road?", :tag_string => "" },
:outgoing_message => { :body => "Please send me all the relevant documents you hold." },
:submitted_new_request => 1, :preview => 0
response.should redirect_to(:action => 'show', :url_title => 'why_did_the_chicken_cross_the_ro')
- post :new, :info_request => { :public_body_id => @body.id,
+ post :new, :info_request => { :public_body_id => @body.id,
:title => "What's black and white and red all over?", :tag_string => "" },
:outgoing_message => { :body => "Please send all minutes of meetings and email records that address this question." },
:submitted_new_request => 1, :preview => 0
@@ -869,7 +890,7 @@ describe RequestController, "when creating a new request" do
end
-# These go with the previous set, but use mocks instead of fixtures.
+# These go with the previous set, but use mocks instead of fixtures.
# TODO harmonise these
describe RequestController, "when making a new request" do
@@ -956,7 +977,7 @@ describe RequestController, "when viewing an individual response for reply/follo
end
it "should not show individual responses if request hidden, even if request owner" do
- ir = info_requests(:fancy_dog_request)
+ ir = info_requests(:fancy_dog_request)
ir.prominence = 'hidden'
ir.save!
@@ -968,7 +989,7 @@ end
describe RequestController, "when classifying an information request" do
- before(:each) do
+ before(:each) do
@dog_request = info_requests(:fancy_dog_request)
@dog_request.stub!(:is_old_unclassified?).and_return(false)
InfoRequest.stub!(:find).and_return(@dog_request)
@@ -976,9 +997,9 @@ describe RequestController, "when classifying an information request" do
end
def post_status(status)
- post :describe_state, :incoming_message => { :described_state => status },
- :id => @dog_request.id,
- :last_info_request_event_id => @dog_request.last_event_id_needing_description,
+ post :describe_state, :incoming_message => { :described_state => status },
+ :id => @dog_request.id,
+ :last_info_request_event_id => @dog_request.last_event_id_needing_description,
:submitted_describe_state => 1
end
@@ -988,79 +1009,79 @@ describe RequestController, "when classifying an information request" do
response.should redirect_to(:controller => 'user', :action => 'signin', :token => post_redirect.token)
end
- it 'should ask whether the request is old and unclassified' do
+ it 'should ask whether the request is old and unclassified' do
@dog_request.should_receive(:is_old_unclassified?)
post_status('rejected')
end
-
+
it "should not classify the request if logged in as the wrong user" do
session[:user_id] = users(:silly_name_user).id
post_status('rejected')
response.should render_template('user/wrong_user')
end
-
- describe 'when the request is old and unclassified' do
-
- before do
+
+ describe 'when the request is old and unclassified' do
+
+ before do
@dog_request.stub!(:is_old_unclassified?).and_return(true)
RequestMailer.stub!(:deliver_old_unclassified_updated)
end
-
- describe 'when the user is not logged in' do
-
- it 'should require login' do
+
+ describe 'when the user is not logged in' do
+
+ it 'should require login' do
session[:user_id] = nil
post_status('rejected')
post_redirect = PostRedirect.get_last_post_redirect
response.should redirect_to(:controller => 'user', :action => 'signin', :token => post_redirect.token)
end
-
+
end
-
- describe 'when the user is logged in as a different user' do
-
+
+ describe 'when the user is logged in as a different user' do
+
before do
@other_user = mock_model(User)
session[:user_id] = users(:silly_name_user).id
end
-
+
it 'should classify the request' do
- @dog_request.stub!(:calculate_status).and_return('rejected')
+ @dog_request.stub!(:calculate_status).and_return('rejected')
@dog_request.should_receive(:set_described_state).with('rejected')
post_status('rejected')
end
-
- it 'should log a status update event' do
- expected_params = {:user_id => users(:silly_name_user).id,
- :old_described_state => 'waiting_response',
+
+ it 'should log a status update event' do
+ expected_params = {:user_id => users(:silly_name_user).id,
+ :old_described_state => 'waiting_response',
:described_state => 'rejected'}
@dog_request.should_receive(:log_event).with("status_update", expected_params)
post_status('rejected')
end
-
- it 'should send an email to the requester letting them know someone has updated the status of their request' do
+
+ it 'should send an email to the requester letting them know someone has updated the status of their request' do
RequestMailer.should_receive(:deliver_old_unclassified_updated)
post_status('rejected')
end
-
- it 'should redirect to the request page' do
+
+ it 'should redirect to the request page' do
post_status('rejected')
response.should redirect_to(:action => 'show', :controller => 'request', :url_title => @dog_request.url_title)
end
-
- it 'should show a message thanking the user for a good deed' do
+
+ it 'should show a message thanking the user for a good deed' do
post_status('rejected')
flash[:notice].should == 'Thank you for updating this request!'
end
-
+
end
end
-
- describe 'when logged in as an admin user who is not the actual requester' do
-
- before do
+
+ describe 'when logged in as an admin user who is not the actual requester' do
+
+ before do
@admin_user = users(:admin_user)
session[:user_id] = @admin_user.id
@dog_request = info_requests(:fancy_dog_request)
@@ -1068,39 +1089,39 @@ describe RequestController, "when classifying an information request" do
@dog_request.stub!(:each).and_return([@dog_request])
end
- it 'should update the status of the request' do
+ it 'should update the status of the request' do
@dog_request.stub!(:calculate_status).and_return('rejected')
@dog_request.should_receive(:set_described_state).with('rejected')
post_status('rejected')
end
-
- it 'should log a status update event' do
- expected_params = {:user_id => @admin_user.id,
- :old_described_state => 'waiting_response',
+
+ it 'should log a status update event' do
+ expected_params = {:user_id => @admin_user.id,
+ :old_described_state => 'waiting_response',
:described_state => 'rejected'}
@dog_request.should_receive(:log_event).with("status_update", expected_params)
post_status('rejected')
end
- it 'should send an email to the requester letting them know someone has updated the status of their request' do
+ it 'should send an email to the requester letting them know someone has updated the status of their request' do
RequestMailer.should_receive(:deliver_old_unclassified_updated)
post_status('rejected')
end
- it 'should redirect to the request page' do
+ it 'should redirect to the request page' do
post_status('rejected')
response.should redirect_to(:action => 'show', :controller => 'request', :url_title => @dog_request.url_title)
end
- it 'should show a message thanking the user for a good deed' do
+ it 'should show a message thanking the user for a good deed' do
post_status('rejected')
flash[:notice].should == 'Thank you for updating this request!'
end
end
- describe 'when logged in as an admin user who is also the actual requester' do
-
- before do
+ describe 'when logged in as an admin user who is also the actual requester' do
+
+ before do
@admin_user = users(:admin_user)
session[:user_id] = @admin_user.id
@dog_request = info_requests(:fancy_dog_request)
@@ -1110,43 +1131,43 @@ describe RequestController, "when classifying an information request" do
@dog_request.stub!(:each).and_return([@dog_request])
end
- it 'should update the status of the request' do
+ it 'should update the status of the request' do
@dog_request.stub!(:calculate_status).and_return('rejected')
@dog_request.should_receive(:set_described_state).with('rejected')
post_status('rejected')
end
-
- it 'should not log a status update event' do
+
+ it 'should not log a status update event' do
@dog_request.should_not_receive(:log_event)
post_status('rejected')
end
- it 'should not send an email to the requester letting them know someone has updated the status of their request' do
+ it 'should not send an email to the requester letting them know someone has updated the status of their request' do
RequestMailer.should_not_receive(:deliver_old_unclassified_updated)
post_status('rejected')
end
-
- it 'should say it is showing advice as to what to do next' do
+
+ it 'should say it is showing advice as to what to do next' do
post_status('rejected')
- flash[:notice].should match(/Here is what to do now/)
+ flash[:notice].should match(/Here is what to do now/)
end
-
- it 'should redirect to the unhappy page' do
+
+ it 'should redirect to the unhappy page' do
post_status('rejected')
response.should redirect_to(:controller => 'help', :action => 'unhappy', :url_title => @dog_request.url_title)
end
end
-
- describe 'when logged in as the requestor' do
-
- before do
+
+ describe 'when logged in as the requestor' do
+
+ before do
@request_owner = users(:bob_smith_user)
session[:user_id] = @request_owner.id
@dog_request.awaiting_description.should == true
@dog_request.stub!(:each).and_return([@dog_request])
end
-
+
it "should successfully classify response if logged in as user controlling request" do
post_status('rejected')
response.should redirect_to(:controller => 'help', :action => 'unhappy', :url_title => @dog_request.url_title)
@@ -1157,16 +1178,16 @@ describe RequestController, "when classifying an information request" do
@dog_request.get_last_response_event.calculated_state.should == 'rejected'
end
- it 'should not log a status update event' do
+ it 'should not log a status update event' do
@dog_request.should_not_receive(:log_event)
post_status('rejected')
end
-
- it 'should not send an email to the requester letting them know someone has updated the status of their request' do
+
+ it 'should not send an email to the requester letting them know someone has updated the status of their request' do
RequestMailer.should_not_receive(:deliver_old_unclassified_updated)
post_status('rejected')
end
-
+
it "should send email when classified as requires_admin" do
post :describe_state, :incoming_message => { :described_state => "requires_admin" }, :id => @dog_request.id, :incoming_message_id => incoming_messages(:useless_incoming_message), :last_info_request_event_id => @dog_request.last_event_id_needing_description, :submitted_describe_state => 1
response.should redirect_to(:controller => 'help', :action => 'contact')
@@ -1183,12 +1204,12 @@ describe RequestController, "when classifying an information request" do
mail.from_addrs.first.to_s.should == @request_owner.name_and_email
end
- it 'should say it is showing advice as to what to do next' do
+ it 'should say it is showing advice as to what to do next' do
post_status('rejected')
- flash[:notice].should match(/Here is what to do now/)
+ flash[:notice].should match(/Here is what to do now/)
end
-
- it 'should redirect to the unhappy page' do
+
+ it 'should redirect to the unhappy page' do
post_status('rejected')
response.should redirect_to(:controller => 'help', :action => 'unhappy', :url_title => @dog_request.url_title)
end
@@ -1200,15 +1221,15 @@ describe RequestController, "when classifying an information request" do
RequestController.send(:require, File.expand_path(File.join(File.dirname(__FILE__), '..', 'models', 'customstates')))
RequestController.send(:include, RequestControllerCustomStates)
RequestController.class_eval('@@custom_states_loaded = true')
- Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))
+ Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))
post_status('deadline_extended')
flash[:notice].should == 'Authority has requested extension of the deadline.'
end
end
-
- describe 'when redirecting after a successful status update by the request owner' do
-
- before do
+
+ describe 'when redirecting after a successful status update by the request owner' do
+
+ before do
@request_owner = users(:bob_smith_user)
session[:user_id] = @request_owner.id
@dog_request = info_requests(:fancy_dog_request)
@@ -1228,12 +1249,12 @@ describe RequestController, "when classifying an information request" do
def unhappy_url
"help/unhappy/#{@dog_request.url_title}"
end
-
+
def expect_redirect(status, redirect_path)
post_status(status)
response.should redirect_to("http://test.host/#{redirect_path}")
end
-
+
it 'should redirect to the "request url" with a message in the right tense when status is updated to "waiting response" and the response is not overdue' do
@dog_request.stub!(:date_response_required_by).and_return(Time.now.to_date+1)
@dog_request.stub!(:date_very_overdue_after).and_return(Time.now.to_date+40)
@@ -1241,15 +1262,15 @@ describe RequestController, "when classifying an information request" do
expect_redirect("waiting_response", "request/#{@dog_request.url_title}")
flash[:notice].should match(/should get a response/)
end
-
- it 'should redirect to the "request url" with a message in the right tense when status is updated to "waiting response" and the response is overdue' do
+
+ it 'should redirect to the "request url" with a message in the right tense when status is updated to "waiting response" and the response is overdue' do
@dog_request.stub!(:date_response_required_by).and_return(Time.now.to_date-1)
@dog_request.stub!(:date_very_overdue_after).and_return(Time.now.to_date+40)
expect_redirect('waiting_response', request_url)
flash[:notice].should match(/should have got a response/)
end
- it 'should redirect to the "request url" with a message in the right tense when status is updated to "waiting response" and the response is overdue' do
+ it 'should redirect to the "request url" with a message in the right tense when status is updated to "waiting response" and the response is overdue' do
@dog_request.stub!(:date_response_required_by).and_return(Time.now.to_date-2)
@dog_request.stub!(:date_very_overdue_after).and_return(Time.now.to_date-1)
expect_redirect('waiting_response', unhappy_url)
@@ -1257,54 +1278,54 @@ describe RequestController, "when classifying an information request" do
flash[:notice].should match(/by more than 40 working days/)
flash[:notice].should match(/within 20 working days/)
end
-
- it 'should redirect to the "request url" when status is updated to "not held"' do
+
+ it 'should redirect to the "request url" when status is updated to "not held"' do
expect_redirect('not_held', request_url)
end
-
- it 'should redirect to the "request url" when status is updated to "successful"' do
+
+ it 'should redirect to the "request url" when status is updated to "successful"' do
expect_redirect('successful', request_url)
end
-
- it 'should redirect to the "unhappy url" when status is updated to "rejected"' do
+
+ it 'should redirect to the "unhappy url" when status is updated to "rejected"' do
expect_redirect('rejected', "help/unhappy/#{@dog_request.url_title}")
end
-
- it 'should redirect to the "unhappy url" when status is updated to "partially successful"' do
+
+ it 'should redirect to the "unhappy url" when status is updated to "partially successful"' do
expect_redirect('partially_successful', "help/unhappy/#{@dog_request.url_title}")
end
-
- it 'should redirect to the "response url" when status is updated to "waiting clarification" and there is a last response' do
+
+ it 'should redirect to the "response url" when status is updated to "waiting clarification" and there is a last response' do
incoming_message = mock_model(IncomingMessage)
@dog_request.stub!(:get_last_response).and_return(incoming_message)
expect_redirect('waiting_clarification', "request/#{@dog_request.id}/response/#{incoming_message.id}")
end
-
- it 'should redirect to the "response no followup url" when status is updated to "waiting clarification" and there are no events needing description' do
+
+ it 'should redirect to the "response no followup url" when status is updated to "waiting clarification" and there are no events needing description' do
@dog_request.stub!(:get_last_response).and_return(nil)
expect_redirect('waiting_clarification', "request/#{@dog_request.id}/response")
end
- it 'should redirect to the "respond to last url" when status is updated to "gone postal"' do
+ it 'should redirect to the "respond to last url" when status is updated to "gone postal"' do
expect_redirect('gone_postal', "request/#{@dog_request.id}/response/#{@dog_request.get_last_response.id}?gone_postal=1")
end
-
- it 'should redirect to the "request url" when status is updated to "internal review"' do
+
+ it 'should redirect to the "request url" when status is updated to "internal review"' do
expect_redirect('internal_review', request_url)
end
-
- it 'should redirect to the "help general url" when status is updated to "requires admin"' do
+
+ it 'should redirect to the "help general url" when status is updated to "requires admin"' do
expect_redirect('requires_admin', "help/contact")
end
-
- it 'should redirect to the "help general url" when status is updated to "error message"' do
+
+ it 'should redirect to the "help general url" when status is updated to "error message"' do
expect_redirect('error_message', "help/contact")
end
-
- it 'should redirect to the "respond to last url url" when status is updated to "user_withdrawn"' do
+
+ it 'should redirect to the "respond to last url url" when status is updated to "user_withdrawn"' do
expect_redirect('user_withdrawn', "request/#{@dog_request.id}/response/#{@dog_request.get_last_response.id}")
end
-
+
end
end
@@ -1346,7 +1367,7 @@ describe RequestController, "when sending a followup message" do
post :show_response, :outgoing_message => { :body => "What a useless response! You suck.", :what_doing => 'normal_sort'}, :id => info_requests(:fancy_dog_request).id, :incoming_message_id => incoming_messages(:useless_incoming_message), :submitted_followup => 1, :preview => 0, :reedit => "Re-edit this request"
response.should render_template('show_response')
end
-
+
it "should send the follow up message if you are the right user" do
# fake that this is a clarification
info_requests(:fancy_dog_request).set_described_state('waiting_clarification')
@@ -1378,7 +1399,7 @@ describe RequestController, "when sending a followup message" do
# make the followup once
post :show_response, :outgoing_message => { :body => "Stop repeating yourself!", :what_doing => 'normal_sort' }, :id => info_requests(:fancy_dog_request).id, :incoming_message_id => incoming_messages(:useless_incoming_message), :submitted_followup => 1
response.should redirect_to(:action => 'show', :url_title => info_requests(:fancy_dog_request).url_title)
-
+
# second time should give an error
post :show_response, :outgoing_message => { :body => "Stop repeating yourself!", :what_doing => 'normal_sort' }, :id => info_requests(:fancy_dog_request).id, :incoming_message_id => incoming_messages(:useless_incoming_message), :submitted_followup => 1
# XXX how do I check the error message here?
@@ -1392,7 +1413,7 @@ end
describe RequestController, "sending overdue request alerts" do
integrate_views
-
+
before(:each) do
load_raw_emails_data
end
@@ -1407,7 +1428,7 @@ describe RequestController, "sending overdue request alerts" do
chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/}
chicken_mails.size.should == 1
mail = chicken_mails[0]
-
+
mail.body.should =~ /promptly, as normally/
mail.to_addrs.first.to_s.should == info_requests(:naughty_chicken_request).user.name_and_email
@@ -1436,7 +1457,7 @@ describe RequestController, "sending overdue request alerts" do
chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/}
chicken_mails.size.should == 1
mail = chicken_mails[0]
-
+
mail.body.should =~ /promptly, as normally/
mail.to_addrs.first.to_s.should == info_requests(:naughty_chicken_request).user.name_and_email
end
@@ -1462,7 +1483,7 @@ describe RequestController, "sending overdue request alerts" do
chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/}
chicken_mails.size.should == 1
mail = chicken_mails[0]
-
+
mail.body.should =~ /required by law/
mail.to_addrs.first.to_s.should == info_requests(:naughty_chicken_request).user.name_and_email
@@ -1568,7 +1589,7 @@ describe RequestController, "comment alerts" do
before(:each) do
load_raw_emails_data
end
-
+
it "should send an alert (once and once only)" do
# delete ficture comment and make new one, so is in last month (as
# alerts are only for comments in last month, see
@@ -1590,7 +1611,7 @@ describe RequestController, "comment alerts" do
# XXX check mail_url here somehow, can't call comment_url like this:
# mail_url.should == comment_url(comments(:silly_comment))
-
+
# check if we send again, no more go out
deliveries.clear
RequestMailer.alert_comment_on_request
@@ -1646,15 +1667,15 @@ describe RequestController, "when viewing comments" do
it "should link to the user who submitted it" do
session[:user_id] = users(:bob_smith_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
- response.body.should have_tag("div#comment-1 h2", /Silly.*left an annotation/m)
- response.body.should_not have_tag("div#comment-1 h2", /You.*left an annotation/m)
+ response.body.should have_tag("div#comment-1 h2", /Silly.*left an annotation/m)
+ response.body.should_not have_tag("div#comment-1 h2", /You.*left an annotation/m)
end
it "should link to the user who submitted to it, even if it is you" do
session[:user_id] = users(:silly_name_user).id
get :show, :url_title => 'why_do_you_have_such_a_fancy_dog'
- response.body.should have_tag("div#comment-1 h2", /Silly.*left an annotation/m)
- response.body.should_not have_tag("div#comment-1 h2", /You.*left an annotation/m)
+ response.body.should have_tag("div#comment-1 h2", /Silly.*left an annotation/m)
+ response.body.should_not have_tag("div#comment-1 h2", /You.*left an annotation/m)
end
end
@@ -1666,17 +1687,17 @@ describe RequestController, "authority uploads a response from the web interface
before(:each) do
# domain after the @ is used for authentication of FOI officers, so to test it
# we need a user which isn't at localhost.
- @normal_user = User.new(:name => "Mr. Normal", :email => "normal-user@flourish.org",
+ @normal_user = User.new(:name => "Mr. Normal", :email => "normal-user@flourish.org",
:password => PostRedirect.generate_random_token)
@normal_user.save!
- @foi_officer_user = User.new(:name => "The Geraldine Quango", :email => "geraldine-requests@localhost",
+ @foi_officer_user = User.new(:name => "The Geraldine Quango", :email => "geraldine-requests@localhost",
:password => PostRedirect.generate_random_token)
@foi_officer_user.save!
end
-
+
it "should require login to view the form to upload" do
- @ir = info_requests(:fancy_dog_request)
+ @ir = info_requests(:fancy_dog_request)
@ir.public_body.is_foi_officer?(@normal_user).should == false
session[:user_id] = @normal_user.id
@@ -1685,7 +1706,7 @@ describe RequestController, "authority uploads a response from the web interface
end
it "should let you view upload form if you are an FOI officer" do
- @ir = info_requests(:fancy_dog_request)
+ @ir = info_requests(:fancy_dog_request)
@ir.public_body.is_foi_officer?(@foi_officer_user).should == true
session[:user_id] = @foi_officer_user.id
@@ -1694,7 +1715,7 @@ describe RequestController, "authority uploads a response from the web interface
end
it "should prevent uploads if you are not a requester" do
- @ir = info_requests(:fancy_dog_request)
+ @ir = info_requests(:fancy_dog_request)
incoming_before = @ir.incoming_messages.size
session[:user_id] = @normal_user.id
@@ -1718,7 +1739,7 @@ describe RequestController, "authority uploads a response from the web interface
# How do I test a file upload in rails?
# http://stackoverflow.com/questions/1178587/how-do-i-test-a-file-upload-in-rails
it "should let the authority upload a file" do
- @ir = info_requests(:fancy_dog_request)
+ @ir = info_requests(:fancy_dog_request)
incoming_before = @ir.incoming_messages.size
session[:user_id] = @foi_officer_user.id
@@ -1774,7 +1795,7 @@ describe RequestController, "when doing type ahead searches" do
response.should render_template('request/_search_ahead.rhtml')
assigns[:xapian_requests].should be_nil
end
-
+
it "should return a request matching the given keyword, but not users with a matching description" do
get :search_typeahead, :q => "chicken"
response.should render_template('request/_search_ahead.rhtml')
@@ -1793,13 +1814,13 @@ describe RequestController, "when doing type ahead searches" do
end
it "should not return matches for short words" do
- get :search_typeahead, :q => "a"
+ get :search_typeahead, :q => "a"
response.should render_template('request/_search_ahead.rhtml')
assigns[:xapian_requests].should be_nil
end
it "should do partial matches for longer words" do
- get :search_typeahead, :q => "chick"
+ get :search_typeahead, :q => "chick"
response.should render_template('request/_search_ahead.rhtml')
assigns[:xapian_requests].results.size.should ==1
end
@@ -1836,7 +1857,7 @@ describe RequestController, "when showing similar requests" do
it "should show similar requests" do
badger_request = info_requests(:badger_request)
get :similar, :url_title => badger_request.url_title
-
+
# Xapian seems to think *all* the requests are similar
assigns[:xapian_object].results.map{|x|x[:model].info_request}.should =~ InfoRequest.all.reject {|x| x == badger_request}
end
@@ -1860,7 +1881,7 @@ end
describe RequestController, "when reporting a request (logged in)" do
integrate_views
-
+
before do
@user = users(:robin_user)
session[:user_id] = @user.id
@@ -1871,10 +1892,10 @@ describe RequestController, "when reporting a request (logged in)" do
title = ir.url_title
get :show, :url_title => title
assigns[:info_request].attention_requested.should == false
-
+
post :report_request, :url_title => title
response.should redirect_to(:action => :show, :url_title => title)
-
+
get :show, :url_title => title
response.should be_success
assigns[:info_request].attention_requested.should == true
@@ -1883,13 +1904,13 @@ describe RequestController, "when reporting a request (logged in)" do
it "should not allow a request to be reported twice" do
title = info_requests(:badger_request).url_title
-
+
post :report_request, :url_title => title
response.should redirect_to(:action => :show, :url_title => title)
get :show, :url_title => title
response.should be_success
response.body.should include("has been reported")
-
+
post :report_request, :url_title => title
response.should redirect_to(:action => :show, :url_title => title)
get :show, :url_title => title
@@ -1901,14 +1922,14 @@ describe RequestController, "when reporting a request (logged in)" do
title = info_requests(:badger_request).url_title
get :show, :url_title => title
response.body.should include("Offensive?")
-
+
post :report_request, :url_title => title
response.should redirect_to(:action => :show, :url_title => title)
-
+
get :show, :url_title => title
- response.body.should_not include("Offensive?")
+ response.body.should_not include("Offensive?")
response.body.should include("This request has been reported")
-
+
info_requests(:badger_request).set_described_state("successful")
get :show, :url_title => title
response.body.should_not include("This request has been reported")