Merge remote-tracking branch 'upstream/pull/2225'
[rails.git] / test / controllers / changesets_controller_test.rb
1 require "test_helper"
2
3 class ChangesetsControllerTest < ActionController::TestCase
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/user/name/history", :method => :get },
9       { :controller => "changesets", :action => "index", :display_name => "name" }
10     )
11     assert_routing(
12       { :path => "/user/name/history/feed", :method => :get },
13       { :controller => "changesets", :action => "feed", :display_name => "name", :format => :atom }
14     )
15     assert_routing(
16       { :path => "/history/friends", :method => :get },
17       { :controller => "changesets", :action => "index", :friends => true, :format => :html }
18     )
19     assert_routing(
20       { :path => "/history/nearby", :method => :get },
21       { :controller => "changesets", :action => "index", :nearby => true, :format => :html }
22     )
23     assert_routing(
24       { :path => "/history", :method => :get },
25       { :controller => "changesets", :action => "index" }
26     )
27     assert_routing(
28       { :path => "/history/feed", :method => :get },
29       { :controller => "changesets", :action => "feed", :format => :atom }
30     )
31   end
32
33   ##
34   # This should display the last 20 changesets closed
35   def test_index
36     get :index, :params => { :format => "html" }
37     assert_response :success
38     assert_template "history"
39     assert_template :layout => "map"
40     assert_select "h2", :text => "Changesets", :count => 1
41
42     get :index, :params => { :format => "html", :list => "1" }, :xhr => true
43     assert_response :success
44     assert_template "index"
45
46     check_index_result(Changeset.all)
47   end
48
49   ##
50   # This should display the last 20 changesets closed
51   def test_index_xhr
52     get :index, :params => { :format => "html" }, :xhr => true
53     assert_response :success
54     assert_template "history"
55     assert_template :layout => "xhr"
56     assert_select "h2", :text => "Changesets", :count => 1
57
58     get :index, :params => { :format => "html", :list => "1" }, :xhr => true
59     assert_response :success
60     assert_template "index"
61
62     check_index_result(Changeset.all)
63   end
64
65   ##
66   # This should display the last 20 changesets closed in a specific area
67   def test_index_bbox
68     get :index, :params => { :format => "html", :bbox => "4.5,4.5,5.5,5.5" }
69     assert_response :success
70     assert_template "history"
71     assert_template :layout => "map"
72     assert_select "h2", :text => "Changesets", :count => 1
73
74     get :index, :params => { :format => "html", :bbox => "4.5,4.5,5.5,5.5", :list => "1" }, :xhr => true
75     assert_response :success
76     assert_template "index"
77
78     check_index_result(Changeset.where("min_lon < 55000000 and max_lon > 45000000 and min_lat < 55000000 and max_lat > 45000000"))
79   end
80
81   ##
82   # Checks the display of the user changesets listing
83   def test_index_user
84     user = create(:user)
85     create(:changeset, :user => user)
86     create(:changeset, :closed, :user => user)
87
88     get :index, :params => { :format => "html", :display_name => user.display_name }
89     assert_response :success
90     assert_template "history"
91
92     get :index, :params => { :format => "html", :display_name => user.display_name, :list => "1" }, :xhr => true
93     assert_response :success
94     assert_template "index"
95
96     check_index_result(user.changesets)
97   end
98
99   ##
100   # Checks the display of the user changesets listing for a private user
101   def test_index_private_user
102     private_user = create(:user, :data_public => false)
103     create(:changeset, :user => private_user)
104     create(:changeset, :closed, :user => private_user)
105
106     get :index, :params => { :format => "html", :display_name => private_user.display_name }
107     assert_response :success
108     assert_template "history"
109
110     get :index, :params => { :format => "html", :display_name => private_user.display_name, :list => "1" }, :xhr => true
111     assert_response :success
112     assert_template "index"
113
114     check_index_result(Changeset.none)
115   end
116
117   ##
118   # Check the not found of the index user changesets
119   def test_index_user_not_found
120     get :index, :params => { :format => "html", :display_name => "Some random user" }
121     assert_response :not_found
122     assert_template "users/no_such_user"
123
124     get :index, :params => { :format => "html", :display_name => "Some random user", :list => "1" }, :xhr => true
125     assert_response :not_found
126     assert_template "users/no_such_user"
127   end
128
129   ##
130   # Checks the display of the friends changesets listing
131   def test_index_friends
132     private_user = create(:user, :data_public => true)
133     friend = create(:friend, :befriender => private_user)
134     create(:changeset, :user => friend.befriendee)
135
136     get :index, :params => { :friends => true }
137     assert_response :redirect
138     assert_redirected_to :controller => :users, :action => :login, :referer => friend_changesets_path
139
140     session[:user] = private_user.id
141
142     get :index, :params => { :friends => true }
143     assert_response :success
144     assert_template "history"
145
146     get :index, :params => { :friends => true, :list => "1" }, :xhr => true
147     assert_response :success
148     assert_template "index"
149
150     check_index_result(Changeset.where(:user => private_user.friend_users.identifiable))
151   end
152
153   ##
154   # Checks the display of the nearby user changesets listing
155   def test_index_nearby
156     private_user = create(:user, :data_public => false, :home_lat => 51.1, :home_lon => 1.0)
157     user = create(:user, :home_lat => 51.0, :home_lon => 1.0)
158     create(:changeset, :user => user)
159
160     get :index, :params => { :nearby => true }
161     assert_response :redirect
162     assert_redirected_to :controller => :users, :action => :login, :referer => nearby_changesets_path
163
164     session[:user] = private_user.id
165
166     get :index, :params => { :nearby => true }
167     assert_response :success
168     assert_template "history"
169
170     get :index, :params => { :nearby => true, :list => "1" }, :xhr => true
171     assert_response :success
172     assert_template "index"
173
174     check_index_result(Changeset.where(:user => user.nearby))
175   end
176
177   ##
178   # Check that we can't request later pages of the changesets index
179   def test_index_max_id
180     get :index, :params => { :format => "html", :max_id => 4 }, :xhr => true
181     assert_response :success
182     assert_template "history"
183     assert_template :layout => "xhr"
184     assert_select "h2", :text => "Changesets", :count => 1
185
186     get :index, :params => { :format => "html", :list => "1", :max_id => 4 }, :xhr => true
187     assert_response :success
188     assert_template "index"
189
190     check_index_result(Changeset.where("id <= 4"))
191   end
192
193   ##
194   # Check that a list with a next page link works
195   def test_index_more
196     create_list(:changeset, 50)
197
198     get :index, :params => { :format => "html" }
199     assert_response :success
200
201     get :index, :params => { :format => "html" }, :xhr => true
202     assert_response :success
203   end
204
205   ##
206   # This should display the last 20 non-empty changesets
207   def test_feed
208     changeset = create(:changeset, :num_changes => 1)
209     create(:changeset_tag, :changeset => changeset)
210     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
211     closed_changeset = create(:changeset, :closed, :num_changes => 1)
212     _empty_changeset = create(:changeset, :num_changes => 0)
213
214     get :feed, :params => { :format => :atom }
215     assert_response :success
216     assert_template "index"
217     assert_equal "application/atom+xml", response.content_type
218
219     check_feed_result([changeset, closed_changeset])
220   end
221
222   ##
223   # This should display the last 20 changesets closed in a specific area
224   def test_feed_bbox
225     changeset = create(:changeset, :num_changes => 1, :min_lat => 5 * GeoRecord::SCALE, :min_lon => 5 * GeoRecord::SCALE, :max_lat => 5 * GeoRecord::SCALE, :max_lon => 5 * GeoRecord::SCALE)
226     create(:changeset_tag, :changeset => changeset)
227     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
228     closed_changeset = create(:changeset, :closed, :num_changes => 1, :min_lat => 5 * GeoRecord::SCALE, :min_lon => 5 * GeoRecord::SCALE, :max_lat => 5 * GeoRecord::SCALE, :max_lon => 5 * GeoRecord::SCALE)
229     _elsewhere_changeset = create(:changeset, :num_changes => 1, :min_lat => -5 * GeoRecord::SCALE, :min_lon => -5 * GeoRecord::SCALE, :max_lat => -5 * GeoRecord::SCALE, :max_lon => -5 * GeoRecord::SCALE)
230     _empty_changeset = create(:changeset, :num_changes => 0, :min_lat => -5 * GeoRecord::SCALE, :min_lon => -5 * GeoRecord::SCALE, :max_lat => -5 * GeoRecord::SCALE, :max_lon => -5 * GeoRecord::SCALE)
231
232     get :feed, :params => { :format => :atom, :bbox => "4.5,4.5,5.5,5.5" }
233     assert_response :success
234     assert_template "index"
235     assert_equal "application/atom+xml", response.content_type
236
237     check_feed_result([changeset, closed_changeset])
238   end
239
240   ##
241   # Checks the display of the user changesets feed
242   def test_feed_user
243     user = create(:user)
244     changesets = create_list(:changeset, 3, :user => user, :num_changes => 4)
245     create(:changeset_tag, :changeset => changesets[1])
246     create(:changeset_tag, :changeset => changesets[1], :k => "website", :v => "http://example.com/")
247     _other_changeset = create(:changeset)
248
249     get :feed, :params => { :format => :atom, :display_name => user.display_name }
250
251     assert_response :success
252     assert_template "index"
253     assert_equal "application/atom+xml", response.content_type
254
255     check_feed_result(changesets)
256   end
257
258   ##
259   # Check the not found of the user changesets feed
260   def test_feed_user_not_found
261     get :feed, :params => { :format => "atom", :display_name => "Some random user" }
262     assert_response :not_found
263   end
264
265   ##
266   # Check that we can't request later pages of the changesets feed
267   def test_feed_max_id
268     get :feed, :params => { :format => "atom", :max_id => 100 }
269     assert_response :redirect
270     assert_redirected_to :action => :feed
271   end
272
273   private
274
275   ##
276   # check the result of a index
277   def check_index_result(changesets)
278     changesets = changesets.where("num_changes > 0")
279                            .order(:created_at => :desc)
280                            .limit(20)
281     assert changesets.size <= 20
282
283     assert_select "ol.changesets", :count => [changesets.size, 1].min do
284       assert_select "li", :count => changesets.size
285
286       changesets.each do |changeset|
287         assert_select "li#changeset_#{changeset.id}", :count => 1
288       end
289     end
290   end
291
292   ##
293   # check the result of a feed
294   def check_feed_result(changesets)
295     assert changesets.size <= 20
296
297     assert_select "feed", :count => [changesets.size, 1].min do
298       assert_select "> title", :count => 1, :text => /^Changesets/
299       assert_select "> entry", :count => changesets.size
300
301       changesets.each do |changeset|
302         assert_select "> entry > id", changeset_url(:id => changeset.id)
303       end
304     end
305   end
306 end