diff options
-rw-r--r-- | app/controllers/reports_controller.rb | 23 | ||||
-rw-r--r-- | app/controllers/request_controller.rb | 22 | ||||
-rw-r--r-- | app/views/reports/new_report_request.html.erb (renamed from app/views/request/new_report_request.html.erb) | 0 | ||||
-rw-r--r-- | config/routes.rb | 6 | ||||
-rw-r--r-- | spec/controllers/reports_controller_spec.rb | 94 | ||||
-rw-r--r-- | spec/controllers/request_controller_spec.rb | 148 | ||||
-rw-r--r-- | spec/views/reports/new_report_request.html.erb_spec.rb (renamed from spec/views/request/new_report_request.html.erb_spec.rb) | 2 |
7 files changed, 151 insertions, 144 deletions
diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb new file mode 100644 index 000000000..cf1ad19e7 --- /dev/null +++ b/app/controllers/reports_controller.rb @@ -0,0 +1,23 @@ +class ReportsController < ApplicationController + def report_request + info_request = InfoRequest.find_by_url_title!(params[:url_title]) + if !authenticated_user + flash[:notice] = _("You need to be logged in to report a request for administrator attention") + elsif info_request.attention_requested + flash[:notice] = _("This request has already been reported for administrator attention") + else + info_request.report!(params[:reason], params[:message], @user) + flash[:notice] = _("This request has been reported for administrator attention") + end + redirect_to request_url(info_request) + end + + def new_report_request + @info_request = InfoRequest.find_by_url_title!(params[:url_title]) + if authenticated?( + :web => _("To report this request"), + :email => _("Then you can report the request '{{title}}'", :title => @info_request.title), + :email_subject => _("Report an offensive or unsuitable request")) + end + end +end diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index 12ba1a3a9..7bc37de5e 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -680,28 +680,6 @@ class RequestController < ApplicationController end end - def report_request - info_request = InfoRequest.find_by_url_title!(params[:url_title]) - if !authenticated_user - flash[:notice] = _("You need to be logged in to report a request for administrator attention") - elsif info_request.attention_requested - flash[:notice] = _("This request has already been reported for administrator attention") - else - info_request.report!(params[:reason], params[:message], @user) - flash[:notice] = _("This request has been reported for administrator attention") - end - redirect_to request_url(info_request) - end - - def new_report_request - @info_request = InfoRequest.find_by_url_title!(params[:url_title]) - if authenticated?( - :web => _("To report this request"), - :email => _("Then you can report the request '{{title}}'", :title => @info_request.title), - :email_subject => _("Report an offensive or unsuitable request")) - end - end - # special caching code so mime types are handled right around_filter :cache_attachments, :only => [ :get_attachment, :get_attachment_as_html ] def cache_attachments diff --git a/app/views/request/new_report_request.html.erb b/app/views/reports/new_report_request.html.erb index 11b682282..11b682282 100644 --- a/app/views/request/new_report_request.html.erb +++ b/app/views/reports/new_report_request.html.erb diff --git a/config/routes.rb b/config/routes.rb index c3e512b9d..4ba74f681 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -58,11 +58,11 @@ Alaveteli::Application.routes.draw do match '/upload/request/:url_title' => 'request#upload_response', :as => :upload_response match '/request/:url_title/download' => 'request#download_entire_request', :as => :download_entire_request - - match '/request/:url_title/report' => 'request#report_request', :as => :request_report, :via => :post - match '/request/:url_title/report/new' => 'request#new_report_request', :as => :new_request_report #### + match '/request/:url_title/report' => 'reports#report_request', :as => :request_report, :via => :post + match '/request/:url_title/report/new' => 'reports#new_report_request', :as => :new_request_report + #### User controller # Use /profile for things to do with the currently signed in user. # Use /user/XXXX for things that anyone can see about that user. diff --git a/spec/controllers/reports_controller_spec.rb b/spec/controllers/reports_controller_spec.rb new file mode 100644 index 000000000..c53748df2 --- /dev/null +++ b/spec/controllers/reports_controller_spec.rb @@ -0,0 +1,94 @@ +require 'spec_helper' + +describe ReportsController, "when reporting a request when not logged in" do + it "should only allow logged-in users to report requests" do + post :report_request, :url_title => info_requests(:badger_request).url_title + + flash[:notice].should =~ /You need to be logged in/ + response.should redirect_to show_request_path(:url_title => info_requests(:badger_request).url_title) + end +end + +describe ReportsController, "when reporting a request (logged in)" do + render_views + + before do + @user = users(:robin_user) + session[:user_id] = @user.id + end + + it "should 404 for non-existent requests" do + lambda { + post :report_request, :url_title => "hjksfdhjk_louytu_qqxxx" + }.should raise_error(ActiveRecord::RecordNotFound) + end + + it "should mark a request as having been reported" do + ir = info_requests(:badger_request) + title = ir.url_title + ir.attention_requested.should == false + + post :report_request, :url_title => title + response.should redirect_to show_request_path(:url_title => title) + + ir.reload + ir.attention_requested.should == true + ir.described_state.should == "attention_requested" + end + + it "should pass on the reason and message" do + info_request = mock_model(InfoRequest, :url_title => "foo", :attention_requested= => nil, :save! => nil) + InfoRequest.should_receive(:find_by_url_title!).with("foo").and_return(info_request) + info_request.should_receive(:report!).with("Not valid request", "It's just not", @user) + post :report_request, :url_title => "foo", :reason => "Not valid request", :message => "It's just not" + end + + 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 show_request_url(:url_title => title) + + post :report_request, :url_title => title + response.should redirect_to show_request_url(:url_title => title) + flash[:notice].should =~ /has already been reported/ + end + + it "should send an email from the reporter to admins" do + ir = info_requests(:badger_request) + title = ir.url_title + post :report_request, :url_title => title + deliveries = ActionMailer::Base.deliveries + deliveries.size.should == 1 + mail = deliveries[0] + mail.subject.should =~ /attention_requested/ + mail.from.should include(@user.email) + mail.body.should include(@user.name) + end +end + +describe ReportsController, "#new_report_request" do + let(:info_request) { mock_model(InfoRequest, :url_title => "foo") } + before :each do + InfoRequest.should_receive(:find_by_url_title!).with("foo").and_return(info_request) + end + + context "not logged in" do + it "should require the user to be logged in" do + get :new_report_request, :url_title => "foo" + response.should_not render_template("new_report_request") + end + end + + context "logged in" do + before :each do + session[:user_id] = users(:bob_smith_user).id + end + it "should show the form" do + get :new_report_request, :url_title => "foo" + response.should render_template("new_report_request") + end + end +end + + diff --git a/spec/controllers/request_controller_spec.rb b/spec/controllers/request_controller_spec.rb index 1fbe8a9a4..bc1307afc 100644 --- a/spec/controllers/request_controller_spec.rb +++ b/spec/controllers/request_controller_spec.rb @@ -239,6 +239,36 @@ describe RequestController, "when showing one request" do end end + context "when the request has not yet been reported" do + it "should allow the user to report" do + title = info_requests(:badger_request).url_title + get :show, :url_title => title + response.should_not contain("This request has been reported") + response.should contain("Offensive?") + end + end + + context "when the request has been reported for admin attention" do + before :each do + info_requests(:fancy_dog_request).report!("", "", nil) + end + it "should inform the user" do + get :show, :url_title => 'why_do_you_have_such_a_fancy_dog' + response.should contain("This request has been reported") + response.should_not contain("Offensive?") + end + + context "and then deemed okay and left to complete" do + before :each do + info_requests(:fancy_dog_request).set_described_state("successful") + end + it "should let the user know that the administrators have not hidden this request" do + get :show, :url_title => 'why_do_you_have_such_a_fancy_dog' + response.body.should =~ (/the site administrators.*have not hidden it/) + end + end + end + describe 'when the request is being viewed by an admin' do describe 'if the request is awaiting description' do @@ -2291,99 +2321,6 @@ describe RequestController, "when showing similar requests" do end - -describe RequestController, "when reporting a request when not logged in" do - it "should only allow logged-in users to report requests" do - post :report_request, :url_title => info_requests(:badger_request).url_title - - flash[:notice].should =~ /You need to be logged in/ - response.should redirect_to show_request_path(:url_title => info_requests(:badger_request).url_title) - end -end - -describe RequestController, "when reporting a request (logged in)" do - render_views - - before do - @user = users(:robin_user) - session[:user_id] = @user.id - end - - it "should 404 for non-existent requests" do - lambda { - post :report_request, :url_title => "hjksfdhjk_louytu_qqxxx" - }.should raise_error(ActiveRecord::RecordNotFound) - end - - it "should mark a request as having been reported" do - ir = info_requests(:badger_request) - 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 - assigns[:info_request].described_state.should == "attention_requested" - end - - it "should pass on the reason and message" do - info_request = mock_model(InfoRequest, :url_title => "foo", :attention_requested= => nil, :save! => nil) - InfoRequest.should_receive(:find_by_url_title!).with("foo").and_return(info_request) - info_request.should_receive(:report!).with("Not valid request", "It's just not", @user) - post :report_request, :url_title => "foo", :reason => "Not valid request", :message => "It's just not" - end - - 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 - response.should be_success - response.body.should include("has already been reported") - end - - it "should let users know a request has been reported" 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 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") - response.body.should =~ (/the site administrators.*have not hidden it/) - end - - it "should send an email from the reporter to admins" do - ir = info_requests(:badger_request) - title = ir.url_title - post :report_request, :url_title => title - deliveries = ActionMailer::Base.deliveries - deliveries.size.should == 1 - mail = deliveries[0] - mail.subject.should =~ /attention_requested/ - mail.from.should include(@user.email) - mail.body.should include(@user.name) - end -end - describe RequestController, "when caching fragments" do it "should not fail with long filenames" do long_name = "blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah.txt" @@ -2411,28 +2348,3 @@ describe RequestController, "when caching fragments" do end -describe RequestController, "#new_report_request" do - let(:info_request) { mock_model(InfoRequest, :url_title => "foo") } - before :each do - InfoRequest.should_receive(:find_by_url_title!).with("foo").and_return(info_request) - end - - context "not logged in" do - it "should require the user to be logged in" do - get :new_report_request, :url_title => "foo" - response.should_not render_template("new_report_request") - end - end - - context "logged in" do - before :each do - session[:user_id] = users(:bob_smith_user).id - end - it "should show the form" do - get :new_report_request, :url_title => "foo" - response.should render_template("new_report_request") - end - end -end - - diff --git a/spec/views/request/new_report_request.html.erb_spec.rb b/spec/views/reports/new_report_request.html.erb_spec.rb index b1ccf36c9..806bf74c0 100644 --- a/spec/views/request/new_report_request.html.erb_spec.rb +++ b/spec/views/reports/new_report_request.html.erb_spec.rb @@ -1,6 +1,6 @@ require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) -describe 'request/new_report_request.html.erb' do +describe 'reports/new_report_request.html.erb' do let(:info_request) { mock_model(InfoRequest, :url_title => "foo") } before :each do assign(:info_request, info_request) |