]> git.openstreetmap.org Git - rails.git/blob - test/controllers/api/changesets/uploads_controller_test.rb
Split and move api changeset test_upload_simple_valid
[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       # -------------------------------------
67       # Test modifying elements.
68       # -------------------------------------
69
70       def test_upload_modify_elements
71         user = create(:user)
72         changeset = create(:changeset, :user => user)
73         node = create(:node, :latitude => 0, :longitude => 0)
74         way = create(:way)
75         relation = create(:relation)
76         other_relation = create(:relation)
77
78         # create some tags, since we test that they are removed later
79         create(:node_tag, :node => node)
80         create(:way_tag, :way => way)
81         create(:relation_tag, :relation => relation)
82
83         # simple diff to change a node, way and relation by removing their tags
84         diff = <<~CHANGESET
85           <osmChange>
86             <modify>
87               <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='1'/>
88               <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
89                 <nd ref='#{node.id}'/>
90               </way>
91             </modify>
92             <modify>
93               <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
94                 <member type='way' role='some' ref='#{way.id}'/>
95                 <member type='node' role='some' ref='#{node.id}'/>
96                 <member type='relation' role='some' ref='#{other_relation.id}'/>
97               </relation>
98             </modify>
99           </osmChange>
100         CHANGESET
101
102         auth_header = bearer_authorization_header user
103
104         post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header
105
106         assert_response :success
107
108         assert_dom "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 do
109           assert_dom "> node", 1 do
110             assert_dom "> @old_id", node.id.to_s
111             assert_dom "> @new_id", node.id.to_s
112             assert_dom "> @new_version", "2"
113           end
114           assert_dom "> way", 1 do
115             assert_dom "> @old_id", way.id.to_s
116             assert_dom "> @new_id", way.id.to_s
117             assert_dom "> @new_version", "2"
118           end
119           assert_dom "> relation", 1 do
120             assert_dom "> @old_id", relation.id.to_s
121             assert_dom "> @new_id", relation.id.to_s
122             assert_dom "> @new_version", "2"
123           end
124         end
125
126         changeset.reload
127         assert_equal 3, changeset.num_changes
128         node.reload
129         assert_equal 2, node.version
130         assert_equal 2 * GeoRecord::SCALE, node.latitude
131         assert_equal 1 * GeoRecord::SCALE, node.longitude
132         assert_equal 0, node.tags.size, "node #{node.id} should now have no tags"
133         way.reload
134         assert_equal 2, way.version
135         assert_equal 0, way.tags.size, "way #{way.id} should now have no tags"
136         assert_equal [node], way.nodes
137         relation.reload
138         assert_equal 2, relation.version
139         assert_equal 0, relation.tags.size, "relation #{relation.id} should now have no tags"
140         assert_equal [["Way", way.id, "some"], ["Node", node.id, "some"], ["Relation", other_relation.id, "some"]], relation.members
141       end
142     end
143   end
144 end