diff --git a/lib/excelsior/error.rb b/lib/excelsior/error.rb new file mode 100644 index 0000000000000000000000000000000000000000..849361969f64fc77ba9bf00133ddc582f5a3efe4 --- /dev/null +++ b/lib/excelsior/error.rb @@ -0,0 +1,3 @@ +module Excelsior + Error = Struct.new(:row, :errors) +end diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb index 455ee544dd3fc3d8dde5a0a181cf3e5b64f1deb8..fd17e4285e828b273d892803c3ecb1c5e78f749d 100644 --- a/lib/excelsior/import.rb +++ b/lib/excelsior/import.rb @@ -3,6 +3,7 @@ require 'rails' require 'active_record' require 'excelsior/source' require 'excelsior/mapping' +require 'excelsior/error' module Excelsior class Import @@ -26,12 +27,13 @@ module Excelsior end def run # takes an optional block - @rows.map do |row| + @rows.map.with_index do |row, i| attributes = map_row_values(row, @columns) if block_given? yield attributes else - model_class.create!(attributes) + record = model_class.create(attributes) + add_model_errors(record, i) end end end @@ -52,5 +54,13 @@ module Excelsior def model_class self.class.name.gsub("Import", "").constantize end + + def add_model_errors(record, index) + return if record.errors.empty? + + @errors[:model] ||= [] + + @errors[:model] << Error.new(index + 1, record.errors.full_messages) + end end end diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb index adafe5fdd598954831d2cd2957c39ad6b504ce03..40b3c3feec892f48d5b0a5cbbc1e263d1137e36d 100644 --- a/test/excelsior_test.rb +++ b/test/excelsior_test.rb @@ -15,6 +15,7 @@ end class ExcelsiorTest < Minitest::Test def setup + User.delete_all @import = UserImport.new end @@ -74,4 +75,10 @@ class ExcelsiorTest < Minitest::Test import = UserImport.new("test/files/missing-column.xlsx") assert import.errors[:missing_column].any? end + + def test_model_validations + import = UserImport.new("test/files/missing-first-name.xlsx").tap(&:run) + assert import.errors[:model].any? + assert_equal import.errors[:model], [Excelsior::Error.new(3, ["First name can't be blank"])] + end end diff --git a/test/files/missing-first-name.xlsx b/test/files/missing-first-name.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..56f6349dbf85db3ad7986cca64c9c5f9c02d4d22 Binary files /dev/null and b/test/files/missing-first-name.xlsx differ