Migration to add close-time to changesets. This replaces the boolean 'open' attribute. Added checks to ensure that the maximum lifetime and number of changes in a changeset are enforced. Added some tests.
This commit is contained in:
parent
9a4ea6bfd0
commit
a90be5e69a
8 changed files with 166 additions and 20 deletions
16
test/fixtures/changesets.yml
vendored
16
test/fixtures/changesets.yml
vendored
|
@ -7,33 +7,37 @@ normal_user_first_change:
|
|||
id: 1
|
||||
user_id: 1
|
||||
created_at: "2007-01-01 00:00:00"
|
||||
open: true
|
||||
closed_at: <%= DateTime.now + Rational(1,24) %>
|
||||
min_lon: <%= 1 * SCALE %>
|
||||
min_lat: <%= 1 * SCALE %>
|
||||
max_lon: <%= 5 * SCALE %>
|
||||
max_lat: <%= 5 * SCALE %>
|
||||
num_changes: 11
|
||||
|
||||
second_user_first_change:
|
||||
id: 2
|
||||
user_id: 2
|
||||
created_at: "2008-05-01 01:23:45"
|
||||
open: true
|
||||
closed_at: <%= DateTime.now + Rational(1,24) %>
|
||||
num_changes: 0
|
||||
|
||||
normal_user_closed_change:
|
||||
id: 3
|
||||
user_id: 1
|
||||
created_at: "2007-01-01 00:00:00"
|
||||
open: false
|
||||
closed_at: "2007-01-02 00:00:00"
|
||||
num_changes: 0
|
||||
|
||||
normal_user_version_change:
|
||||
id: 4
|
||||
user_id: 1
|
||||
created_at: "2008-01-01 00:00:00"
|
||||
open: true
|
||||
closed_at: <%= DateTime.now + Rational(1,24) %>
|
||||
min_lon: <%= 1 * SCALE %>
|
||||
min_lat: <%= 1 * SCALE %>
|
||||
max_lon: <%= 4 * SCALE %>
|
||||
max_lat: <%= 4 * SCALE %>
|
||||
num_changes: 8
|
||||
|
||||
# changeset to contain all the invalid stuff that is in the
|
||||
# fixtures (nodes outside the world, etc...), but needs to have
|
||||
|
@ -42,5 +46,5 @@ invalid_changeset:
|
|||
id: 5
|
||||
user_id: 3
|
||||
created_at: "2008-01-01 00:00:00"
|
||||
open: false
|
||||
|
||||
closed_at: "2008-01-02 00:00:00"
|
||||
num_changes: 9
|
||||
|
|
|
@ -618,15 +618,19 @@ EOF
|
|||
|
||||
get :query, :time => '2007-12-31'
|
||||
assert_response :success, "can't get changesets by time-since"
|
||||
assert_changesets [2,4,5]
|
||||
assert_changesets [1,2,4,5]
|
||||
|
||||
get :query, :time => '2008-01-01T12:34Z'
|
||||
assert_response :success, "can't get changesets by time-since with hour"
|
||||
assert_changesets [2]
|
||||
assert_changesets [1,2,4,5]
|
||||
|
||||
get :query, :time => '2007-12-31T23:59Z,2008-01-01T00:01Z'
|
||||
assert_response :success, "can't get changesets by time-range"
|
||||
assert_changesets [4,5]
|
||||
assert_changesets [1,4,5]
|
||||
|
||||
get :query, :open => 'true'
|
||||
assert_response :success, "can't get changesets by open-ness"
|
||||
assert_changesets [1,2,4]
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -700,6 +704,62 @@ EOF
|
|||
assert_response :conflict
|
||||
end
|
||||
|
||||
##
|
||||
# check that a changeset can contain a certain max number of changes.
|
||||
def test_changeset_limits
|
||||
basic_authorization "test@openstreetmap.org", "test"
|
||||
|
||||
# open a new changeset
|
||||
content "<osm><changeset/></osm>"
|
||||
put :create
|
||||
assert_response :success, "can't create a new changeset"
|
||||
cs_id = @response.body.to_i
|
||||
|
||||
# start the counter just short of where the changeset should finish.
|
||||
offset = 10
|
||||
# alter the database to set the counter on the changeset directly,
|
||||
# otherwise it takes about 6 minutes to fill all of them.
|
||||
changeset = Changeset.find(cs_id)
|
||||
changeset.num_changes = Changeset::MAX_ELEMENTS - offset
|
||||
changeset.save!
|
||||
|
||||
with_controller(NodeController.new) do
|
||||
# create a new node
|
||||
content "<osm><node changeset='#{cs_id}' lat='0.0' lon='0.0'/></osm>"
|
||||
put :create
|
||||
assert_response :success, "can't create a new node"
|
||||
node_id = @response.body.to_i
|
||||
|
||||
get :read, :id => node_id
|
||||
assert_response :success, "can't read back new node"
|
||||
node_doc = XML::Parser.string(@response.body).parse
|
||||
node_xml = node_doc.find("//osm/node").first
|
||||
|
||||
# loop until we fill the changeset with nodes
|
||||
offset.times do |i|
|
||||
node_xml['lat'] = rand.to_s
|
||||
node_xml['lon'] = rand.to_s
|
||||
node_xml['version'] = (i+1).to_s
|
||||
|
||||
content node_doc
|
||||
put :update, :id => node_id
|
||||
assert_response :success, "attempt #{i} should have succeeded"
|
||||
end
|
||||
|
||||
# trying again should fail
|
||||
node_xml['lat'] = rand.to_s
|
||||
node_xml['lon'] = rand.to_s
|
||||
node_xml['version'] = offset.to_s
|
||||
|
||||
content node_doc
|
||||
put :update, :id => node_id
|
||||
assert_response :conflict, "final attempt should have failed"
|
||||
end
|
||||
|
||||
changeset = Changeset.find(cs_id)
|
||||
assert_equal Changeset::MAX_ELEMENTS + 1, changeset.num_changes
|
||||
end
|
||||
|
||||
#------------------------------------------------------------
|
||||
# utility functions
|
||||
#------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue