source: subversion/sites/rails_port/test/functional/api_controller_test.rb @ 17044

Last change on this file since 17044 was 17044, checked in by tomhughes, 10 years ago

Add extra visibility options for GPS traces, and enhance the API call
that returns trace data to return more information if the owner of the
trace has allowed it. Based on a patch from Matt Amos.

File size: 10.3 KB
Line 
1require File.dirname(__FILE__) + '/../test_helper'
2require 'api_controller'
3
4class ApiControllerTest < ActionController::TestCase
5  api_fixtures
6 
7  def setup
8    super
9    @badbigbbox = %w{ -0.1,-0.1,1.1,1.1  10,10,11,11 }
10    @badmalformedbbox = %w{ -0.1  hello
11    10N2W10.1N2.1W }
12    @badlatmixedbbox = %w{ 0,0.1,0.1,0  -0.1,80,0.1,70  0.24,54.34,0.25,54.33 }
13    @badlonmixedbbox = %w{ 80,-0.1,70,0.1  54.34,0.24,54.33,0.25 } 
14    #@badlatlonoutboundsbbox = %w{ 191,-0.1,193,0.1  -190.1,89.9,-190,90 }
15    @goodbbox = %w{ -0.1,-0.1,0.1,0.1  51.1,-0.1,51.2,0
16    -0.1,%20-0.1,%200.1,%200.1  -0.1edcd,-0.1d,0.1,0.1  -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1}
17    # That last item in the goodbbox really shouldn't be there, as the API should
18    # reall reject it, however this is to test to see if the api changes.
19  end
20
21  # -------------------------------------
22  # Test reading a bounding box.
23  # -------------------------------------
24
25  def test_map
26    node = current_nodes(:used_node_1)
27    # Need to split the min/max lat/lon out into their own variables here
28    # so that we can test they are returned later.
29    minlon = node.lon-0.1
30    minlat = node.lat-0.1
31    maxlon = node.lon+0.1
32    maxlat = node.lat+0.1
33    bbox = "#{minlon},#{minlat},#{maxlon},#{maxlat}"
34    get :map, :bbox => bbox
35    if $VERBOSE
36      print @request.to_yaml
37      print @response.body
38    end
39    assert_response :success, "Expected scucess with the map call"
40    assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']:root", :count => 1 do
41      assert_select "bounds[minlon=#{minlon}][minlat=#{minlat}][maxlon=#{maxlon}][maxlat=#{maxlat}]", :count => 1
42      assert_select "node[id=#{node.id}][lat=#{node.lat}][lon=#{node.lon}][version=#{node.version}][changeset=#{node.changeset_id}][visible=#{node.visible}][timestamp=#{node.timestamp.xmlschema}]", :count => 1 do
43        # This should really be more generic
44        assert_select "tag[k='test'][v='yes']"
45      end
46      # Should also test for the ways and relation
47    end
48  end
49 
50  # This differs from the above test in that we are making the bbox exactly
51  # the same as the node we are looking at
52  def test_map_inclusive
53    node = current_nodes(:used_node_1)
54    bbox = "#{node.lon},#{node.lat},#{node.lon},#{node.lat}"
55    get :map, :bbox => bbox
56    #print @response.body
57    assert_response :success, "The map call should have succeeded"
58    assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']:root:empty", :count => 1
59  end
60 
61  def test_tracepoints
62    point = gpx_files(:public_trace_file)
63    minlon = point.longitude-0.001
64    minlat = point.latitude-0.001
65    maxlon = point.longitude+0.001
66    maxlat = point.latitude+0.001
67    bbox = "#{minlon},#{minlat},#{maxlon},#{maxlat}"
68    get :trackpoints, :bbox => bbox
69    #print @response.body
70    assert_response :success
71    assert_select "gpx[version=1.0][creator=OpenStreetMap.org][xmlns=http://www.topografix.com/GPX/1/0/]:root", :count => 1 do
72      assert_select "trk" do
73        assert_select "trkseg"
74      end
75    end
76  end
77 
78  def test_tracepoints_trackable
79    point = gpx_files(:trackable_trace_file)
80    minlon = point.longitude-0.002
81    minlat = point.latitude-0.002
82    maxlon = point.longitude+0.002
83    maxlat = point.latitude+0.002
84    bbox = "#{minlon},#{minlat},#{maxlon},#{maxlat}"
85    get :trackpoints, :bbox => bbox
86    #print @response.body
87    assert_response :success
88    assert_select "gpx[version=1.0][creator=OpenStreetMap.org][xmlns=http://www.topografix.com/GPX/1/0/]:root", :count => 1 do
89      assert_select "trk", :count => 1 do
90        assert_select "trk > trkseg", :count => 2 do |trksegs|
91          trksegs.each do |trkseg|
92            assert_select trkseg, "trkpt", :count => 1 do |trkpt|
93              assert_select trkpt[0], "time", :count => 1
94            end
95          end
96        end
97      end
98    end
99  end
100 
101  def test_tracepoints_identifiable
102    point = gpx_files(:identifiable_trace_file)
103    minlon = point.longitude-0.002
104    minlat = point.latitude-0.002
105    maxlon = point.longitude+0.002
106    maxlat = point.latitude+0.002
107    bbox = "#{minlon},#{minlat},#{maxlon},#{maxlat}"
108    get :trackpoints, :bbox => bbox
109    #print @response.body
110    assert_response :success
111    assert_select "gpx[version=1.0][creator=OpenStreetMap.org][xmlns=http://www.topografix.com/GPX/1/0/]:root", :count => 1 do
112      assert_select "trk", :count => 1 do
113        assert_select "trk>name", :count => 1
114        assert_select "trk>desc", :count => 1
115        assert_select "trk>url", :count => 1
116        assert_select "trkseg", :count => 1 do
117          assert_select "trkpt", :count => 1 do
118            assert_select "time", :count => 1
119          end
120        end
121      end
122    end
123  end
124 
125  def test_map_without_bbox
126    ["trackpoints", "map"].each do |tq|
127      get tq
128      assert_response :bad_request
129      assert_equal "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat", @response.body, "A bbox param was expected"
130    end
131  end
132 
133  def test_traces_page_less_than_0
134    -10.upto(-1) do |i|
135      get :trackpoints, :page => i, :bbox => "-0.1,-0.1,0.1,0.1"
136      assert_response :bad_request
137      assert_equal "Page number must be greater than or equal to 0", @response.body, "The page number was #{i}"
138    end
139    0.upto(10) do |i|
140      get :trackpoints, :page => i, :bbox => "-0.1,-0.1,0.1,0.1"
141      assert_response :success, "The page number was #{i} and should have been accepted"
142    end
143  end
144 
145  def test_bbox_too_big
146    @badbigbbox.each do |bbox|
147      [ "trackpoints", "map" ].each do |tq|
148        get tq, :bbox => bbox
149        assert_response :bad_request, "The bbox:#{bbox} was expected to be too big"
150        assert_equal "The maximum bbox size is #{APP_CONFIG['max_request_area']}, and your request was too large. Either request a smaller area, or use planet.osm", @response.body, "bbox: #{bbox}"
151      end
152    end
153  end
154 
155  def test_bbox_malformed
156    @badmalformedbbox.each do |bbox|
157      [ "trackpoints", "map" ].each do |tq|
158        get tq, :bbox => bbox
159        assert_response :bad_request, "The bbox:#{bbox} was expected to be malformed"
160        assert_equal "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat", @response.body, "bbox: #{bbox}"
161      end
162    end
163  end
164 
165  def test_bbox_lon_mixedup
166    @badlonmixedbbox.each do |bbox|
167      [ "trackpoints", "map" ].each do |tq|
168        get tq, :bbox => bbox
169        assert_response :bad_request, "The bbox:#{bbox} was expected to have the longitude mixed up"
170        assert_equal "The minimum longitude must be less than the maximum longitude, but it wasn't", @response.body, "bbox: #{bbox}"
171      end
172    end
173  end
174 
175  def test_bbox_lat_mixedup
176    @badlatmixedbbox.each do |bbox|
177      ["trackpoints", "map"].each do |tq|
178        get tq, :bbox => bbox
179        assert_response :bad_request, "The bbox:#{bbox} was expected to have the latitude mixed up"
180        assert_equal "The minimum latitude must be less than the maximum latitude, but it wasn't", @response.body, "bbox: #{bbox}"
181      end
182    end
183  end
184 
185  # We can't actually get an out of bounds error, as the bbox is sanitised.
186  #def test_latlon_outofbounds
187  #  @badlatlonoutboundsbbox.each do |bbox|
188  #    [ "trackpoints", "map" ].each do |tq|
189  #      get tq, :bbox => bbox
190  #      #print @request.to_yaml
191  #      assert_response :bad_request, "The bbox #{bbox} was expected to be out of range"
192  #      assert_equal "The latitudes must be between -90 an 90, and longitudes between -180 and 180", @response.body, "bbox: #{bbox}"
193  #    end
194  #  end
195  #end
196 
197  # MySQL and Postgres require that the C based functions are installed for
198  # this test to work. More information is available from:
199  # http://wiki.openstreetmap.org/wiki/Rails#Installing_the_quadtile_functions
200  # or by looking at the readme in db/README
201  def test_changes_simple
202    get :changes
203    assert_response :success
204    #print @response.body
205    # As we have loaded the fixtures, we can assume that there are no
206    # changes recently
207    now = Time.now.getutc
208    hourago = now - 1.hour
209    # Note that this may fail on a very slow machine, so isn't a great test
210    assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']:root", :count => 1 do
211      assert_select "changes[starttime='#{hourago.xmlschema}'][endtime='#{now.xmlschema}']", :count => 1
212    end
213  end
214 
215  def test_changes_zoom_invalid
216    zoom_to_test = %w{ p -1 0 17 one two }
217    zoom_to_test.each do |zoom|
218      get :changes, :zoom => zoom
219      assert_response :bad_request
220      assert_equal @response.body, "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours"
221    end
222  end
223 
224  def test_changes_zoom_valid
225    1.upto(16) do |zoom|
226      get :changes, :zoom => zoom
227      assert_response :success
228      # NOTE: there was a test here for the timing, but it was too sensitive to be a good test
229      # and it was annoying.
230      assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']:root", :count => 1 do
231        assert_select "changes", :count => 1
232      end
233    end
234  end
235 
236  def test_start_end_time_invalid
237   
238  end
239 
240  def test_start_end_time_invalid
241   
242  end
243 
244  def test_hours_invalid
245    invalid = %w{ -21 335 -1 0 25 26 100 one two three ping pong : }
246    invalid.each do |hour|
247      get :changes, :hours => hour
248      assert_response :bad_request, "Problem with the hour: #{hour}"
249      assert_equal @response.body, "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours", "Problem with the hour: #{hour}."
250    end
251  end
252 
253  def test_hours_valid
254    1.upto(24) do |hour|
255      get :changes, :hours => hour
256      assert_response :success
257    end
258  end
259 
260  def test_capabilities
261    get :capabilities
262    assert_response :success
263    assert_select "osm:root[version='#{API_VERSION}'][generator='#{GENERATOR}']", :count => 1 do
264      assert_select "api", :count => 1 do
265        assert_select "version[minimum=#{API_VERSION}][maximum=#{API_VERSION}]", :count => 1
266        assert_select "area[maximum=#{APP_CONFIG['max_request_area']}]", :count => 1
267        assert_select "tracepoints[per_page=#{APP_CONFIG['tracepoints_per_page']}]", :count => 1
268        assert_select "changesets[maximum_elements=#{Changeset::MAX_ELEMENTS}]", :count => 1
269      end
270    end
271  end
272end
Note: See TracBrowser for help on using the repository browser.