3 class RelationVersionsTest < ActionDispatch::IntegrationTest
5 # check that relations are ordered
6 def test_relation_member_ordering
8 changeset = create(:changeset, :user => user)
12 way1 = create(:way_with_nodes, :nodes_count => 2)
13 way2 = create(:way_with_nodes, :nodes_count => 2)
15 auth_header = bearer_authorization_header user
19 <relation changeset='#{changeset.id}'>
20 <member ref='#{node1.id}' type='node' role='first'/>
21 <member ref='#{node2.id}' type='node' role='second'/>
22 <member ref='#{way1.id}' type='way' role='third'/>
23 <member ref='#{way2.id}' type='way' role='fourth'/>
27 doc = XML::Parser.string(doc_str).parse
29 post api_relations_path, :params => doc.to_s, :headers => auth_header
30 assert_response :success, "can't create a relation: #{@response.body}"
31 relation_id = @response.body.to_i
33 # get it back and check the ordering
34 get api_relation_path(relation_id)
35 assert_members_equal_response doc
37 # check the ordering in the history tables:
38 get api_relation_version_path(relation_id, 1)
39 assert_members_equal_response doc, "can't read back version 2 of the relation"
41 # insert a member at the front
42 new_member = XML::Node.new "member"
43 new_member["ref"] = node3.id.to_s
44 new_member["type"] = "node"
45 new_member["role"] = "new first"
46 doc.find("//osm/relation").first.child.prev = new_member
47 # update the version, should be 1?
48 doc.find("//osm/relation").first["id"] = relation_id.to_s
49 doc.find("//osm/relation").first["version"] = 1.to_s
51 # upload the next version of the relation
52 put api_relation_path(relation_id), :params => doc.to_s, :headers => auth_header
53 assert_response :success, "can't update relation: #{@response.body}"
54 assert_equal 2, @response.body.to_i
56 # get it back again and check the ordering again
57 get api_relation_path(relation_id)
58 assert_members_equal_response doc
60 # check the ordering in the history tables:
61 get api_relation_version_path(relation_id, 2)
62 assert_members_equal_response doc, "can't read back version 2 of the relation"
66 # check that relations can contain duplicate members
67 def test_relation_member_duplicates
68 private_user = create(:user, :data_public => false)
70 changeset = create(:changeset, :user => user)
76 <relation changeset='#{changeset.id}'>
77 <member ref='#{node1.id}' type='node' role='forward'/>
78 <member ref='#{node2.id}' type='node' role='forward'/>
79 <member ref='#{node1.id}' type='node' role='forward'/>
80 <member ref='#{node2.id}' type='node' role='forward'/>
84 doc = XML::Parser.string(doc_str).parse
86 ## First try with the private user
87 auth_header = bearer_authorization_header private_user
89 post api_relations_path, :params => doc.to_s, :headers => auth_header
90 assert_response :forbidden
92 ## Now try with the public user
93 auth_header = bearer_authorization_header user
95 post api_relations_path, :params => doc.to_s, :headers => auth_header
96 assert_response :success, "can't create a relation: #{@response.body}"
97 relation_id = @response.body.to_i
99 # get it back and check the ordering
100 get api_relation_path(relation_id)
101 assert_members_equal_response doc
103 # check the ordering in the history tables:
104 get api_relation_version_path(relation_id, 1)
105 assert_members_equal_response doc, "can't read back version 1 of the relation"
109 # test that the ordering of elements in the history is the same as in current.
110 def test_history_ordering
112 changeset = create(:changeset, :user => user)
113 node1 = create(:node)
114 node2 = create(:node)
115 node3 = create(:node)
116 node4 = create(:node)
120 <relation changeset='#{changeset.id}'>
121 <member ref='#{node1.id}' type='node' role='forward'/>
122 <member ref='#{node4.id}' type='node' role='forward'/>
123 <member ref='#{node3.id}' type='node' role='forward'/>
124 <member ref='#{node2.id}' type='node' role='forward'/>
128 doc = XML::Parser.string(doc_str).parse
129 auth_header = bearer_authorization_header user
131 post api_relations_path, :params => doc.to_s, :headers => auth_header
132 assert_response :success, "can't create a relation: #{@response.body}"
133 relation_id = @response.body.to_i
135 # check the ordering in the current tables:
136 get api_relation_path(relation_id)
137 assert_members_equal_response doc
139 # check the ordering in the history tables:
140 get api_relation_version_path(relation_id, 1)
141 assert_members_equal_response doc, "can't read back version 1 of the relation"
147 # checks that the XML document and the response have
148 # members in the same order.
149 def assert_members_equal_response(doc, response_message = "can't read back the relation")
150 assert_response :success, "#{response_message}: #{@response.body}"
151 new_doc = XML::Parser.string(@response.body).parse
153 doc_members = doc.find("//osm/relation/member").collect do |m|
154 [m["ref"].to_i, m["type"].to_sym, m["role"]]
157 new_members = new_doc.find("//osm/relation/member").collect do |m|
158 [m["ref"].to_i, m["type"].to_sym, m["role"]]
161 assert_equal doc_members, new_members, "members are not equal - ordering is wrong? (#{doc}, #{@response.body})"