diff options
Diffstat (limited to 'spec/controllers')
-rw-r--r-- | spec/controllers/admin_public_body_controller_spec.rb | 51 | ||||
-rw-r--r-- | spec/controllers/general_controller_spec.rb | 120 | ||||
-rw-r--r-- | spec/controllers/request_controller_spec.rb | 63 |
3 files changed, 172 insertions, 62 deletions
diff --git a/spec/controllers/admin_public_body_controller_spec.rb b/spec/controllers/admin_public_body_controller_spec.rb index be33802c5..504ddc5cc 100644 --- a/spec/controllers/admin_public_body_controller_spec.rb +++ b/spec/controllers/admin_public_body_controller_spec.rb @@ -166,6 +166,13 @@ describe AdminPublicBodyController, "when administering public bodies and paying config['SKIP_ADMIN_AUTH'] = true end + def setup_emergency_credentials(username, password) + config = MySociety::Config.load_default() + config['SKIP_ADMIN_AUTH'] = false + config['ADMIN_USERNAME'] = username + config['ADMIN_PASSWORD'] = password + @request.env["HTTP_AUTHORIZATION"] = "" + end it "disallows non-authenticated users to do anything" do @request.env["HTTP_AUTHORIZATION"] = "" @@ -180,19 +187,14 @@ describe AdminPublicBodyController, "when administering public bodies and paying config = MySociety::Config.load_default() config['SKIP_ADMIN_AUTH'] = true @request.env["HTTP_AUTHORIZATION"] = "" - n = PublicBody.count post :destroy, { :id => public_bodies(:forlorn_public_body).id } PublicBody.count.should == n - 1 session[:using_admin].should == 1 end - it "doesn't let people with bad credentials log in" do - config = MySociety::Config.load_default() - config['SKIP_ADMIN_AUTH'] = false - config['ADMIN_USERNAME'] = 'biz' - config['ADMIN_PASSWORD'] = 'fuz' - @request.env["HTTP_AUTHORIZATION"] = "" + it "doesn't let people with bad emergency account credentials log in" do + setup_emergency_credentials('biz', 'fuz') n = PublicBody.count basic_auth_login(@request, "baduser", "badpassword") post :destroy, { :id => public_bodies(:forlorn_public_body).id } @@ -201,12 +203,8 @@ describe AdminPublicBodyController, "when administering public bodies and paying session[:using_admin].should == nil end - it "allows people with good credentials log in using HTTP Basic Auth" do - config = MySociety::Config.load_default() - config['SKIP_ADMIN_AUTH'] = false - config['ADMIN_USERNAME'] = 'biz' - config['ADMIN_PASSWORD'] = 'fuz' - @request.env["HTTP_AUTHORIZATION"] = "" + it "allows people with good emergency account credentials log in using HTTP Basic Auth" do + setup_emergency_credentials('biz', 'fuz') n = PublicBody.count basic_auth_login(@request, "biz", "fuz") post :show, { :id => public_bodies(:humpadink_public_body).id, :emergency => 1} @@ -235,6 +233,33 @@ describe AdminPublicBodyController, "when administering public bodies and paying PublicBody.count.should == n session[:using_admin].should == nil end + + describe 'when asked for the admin current user' do + + it 'returns the emergency account name for someone who logged in with the emergency account' do + setup_emergency_credentials('biz', 'fuz') + basic_auth_login(@request, "biz", "fuz") + post :show, { :id => public_bodies(:humpadink_public_body).id, :emergency => 1 } + controller.send(:admin_current_user).should == 'biz' + end + + it 'returns the current user url_name for a superuser' do + session[:user_id] = users(:admin_user).id + @request.env["HTTP_AUTHORIZATION"] = "" + post :show, { :id => public_bodies(:humpadink_public_body).id } + controller.send(:admin_current_user).should == users(:admin_user).url_name + end + + it 'returns the REMOTE_USER value from the request environment when skipping admin auth' do + config = MySociety::Config.load_default() + config['SKIP_ADMIN_AUTH'] = true + @request.env["HTTP_AUTHORIZATION"] = "" + @request.env["REMOTE_USER"] = "i_am_admin" + post :show, { :id => public_bodies(:humpadink_public_body).id } + controller.send(:admin_current_user).should == "i_am_admin" + end + + end end describe AdminPublicBodyController, "when administering public bodies with i18n" do diff --git a/spec/controllers/general_controller_spec.rb b/spec/controllers/general_controller_spec.rb index cebcaf6ab..935f8eab6 100644 --- a/spec/controllers/general_controller_spec.rb +++ b/spec/controllers/general_controller_spec.rb @@ -33,12 +33,22 @@ describe GeneralController, 'when getting the blog feed' do end -describe GeneralController, "when searching" do +describe GeneralController, "when showing the frontpage" do + integrate_views - before(:each) do - load_raw_emails_data - rebuild_xapian_index + before do + public_body = mock_model(PublicBody, :name => "Example Public Body", + :url_name => 'example_public_body') + info_request = mock_model(InfoRequest, :public_body => public_body, + :title => 'Example Request', + :url_title => 'example_request') + info_request_event = mock_model(InfoRequestEvent, :created_at => Time.now, + :info_request => info_request, + :described_at => Time.now, + :search_text_main => 'example text') + xapian_result = mock('xapian result', :results => [{:model => info_request_event}]) + controller.stub!(:perform_search).and_return(xapian_result) end it "should render the front page successfully" do @@ -87,11 +97,6 @@ describe GeneralController, "when searching" do response.should be_success end - it "should redirect from search query URL to pretty URL" do - post :search_redirect, :query => "mouse" # query hidden in POST parameters - response.should redirect_to(:action => 'search', :combined => "mouse", :view => "all") # URL /search/:query/all - end - describe "when using different locale settings" do home_link_regex = /href=".*\/en\// it "should generate URLs with a locale prepended when there's more than one locale set" do @@ -133,23 +138,41 @@ describe GeneralController, "when searching" do I18n.available_locales = old_i18n_available_locales end end +end +describe GeneralController, "when showing the front page with fixture data" do describe 'when constructing the list of recent requests' do + before(:each) do - load_raw_emails_data - rebuild_xapian_index + rebuild_xapian_index end - it 'should list the newest successful request first' do - # Make sure the newest is listed first even if an older one - # has a newer comment or was reclassified more recently: - # https://github.com/mysociety/alaveteli/issues/370 - # - # This is a deliberate behaviour change, in that the - # previous behaviour (showing more-recently-reclassified - # requests first) was intentional. - get :frontpage - assigns[:request_events].first.info_request.should == info_requests(:another_boring_request) + describe 'when there are fewer than five successful requests' do + + it 'should list the most recently sent and successful requests by the creation date of the + request event' do + # Make sure the newest response is listed first even if a request + # with an older response has a newer comment or was reclassified more recently: + # https://github.com/mysociety/alaveteli/issues/370 + # + # This is a deliberate behaviour change, in that the + # previous behaviour (showing more-recently-reclassified + # requests first) was intentional. + get :frontpage + + request_events = assigns[:request_events] + previous = nil + request_events.each do |event| + if previous + previous.created_at.should be >= event.created_at + end + ['sent', 'response'].include?(event.event_type).should be_true + if event.event_type == 'response' + ['successful', 'partially_successful'].include?(event.calculated_state).should be_true + end + previous = event + end + end end it 'should coalesce duplicate requests' do @@ -158,37 +181,44 @@ describe GeneralController, "when searching" do end end - describe 'when using xapian search' do +end - # rebuild xapian index after fixtures loaded - before(:each) do - load_raw_emails_data - rebuild_xapian_index - end +describe GeneralController, 'when using xapian search' do - it "should find info request when searching for '\"fancy dog\"'" do - get :search, :combined => ['"fancy dog"'] - response.should render_template('search') - assigns[:xapian_requests].matches_estimated.should == 1 - assigns[:xapian_requests].results.size.should == 1 - assigns[:xapian_requests].results[0][:model].should == info_request_events(:useless_outgoing_message_event) + integrate_views + + # rebuild xapian index after fixtures loaded + before(:each) do + load_raw_emails_data + rebuild_xapian_index + end + + it "should redirect from search query URL to pretty URL" do + post :search_redirect, :query => "mouse" # query hidden in POST parameters + response.should redirect_to(:action => 'search', :combined => "mouse", :view => "all") # URL /search/:query/all + end - assigns[:xapian_requests].words_to_highlight == ["fancy", "dog"] - end + it "should find info request when searching for '\"fancy dog\"'" do + get :search, :combined => ['"fancy dog"'] + response.should render_template('search') + assigns[:xapian_requests].matches_estimated.should == 1 + assigns[:xapian_requests].results.size.should == 1 + assigns[:xapian_requests].results[0][:model].should == info_request_events(:useless_outgoing_message_event) - it "should find public body and incoming message when searching for 'geraldine quango'" do - get :search, :combined => ['geraldine quango'] - response.should render_template('search') + assigns[:xapian_requests].words_to_highlight == ["fancy", "dog"] + end - assigns[:xapian_requests].matches_estimated.should == 1 - assigns[:xapian_requests].results.size.should == 1 - assigns[:xapian_requests].results[0][:model].should == info_request_events(:useless_incoming_message_event) + it "should find public body and incoming message when searching for 'geraldine quango'" do + get :search, :combined => ['geraldine quango'] + response.should render_template('search') - assigns[:xapian_bodies].matches_estimated.should == 1 - assigns[:xapian_bodies].results.size.should == 1 - assigns[:xapian_bodies].results[0][:model].should == public_bodies(:geraldine_public_body) - end + assigns[:xapian_requests].matches_estimated.should == 1 + assigns[:xapian_requests].results.size.should == 1 + assigns[:xapian_requests].results[0][:model].should == info_request_events(:useless_incoming_message_event) + assigns[:xapian_bodies].matches_estimated.should == 1 + assigns[:xapian_bodies].results.size.should == 1 + assigns[:xapian_bodies].results[0][:model].should == public_bodies(:geraldine_public_body) end it "should filter results based on end of URL being 'all'" do diff --git a/spec/controllers/request_controller_spec.rb b/spec/controllers/request_controller_spec.rb index 77f43b618..b0223588e 100644 --- a/spec/controllers/request_controller_spec.rb +++ b/spec/controllers/request_controller_spec.rb @@ -245,7 +245,7 @@ describe RequestController, "when showing one request" do response.should have_tag('#anyone_actions', /Add an annotation/) end end - + describe 'when the request does not allow comments' do it 'should not have a comment link' do get :show, { :url_title => 'spam_1' }, @@ -253,7 +253,7 @@ describe RequestController, "when showing one request" do response.should_not have_tag('#anyone_actions', /Add an annotation/) end end - + describe 'when the request is being viewed by an admin' do describe 'if the request is awaiting description' do @@ -1709,15 +1709,17 @@ describe RequestController, "sending overdue request alerts" do mail.to_addrs.first.to_s.should == info_requests(:naughty_chicken_request).user.name_and_email end - it "should send not actually send the overdue alert if the user is banned" do + it "should send not actually send the overdue alert if the user is banned but should + record it as sent" do user = info_requests(:naughty_chicken_request).user user.ban_text = 'Banned' user.save! - + UserInfoRequestSentAlert.find_all_by_user_id(user.id).count.should == 0 RequestMailer.alert_overdue_requests deliveries = ActionMailer::Base.deliveries deliveries.size.should == 0 + UserInfoRequestSentAlert.find_all_by_user_id(user.id).count.should > 0 end it "should send a very overdue alert mail to creators of very overdue requests" do @@ -1746,6 +1748,59 @@ describe RequestController, "sending overdue request alerts" do assigns[:info_request].should == info_requests(:naughty_chicken_request) end + it "should not resend alerts to people who've already received them" do + chicken_request = info_requests(:naughty_chicken_request) + chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 60.days + chicken_request.outgoing_messages[0].save! + RequestMailer.alert_overdue_requests + chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} + chicken_mails.size.should == 1 + RequestMailer.alert_overdue_requests + chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} + chicken_mails.size.should == 1 + end + + it 'should send alerts for requests where the last event forming the initial request is a followup + being sent following a request for clarification' do + chicken_request = info_requests(:naughty_chicken_request) + chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 60.days + chicken_request.outgoing_messages[0].save! + RequestMailer.alert_overdue_requests + chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} + chicken_mails.size.should == 1 + + # Request is waiting clarification + chicken_request.set_described_state('waiting_clarification') + + # Followup message is sent + outgoing_message = OutgoingMessage.new(:status => 'ready', + :message_type => 'followup', + :info_request_id => chicken_request.id, + :body => 'Some text', + :what_doing => 'normal_sort') + outgoing_message.send_message + outgoing_message.save! + + chicken_request = InfoRequest.find(chicken_request.id) + + # Last event forming the request is now the followup + chicken_request.last_event_forming_initial_request.event_type.should == 'followup_sent' + + # This isn't overdue, so no email + RequestMailer.alert_overdue_requests + chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} + chicken_mails.size.should == 1 + + # Make the followup older + outgoing_message.last_sent_at = Time.now() - 60.days + outgoing_message.save! + + # Now it should be alerted on + RequestMailer.alert_overdue_requests + chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} + chicken_mails.size.should == 2 + end + end describe RequestController, "sending unclassified new response reminder alerts" do |