Avoid errors when /edit is called on an invalid object

This commit is contained in:
Tom Hughes 2019-12-16 21:23:09 +00:00
parent 60e1ddb6be
commit ac6a872a48
3 changed files with 117 additions and 22 deletions

View file

@ -31,6 +31,7 @@ Lint/SuppressedException:
Exclude:
- 'app/controllers/api/amf_controller.rb'
- 'app/controllers/users_controller.rb'
- 'app/controllers/site_controller.rb'
# Offense count: 701
Metrics/AbcSize:

View file

@ -77,18 +77,19 @@ class SiteController < ApplicationController
)
end
begin
if params[:node]
bbox = Node.find(params[:node]).bbox.to_unscaled
bbox = Node.visible.find(params[:node]).bbox.to_unscaled
@lat = bbox.centre_lat
@lon = bbox.centre_lon
@zoom = 18
elsif params[:way]
bbox = Way.find(params[:way]).bbox.to_unscaled
bbox = Way.visible.find(params[:way]).bbox.to_unscaled
@lat = bbox.centre_lat
@lon = bbox.centre_lon
@zoom = 17
elsif params[:note]
note = Note.find(params[:note])
note = Note.visible.find(params[:note])
@lat = note.lat
@lon = note.lon
@zoom = 17
@ -98,6 +99,9 @@ class SiteController < ApplicationController
@lon = trace.longitude
@zoom = 16
end
rescue ActiveRecord::RecordNotFound
# don't try and derive a location from a missing/deleted object
end
end
def copyright

View file

@ -259,6 +259,26 @@ class SiteControllerTest < ActionController::TestCase
assert_equal 18, assigns(:zoom)
end
# Test editing inaccessible nodes
def test_edit_with_inaccessible_nodes
user = create(:user)
deleted_node = create(:node, :lat => 1.0, :lon => 1.0, :visible => false)
get :edit, :params => { :node => 99999 }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
get :edit, :params => { :node => deleted_node.id }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
end
# Test editing a specific way
def test_edit_with_way
user = create(:user)
@ -274,6 +294,26 @@ class SiteControllerTest < ActionController::TestCase
assert_equal 17, assigns(:zoom)
end
# Test editing inaccessible ways
def test_edit_with_inaccessible_ways
user = create(:user)
deleted_way = create(:way, :visible => false)
get :edit, :params => { :way => 99999 }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
get :edit, :params => { :way => deleted_way.id }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
end
# Test editing a specific note
def test_edit_with_note
user = create(:user)
@ -289,6 +329,28 @@ class SiteControllerTest < ActionController::TestCase
assert_equal 17, assigns(:zoom)
end
# Test editing inaccessible notes
def test_edit_with_inaccessible_notes
user = create(:user)
deleted_note = create(:note, :status => "hidden") do |n|
n.comments.create(:author_id => user.id)
end
get :edit, :params => { :note => 99999 }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
get :edit, :params => { :note => deleted_note.id }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
end
# Test editing a specific GPX trace
def test_edit_with_gpx
user = create(:user)
@ -302,6 +364,34 @@ class SiteControllerTest < ActionController::TestCase
assert_equal 16, assigns(:zoom)
end
# Test editing inaccessible GPX traces
def test_edit_with_inaccessible_gpxes
user = create(:user)
deleted_gpx = create(:trace, :deleted, :latitude => 1, :longitude => 1)
private_gpx = create(:trace, :latitude => 1, :longitude => 1, :visibility => "private")
get :edit, :params => { :gpx => 99999 }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
get :edit, :params => { :gpx => deleted_gpx.id }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
get :edit, :params => { :gpx => private_gpx.id }, :session => { :user => user }
assert_response :success
assert_template "edit"
assert_nil assigns(:lat)
assert_nil assigns(:lon)
assert_nil assigns(:zoom)
end
# Test the edit page redirects
def test_edit_redirect
get :edit, :params => { :lat => 4, :lon => 5 }