]> git.openstreetmap.org Git - rails.git/blob - test/controllers/api/changesets/uploads_controller_test.rb
Test scopes for api changeset upload
[rails.git] / test / controllers / api / changesets / uploads_controller_test.rb
1 require "test_helper"
2
3 module Api
4   module Changesets
5     class UploadsControllerTest < ActionDispatch::IntegrationTest
6       ##
7       # test all routes which lead to this controller
8       def test_routes
9         assert_routing(
10           { :path => "/api/0.6/changeset/1/upload", :method => :post },
11           { :controller => "api/changesets/uploads", :action => "create", :changeset_id => "1" }
12         )
13       end
14
15       def test_upload_when_unauthorized
16         changeset = create(:changeset)
17         node = create(:node, :latitude => 0, :longitude => 0)
18
19         diff = <<~CHANGESET
20           <osmChange>
21             <modify>
22               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
23             </modify>
24           </osmChange>
25         CHANGESET
26
27         post api_changeset_upload_path(changeset), :params => diff
28
29         assert_response :unauthorized
30
31         changeset.reload
32         assert_equal 0, changeset.num_changes
33         node.reload
34         assert_equal 1, node.version
35         assert_equal 0, node.latitude
36         assert_equal 0, node.longitude
37       end
38
39       def test_upload_by_private_user
40         user = create(:user, :data_public => false)
41         changeset = create(:changeset, :user => user)
42         node = create(:node, :latitude => 0, :longitude => 0)
43
44         diff = <<~CHANGESET
45           <osmChange>
46             <modify>
47               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
48             </modify>
49           </osmChange>
50         CHANGESET
51
52         auth_header = bearer_authorization_header user
53
54         post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header
55
56         assert_response :forbidden
57
58         changeset.reload
59         assert_equal 0, changeset.num_changes
60         node.reload
61         assert_equal 1, node.version
62         assert_equal 0, node.latitude
63         assert_equal 0, node.longitude
64       end
65
66       def test_upload_without_required_scope
67         user = create(:user)
68         changeset = create(:changeset, :user => user)
69         node = create(:node, :latitude => 0, :longitude => 0)
70
71         diff = <<~CHANGESET
72           <osmChange>
73             <modify>
74               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
75             </modify>
76           </osmChange>
77         CHANGESET
78
79         auth_header = bearer_authorization_header user, :scopes => %w[read_prefs]
80
81         post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header
82
83         assert_response :forbidden
84
85         changeset.reload
86         assert_equal 0, changeset.num_changes
87         node.reload
88         assert_equal 1, node.version
89         assert_equal 0, node.latitude
90         assert_equal 0, node.longitude
91       end
92
93       def test_upload_with_required_scope
94         user = create(:user)
95         changeset = create(:changeset, :user => user)
96         node = create(:node, :latitude => 0, :longitude => 0)
97
98         diff = <<~CHANGESET
99           <osmChange>
100             <modify>
101               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
102             </modify>
103           </osmChange>
104         CHANGESET
105
106         auth_header = bearer_authorization_header user, :scopes => %w[write_api]
107
108         post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header
109
110         assert_response :success
111
112         assert_dom "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 do
113           assert_dom "> node", 1 do
114             assert_dom "> @old_id", node.id.to_s
115             assert_dom "> @new_id", node.id.to_s
116             assert_dom "> @new_version", "2"
117           end
118         end
119
120         changeset.reload
121         assert_equal 1, changeset.num_changes
122         node.reload
123         assert_equal 2, node.version
124         assert_equal 2 * GeoRecord::SCALE, node.latitude
125         assert_equal 1 * GeoRecord::SCALE, node.longitude
126       end
127
128       # -------------------------------------
129       # Test modifying elements.
130       # -------------------------------------
131
132       def test_upload_modify_elements
133         user = create(:user)
134         changeset = create(:changeset, :user => user)
135         node = create(:node, :latitude => 0, :longitude => 0)
136         way = create(:way)
137         relation = create(:relation)
138         other_relation = create(:relation)
139
140         # create some tags, since we test that they are removed later
141         create(:node_tag, :node => node)
142         create(:way_tag, :way => way)
143         create(:relation_tag, :relation => relation)
144
145         # simple diff to change a node, way and relation by removing their tags
146         diff = <<~CHANGESET
147           <osmChange>
148             <modify>
149               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
150               <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
151                 <nd ref='#{node.id}'/>
152               </way>
153             </modify>
154             <modify>
155               <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
156                 <member type='way' role='some' ref='#{way.id}'/>
157                 <member type='node' role='some' ref='#{node.id}'/>
158                 <member type='relation' role='some' ref='#{other_relation.id}'/>
159               </relation>
160             </modify>
161           </osmChange>
162         CHANGESET
163
164         auth_header = bearer_authorization_header user
165
166         post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header
167
168         assert_response :success
169
170         assert_dom "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 do
171           assert_dom "> node", 1 do
172             assert_dom "> @old_id", node.id.to_s
173             assert_dom "> @new_id", node.id.to_s
174             assert_dom "> @new_version", "2"
175           end
176           assert_dom "> way", 1 do
177             assert_dom "> @old_id", way.id.to_s
178             assert_dom "> @new_id", way.id.to_s
179             assert_dom "> @new_version", "2"
180           end
181           assert_dom "> relation", 1 do
182             assert_dom "> @old_id", relation.id.to_s
183             assert_dom "> @new_id", relation.id.to_s
184             assert_dom "> @new_version", "2"
185           end
186         end
187
188         changeset.reload
189         assert_equal 3, changeset.num_changes
190         node.reload
191         assert_equal 2, node.version
192         assert_equal 2 * GeoRecord::SCALE, node.latitude
193         assert_equal 1 * GeoRecord::SCALE, node.longitude
194         assert_equal 0, node.tags.size, "node #{node.id} should now have no tags"
195         way.reload
196         assert_equal 2, way.version
197         assert_equal 0, way.tags.size, "way #{way.id} should now have no tags"
198         assert_equal [node], way.nodes
199         relation.reload
200         assert_equal 2, relation.version
201         assert_equal 0, relation.tags.size, "relation #{relation.id} should now have no tags"
202         assert_equal [["Way", way.id, "some"], ["Node", node.id, "some"], ["Relation", other_relation.id, "some"]], relation.members
203       end
204     end
205   end
206 end