Skip to content

Commit

Permalink
Merge pull request #56 from grzuy/support_all_or_none_records
Browse files Browse the repository at this point in the history
Adds support for :all_or_none option on #import
  • Loading branch information
zdennis committed Aug 30, 2012
2 parents 0b03543 + eac7d5f commit 6182b94
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
8 changes: 6 additions & 2 deletions lib/activerecord-import/import.rb
Expand Up @@ -260,8 +260,12 @@ def import_with_validations( column_names, array_of_attributes, options={} )
end end
end end
array_of_attributes.compact! array_of_attributes.compact!


num_inserts = array_of_attributes.empty? ? 0 : import_without_validations_or_callbacks( column_names, array_of_attributes, options ) num_inserts = if array_of_attributes.empty? || options[:all_or_none] && failed_instances.any?
0
else
import_without_validations_or_callbacks( column_names, array_of_attributes, options )
end
ActiveRecord::Import::Result.new(failed_instances, num_inserts) ActiveRecord::Import::Result.new(failed_instances, num_inserts)
end end


Expand Down
40 changes: 39 additions & 1 deletion test/import_test.rb
Expand Up @@ -81,7 +81,45 @@
end end
end end
end end


context "with :all_or_none option" do
let(:columns) { %w(title author_name) }
let(:valid_values) { [[ "LDAP", "Jerry Carter"], ["Rails Recipes", "Chad Fowler"]] }
let(:invalid_values) { [[ "The RSpec Book", ""], ["Agile+UX", ""]] }
let(:mixed_values) { valid_values + invalid_values }

context "with validation checks turned on" do
it "should import valid data" do
assert_difference "Topic.count", +2 do
result = Topic.import columns, valid_values, :all_or_none => true
end
end

it "should not import invalid data" do
assert_no_difference "Topic.count" do
result = Topic.import columns, invalid_values, :all_or_none => true
end
end

it "should not import valid data when mixed with invalid data" do
assert_no_difference "Topic.count" do
result = Topic.import columns, mixed_values, :all_or_none => true
end
end

it "should report the failed instances" do
results = Topic.import columns, mixed_values, :all_or_none => true
assert_equal invalid_values.size, results.failed_instances.size
results.failed_instances.each { |e| assert_kind_of Topic, e }
end

it "should report the zero inserts" do
results = Topic.import columns, mixed_values, :all_or_none => true
assert_equal 0, results.num_inserts
end
end
end

context "with :synchronize option" do context "with :synchronize option" do
context "synchronizing on new records" do context "synchronizing on new records" do
let(:new_topics) { Build(3, :topics) } let(:new_topics) { Build(3, :topics) }
Expand Down

0 comments on commit 6182b94

Please sign in to comment.