Merge remote-tracking branch 'upstream/pull/2051'
[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.strip_heredoc
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 => {
41            "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
42            "HTTP_CONTENT_TYPE" => "application/xml"
43          }
44     assert_response :success,
45                     "can't upload an uncompressed diff to changeset: #{@response.body}"
46
47     # check that the changes made it into the database
48     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
49     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
50     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
51   end
52
53   def test_gzip_compression
54     user = create(:user)
55     changeset = create(:changeset, :user => user)
56
57     node = create(:node)
58     way = create(:way)
59     relation = create(:relation)
60     other_relation = create(:relation)
61     # Create some tags, since we test that they are removed later
62     create(:node_tag, :node => node)
63     create(:way_tag, :way => way)
64     create(:relation_tag, :relation => relation)
65
66     # simple diff to change a node, way and relation by removing
67     # their tags
68     diff = <<CHANGESET.strip_heredoc
69       <osmChange>
70        <modify>
71         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
72         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
73          <nd ref='#{node.id}'/>
74         </way>
75        </modify>
76        <modify>
77         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
78          <member type='way' role='some' ref='#{way.id}'/>
79          <member type='node' role='some' ref='#{node.id}'/>
80          <member type='relation' role='some' ref='#{other_relation.id}'/>
81         </relation>
82        </modify>
83       </osmChange>
84 CHANGESET
85
86     # upload it
87     post "/api/0.6/changeset/#{changeset.id}/upload",
88          :params => gzip_content(diff),
89          :headers => {
90            "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
91            "HTTP_CONTENT_ENCODING" => "gzip",
92            "HTTP_CONTENT_TYPE" => "application/xml"
93          }
94     assert_response :success,
95                     "can't upload a gzip compressed diff to changeset: #{@response.body}"
96
97     # check that the changes made it into the database
98     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
99     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
100     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
101   end
102
103   def test_deflate_compression
104     user = create(:user)
105     changeset = create(:changeset, :user => user)
106
107     node = create(:node)
108     way = create(:way)
109     relation = create(:relation)
110     other_relation = create(:relation)
111     # Create some tags, since we test that they are removed later
112     create(:node_tag, :node => node)
113     create(:way_tag, :way => way)
114     create(:relation_tag, :relation => relation)
115
116     # simple diff to change a node, way and relation by removing
117     # their tags
118     diff = <<CHANGESET.strip_heredoc
119       <osmChange>
120        <modify>
121         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
122         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
123          <nd ref='#{node.id}'/>
124         </way>
125        </modify>
126        <modify>
127         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
128          <member type='way' role='some' ref='#{way.id}'/>
129          <member type='node' role='some' ref='#{node.id}'/>
130          <member type='relation' role='some' ref='#{other_relation.id}'/>
131         </relation>
132        </modify>
133       </osmChange>
134 CHANGESET
135
136     # upload it
137     post "/api/0.6/changeset/#{changeset.id}/upload",
138          :params => deflate_content(diff),
139          :headers => {
140            "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
141            "HTTP_CONTENT_ENCODING" => "deflate",
142            "HTTP_CONTENT_TYPE" => "application/xml"
143          }
144     assert_response :success,
145                     "can't upload a deflate compressed diff to changeset: #{@response.body}"
146
147     # check that the changes made it into the database
148     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
149     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
150     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
151   end
152
153   def test_invalid_compression
154     user = create(:user)
155     changeset = create(:changeset, :user => user)
156
157     # upload it
158     post "/api/0.6/changeset/#{changeset.id}/upload",
159          :params => "",
160          :headers => {
161            "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
162            "HTTP_CONTENT_ENCODING" => "unknown",
163            "HTTP_CONTENT_TYPE" => "application/xml"
164          }
165     assert_response :unsupported_media_type
166   end
167
168   private
169
170   def gzip_content(uncompressed)
171     compressed = StringIO.new
172     gz = Zlib::GzipWriter.new(compressed)
173     gz.write(uncompressed)
174     gz.close
175     compressed.string
176   end
177
178   def deflate_content(uncompressed)
179     Zlib::Deflate.deflate(uncompressed)
180   end
181 end