Factor out loading of the various fixtures needed to test API calls
[rails.git] / test / functional / segment_controller_test.rb
1 require File.dirname(__FILE__) + '/../test_helper'
2 require 'segment_controller'
3
4 # Re-raise errors caught by the controller.
5 class SegmentController; def rescue_action(e) raise e end; end
6
7 class SegmentControllerTest < Test::Unit::TestCase
8   api_fixtures
9
10   def setup
11     @controller = SegmentController.new
12     @request    = ActionController::TestRequest.new
13     @response   = ActionController::TestResponse.new
14   end
15
16   def test_create
17     # cannot read password from fixture as it is stored as MD5 digest
18     basic_authorization("test@openstreetmap.org", "test");  
19     na = current_nodes(:used_node_1).id
20     nb = current_nodes(:used_node_2).id
21     content("<osm><segment from='#{na}' to='#{nb}' /></osm>")
22     put :create
23     # hope for success
24     assert_response :success, "segment upload did not return success status"
25     # read id of created segment and search for it
26     segmentid = @response.body
27     checksegment = Segment.find(segmentid)
28     assert_not_nil checksegment, "uploaded segment not found in data base after upload"
29     # compare values
30     assert_equal na, checksegment.node_a, "saved segment does not match requested from-node"
31     assert_equal nb, checksegment.node_b, "saved segment does not match requested to-node"
32     assert_equal users(:normal_user).id, checksegment.user_id, "saved segment does not belong to user that created it"
33     assert_equal true, checksegment.visible, "saved segment is not visible"
34   end
35
36   def test_create_invalid
37     basic_authorization("test@openstreetmap.org", "test");  
38     # create a segment with one invalid node
39     na = current_nodes(:used_node_1).id
40     nb = 0
41     content("<osm><segment from='#{na}' to='#{nb}' /></osm>")
42     put :create
43     # expect failure
44     assert_response :precondition_failed, "upload of invalid segment did not return 'precondition failed'"
45   end
46
47   def test_read
48     # check that a visible segment is returned properly
49     get :read, :id => current_segments(:visible_segment).id
50     assert_response :success
51     # TODO: check for <segment> tag in return data
52
53     # check that an invisible segment is not returned
54     get :read, :id => current_segments(:invisible_segment).id
55     assert_response :gone
56
57     # check chat a non-existent segment is not returned
58     get :read, :id => 0
59     assert_response :not_found
60   end
61
62   # this tests deletion restrictions - basic deletion is tested in the unit
63   # tests for segment!
64   def test_delete
65
66     # first try to delete segment without auth
67     delete :delete, :id => current_segments(:visible_segment).id
68     assert_response :unauthorized
69
70     # now set auth
71     basic_authorization("test@openstreetmap.org", "test");  
72
73     # this should work
74     delete :delete, :id => current_segments(:visible_segment).id
75     assert_response :success
76
77     # this won't work since the segment is already deleted
78     delete :delete, :id => current_segments(:invisible_segment).id
79     assert_response :gone
80
81     # this won't work since the segment never existed
82     delete :delete, :id => 0
83     assert_response :not_found
84
85     # this won't work since the segment is in use
86     delete :delete, :id => current_segments(:used_segment).id
87     assert_response :precondition_failed
88   end
89
90
91   def basic_authorization(user, pass)
92     @request.env["HTTP_AUTHORIZATION"] = "Basic %s" % Base64.encode64("#{user}:#{pass}")
93   end
94
95   def content(c)
96     @request.env["RAW_POST_DATA"] = c
97   end
98 end