4   class NotesControllerTest < ActionDispatch::IntegrationTest
 
   7       # Stub nominatim response for note locations
 
   8       stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?})
 
   9         .to_return(:status => 404)
 
  13     # test all routes which lead to this controller
 
  16         { :path => "/api/0.6/notes", :method => :post },
 
  17         { :controller => "api/notes", :action => "create", :format => "xml" }
 
  20         { :path => "/api/0.6/notes/1", :method => :get },
 
  21         { :controller => "api/notes", :action => "show", :id => "1", :format => "xml" }
 
  24         { :controller => "api/notes", :action => "show", :id => "1", :format => "xml" },
 
  25         { :path => "/api/0.6/notes/1.xml", :method => :get }
 
  28         { :path => "/api/0.6/notes/1.rss", :method => :get },
 
  29         { :controller => "api/notes", :action => "show", :id => "1", :format => "rss" }
 
  32         { :path => "/api/0.6/notes/1.json", :method => :get },
 
  33         { :controller => "api/notes", :action => "show", :id => "1", :format => "json" }
 
  36         { :path => "/api/0.6/notes/1.gpx", :method => :get },
 
  37         { :controller => "api/notes", :action => "show", :id => "1", :format => "gpx" }
 
  40         { :path => "/api/0.6/notes/1/comment", :method => :post },
 
  41         { :controller => "api/notes", :action => "comment", :id => "1", :format => "xml" }
 
  44         { :path => "/api/0.6/notes/1/close", :method => :post },
 
  45         { :controller => "api/notes", :action => "close", :id => "1", :format => "xml" }
 
  48         { :path => "/api/0.6/notes/1/reopen", :method => :post },
 
  49         { :controller => "api/notes", :action => "reopen", :id => "1", :format => "xml" }
 
  52         { :path => "/api/0.6/notes/1", :method => :delete },
 
  53         { :controller => "api/notes", :action => "destroy", :id => "1", :format => "xml" }
 
  57         { :path => "/api/0.6/notes", :method => :get },
 
  58         { :controller => "api/notes", :action => "index", :format => "xml" }
 
  61         { :controller => "api/notes", :action => "index", :format => "xml" },
 
  62         { :path => "/api/0.6/notes.xml", :method => :get }
 
  65         { :path => "/api/0.6/notes.rss", :method => :get },
 
  66         { :controller => "api/notes", :action => "index", :format => "rss" }
 
  69         { :path => "/api/0.6/notes.json", :method => :get },
 
  70         { :controller => "api/notes", :action => "index", :format => "json" }
 
  73         { :path => "/api/0.6/notes.gpx", :method => :get },
 
  74         { :controller => "api/notes", :action => "index", :format => "gpx" }
 
  78         { :path => "/api/0.6/notes/search", :method => :get },
 
  79         { :controller => "api/notes", :action => "search", :format => "xml" }
 
  82         { :controller => "api/notes", :action => "search", :format => "xml" },
 
  83         { :path => "/api/0.6/notes/search.xml", :method => :get }
 
  86         { :path => "/api/0.6/notes/search.rss", :method => :get },
 
  87         { :controller => "api/notes", :action => "search", :format => "rss" }
 
  90         { :path => "/api/0.6/notes/search.json", :method => :get },
 
  91         { :controller => "api/notes", :action => "search", :format => "json" }
 
  94         { :path => "/api/0.6/notes/search.gpx", :method => :get },
 
  95         { :controller => "api/notes", :action => "search", :format => "gpx" }
 
  99         { :path => "/api/0.6/notes/feed", :method => :get },
 
 100         { :controller => "api/notes", :action => "feed", :format => "rss" }
 
 104         { :controller => "api/notes", :action => "create" },
 
 105         { :path => "/api/0.6/notes/addPOIexec", :method => :post }
 
 108         { :controller => "api/notes", :action => "close" },
 
 109         { :path => "/api/0.6/notes/closePOIexec", :method => :post }
 
 112         { :controller => "api/notes", :action => "comment" },
 
 113         { :path => "/api/0.6/notes/editPOIexec", :method => :post }
 
 116         { :controller => "api/notes", :action => "index", :format => "gpx" },
 
 117         { :path => "/api/0.6/notes/getGPX", :method => :get }
 
 120         { :controller => "api/notes", :action => "feed", :format => "rss" },
 
 121         { :path => "/api/0.6/notes/getRSSfeed", :method => :get }
 
 125     def test_create_success
 
 126       assert_difference "Note.count", 1 do
 
 127         assert_difference "NoteComment.count", 1 do
 
 128           post notes_path(:lat => -1.0, :lon => -1.0, :text => "This is a comment", :format => "json")
 
 131       assert_response :success
 
 132       js = ActiveSupport::JSON.decode(@response.body)
 
 134       assert_equal "Feature", js["type"]
 
 135       assert_equal "Point", js["geometry"]["type"]
 
 136       assert_equal [-1.0, -1.0], js["geometry"]["coordinates"]
 
 137       assert_equal "open", js["properties"]["status"]
 
 138       assert_equal 1, js["properties"]["comments"].count
 
 139       assert_equal "opened", js["properties"]["comments"].last["action"]
 
 140       assert_equal "This is a comment", js["properties"]["comments"].last["text"]
 
 141       assert_nil js["properties"]["comments"].last["user"]
 
 142       id = js["properties"]["id"]
 
 144       get note_path(:id => id, :format => "json")
 
 145       assert_response :success
 
 146       js = ActiveSupport::JSON.decode(@response.body)
 
 148       assert_equal "Feature", js["type"]
 
 149       assert_equal "Point", js["geometry"]["type"]
 
 150       assert_equal [-1.0, -1.0], js["geometry"]["coordinates"]
 
 151       assert_equal id, js["properties"]["id"]
 
 152       assert_equal "open", js["properties"]["status"]
 
 153       assert_equal 1, js["properties"]["comments"].count
 
 154       assert_equal "opened", js["properties"]["comments"].last["action"]
 
 155       assert_equal "This is a comment", js["properties"]["comments"].last["text"]
 
 156       assert_nil js["properties"]["comments"].last["user"]
 
 160       assert_no_difference "Note.count" do
 
 161         assert_no_difference "NoteComment.count" do
 
 162           post notes_path(:lon => -1.0, :text => "This is a comment")
 
 165       assert_response :bad_request
 
 167       assert_no_difference "Note.count" do
 
 168         assert_no_difference "NoteComment.count" do
 
 169           post notes_path(:lat => -1.0, :text => "This is a comment")
 
 172       assert_response :bad_request
 
 174       assert_no_difference "Note.count" do
 
 175         assert_no_difference "NoteComment.count" do
 
 176           post notes_path(:lat => -1.0, :lon => -1.0)
 
 179       assert_response :bad_request
 
 181       assert_no_difference "Note.count" do
 
 182         assert_no_difference "NoteComment.count" do
 
 183           post notes_path(:lat => -1.0, :lon => -1.0, :text => "")
 
 186       assert_response :bad_request
 
 188       assert_no_difference "Note.count" do
 
 189         assert_no_difference "NoteComment.count" do
 
 190           post notes_path(:lat => -100.0, :lon => -1.0, :text => "This is a comment")
 
 193       assert_response :bad_request
 
 195       assert_no_difference "Note.count" do
 
 196         assert_no_difference "NoteComment.count" do
 
 197           post notes_path(:lat => -1.0, :lon => -200.0, :text => "This is a comment")
 
 200       assert_response :bad_request
 
 202       assert_no_difference "Note.count" do
 
 203         assert_no_difference "NoteComment.count" do
 
 204           post notes_path(:lat => "abc", :lon => -1.0, :text => "This is a comment")
 
 207       assert_response :bad_request
 
 209       assert_no_difference "Note.count" do
 
 210         assert_no_difference "NoteComment.count" do
 
 211           post notes_path(:lat => -1.0, :lon => "abc", :text => "This is a comment")
 
 214       assert_response :bad_request
 
 216       assert_no_difference "Note.count" do
 
 217         assert_no_difference "NoteComment.count" do
 
 218           post notes_path(:lat => -1.0, :lon => -1.0, :text => "x\u0000y")
 
 221       assert_response :bad_request
 
 224     def test_comment_success
 
 225       open_note_with_comment = create(:note_with_comments)
 
 227       auth_header = basic_authorization_header user.email, "test"
 
 228       assert_difference "NoteComment.count", 1 do
 
 229         assert_no_difference "ActionMailer::Base.deliveries.size" do
 
 230           perform_enqueued_jobs do
 
 231             post comment_note_path(:id => open_note_with_comment, :text => "This is an additional comment", :format => "json"), :headers => auth_header
 
 235       assert_response :success
 
 236       js = ActiveSupport::JSON.decode(@response.body)
 
 238       assert_equal "Feature", js["type"]
 
 239       assert_equal open_note_with_comment.id, js["properties"]["id"]
 
 240       assert_equal "open", js["properties"]["status"]
 
 241       assert_equal 2, js["properties"]["comments"].count
 
 242       assert_equal "commented", js["properties"]["comments"].last["action"]
 
 243       assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
 
 244       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 246       get note_path(:id => open_note_with_comment, :format => "json")
 
 247       assert_response :success
 
 248       js = ActiveSupport::JSON.decode(@response.body)
 
 250       assert_equal "Feature", js["type"]
 
 251       assert_equal open_note_with_comment.id, js["properties"]["id"]
 
 252       assert_equal "open", js["properties"]["status"]
 
 253       assert_equal 2, js["properties"]["comments"].count
 
 254       assert_equal "commented", js["properties"]["comments"].last["action"]
 
 255       assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
 
 256       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 258       # Ensure that emails are sent to users
 
 259       first_user = create(:user)
 
 260       second_user = create(:user)
 
 261       third_user = create(:user)
 
 263       note_with_comments_by_users = create(:note) do |note|
 
 264         create(:note_comment, :note => note, :author => first_user)
 
 265         create(:note_comment, :note => note, :author => second_user)
 
 268       auth_header = basic_authorization_header third_user.email, "test"
 
 270       assert_difference "NoteComment.count", 1 do
 
 271         assert_difference "ActionMailer::Base.deliveries.size", 2 do
 
 272           perform_enqueued_jobs do
 
 273             post comment_note_path(:id => note_with_comments_by_users, :text => "This is an additional comment", :format => "json"), :headers => auth_header
 
 277       assert_response :success
 
 278       js = ActiveSupport::JSON.decode(@response.body)
 
 280       assert_equal "Feature", js["type"]
 
 281       assert_equal note_with_comments_by_users.id, js["properties"]["id"]
 
 282       assert_equal "open", js["properties"]["status"]
 
 283       assert_equal 3, js["properties"]["comments"].count
 
 284       assert_equal "commented", js["properties"]["comments"].last["action"]
 
 285       assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
 
 286       assert_equal third_user.display_name, js["properties"]["comments"].last["user"]
 
 288       email = ActionMailer::Base.deliveries.find { |e| e.to.first == first_user.email }
 
 290       assert_equal 1, email.to.length
 
 291       assert_equal "[OpenStreetMap] #{third_user.display_name} has commented on one of your notes", email.subject
 
 292       assert_equal first_user.email, email.to.first
 
 294       email = ActionMailer::Base.deliveries.find { |e| e.to.first == second_user.email }
 
 296       assert_equal 1, email.to.length
 
 297       assert_equal "[OpenStreetMap] #{third_user.display_name} has commented on a note you are interested in", email.subject
 
 299       get note_path(:id => note_with_comments_by_users, :format => "json")
 
 300       assert_response :success
 
 301       js = ActiveSupport::JSON.decode(@response.body)
 
 303       assert_equal "Feature", js["type"]
 
 304       assert_equal note_with_comments_by_users.id, js["properties"]["id"]
 
 305       assert_equal "open", js["properties"]["status"]
 
 306       assert_equal 3, js["properties"]["comments"].count
 
 307       assert_equal "commented", js["properties"]["comments"].last["action"]
 
 308       assert_equal "This is an additional comment", js["properties"]["comments"].last["text"]
 
 309       assert_equal third_user.display_name, js["properties"]["comments"].last["user"]
 
 311       ActionMailer::Base.deliveries.clear
 
 314     def test_comment_fail
 
 315       open_note_with_comment = create(:note_with_comments)
 
 319       assert_no_difference "NoteComment.count" do
 
 320         post comment_note_path(:id => open_note_with_comment)
 
 321         assert_response :unauthorized
 
 324       auth_header = basic_authorization_header user.email, "test"
 
 326       assert_no_difference "NoteComment.count" do
 
 327         post comment_note_path(:id => open_note_with_comment), :headers => auth_header
 
 329       assert_response :bad_request
 
 331       assert_no_difference "NoteComment.count" do
 
 332         post comment_note_path(:id => open_note_with_comment, :text => ""), :headers => auth_header
 
 334       assert_response :bad_request
 
 336       assert_no_difference "NoteComment.count" do
 
 337         post comment_note_path(:id => 12345, :text => "This is an additional comment"), :headers => auth_header
 
 339       assert_response :not_found
 
 341       hidden_note_with_comment = create(:note_with_comments, :status => "hidden")
 
 343       assert_no_difference "NoteComment.count" do
 
 344         post comment_note_path(:id => hidden_note_with_comment, :text => "This is an additional comment"), :headers => auth_header
 
 346       assert_response :gone
 
 348       closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now)
 
 350       assert_no_difference "NoteComment.count" do
 
 351         post comment_note_path(:id => closed_note_with_comment, :text => "This is an additional comment"), :headers => auth_header
 
 353       assert_response :conflict
 
 355       assert_no_difference "NoteComment.count" do
 
 356         post comment_note_path(:id => open_note_with_comment, :text => "x\u0000y"), :headers => auth_header
 
 358       assert_response :bad_request
 
 361     def test_close_success
 
 362       open_note_with_comment = create(:note_with_comments)
 
 365       post close_note_path(:id => open_note_with_comment, :text => "This is a close comment", :format => "json")
 
 366       assert_response :unauthorized
 
 368       auth_header = basic_authorization_header user.email, "test"
 
 370       post close_note_path(:id => open_note_with_comment, :text => "This is a close comment", :format => "json"), :headers => auth_header
 
 371       assert_response :success
 
 372       js = ActiveSupport::JSON.decode(@response.body)
 
 374       assert_equal "Feature", js["type"]
 
 375       assert_equal open_note_with_comment.id, js["properties"]["id"]
 
 376       assert_equal "closed", js["properties"]["status"]
 
 377       assert_equal 2, js["properties"]["comments"].count
 
 378       assert_equal "closed", js["properties"]["comments"].last["action"]
 
 379       assert_equal "This is a close comment", js["properties"]["comments"].last["text"]
 
 380       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 382       get note_path(:id => open_note_with_comment.id, :format => "json")
 
 383       assert_response :success
 
 384       js = ActiveSupport::JSON.decode(@response.body)
 
 386       assert_equal "Feature", js["type"]
 
 387       assert_equal open_note_with_comment.id, js["properties"]["id"]
 
 388       assert_equal "closed", js["properties"]["status"]
 
 389       assert_equal 2, js["properties"]["comments"].count
 
 390       assert_equal "closed", js["properties"]["comments"].last["action"]
 
 391       assert_equal "This is a close comment", js["properties"]["comments"].last["text"]
 
 392       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 396       post close_note_path(:id => 12345)
 
 397       assert_response :unauthorized
 
 399       auth_header = basic_authorization_header create(:user).email, "test"
 
 401       post close_note_path(:id => 12345), :headers => auth_header
 
 402       assert_response :not_found
 
 404       hidden_note_with_comment = create(:note_with_comments, :status => "hidden")
 
 406       post close_note_path(:id => hidden_note_with_comment), :headers => auth_header
 
 407       assert_response :gone
 
 409       closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now)
 
 411       post close_note_path(:id => closed_note_with_comment), :headers => auth_header
 
 412       assert_response :conflict
 
 415     def test_reopen_success
 
 416       closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now)
 
 419       post reopen_note_path(:id => closed_note_with_comment, :text => "This is a reopen comment", :format => "json")
 
 420       assert_response :unauthorized
 
 422       auth_header = basic_authorization_header user.email, "test"
 
 424       post reopen_note_path(:id => closed_note_with_comment, :text => "This is a reopen comment", :format => "json"), :headers => auth_header
 
 425       assert_response :success
 
 426       js = ActiveSupport::JSON.decode(@response.body)
 
 428       assert_equal "Feature", js["type"]
 
 429       assert_equal closed_note_with_comment.id, js["properties"]["id"]
 
 430       assert_equal "open", js["properties"]["status"]
 
 431       assert_equal 2, js["properties"]["comments"].count
 
 432       assert_equal "reopened", js["properties"]["comments"].last["action"]
 
 433       assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"]
 
 434       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 436       get note_path(:id => closed_note_with_comment, :format => "json")
 
 437       assert_response :success
 
 438       js = ActiveSupport::JSON.decode(@response.body)
 
 440       assert_equal "Feature", js["type"]
 
 441       assert_equal closed_note_with_comment.id, js["properties"]["id"]
 
 442       assert_equal "open", js["properties"]["status"]
 
 443       assert_equal 2, js["properties"]["comments"].count
 
 444       assert_equal "reopened", js["properties"]["comments"].last["action"]
 
 445       assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"]
 
 446       assert_equal user.display_name, js["properties"]["comments"].last["user"]
 
 450       hidden_note_with_comment = create(:note_with_comments, :status => "hidden")
 
 452       post reopen_note_path(:id => hidden_note_with_comment)
 
 453       assert_response :unauthorized
 
 455       auth_header = basic_authorization_header create(:user).email, "test"
 
 457       post reopen_note_path(:id => 12345), :headers => auth_header
 
 458       assert_response :not_found
 
 460       post reopen_note_path(:id => hidden_note_with_comment), :headers => auth_header
 
 461       assert_response :gone
 
 463       open_note_with_comment = create(:note_with_comments)
 
 465       post reopen_note_path(:id => open_note_with_comment), :headers => auth_header
 
 466       assert_response :conflict
 
 469     def test_show_success
 
 470       open_note = create(:note_with_comments)
 
 472       get note_path(:id => open_note, :format => "xml")
 
 473       assert_response :success
 
 474       assert_equal "application/xml", @response.media_type
 
 475       assert_select "osm", :count => 1 do
 
 476         assert_select "note[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do
 
 477           assert_select "id", open_note.id.to_s
 
 478           assert_select "url", note_url(open_note, :format => "xml")
 
 479           assert_select "comment_url", comment_note_url(open_note, :format => "xml")
 
 480           assert_select "close_url", close_note_url(open_note, :format => "xml")
 
 481           assert_select "date_created", open_note.created_at.to_s
 
 482           assert_select "status", open_note.status
 
 483           assert_select "comments", :count => 1 do
 
 484             assert_select "comment", :count => 1
 
 489       get note_path(:id => open_note, :format => "rss")
 
 490       assert_response :success
 
 491       assert_equal "application/rss+xml", @response.media_type
 
 492       assert_select "rss", :count => 1 do
 
 493         assert_select "channel", :count => 1 do
 
 494           assert_select "item", :count => 1 do
 
 495             assert_select "link", browse_note_url(open_note)
 
 496             assert_select "guid", note_url(open_note)
 
 497             assert_select "pubDate", open_note.created_at.to_s(:rfc822)
 
 498             #          assert_select "geo:lat", open_note.lat.to_s
 
 499             #          assert_select "geo:long", open_note.lon
 
 500             #          assert_select "georss:point", "#{open_note.lon} #{open_note.lon}"
 
 505       get note_path(:id => open_note, :format => "json")
 
 506       assert_response :success
 
 507       assert_equal "application/json", @response.media_type
 
 508       js = ActiveSupport::JSON.decode(@response.body)
 
 510       assert_equal "Feature", js["type"]
 
 511       assert_equal "Point", js["geometry"]["type"]
 
 512       assert_equal open_note.lat, js["geometry"]["coordinates"][0]
 
 513       assert_equal open_note.lon, js["geometry"]["coordinates"][1]
 
 514       assert_equal open_note.id, js["properties"]["id"]
 
 515       assert_equal note_url(open_note, :format => "json"), js["properties"]["url"]
 
 516       assert_equal comment_note_url(open_note, :format => "json"), js["properties"]["comment_url"]
 
 517       assert_equal close_note_url(open_note, :format => "json"), js["properties"]["close_url"]
 
 518       assert_equal open_note.created_at.to_s, js["properties"]["date_created"]
 
 519       assert_equal open_note.status, js["properties"]["status"]
 
 521       get note_path(:id => open_note, :format => "gpx")
 
 522       assert_response :success
 
 523       assert_equal "application/gpx+xml", @response.media_type
 
 524       assert_select "gpx", :count => 1 do
 
 525         assert_select "wpt[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do
 
 526           assert_select "time", :count => 1
 
 527           assert_select "name", "Note: #{open_note.id}"
 
 528           assert_select "desc", :count => 1
 
 529           assert_select "link[href='http://www.example.com/note/#{open_note.id}']", :count => 1
 
 530           assert_select "extensions", :count => 1 do
 
 531             assert_select "id", open_note.id.to_s
 
 532             assert_select "url", note_url(open_note, :format => "gpx")
 
 533             assert_select "comment_url", comment_note_url(open_note, :format => "gpx")
 
 534             assert_select "close_url", close_note_url(open_note, :format => "gpx")
 
 540     def test_show_hidden_comment
 
 541       note_with_hidden_comment = create(:note) do |note|
 
 542         create(:note_comment, :note => note, :body => "Valid comment for hidden note")
 
 543         create(:note_comment, :note => note, :visible => false)
 
 544         create(:note_comment, :note => note, :body => "Another valid comment for hidden note")
 
 547       get note_path(:id => note_with_hidden_comment, :format => "json")
 
 548       assert_response :success
 
 549       js = ActiveSupport::JSON.decode(@response.body)
 
 551       assert_equal "Feature", js["type"]
 
 552       assert_equal note_with_hidden_comment.id, js["properties"]["id"]
 
 553       assert_equal 2, js["properties"]["comments"].count
 
 554       assert_equal "Valid comment for hidden note", js["properties"]["comments"][0]["text"]
 
 555       assert_equal "Another valid comment for hidden note", js["properties"]["comments"][1]["text"]
 
 559       get note_path(:id => 12345)
 
 560       assert_response :not_found
 
 562       get note_path(:id => create(:note, :status => "hidden"))
 
 563       assert_response :gone
 
 566     def test_destroy_success
 
 567       open_note_with_comment = create(:note_with_comments)
 
 569       moderator_user = create(:moderator_user)
 
 571       delete note_path(:id => open_note_with_comment, :text => "This is a hide comment", :format => "json")
 
 572       assert_response :unauthorized
 
 574       auth_header = basic_authorization_header user.email, "test"
 
 576       delete note_path(:id => open_note_with_comment, :text => "This is a hide comment", :format => "json"), :headers => auth_header
 
 577       assert_response :forbidden
 
 579       auth_header = basic_authorization_header moderator_user.email, "test"
 
 581       delete note_path(:id => open_note_with_comment, :text => "This is a hide comment", :format => "json"), :headers => auth_header
 
 582       assert_response :success
 
 583       js = ActiveSupport::JSON.decode(@response.body)
 
 585       assert_equal "Feature", js["type"]
 
 586       assert_equal open_note_with_comment.id, js["properties"]["id"]
 
 587       assert_equal "hidden", js["properties"]["status"]
 
 588       assert_equal 2, js["properties"]["comments"].count
 
 589       assert_equal "hidden", js["properties"]["comments"].last["action"]
 
 590       assert_equal "This is a hide comment", js["properties"]["comments"].last["text"]
 
 591       assert_equal moderator_user.display_name, js["properties"]["comments"].last["user"]
 
 593       get note_path(:id => open_note_with_comment, :format => "json"), :headers => auth_header
 
 594       assert_response :success
 
 596       auth_header = basic_authorization_header user.email, "test"
 
 598       get note_path(:id => open_note_with_comment, :format => "json"), :headers => auth_header
 
 599       assert_response :gone
 
 602     def test_destroy_fail
 
 604       moderator_user = create(:moderator_user)
 
 606       delete note_path(:id => 12345, :format => "json")
 
 607       assert_response :unauthorized
 
 609       auth_header = basic_authorization_header user.email, "test"
 
 611       delete note_path(:id => 12345, :format => "json"), :headers => auth_header
 
 612       assert_response :forbidden
 
 614       auth_header = basic_authorization_header moderator_user.email, "test"
 
 616       delete note_path(:id => 12345, :format => "json"), :headers => auth_header
 
 617       assert_response :not_found
 
 619       hidden_note_with_comment = create(:note_with_comments, :status => "hidden")
 
 621       delete note_path(:id => hidden_note_with_comment, :format => "json"), :headers => auth_header
 
 622       assert_response :gone
 
 625     def test_index_success
 
 626       position = (1.1 * GeoRecord::SCALE).to_i
 
 627       create(:note_with_comments, :latitude => position, :longitude => position)
 
 628       create(:note_with_comments, :latitude => position, :longitude => position)
 
 630       get notes_path(:bbox => "1,1,1.2,1.2", :format => "rss")
 
 631       assert_response :success
 
 632       assert_equal "application/rss+xml", @response.media_type
 
 633       assert_select "rss", :count => 1 do
 
 634         assert_select "channel", :count => 1 do
 
 635           assert_select "item", :count => 2
 
 639       get notes_path(:bbox => "1,1,1.2,1.2", :format => "json")
 
 640       assert_response :success
 
 641       assert_equal "application/json", @response.media_type
 
 642       js = ActiveSupport::JSON.decode(@response.body)
 
 644       assert_equal "FeatureCollection", js["type"]
 
 645       assert_equal 2, js["features"].count
 
 647       get notes_path(:bbox => "1,1,1.2,1.2", :format => "xml")
 
 648       assert_response :success
 
 649       assert_equal "application/xml", @response.media_type
 
 650       assert_select "osm", :count => 1 do
 
 651         assert_select "note", :count => 2
 
 654       get notes_path(:bbox => "1,1,1.2,1.2", :format => "gpx")
 
 655       assert_response :success
 
 656       assert_equal "application/gpx+xml", @response.media_type
 
 657       assert_select "gpx", :count => 1 do
 
 658         assert_select "wpt", :count => 2
 
 663       position = (1.1 * GeoRecord::SCALE).to_i
 
 664       create(:note_with_comments, :latitude => position, :longitude => position)
 
 665       create(:note_with_comments, :latitude => position, :longitude => position)
 
 667       get notes_path(:bbox => "1,1,1.2,1.2", :limit => 1, :format => "rss")
 
 668       assert_response :success
 
 669       assert_equal "application/rss+xml", @response.media_type
 
 670       assert_select "rss", :count => 1 do
 
 671         assert_select "channel", :count => 1 do
 
 672           assert_select "item", :count => 1
 
 676       get notes_path(:bbox => "1,1,1.2,1.2", :limit => 1, :format => "json")
 
 677       assert_response :success
 
 678       assert_equal "application/json", @response.media_type
 
 679       js = ActiveSupport::JSON.decode(@response.body)
 
 681       assert_equal "FeatureCollection", js["type"]
 
 682       assert_equal 1, js["features"].count
 
 684       get notes_path(:bbox => "1,1,1.2,1.2", :limit => 1, :format => "xml")
 
 685       assert_response :success
 
 686       assert_equal "application/xml", @response.media_type
 
 687       assert_select "osm", :count => 1 do
 
 688         assert_select "note", :count => 1
 
 691       get notes_path(:bbox => "1,1,1.2,1.2", :limit => 1, :format => "gpx")
 
 692       assert_response :success
 
 693       assert_equal "application/gpx+xml", @response.media_type
 
 694       assert_select "gpx", :count => 1 do
 
 695         assert_select "wpt", :count => 1
 
 699     def test_index_empty_area
 
 700       get notes_path(:bbox => "5,5,5.1,5.1", :format => "rss")
 
 701       assert_response :success
 
 702       assert_equal "application/rss+xml", @response.media_type
 
 703       assert_select "rss", :count => 1 do
 
 704         assert_select "channel", :count => 1 do
 
 705           assert_select "item", :count => 0
 
 709       get notes_path(:bbox => "5,5,5.1,5.1", :format => "json")
 
 710       assert_response :success
 
 711       assert_equal "application/json", @response.media_type
 
 712       js = ActiveSupport::JSON.decode(@response.body)
 
 714       assert_equal "FeatureCollection", js["type"]
 
 715       assert_equal 0, js["features"].count
 
 717       get notes_path(:bbox => "5,5,5.1,5.1", :format => "xml")
 
 718       assert_response :success
 
 719       assert_equal "application/xml", @response.media_type
 
 720       assert_select "osm", :count => 1 do
 
 721         assert_select "note", :count => 0
 
 724       get notes_path(:bbox => "5,5,5.1,5.1", :format => "gpx")
 
 725       assert_response :success
 
 726       assert_equal "application/gpx+xml", @response.media_type
 
 727       assert_select "gpx", :count => 1 do
 
 728         assert_select "wpt", :count => 0
 
 732     def test_index_large_area
 
 733       get notes_path(:bbox => "-2.5,-2.5,2.5,2.5", :format => :json)
 
 734       assert_response :success
 
 735       assert_equal "application/json", @response.media_type
 
 737       get notes_path(:l => "-2.5", :b => "-2.5", :r => "2.5", :t => "2.5", :format => :json)
 
 738       assert_response :success
 
 739       assert_equal "application/json", @response.media_type
 
 741       get notes_path(:bbox => "-10,-10,12,12", :format => :json)
 
 742       assert_response :bad_request
 
 743       assert_equal "text/plain", @response.media_type
 
 745       get notes_path(:l => "-10", :b => "-10", :r => "12", :t => "12", :format => :json)
 
 746       assert_response :bad_request
 
 747       assert_equal "text/plain", @response.media_type
 
 750     def test_index_closed
 
 751       create(:note_with_comments, :status => "closed", :closed_at => Time.now - 5.days)
 
 752       create(:note_with_comments, :status => "closed", :closed_at => Time.now - 100.days)
 
 753       create(:note_with_comments, :status => "hidden")
 
 754       create(:note_with_comments)
 
 756       # Open notes + closed in last 7 days
 
 757       get notes_path(:bbox => "1,1,1.7,1.7", :closed => "7", :format => "json")
 
 758       assert_response :success
 
 759       assert_equal "application/json", @response.media_type
 
 760       js = ActiveSupport::JSON.decode(@response.body)
 
 762       assert_equal "FeatureCollection", js["type"]
 
 763       assert_equal 2, js["features"].count
 
 766       get notes_path(:bbox => "1,1,1.7,1.7", :closed => "0", :format => "json")
 
 767       assert_response :success
 
 768       assert_equal "application/json", @response.media_type
 
 769       js = ActiveSupport::JSON.decode(@response.body)
 
 771       assert_equal "FeatureCollection", js["type"]
 
 772       assert_equal 1, js["features"].count
 
 774       # Open notes + all closed notes
 
 775       get notes_path(:bbox => "1,1,1.7,1.7", :closed => "-1", :format => "json")
 
 776       assert_response :success
 
 777       assert_equal "application/json", @response.media_type
 
 778       js = ActiveSupport::JSON.decode(@response.body)
 
 780       assert_equal "FeatureCollection", js["type"]
 
 781       assert_equal 3, js["features"].count
 
 784     def test_index_bad_params
 
 785       get notes_path(:bbox => "-2.5,-2.5,2.5")
 
 786       assert_response :bad_request
 
 788       get notes_path(:bbox => "-2.5,-2.5,2.5,2.5,2.5")
 
 789       assert_response :bad_request
 
 791       get notes_path(:b => "-2.5", :r => "2.5", :t => "2.5")
 
 792       assert_response :bad_request
 
 794       get notes_path(:l => "-2.5", :r => "2.5", :t => "2.5")
 
 795       assert_response :bad_request
 
 797       get notes_path(:l => "-2.5", :b => "-2.5", :t => "2.5")
 
 798       assert_response :bad_request
 
 800       get notes_path(:l => "-2.5", :b => "-2.5", :r => "2.5")
 
 801       assert_response :bad_request
 
 803       get notes_path(:bbox => "1,1,1.7,1.7", :limit => "0", :format => "json")
 
 804       assert_response :bad_request
 
 806       get notes_path(:bbox => "1,1,1.7,1.7", :limit => "10001", :format => "json")
 
 807       assert_response :bad_request
 
 810     def test_search_success
 
 811       create(:note_with_comments)
 
 813       get search_notes_path(:q => "note comment", :format => "xml")
 
 814       assert_response :success
 
 815       assert_equal "application/xml", @response.media_type
 
 816       assert_select "osm", :count => 1 do
 
 817         assert_select "note", :count => 1
 
 820       get search_notes_path(:q => "note comment", :format => "json")
 
 821       assert_response :success
 
 822       assert_equal "application/json", @response.media_type
 
 823       js = ActiveSupport::JSON.decode(@response.body)
 
 825       assert_equal "FeatureCollection", js["type"]
 
 826       assert_equal 1, js["features"].count
 
 828       get search_notes_path(:q => "note comment", :format => "rss")
 
 829       assert_response :success
 
 830       assert_equal "application/rss+xml", @response.media_type
 
 831       assert_select "rss", :count => 1 do
 
 832         assert_select "channel", :count => 1 do
 
 833           assert_select "item", :count => 1
 
 837       get search_notes_path(:q => "note comment", :format => "gpx")
 
 838       assert_response :success
 
 839       assert_equal "application/gpx+xml", @response.media_type
 
 840       assert_select "gpx", :count => 1 do
 
 841         assert_select "wpt", :count => 1
 
 845     def test_search_by_display_name_success
 
 848       create(:note) do |note|
 
 849         create(:note_comment, :note => note, :author => user)
 
 852       get search_notes_path(:display_name => user.display_name, :format => "xml")
 
 853       assert_response :success
 
 854       assert_equal "application/xml", @response.media_type
 
 855       assert_select "osm", :count => 1 do
 
 856         assert_select "note", :count => 1
 
 859       get search_notes_path(:display_name => user.display_name, :format => "json")
 
 860       assert_response :success
 
 861       assert_equal "application/json", @response.media_type
 
 862       js = ActiveSupport::JSON.decode(@response.body)
 
 864       assert_equal "FeatureCollection", js["type"]
 
 865       assert_equal 1, js["features"].count
 
 867       get search_notes_path(:display_name => user.display_name, :format => "rss")
 
 868       assert_response :success
 
 869       assert_equal "application/rss+xml", @response.media_type
 
 870       assert_select "rss", :count => 1 do
 
 871         assert_select "channel", :count => 1 do
 
 872           assert_select "item", :count => 1
 
 876       get search_notes_path(:display_name => user.display_name, :format => "gpx")
 
 877       assert_response :success
 
 878       assert_equal "application/gpx+xml", @response.media_type
 
 879       assert_select "gpx", :count => 1 do
 
 880         assert_select "wpt", :count => 1
 
 884     def test_search_by_user_success
 
 887       create(:note) do |note|
 
 888         create(:note_comment, :note => note, :author => user)
 
 891       get search_notes_path(:user => user.id, :format => "xml")
 
 892       assert_response :success
 
 893       assert_equal "application/xml", @response.media_type
 
 894       assert_select "osm", :count => 1 do
 
 895         assert_select "note", :count => 1
 
 898       get search_notes_path(:user => user.id, :format => "json")
 
 899       assert_response :success
 
 900       assert_equal "application/json", @response.media_type
 
 901       js = ActiveSupport::JSON.decode(@response.body)
 
 903       assert_equal "FeatureCollection", js["type"]
 
 904       assert_equal 1, js["features"].count
 
 906       get search_notes_path(:user => user.id, :format => "rss")
 
 907       assert_response :success
 
 908       assert_equal "application/rss+xml", @response.media_type
 
 909       assert_select "rss", :count => 1 do
 
 910         assert_select "channel", :count => 1 do
 
 911           assert_select "item", :count => 1
 
 915       get search_notes_path(:user => user.id, :format => "gpx")
 
 916       assert_response :success
 
 917       assert_equal "application/gpx+xml", @response.media_type
 
 918       assert_select "gpx", :count => 1 do
 
 919         assert_select "wpt", :count => 1
 
 923     def test_search_no_match
 
 924       create(:note_with_comments)
 
 926       get search_notes_path(:q => "no match", :format => "xml")
 
 927       assert_response :success
 
 928       assert_equal "application/xml", @response.media_type
 
 929       assert_select "osm", :count => 1 do
 
 930         assert_select "note", :count => 0
 
 933       get search_notes_path(:q => "no match", :format => "json")
 
 934       assert_response :success
 
 935       assert_equal "application/json", @response.media_type
 
 936       js = ActiveSupport::JSON.decode(@response.body)
 
 938       assert_equal "FeatureCollection", js["type"]
 
 939       assert_equal 0, js["features"].count
 
 941       get search_notes_path(:q => "no match", :format => "rss")
 
 942       assert_response :success
 
 943       assert_equal "application/rss+xml", @response.media_type
 
 944       assert_select "rss", :count => 1 do
 
 945         assert_select "channel", :count => 1 do
 
 946           assert_select "item", :count => 0
 
 950       get search_notes_path(:q => "no match", :format => "gpx")
 
 951       assert_response :success
 
 952       assert_equal "application/gpx+xml", @response.media_type
 
 953       assert_select "gpx", :count => 1 do
 
 954         assert_select "wpt", :count => 0
 
 958     def test_search_by_time_no_match
 
 959       create(:note_with_comments)
 
 961       get search_notes_path(:from => "01.01.2010", :to => "01.10.2010", :format => "xml")
 
 962       assert_response :success
 
 963       assert_equal "application/xml", @response.media_type
 
 964       assert_select "osm", :count => 1 do
 
 965         assert_select "note", :count => 0
 
 968       get search_notes_path(:from => "01.01.2010", :to => "01.10.2010", :format => "json")
 
 969       assert_response :success
 
 970       assert_equal "application/json", @response.media_type
 
 971       js = ActiveSupport::JSON.decode(@response.body)
 
 973       assert_equal "FeatureCollection", js["type"]
 
 974       assert_equal 0, js["features"].count
 
 976       get search_notes_path(:from => "01.01.2010", :to => "01.10.2010", :format => "rss")
 
 977       assert_response :success
 
 978       assert_equal "application/rss+xml", @response.media_type
 
 979       assert_select "rss", :count => 1 do
 
 980         assert_select "channel", :count => 1 do
 
 981           assert_select "item", :count => 0
 
 985       get search_notes_path(:from => "01.01.2010", :to => "01.10.2010", :format => "gpx")
 
 986       assert_response :success
 
 987       assert_equal "application/gpx+xml", @response.media_type
 
 988       assert_select "gpx", :count => 1 do
 
 989         assert_select "wpt", :count => 0
 
 993     def test_search_bad_params
 
 994       get search_notes_path(:q => "no match", :limit => "0", :format => "json")
 
 995       assert_response :bad_request
 
 997       get search_notes_path(:q => "no match", :limit => "10001", :format => "json")
 
 998       assert_response :bad_request
 
