]> git.openstreetmap.org Git - rails.git/blob - test/integration/changeset_upload_download_test.rb
Merge remote-tracking branch 'upstream/pull/5439'
[rails.git] / test / integration / changeset_upload_download_test.rb
1 require "test_helper"
2
3 class ChangesetUploadDownloadTest < ActionDispatch::IntegrationTest
4   ##
5   # when we make some simple changes we get the same changes back from the
6   # diff download.
7   def test_diff_download_simple
8     node = create(:node)
9
10     ## First try with a non-public user, which should get a forbidden
11     auth_header = bearer_authorization_header create(:user, :data_public => false)
12
13     # create a temporary changeset
14     xml = "<osm><changeset>" \
15           "<tag k='created_by' v='osm test suite checking changesets'/>" \
16           "</changeset></osm>"
17     post api_changesets_path, :params => xml, :headers => auth_header
18     assert_response :forbidden
19
20     ## Now try with a normal user
21     auth_header = bearer_authorization_header
22
23     # create a temporary changeset
24     xml = "<osm><changeset>" \
25           "<tag k='created_by' v='osm test suite checking changesets'/>" \
26           "</changeset></osm>"
27     post api_changesets_path, :params => xml, :headers => auth_header
28     assert_response :success
29     changeset_id = @response.body.to_i
30
31     # add a diff to it
32     diff = <<~CHANGESET
33       <osmChange>
34         <modify>
35           <node id='#{node.id}' lon='0.0' lat='0.0' changeset='#{changeset_id}' version='1'/>
36           <node id='#{node.id}' lon='0.1' lat='0.0' changeset='#{changeset_id}' version='2'/>
37           <node id='#{node.id}' lon='0.1' lat='0.1' changeset='#{changeset_id}' version='3'/>
38           <node id='#{node.id}' lon='0.1' lat='0.2' changeset='#{changeset_id}' version='4'/>
39           <node id='#{node.id}' lon='0.2' lat='0.2' changeset='#{changeset_id}' version='5'/>
40           <node id='#{node.id}' lon='0.3' lat='0.2' changeset='#{changeset_id}' version='6'/>
41           <node id='#{node.id}' lon='0.3' lat='0.3' changeset='#{changeset_id}' version='7'/>
42           <node id='#{node.id}' lon='0.9' lat='0.9' changeset='#{changeset_id}' version='8'/>
43         </modify>
44       </osmChange>
45     CHANGESET
46
47     # upload it
48     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
49     assert_response :success,
50                     "can't upload multiple versions of an element in a diff: #{@response.body}"
51
52     get api_changeset_download_path(changeset_id)
53     assert_response :success
54
55     assert_dom "osmChange", 1
56     assert_dom "osmChange>modify", 8
57     assert_dom "osmChange>modify>node", 8
58   end
59
60   ##
61   # culled this from josm to ensure that nothing in the way that josm
62   # is formatting the request is causing it to fail.
63   #
64   # NOTE: the error turned out to be something else completely!
65   def test_josm_upload
66     auth_header = bearer_authorization_header
67
68     # create a temporary changeset
69     xml = "<osm><changeset>" \
70           "<tag k='created_by' v='osm test suite checking changesets'/>" \
71           "</changeset></osm>"
72     post api_changesets_path, :params => xml, :headers => auth_header
73     assert_response :success
74     changeset_id = @response.body.to_i
75
76     diff = <<~OSMFILE
77       <osmChange version="0.6" generator="JOSM">
78         <create version="0.6" generator="JOSM">
79           <node id='-1' visible='true' changeset='#{changeset_id}' lat='51.49619982187321' lon='-0.18722061869438314' />
80           <node id='-2' visible='true' changeset='#{changeset_id}' lat='51.496359883909605' lon='-0.18653093576241928' />
81           <node id='-3' visible='true' changeset='#{changeset_id}' lat='51.49598132358285' lon='-0.18719613290981638' />
82           <node id='-4' visible='true' changeset='#{changeset_id}' lat='51.4961591711078' lon='-0.18629015888084607' />
83           <node id='-5' visible='true' changeset='#{changeset_id}' lat='51.49582126021711' lon='-0.18708186591517145' />
84           <node id='-6' visible='true' changeset='#{changeset_id}' lat='51.49591018437858' lon='-0.1861432441734455' />
85           <node id='-7' visible='true' changeset='#{changeset_id}' lat='51.49560784152179' lon='-0.18694719410005425' />
86           <node id='-8' visible='true' changeset='#{changeset_id}' lat='51.49567389979617' lon='-0.1860289771788006' />
87           <node id='-9' visible='true' changeset='#{changeset_id}' lat='51.49543761398892' lon='-0.186820684213126' />
88           <way id='-10' action='modify' visible='true' changeset='#{changeset_id}'>
89             <nd ref='-1' />
90             <nd ref='-2' />
91             <nd ref='-3' />
92             <nd ref='-4' />
93             <nd ref='-5' />
94             <nd ref='-6' />
95             <nd ref='-7' />
96             <nd ref='-8' />
97             <nd ref='-9' />
98             <tag k='highway' v='residential' />
99             <tag k='name' v='Foobar Street' />
100           </way>
101         </create>
102       </osmChange>
103     OSMFILE
104
105     # upload it
106     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
107     assert_response :success,
108                     "can't upload a diff from JOSM: #{@response.body}"
109
110     get api_changeset_download_path(changeset_id)
111     assert_response :success
112
113     assert_dom "osmChange", 1
114     assert_dom "osmChange>create>node", 9
115     assert_dom "osmChange>create>way", 1
116     assert_dom "osmChange>create>way>nd", 9
117     assert_dom "osmChange>create>way>tag", 2
118   end
119
120   ##
121   # when we make some complex changes we get the same changes back from the
122   # diff download.
123   def test_diff_download_complex
124     node = create(:node)
125     node2 = create(:node)
126     way = create(:way)
127     auth_header = bearer_authorization_header
128
129     # create a temporary changeset
130     xml = "<osm><changeset>" \
131           "<tag k='created_by' v='osm test suite checking changesets'/>" \
132           "</changeset></osm>"
133     post api_changesets_path, :params => xml, :headers => auth_header
134     assert_response :success
135     changeset_id = @response.body.to_i
136
137     # add a diff to it
138     diff = <<~CHANGESET
139       <osmChange>
140         <delete>
141           <node id='#{node.id}' lon='0.0' lat='0.0' changeset='#{changeset_id}' version='1'/>
142         </delete>
143         <create>
144           <node id='-1' lon='0.9' lat='0.9' changeset='#{changeset_id}' version='0'/>
145           <node id='-2' lon='0.8' lat='0.9' changeset='#{changeset_id}' version='0'/>
146           <node id='-3' lon='0.7' lat='0.9' changeset='#{changeset_id}' version='0'/>
147         </create>
148         <modify>
149           <node id='#{node2.id}' lon='2.0' lat='1.5' changeset='#{changeset_id}' version='1'/>
150           <way id='#{way.id}' changeset='#{changeset_id}' version='1'>
151             <nd ref='#{node2.id}'/>
152             <nd ref='-1'/>
153             <nd ref='-2'/>
154             <nd ref='-3'/>
155           </way>
156         </modify>
157       </osmChange>
158     CHANGESET
159
160     # upload it
161     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
162     assert_response :success,
163                     "can't upload multiple versions of an element in a diff: #{@response.body}"
164
165     get api_changeset_download_path(changeset_id)
166     assert_response :success
167
168     assert_dom "osmChange", 1
169     assert_dom "osmChange>create", 3
170     assert_dom "osmChange>delete", 1
171     assert_dom "osmChange>modify", 2
172     assert_dom "osmChange>create>node", 3
173     assert_dom "osmChange>delete>node", 1
174     assert_dom "osmChange>modify>node", 1
175     assert_dom "osmChange>modify>way", 1
176   end
177 end