- [false, 'name', 'bar'],
- [false, 'description', 'The quick brown fox jumps over the lazy dog'],
- [false, 'properties', {'new_version' => true}],
- [false, 'manifest_text', ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n"],
- [true, 'name', 'bar'],
- [true, 'description', 'The quick brown fox jumps over the lazy dog'],
- [true, 'properties', {'new_version' => true}],
- [true, 'manifest_text', ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n"],
- ].each do |versioning, attr, val|
- test "update collection #{attr} with versioning #{versioning ? '' : 'not '}enabled" do
- Rails.configuration.collection_versioning = versioning
+ ['version', 10],
+ ['current_version_uuid', 'zzzzz-4zz18-bv31uwvy3neko21'],
+ ].each do |name, new_value|
+ test "'#{name}' updates on current version collections are not allowed" do
+ act_as_user users(:active) do
+ # Set up initial collection
+ c = create_collection 'foo', Encoding::US_ASCII
+ assert c.valid?
+ assert_equal 1, c.version
+
+ assert_raises(ActiveRecord::RecordInvalid) do
+ c.update_attributes!({
+ name => new_value
+ })
+ end
+ end
+ end
+ end
+
+ test "uuid updates on current version make older versions update their pointers" do
+ Rails.configuration.collection_versioning = true
+ Rails.configuration.preserve_version_if_idle = 0
+ act_as_system_user do
+ # Set up initial collection
+ c = create_collection 'foo', Encoding::US_ASCII
+ assert c.valid?
+ assert_equal 1, c.version
+ # Make changes so that a new version is created
+ c.update_attributes!({'name' => 'bar'})
+ c.reload
+ assert_equal 2, c.version
+ assert_equal 2, Collection.where(current_version_uuid: c.uuid).count
+ new_uuid = 'zzzzz-4zz18-somefakeuuidnow'
+ assert_empty Collection.where(uuid: new_uuid)
+ # Update UUID on current version, check that both collections point to it
+ c.update_attributes!({'uuid' => new_uuid})
+ c.reload
+ assert_equal new_uuid, c.uuid
+ assert_equal 2, Collection.where(current_version_uuid: new_uuid).count
+ end
+ end
+
+ test "older versions' modified_at indicate when they're created" do
+ Rails.configuration.collection_versioning = true
+ Rails.configuration.preserve_version_if_idle = 0
+ act_as_user users(:active) do
+ # Set up initial collection
+ c = create_collection 'foo', Encoding::US_ASCII
+ assert c.valid?
+ # Make changes so that a new version is created
+ c.update_attributes!({'name' => 'bar'})
+ c.reload
+ assert_equal 2, c.version
+ # Get the old version
+ c_old = Collection.where(current_version_uuid: c.uuid, version: 1).first
+ assert_not_nil c_old
+
+ version_creation_datetime = c_old.modified_at.to_f
+ assert_equal c.created_at.to_f, c_old.created_at.to_f
+ # Current version is updated just a few milliseconds before the version is
+ # saved on the database.
+ assert_operator c.modified_at.to_f, :<, version_creation_datetime
+
+ # Make update on current version so old version get the attribute synced;
+ # its modified_at should not change.
+ new_replication = 3
+ c.update_attributes!({'replication_desired' => new_replication})
+ c.reload
+ assert_equal new_replication, c.replication_desired
+ c_old.reload
+ assert_equal new_replication, c_old.replication_desired
+ assert_equal version_creation_datetime, c_old.modified_at.to_f
+ assert_operator c.modified_at.to_f, :>, c_old.modified_at.to_f
+ end
+ end
+
+ test "past versions should not be directly updatable" do
+ Rails.configuration.collection_versioning = true
+ Rails.configuration.preserve_version_if_idle = 0
+ act_as_system_user do
+ # Set up initial collection
+ c = create_collection 'foo', Encoding::US_ASCII
+ assert c.valid?
+ # Make changes so that a new version is created
+ c.update_attributes!({'name' => 'bar'})
+ c.reload
+ assert_equal 2, c.version
+ # Get the old version
+ c_old = Collection.where(current_version_uuid: c.uuid, version: 1).first
+ assert_not_nil c_old
+ # With collection versioning still being enabled, try to update
+ c_old.name = 'this was foo'
+ assert c_old.invalid?
+ c_old.reload
+ # Try to fool the validator attempting to make c_old to look like a
+ # current version, it should also fail.
+ c_old.current_version_uuid = c_old.uuid
+ assert c_old.invalid?
+ c_old.reload
+ # Now disable collection versioning, it should behave the same way
+ Rails.configuration.collection_versioning = false
+ c_old.name = 'this was foo'
+ assert c_old.invalid?
+ end
+ end
+
+ [
+ ['owner_uuid', 'zzzzz-tpzed-d9tiejq69daie8f', 'zzzzz-tpzed-xurymjxw79nv3jz'],
+ ['replication_desired', 2, 3],
+ ['storage_classes_desired', ['hot'], ['archive']],
+ ['is_trashed', true, false],
+ ].each do |attr, first_val, second_val|
+ test "sync #{attr} with older versions" do
+ Rails.configuration.collection_versioning = true
+ Rails.configuration.preserve_version_if_idle = 0