1000       get search_notes_path(:display_name => "non-existent")
 
1001       assert_response :bad_request
 
1003       get search_notes_path(:user => "-1")
 
1004       assert_response :bad_request
 
1006       get search_notes_path(:from => "wrong-date", :to => "wrong-date")
 
1007       assert_response :bad_request
 
1009       get search_notes_path(:from => "01.01.2010", :to => "2010.01.2010")
 
1010       assert_response :bad_request
 
1013     def test_feed_success
 
1014       position = (1.1 * GeoRecord::SCALE).to_i
 
1015       create(:note_with_comments, :latitude => position, :longitude => position)
 
1016       create(:note_with_comments, :latitude => position, :longitude => position)
 
1017       position = (1.5 * GeoRecord::SCALE).to_i
 
1018       create(:note_with_comments, :latitude => position, :longitude => position)
 
1019       create(:note_with_comments, :latitude => position, :longitude => position)
 
1021       get feed_notes_path(:format => "rss")
 
1022       assert_response :success
 
1023       assert_equal "application/rss+xml", @response.media_type
 
1024       assert_select "rss", :count => 1 do
 
1025         assert_select "channel", :count => 1 do
 
1026           assert_select "item", :count => 4
 
1030       get feed_notes_path(:bbox => "1,1,1.2,1.2", :format => "rss")
 
1031       assert_response :success
 
1032       assert_equal "application/rss+xml", @response.media_type
 
1033       assert_select "rss", :count => 1 do
 
1034         assert_select "channel", :count => 1 do
 
1035           assert_select "item", :count => 2
 
1041       get feed_notes_path(:bbox => "1,1,1.2", :format => "rss")
 
1042       assert_response :bad_request
 
1044       get feed_notes_path(:bbox => "1,1,1.2,1.2,1.2", :format => "rss")
 
1045       assert_response :bad_request
 
1047       get feed_notes_path(:bbox => "1,1,1.2,1.2", :limit => "0", :format => "rss")
 
1048       assert_response :bad_request
 
1050       get feed_notes_path(:bbox => "1,1,1.2,1.2", :limit => "10001", :format => "rss")
 
1051       assert_response :bad_request