]> git.openstreetmap.org Git - rails.git/blob - test/integration/compressed_requests_test.rb
Add frozen_string_literal comments to ruby files
[rails.git] / test / integration / compressed_requests_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class CompressedRequestsTest < ActionDispatch::IntegrationTest
6   def test_no_compression
7     user = create(:user)
8     changeset = create(:changeset, :user => user)
9
10     node = create(:node)
11     way = create(:way)
12     relation = create(:relation)
13     other_relation = create(:relation)
14     # Create some tags, since we test that they are removed later
15     create(:node_tag, :node => node)
16     create(:way_tag, :way => way)
17     create(:relation_tag, :relation => relation)
18
19     # simple diff to change a node, way and relation by removing
20     # their tags
21     diff = <<~CHANGESET
22       <osmChange>
23        <modify>
24         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
25         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
26          <nd ref='#{node.id}'/>
27         </way>
28        </modify>
29        <modify>
30         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
31          <member type='way' role='some' ref='#{way.id}'/>
32          <member type='node' role='some' ref='#{node.id}'/>
33          <member type='relation' role='some' ref='#{other_relation.id}'/>
34         </relation>
35        </modify>
36       </osmChange>
37     CHANGESET
38
39     # upload it
40     post "/api/0.6/changeset/#{changeset.id}/upload",
41          :params => diff,
42          :headers => bearer_authorization_header(user).merge(
43            "Content-Type" => "application/xml"
44          )
45     assert_response :success,
46                     "can't upload an uncompressed diff to changeset: #{@response.body}"
47
48     # check that the changes made it into the database
49     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
50     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
51     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
52   end
53
54   def test_gzip_compression
55     user = create(:user)
56     changeset = create(:changeset, :user => user)
57
58     node = create(:node)
59     way = create(:way)
60     relation = create(:relation)
61     other_relation = create(:relation)
62     # Create some tags, since we test that they are removed later
63     create(:node_tag, :node => node)
64     create(:way_tag, :way => way)
65     create(:relation_tag, :relation => relation)
66
67     # simple diff to change a node, way and relation by removing
68     # their tags
69     diff = <<~CHANGESET
70       <osmChange>
71        <modify>
72         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
73         <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
74          <nd ref='#{node.id}'/>
75         </way>
76        </modify>
77        <modify>
78         <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
79          <member type='way' role='some' ref='#{way.id}'/>
80          <member type='node' role='some' ref='#{node.id}'/>
81          <member type='relation' role='some' ref='#{other_relation.id}'/>
82         </relation>
83        </modify>
84       </osmChange>
85     CHANGESET
86
87     # upload it
88     post "/api/0.6/changeset/#{changeset.id}/upload",
89          :params => gzip_content(diff),
90          :headers => bearer_authorization_header(user).merge(
91            "Content-Encoding" => "gzip",
92            "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
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 => bearer_authorization_header(user).merge(
140            "Content-Encoding" => "deflate",
141            "Content-Type" => "application/xml"
142          )
143     assert_response :success,
144                     "can't upload a deflate compressed diff to changeset: #{@response.body}"
145
146     # check that the changes made it into the database
147     assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
148     assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
149     assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
150   end
151
152   def test_invalid_compression
153     user = create(:user)
154     changeset = create(:changeset, :user => user)
155
156     # upload it
157     post "/api/0.6/changeset/#{changeset.id}/upload",
158          :params => "",
159          :headers => bearer_authorization_header(user).merge(
160            "Content-Encoding" => "unknown",
161            "Content-Type" => "application/xml"
162          )
163     assert_response :unsupported_media_type
164   end
165
166   private
167
168   def gzip_content(uncompressed)
169     compressed = StringIO.new
170     gz = Zlib::GzipWriter.new(compressed)
171     gz.write(uncompressed)
172     gz.close
173     compressed.string
174   end
175
176   def deflate_content(uncompressed)
177     Zlib::Deflate.deflate(uncompressed)
178   end
179 end