1 # frozen_string_literal: true
5 class CompressedRequestsTest < ActionDispatch::IntegrationTest
6 def test_no_compression
8 changeset = create(:changeset, :user => user)
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)
19 # simple diff to change a node, way and relation by removing
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}'/>
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}'/>
40 post "/api/0.6/changeset/#{changeset.id}/upload",
42 :headers => bearer_authorization_header(user).merge(
43 "Content-Type" => "application/xml"
45 assert_response :success,
46 "can't upload an uncompressed diff to changeset: #{@response.body}"
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"
54 def test_gzip_compression
56 changeset = create(:changeset, :user => user)
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)
67 # simple diff to change a node, way and relation by removing
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}'/>
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}'/>
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"
94 assert_response :success,
95 "can't upload a gzip compressed diff to changeset: #{@response.body}"
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"
103 def test_deflate_compression
105 changeset = create(:changeset, :user => user)
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)
116 # simple diff to change a node, way and relation by removing
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}'/>
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}'/>
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"
143 assert_response :success,
144 "can't upload a deflate compressed diff to changeset: #{@response.body}"
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"
152 def test_invalid_compression
154 changeset = create(:changeset, :user => user)
157 post "/api/0.6/changeset/#{changeset.id}/upload",
159 :headers => bearer_authorization_header(user).merge(
160 "Content-Encoding" => "unknown",
161 "Content-Type" => "application/xml"
163 assert_response :unsupported_media_type
168 def gzip_content(uncompressed)
169 compressed = StringIO.new
170 gz = Zlib::GzipWriter.new(compressed)
171 gz.write(uncompressed)
176 def deflate_content(uncompressed)
177 Zlib::Deflate.deflate(uncompressed)