]> git.openstreetmap.org Git - rails.git/blob - test/controllers/site_controller_test.rb
Avoid errors when /edit is called on an invalid object
[rails.git] / test / controllers / site_controller_test.rb
1 require "test_helper"
2
3 class SiteControllerTest < ActionController::TestCase
4   ##
5   # setup oauth keys
6   def setup
7     super
8
9     Settings.id_key = create(:client_application).key
10     Settings.potlatch2_key = create(:client_application).key
11
12     stub_hostip_requests
13   end
14
15   ##
16   # clear oauth keys
17   def teardown
18     Settings.id_key = nil
19     Settings.potlatch2_key = nil
20   end
21
22   ##
23   # test all routes which lead to this controller
24   def test_routes
25     assert_routing(
26       { :path => "/", :method => :get },
27       { :controller => "site", :action => "index" }
28     )
29     assert_routing(
30       { :path => "/", :method => :post },
31       { :controller => "site", :action => "index" }
32     )
33     assert_routing(
34       { :path => "/edit", :method => :get },
35       { :controller => "site", :action => "edit" }
36     )
37     assert_recognizes(
38       { :controller => "site", :action => "edit", :format => "html" },
39       { :path => "/edit.html", :method => :get }
40     )
41     assert_routing(
42       { :path => "/copyright", :method => :get },
43       { :controller => "site", :action => "copyright" }
44     )
45     assert_routing(
46       { :path => "/copyright/locale", :method => :get },
47       { :controller => "site", :action => "copyright", :copyright_locale => "locale" }
48     )
49     assert_routing(
50       { :path => "/welcome", :method => :get },
51       { :controller => "site", :action => "welcome" }
52     )
53     assert_routing(
54       { :path => "/fixthemap", :method => :get },
55       { :controller => "site", :action => "fixthemap" }
56     )
57     assert_routing(
58       { :path => "/export", :method => :get },
59       { :controller => "site", :action => "export" }
60     )
61     assert_recognizes(
62       { :controller => "site", :action => "export", :format => "html" },
63       { :path => "/export.html", :method => :get }
64     )
65     assert_routing(
66       { :path => "/offline", :method => :get },
67       { :controller => "site", :action => "offline" }
68     )
69     assert_routing(
70       { :path => "/key", :method => :get },
71       { :controller => "site", :action => "key" }
72     )
73     assert_routing(
74       { :path => "/go/shortcode", :method => :get },
75       { :controller => "site", :action => "permalink", :code => "shortcode" }
76     )
77     assert_routing(
78       { :path => "/preview/typename", :method => :post },
79       { :controller => "site", :action => "preview", :type => "typename" }
80     )
81     assert_routing(
82       { :path => "/id", :method => :get },
83       { :controller => "site", :action => "id" }
84     )
85   end
86
87   # Test the index page
88   def test_index
89     get :index
90     assert_response :success
91     assert_template "index"
92   end
93
94   # Test the index page redirects
95   def test_index_redirect
96     get :index, :params => { :node => 123 }
97     assert_redirected_to :controller => :browse, :action => :node, :id => 123
98
99     get :index, :params => { :way => 123 }
100     assert_redirected_to :controller => :browse, :action => :way, :id => 123
101
102     get :index, :params => { :relation => 123 }
103     assert_redirected_to :controller => :browse, :action => :relation, :id => 123
104
105     get :index, :params => { :note => 123 }
106     assert_redirected_to :controller => :browse, :action => :note, :id => 123
107
108     get :index, :params => { :query => "test" }
109     assert_redirected_to :controller => :geocoder, :action => :search, :query => "test"
110
111     get :index, :params => { :lat => 4, :lon => 5 }
112     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=5/4/5"
113
114     get :index, :params => { :lat => 4, :lon => 5, :zoom => 3 }
115     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=3/4/5"
116
117     get :index, :params => { :layers => "T" }
118     assert_redirected_to :controller => :site, :action => :index, :anchor => "layers=T"
119
120     get :index, :params => { :notes => "yes" }
121     assert_redirected_to :controller => :site, :action => :index, :anchor => "layers=N"
122
123     get :index, :params => { :lat => 4, :lon => 5, :zoom => 3, :layers => "T" }
124     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=3/4/5&layers=T"
125   end
126
127   # Test the permalink redirect
128   def test_permalink
129     get :permalink, :params => { :code => "wBz3--" }
130     assert_response :redirect
131     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=3/4.8779296875/3.955078125"
132
133     get :permalink, :params => { :code => "wBz3--", :m => "" }
134     assert_response :redirect
135     assert_redirected_to :controller => :site, :action => :index, :mlat => "4.8779296875", :mlon => "3.955078125", :anchor => "map=3/4.8779296875/3.955078125"
136
137     get :permalink, :params => { :code => "wBz3--", :layers => "T" }
138     assert_response :redirect
139     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=3/4.8779296875/3.955078125&layers=T"
140
141     get :permalink, :params => { :code => "wBz3--", :node => 1 }
142     assert_response :redirect
143     assert_redirected_to :controller => :browse, :action => :node, :id => 1, :anchor => "map=3/4.8779296875/3.955078125"
144
145     get :permalink, :params => { :code => "wBz3--", :way => 2 }
146     assert_response :redirect
147     assert_redirected_to :controller => :browse, :action => :way, :id => 2, :anchor => "map=3/4.8779296875/3.955078125"
148
149     get :permalink, :params => { :code => "wBz3--", :relation => 3 }
150     assert_response :redirect
151     assert_redirected_to :controller => :browse, :action => :relation, :id => 3, :anchor => "map=3/4.8779296875/3.955078125"
152
153     get :permalink, :params => { :code => "wBz3--", :changeset => 4 }
154     assert_response :redirect
155     assert_redirected_to :controller => :browse, :action => :changeset, :id => 4, :anchor => "map=3/4.8779296875/3.955078125"
156   end
157
158   # Test the key page
159   def test_key
160     get :key, :xhr => true
161     assert_response :success
162     assert_template "key"
163     assert_template :layout => false
164   end
165
166   # Test the edit page redirects when you aren't logged in
167   def test_edit
168     get :edit
169     assert_response :redirect
170     assert_redirected_to :controller => :users, :action => :login, :referer => "/edit"
171   end
172
173   # Test the error when trying to edit without public edits
174   def test_edit_non_public
175     get :edit, :session => { :user => create(:user, :data_public => false) }
176     assert_response :success
177     assert_template "edit"
178     assert_select "a[href='https://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits']"
179   end
180
181   # Test the right editor gets used when the user hasn't set a preference
182   def test_edit_without_preference
183     get :edit, :session => { :user => create(:user) }
184     assert_response :success
185     assert_template "edit"
186     assert_template :partial => "_#{Settings.default_editor}", :count => 1
187   end
188
189   # Test the right editor gets used when the user has set a preference
190   def test_edit_with_preference
191     user = create(:user)
192     user.preferred_editor = "id"
193     user.save!
194
195     get :edit, :session => { :user => user }
196     assert_response :success
197     assert_template "edit"
198     assert_template :partial => "_id", :count => 1
199
200     user = create(:user)
201     user.preferred_editor = "potlatch2"
202     user.save!
203
204     get :edit, :session => { :user => user }
205     assert_response :success
206     assert_template "edit"
207     assert_template :partial => "_potlatch2", :count => 1
208
209     user = create(:user)
210     user.preferred_editor = "potlatch"
211     user.save!
212
213     get :edit, :session => { :user => user }
214     assert_response :success
215     assert_template "edit"
216     assert_template :partial => "_potlatch", :count => 1
217
218     user = create(:user)
219     user.preferred_editor = "remote"
220     user.save!
221
222     get :edit, :session => { :user => user }
223     assert_response :success
224     assert_template "index"
225   end
226
227   # Test the right editor gets used when the URL has an override
228   def test_edit_with_override
229     get :edit, :params => { :editor => "id" }, :session => { :user => create(:user) }
230     assert_response :success
231     assert_template "edit"
232     assert_template :partial => "_id", :count => 1
233
234     get :edit, :params => { :editor => "potlatch2" }, :session => { :user => create(:user) }
235     assert_response :success
236     assert_template "edit"
237     assert_template :partial => "_potlatch2", :count => 1
238
239     get :edit, :params => { :editor => "potlatch" }, :session => { :user => create(:user) }
240     assert_response :success
241     assert_template "edit"
242     assert_template :partial => "_potlatch", :count => 1
243
244     get :edit, :params => { :editor => "remote" }, :session => { :user => create(:user) }
245     assert_response :success
246     assert_template "index"
247   end
248
249   # Test editing a specific node
250   def test_edit_with_node
251     user = create(:user)
252     node = create(:node, :lat => 1.0, :lon => 1.0)
253
254     get :edit, :params => { :node => node.id }, :session => { :user => user }
255     assert_response :success
256     assert_template "edit"
257     assert_equal 1.0, assigns(:lat)
258     assert_equal 1.0, assigns(:lon)
259     assert_equal 18, assigns(:zoom)
260   end
261
262   # Test editing inaccessible nodes
263   def test_edit_with_inaccessible_nodes
264     user = create(:user)
265     deleted_node = create(:node, :lat => 1.0, :lon => 1.0, :visible => false)
266
267     get :edit, :params => { :node => 99999 }, :session => { :user => user }
268     assert_response :success
269     assert_template "edit"
270     assert_nil assigns(:lat)
271     assert_nil assigns(:lon)
272     assert_nil assigns(:zoom)
273
274     get :edit, :params => { :node => deleted_node.id }, :session => { :user => user }
275     assert_response :success
276     assert_template "edit"
277     assert_nil assigns(:lat)
278     assert_nil assigns(:lon)
279     assert_nil assigns(:zoom)
280   end
281
282   # Test editing a specific way
283   def test_edit_with_way
284     user = create(:user)
285     node = create(:node, :lat => 3, :lon => 3)
286     way = create(:way)
287     create(:way_node, :node => node, :way => way)
288
289     get :edit, :params => { :way => way.id }, :session => { :user => user }
290     assert_response :success
291     assert_template "edit"
292     assert_equal 3.0, assigns(:lat)
293     assert_equal 3.0, assigns(:lon)
294     assert_equal 17, assigns(:zoom)
295   end
296
297   # Test editing inaccessible ways
298   def test_edit_with_inaccessible_ways
299     user = create(:user)
300     deleted_way = create(:way, :visible => false)
301
302     get :edit, :params => { :way => 99999 }, :session => { :user => user }
303     assert_response :success
304     assert_template "edit"
305     assert_nil assigns(:lat)
306     assert_nil assigns(:lon)
307     assert_nil assigns(:zoom)
308
309     get :edit, :params => { :way => deleted_way.id }, :session => { :user => user }
310     assert_response :success
311     assert_template "edit"
312     assert_nil assigns(:lat)
313     assert_nil assigns(:lon)
314     assert_nil assigns(:zoom)
315   end
316
317   # Test editing a specific note
318   def test_edit_with_note
319     user = create(:user)
320     note = create(:note) do |n|
321       n.comments.create(:author_id => user.id)
322     end
323
324     get :edit, :params => { :note => note.id }, :session => { :user => user }
325     assert_response :success
326     assert_template "edit"
327     assert_equal 1.0, assigns(:lat)
328     assert_equal 1.0, assigns(:lon)
329     assert_equal 17, assigns(:zoom)
330   end
331
332   # Test editing inaccessible notes
333   def test_edit_with_inaccessible_notes
334     user = create(:user)
335     deleted_note = create(:note, :status => "hidden") do |n|
336       n.comments.create(:author_id => user.id)
337     end
338
339     get :edit, :params => { :note => 99999 }, :session => { :user => user }
340     assert_response :success
341     assert_template "edit"
342     assert_nil assigns(:lat)
343     assert_nil assigns(:lon)
344     assert_nil assigns(:zoom)
345
346     get :edit, :params => { :note => deleted_note.id }, :session => { :user => user }
347     assert_response :success
348     assert_template "edit"
349     assert_nil assigns(:lat)
350     assert_nil assigns(:lon)
351     assert_nil assigns(:zoom)
352   end
353
354   # Test editing a specific GPX trace
355   def test_edit_with_gpx
356     user = create(:user)
357     gpx = create(:trace, :latitude => 1, :longitude => 1)
358
359     get :edit, :params => { :gpx => gpx.id }, :session => { :user => user }
360     assert_response :success
361     assert_template "edit"
362     assert_equal 1.0, assigns(:lat)
363     assert_equal 1.0, assigns(:lon)
364     assert_equal 16, assigns(:zoom)
365   end
366
367   # Test editing inaccessible GPX traces
368   def test_edit_with_inaccessible_gpxes
369     user = create(:user)
370     deleted_gpx = create(:trace, :deleted, :latitude => 1, :longitude => 1)
371     private_gpx = create(:trace, :latitude => 1, :longitude => 1, :visibility => "private")
372
373     get :edit, :params => { :gpx => 99999 }, :session => { :user => user }
374     assert_response :success
375     assert_template "edit"
376     assert_nil assigns(:lat)
377     assert_nil assigns(:lon)
378     assert_nil assigns(:zoom)
379
380     get :edit, :params => { :gpx => deleted_gpx.id }, :session => { :user => user }
381     assert_response :success
382     assert_template "edit"
383     assert_nil assigns(:lat)
384     assert_nil assigns(:lon)
385     assert_nil assigns(:zoom)
386
387     get :edit, :params => { :gpx => private_gpx.id }, :session => { :user => user }
388     assert_response :success
389     assert_template "edit"
390     assert_nil assigns(:lat)
391     assert_nil assigns(:lon)
392     assert_nil assigns(:zoom)
393   end
394
395   # Test the edit page redirects
396   def test_edit_redirect
397     get :edit, :params => { :lat => 4, :lon => 5 }
398     assert_redirected_to :controller => :site, :action => :edit, :anchor => "map=5/4/5"
399
400     get :edit, :params => { :lat => 4, :lon => 5, :zoom => 3 }
401     assert_redirected_to :controller => :site, :action => :edit, :anchor => "map=3/4/5"
402
403     get :edit, :params => { :lat => 4, :lon => 5, :zoom => 3, :editor => "id" }
404     assert_redirected_to :controller => :site, :action => :edit, :editor => "id", :anchor => "map=3/4/5"
405   end
406
407   # Test the copyright page
408   def test_copyright
409     get :copyright
410     assert_response :success
411     assert_template "copyright"
412   end
413
414   # Test the welcome page
415   def test_welcome
416     get :welcome
417     assert_response :redirect
418     assert_redirected_to :controller => :users, :action => :login, :referer => "/welcome"
419
420     get :welcome, :session => { :user => create(:user) }
421     assert_response :success
422     assert_template "welcome"
423   end
424
425   # Test the fixthemap page
426   def test_fixthemap
427     get :fixthemap
428     assert_response :success
429     assert_template "fixthemap"
430   end
431
432   # Test the help page
433   def test_help
434     get :help
435     assert_response :success
436     assert_template "help"
437   end
438
439   # Test the about page
440   def test_about
441     get :about
442     assert_response :success
443     assert_template "about"
444   end
445
446   # Test the export page
447   def test_export
448     get :export
449     assert_response :success
450     assert_template "export"
451     assert_template :layout => "map"
452
453     get :export, :xhr => true
454     assert_response :success
455     assert_template "export"
456     assert_template :layout => "xhr"
457   end
458
459   # Test the offline page
460   def test_offline
461     get :offline
462     assert_response :success
463     assert_template "offline"
464   end
465
466   # Test the rich text preview
467   def test_preview
468     post :preview, :xhr => true, :params => { :type => "html" }
469     assert_response :success
470
471     post :preview, :xhr => true, :params => { :type => "markdown" }
472     assert_response :success
473
474     post :preview, :xhr => true, :params => { :type => "text" }
475     assert_response :success
476   end
477
478   # Test the id frame
479   def test_id
480     get :id, :session => { :user => create(:user) }
481     assert_response :success
482     assert_template "id"
483     assert_template :layout => false
484   end
485 end