From a39c6d524ee23c009c25c2f1edaeeadfd6dfd912 Mon Sep 17 00:00:00 2001
From: Alexis Reigel <mail@koffeinfrei.org>
Date: Fri, 1 Jun 2018 13:55:21 +0200
Subject: [PATCH] don't run when the initial valid check fails

---
 lib/excelsior/import.rb | 14 ++++++++++----
 test/excelsior_test.rb  |  6 ++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index c2525f1..0370470 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -30,10 +30,12 @@ module Excelsior
 
       @report = Report.new
 
-      valid?
+      validate!
     end
 
     def run(&block)
+      return unless valid?
+
       if self.class.use_transaction
         model_class.transaction do
           insert_rows(&block)
@@ -45,7 +47,7 @@ module Excelsior
       end
     end
 
-    def valid?
+    def validate!
       @errors = fields.to_a.each_with_object({}) do |f, acc|
         acc[:missing_column] ||= []
 
@@ -53,6 +55,10 @@ module Excelsior
       end
     end
 
+    def valid?
+      @errors[:missing_column].empty?
+    end
+
     private
 
     def model_class
@@ -60,6 +66,8 @@ module Excelsior
     end
 
     def add_model_errors(record, index)
+      @errors[:model] ||= []
+
       if record.errors.empty?
         report_insert
         return
@@ -67,8 +75,6 @@ module Excelsior
 
       report_failure
 
-      @errors[:model] ||= []
-
       @errors[:model] << Error.new(index + 1, record.errors.full_messages)
     end
 
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index 2d97bb3..b8d2ed5 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -156,6 +156,12 @@ describe Excelsior do
       assert import.errors[:missing_column].any?
     end
 
+    it 'does not run the import' do
+      import = UserImport.new('test/files/missing-column.xlsx')
+      import.run
+      assert_equal 0, import.report.total
+    end
+
     it 'returns the model validation errors' do
       import = UserImport.new('test/files/missing-first-name.xlsx').tap(&:run)
       assert import.errors[:model].any?
-- 
GitLab