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)