]> git.openstreetmap.org Git - rails.git/blob - test/integration/compressed_requests_test.rb
Merge branch 'pull/5117'
[rails.git] / test / integration / compressed_requests_test.rb
1 require "test_helper"
2
3 class CompressedRequestsTest < ActionDispatch::IntegrationTest
4   def test_no_compression
5     user = create(:user)
6     changeset = create(:changeset, :user => user)
7
8     node = create(:node)
9     way = create(:way)
10     relation = create(:relation)
11     other_relation = create(:relation)
12     # Create some tags, since we test that they are removed later
13     create(:node_tag, :node => node)
14     create(:way_tag, :way => way)
15     create(:relation_tag, :relation => relation)
16
17     # simple diff to change a node, way and relation by removing
18     # their tags
19     diff = <<~CHANGESET
20       <osmChange>
21        <modify>
22         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
23         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
24          <nd ref='#{node.id}'/>
25         </way>
26        </modify>
27        <modify>
28         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
29          <member type='way' role='some' ref='#{way.id}'/>
30          <member type='node' role='some' ref='#{node.id}'/>
31          <member type='relation' role='some' ref='#{other_relation.id}'/>
32         </relation>
33        </modify>
34       </osmChange>
35     CHANGESET
36
37     # upload it
38     post "/api/0.6/changeset/#{changeset.id}/upload",
39          :params => diff,
40          :headers => bearer_authorization_header(user).merge(
41            "HTTP_CONTENT_TYPE" => "application/xml"
42          )
43     assert_response :success,
44                     "can't upload an uncompressed diff to changeset: #{@response.body}"
45
46     # check that the changes made it into the database
47     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
48     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
49     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
50   end
51
52   def test_gzip_compression
53     user = create(:user)
54     changeset = create(:changeset, :user => user)
55
56     node = create(:node)
57     way = create(:way)
58     relation = create(:relation)
59     other_relation = create(:relation)
60     # Create some tags, since we test that they are removed later
61     create(:node_tag, :node => node)
62     create(:way_tag, :way => way)
63     create(:relation_tag, :relation => relation)
64
65     # simple diff to change a node, way and relation by removing
66     # their tags
67     diff = <<~CHANGESET
68       <osmChange>
69        <modify>
70         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
71         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
72          <nd ref='#{node.id}'/>
73         </way>
74        </modify>
75        <modify>
76         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
77          <member type='way' role='some' ref='#{way.id}'/>
78          <member type='node' role='some' ref='#{node.id}'/>
79          <member type='relation' role='some' ref='#{other_relation.id}'/>
80         </relation>
81        </modify>
82       </osmChange>
83     CHANGESET
84
85     # upload it
86     post "/api/0.6/changeset/#{changeset.id}/upload",
87          :params => gzip_content(diff),
88          :headers => bearer_authorization_header(user).merge(
89            "HTTP_CONTENT_ENCODING" => "gzip",
90            "HTTP_CONTENT_TYPE" => "application/xml"
91          )
92     assert_response :success,
93                     "can't upload a gzip compressed diff to changeset: #{@response.body}"
94
95     # check that the changes made it into the database
96     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
97     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
98     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
99   end
100
101   def test_deflate_compression
102     user = create(:user)
103     changeset = create(:changeset, :user => user)
104
105     node = create(:node)
106     way = create(:way)
107     relation = create(:relation)
108     other_relation = create(:relation)
109     # Create some tags, since we test that they are removed later
110     create(:node_tag, :node => node)
111     create(:way_tag, :way => way)
112     create(:relation_tag, :relation => relation)
113
114     # simple diff to change a node, way and relation by removing
115     # their tags
116     diff = <<~CHANGESET
117       <osmChange>
118        <modify>
119         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
120         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
121          <nd ref='#{node.id}'/>
122         </way>
123        </modify>
124        <modify>
125         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
126          <member type='way' role='some' ref='#{way.id}'/>
127          <member type='node' role='some' ref='#{node.id}'/>
128          <member type='relation' role='some' ref='#{other_relation.id}'/>
129         </relation>
130        </modify>
131       </osmChange>
132     CHANGESET
133
134     # upload it
135     post "/api/0.6/changeset/#{changeset.id}/upload",
136          :params => deflate_content(diff),
137          :headers => bearer_authorization_header(user).merge(
138            "HTTP_CONTENT_ENCODING" => "deflate",
139            "HTTP_CONTENT_TYPE" => "application/xml"
140          )
141     assert_response :success,
142                     "can't upload a deflate compressed diff to changeset: #{@response.body}"
143
144     # check that the changes made it into the database
145     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
146     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
147     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
148   end
149
150   def test_invalid_compression
151     user = create(:user)
152     changeset = create(:changeset, :user => user)
153
154     # upload it
155     post "/api/0.6/changeset/#{changeset.id}/upload",
156          :params => "",
157          :headers => bearer_authorization_header(user).merge(
158            "HTTP_CONTENT_ENCODING" => "unknown",
159            "HTTP_CONTENT_TYPE" => "application/xml"
160          )
161     assert_response :unsupported_media_type
162   end
163
164   private
165
166   def gzip_content(uncompressed)
167     compressed = StringIO.new
168     gz = Zlib::GzipWriter.new(compressed)
169     gz.write(uncompressed)
170     gz.close
171     compressed.string
172   end
173
174   def deflate_content(uncompressed)
175     Zlib::Deflate.deflate(uncompressed)
176   end
177 end