]> git.openstreetmap.org Git - rails.git/blob - test/integration/relation_versions_test.rb
Move tests comparing relation members with response to integration tests
[rails.git] / test / integration / relation_versions_test.rb
1 require "test_helper"
2
3 class RelationVersionsTest < ActionDispatch::IntegrationTest
4   ##
5   # check that relations are ordered
6   def test_relation_member_ordering
7     user = create(:user)
8     changeset = create(:changeset, :user => user)
9     node1 = create(:node)
10     node2 = create(:node)
11     node3 = create(:node)
12     way1 = create(:way_with_nodes, :nodes_count => 2)
13     way2 = create(:way_with_nodes, :nodes_count => 2)
14
15     auth_header = bearer_authorization_header user
16
17     doc_str = <<~OSM
18       <osm>
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'/>
24         </relation>
25       </osm>
26     OSM
27     doc = XML::Parser.string(doc_str).parse
28
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
32
33     # get it back and check the ordering
34     get api_relation_path(relation_id)
35     assert_members_equal_response doc
36
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"
40
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
50
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
55
56     # get it back again and check the ordering again
57     get api_relation_path(relation_id)
58     assert_members_equal_response doc
59
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"
63   end
64
65   ##
66   # check that relations can contain duplicate members
67   def test_relation_member_duplicates
68     private_user = create(:user, :data_public => false)
69     user = create(:user)
70     changeset = create(:changeset, :user => user)
71     node1 = create(:node)
72     node2 = create(:node)
73
74     doc_str = <<~OSM
75       <osm>
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'/>
81         </relation>
82       </osm>
83     OSM
84     doc = XML::Parser.string(doc_str).parse
85
86     ## First try with the private user
87     auth_header = bearer_authorization_header private_user
88
89     post api_relations_path, :params => doc.to_s, :headers => auth_header
90     assert_response :forbidden
91
92     ## Now try with the public user
93     auth_header = bearer_authorization_header user
94
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
98
99     # get it back and check the ordering
100     get api_relation_path(relation_id)
101     assert_members_equal_response doc
102
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"
106   end
107
108   ##
109   # test that the ordering of elements in the history is the same as in current.
110   def test_history_ordering
111     user = create(:user)
112     changeset = create(:changeset, :user => user)
113     node1 = create(:node)
114     node2 = create(:node)
115     node3 = create(:node)
116     node4 = create(:node)
117
118     doc_str = <<~OSM
119       <osm>
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'/>
125         </relation>
126       </osm>
127     OSM
128     doc = XML::Parser.string(doc_str).parse
129     auth_header = bearer_authorization_header user
130
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
134
135     # check the ordering in the current tables:
136     get api_relation_path(relation_id)
137     assert_members_equal_response doc
138
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"
142   end
143
144   private
145
146   ##
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
152
153     doc_members = doc.find("//osm/relation/member").collect do |m|
154       [m["ref"].to_i, m["type"].to_sym, m["role"]]
155     end
156
157     new_members = new_doc.find("//osm/relation/member").collect do |m|
158       [m["ref"].to_i, m["type"].to_sym, m["role"]]
159     end
160
161     assert_equal doc_members, new_members, "members are not equal - ordering is wrong? (#{doc}, #{@response.body})"
162   end
163 end