1 # frozen_string_literal: true
 
   5 class ChangesetUploadDownloadTest < ActionDispatch::IntegrationTest
 
   7   # when we make some simple changes we get the same changes back from the
 
   9   def test_diff_download_simple
 
  12     ## First try with a non-public user, which should get a forbidden
 
  13     auth_header = bearer_authorization_header create(:user, :data_public => false)
 
  15     # create a temporary changeset
 
  16     xml = "<osm><changeset>" \
 
  17           "<tag k='created_by' v='osm test suite checking changesets'/>" \
 
  19     post api_changesets_path, :params => xml, :headers => auth_header
 
  20     assert_response :forbidden
 
  22     ## Now try with a normal user
 
  23     auth_header = bearer_authorization_header
 
  25     # create a temporary changeset
 
  26     xml = "<osm><changeset>" \
 
  27           "<tag k='created_by' v='osm test suite checking changesets'/>" \
 
  29     post api_changesets_path, :params => xml, :headers => auth_header
 
  30     assert_response :success
 
  31     changeset_id = @response.body.to_i
 
  37           <node id='#{node.id}' lon='0.0' lat='0.0' changeset='#{changeset_id}' version='1'/>
 
  38           <node id='#{node.id}' lon='0.1' lat='0.0' changeset='#{changeset_id}' version='2'/>
 
  39           <node id='#{node.id}' lon='0.1' lat='0.1' changeset='#{changeset_id}' version='3'/>
 
  40           <node id='#{node.id}' lon='0.1' lat='0.2' changeset='#{changeset_id}' version='4'/>
 
  41           <node id='#{node.id}' lon='0.2' lat='0.2' changeset='#{changeset_id}' version='5'/>
 
  42           <node id='#{node.id}' lon='0.3' lat='0.2' changeset='#{changeset_id}' version='6'/>
 
  43           <node id='#{node.id}' lon='0.3' lat='0.3' changeset='#{changeset_id}' version='7'/>
 
  44           <node id='#{node.id}' lon='0.9' lat='0.9' changeset='#{changeset_id}' version='8'/>
 
  50     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
 
  51     assert_response :success,
 
  52                     "can't upload multiple versions of an element in a diff: #{@response.body}"
 
  54     get api_changeset_download_path(changeset_id)
 
  55     assert_response :success
 
  57     assert_dom "osmChange", 1
 
  58     assert_dom "osmChange>modify", 8
 
  59     assert_dom "osmChange>modify>node", 8
 
  63   # culled this from josm to ensure that nothing in the way that josm
 
  64   # is formatting the request is causing it to fail.
 
  66   # NOTE: the error turned out to be something else completely!
 
  68     auth_header = bearer_authorization_header
 
  70     # create a temporary changeset
 
  71     xml = "<osm><changeset>" \
 
  72           "<tag k='created_by' v='osm test suite checking changesets'/>" \
 
  74     post api_changesets_path, :params => xml, :headers => auth_header
 
  75     assert_response :success
 
  76     changeset_id = @response.body.to_i
 
  79       <osmChange version="0.6" generator="JOSM">
 
  80         <create version="0.6" generator="JOSM">
 
  81           <node id='-1' visible='true' changeset='#{changeset_id}' lat='51.49619982187321' lon='-0.18722061869438314' />
 
  82           <node id='-2' visible='true' changeset='#{changeset_id}' lat='51.496359883909605' lon='-0.18653093576241928' />
 
  83           <node id='-3' visible='true' changeset='#{changeset_id}' lat='51.49598132358285' lon='-0.18719613290981638' />
 
  84           <node id='-4' visible='true' changeset='#{changeset_id}' lat='51.4961591711078' lon='-0.18629015888084607' />
 
  85           <node id='-5' visible='true' changeset='#{changeset_id}' lat='51.49582126021711' lon='-0.18708186591517145' />
 
  86           <node id='-6' visible='true' changeset='#{changeset_id}' lat='51.49591018437858' lon='-0.1861432441734455' />
 
  87           <node id='-7' visible='true' changeset='#{changeset_id}' lat='51.49560784152179' lon='-0.18694719410005425' />
 
  88           <node id='-8' visible='true' changeset='#{changeset_id}' lat='51.49567389979617' lon='-0.1860289771788006' />
 
  89           <node id='-9' visible='true' changeset='#{changeset_id}' lat='51.49543761398892' lon='-0.186820684213126' />
 
  90           <way id='-10' action='modify' visible='true' changeset='#{changeset_id}'>
 
 100             <tag k='highway' v='residential' />
 
 101             <tag k='name' v='Foobar Street' />
 
 108     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
 
 109     assert_response :success,
 
 110                     "can't upload a diff from JOSM: #{@response.body}"
 
 112     get api_changeset_download_path(changeset_id)
 
 113     assert_response :success
 
 115     assert_dom "osmChange", 1
 
 116     assert_dom "osmChange>create>node", 9
 
 117     assert_dom "osmChange>create>way", 1
 
 118     assert_dom "osmChange>create>way>nd", 9
 
 119     assert_dom "osmChange>create>way>tag", 2
 
 123   # when we make some complex changes we get the same changes back from the
 
 125   def test_diff_download_complex
 
 127     node2 = create(:node)
 
 129     auth_header = bearer_authorization_header
 
 131     # create a temporary changeset
 
 132     xml = "<osm><changeset>" \
 
 133           "<tag k='created_by' v='osm test suite checking changesets'/>" \
 
 135     post api_changesets_path, :params => xml, :headers => auth_header
 
 136     assert_response :success
 
 137     changeset_id = @response.body.to_i
 
 143           <node id='#{node.id}' lon='0.0' lat='0.0' changeset='#{changeset_id}' version='1'/>
 
 146           <node id='-1' lon='0.9' lat='0.9' changeset='#{changeset_id}' version='0'/>
 
 147           <node id='-2' lon='0.8' lat='0.9' changeset='#{changeset_id}' version='0'/>
 
 148           <node id='-3' lon='0.7' lat='0.9' changeset='#{changeset_id}' version='0'/>
 
 151           <node id='#{node2.id}' lon='2.0' lat='1.5' changeset='#{changeset_id}' version='1'/>
 
 152           <way id='#{way.id}' changeset='#{changeset_id}' version='1'>
 
 153             <nd ref='#{node2.id}'/>
 
 163     post api_changeset_upload_path(changeset_id), :params => diff, :headers => auth_header
 
 164     assert_response :success,
 
 165                     "can't upload multiple versions of an element in a diff: #{@response.body}"
 
 167     get api_changeset_download_path(changeset_id)
 
 168     assert_response :success
 
 170     assert_dom "osmChange", 1
 
 171     assert_dom "osmChange>create", 3
 
 172     assert_dom "osmChange>delete", 1
 
 173     assert_dom "osmChange>modify", 2
 
 174     assert_dom "osmChange>create>node", 3
 
 175     assert_dom "osmChange>delete>node", 1
 
 176     assert_dom "osmChange>modify>node", 1
 
 177     assert_dom "osmChange>modify>way", 1