diff --git a/elasticsearch-persistence/lib/elasticsearch/persistence/model/store.rb b/elasticsearch-persistence/lib/elasticsearch/persistence/model/store.rb index 72326128a..313d4e75f 100644 --- a/elasticsearch-persistence/lib/elasticsearch/persistence/model/store.rb +++ b/elasticsearch-persistence/lib/elasticsearch/persistence/model/store.rb @@ -102,6 +102,9 @@ def destroy(options={}) # @return [Hash] The Elasticsearch response as a Hash # def update(attributes={}, options={}) + unless options.delete(:validate) == false + return false unless valid? + end raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted? run_callbacks :update do diff --git a/elasticsearch-persistence/test/unit/model_store_test.rb b/elasticsearch-persistence/test/unit/model_store_test.rb index 835f49428..f4163d975 100644 --- a/elasticsearch-persistence/test/unit/model_store_test.rb +++ b/elasticsearch-persistence/test/unit/model_store_test.rb @@ -311,6 +311,43 @@ def valid?; false; end; assert subject.update( {}, { script: 'EXEC' } ) end + should "not update an invalid model" do + subject.expects(:persisted?).returns(true) + subject.expects(:id).returns('abc123').at_least_once + + @gateway + .expects(:update) + .never + + subject.instance_eval do + def valid?; false; end; + end + + assert ! subject.update + assert ! subject.persisted? + end + + should "skip the validation with the :validate option" do + subject.expects(:persisted?).returns(true) + subject.expects(:id).returns('abc123').at_least_once + + @gateway + .expects(:update) + .with do |object, options| + assert_equal subject, object + assert_equal nil, options[:id] + true + end + .returns({'_id' => 'abc123'}) + + subject.instance_eval do + def valid?; false; end; + end + + assert subject.update validate: false + assert subject.persisted? + end + should "pass the options to gateway" do subject.expects(:persisted?).returns(true)