From 93eb3ba5f7a85c066aff8a81bc12964e9ae323b9 Mon Sep 17 00:00:00 2001
From: Alexis Reigel <mail@koffeinfrei.org>
Date: Fri, 1 Jun 2018 15:33:36 +0200
Subject: [PATCH] check columns (formerly `validate!`) on run

don't execute anything from the constructor
---
 lib/excelsior/import.rb | 28 ++++++++++++++--------------
 lib/excelsior/result.rb |  4 ++++
 test/excelsior_test.rb  |  2 +-
 3 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index c00202a..cd81e3e 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -30,19 +30,15 @@ module Excelsior
       @rows = @sheet.rows
 
       @result = Result.new(@rows.length)
-
-      validate!
     end
 
     def run(&block)
-      return unless valid?
+      check_columns!
 
-      if self.class.use_transaction
-        model_class.transaction do
-          insert_rows(&block)
+      return if result.failed?
 
-          raise ActiveRecord::Rollback if report.failed.positive?
-        end
+      if self.class.use_transaction
+        run_with_transaction(&block)
       else
         insert_rows(&block)
       end
@@ -50,20 +46,24 @@ module Excelsior
       result
     end
 
-    def validate!
+    private
+
+    def check_columns!
       fields.to_a.each do |f|
         errors[:missing_column] << { missing: f[:header] } unless @columns.include?(f[:header])
       end
     end
 
-    def valid?
-      result.status != Result::Statuses::FAILED
+    def model_class
+      self.class.name.gsub('Import', '').constantize
     end
 
-    private
+    def run_with_transaction(&block)
+      model_class.transaction do
+        insert_rows(&block)
 
-    def model_class
-      self.class.name.gsub('Import', '').constantize
+        raise ActiveRecord::Rollback if report.failed.positive?
+      end
     end
 
     def add_model_errors(record, index)
diff --git a/lib/excelsior/result.rb b/lib/excelsior/result.rb
index 441d2eb..c0ff721 100644
--- a/lib/excelsior/result.rb
+++ b/lib/excelsior/result.rb
@@ -27,5 +27,9 @@ module Excelsior
         Statuses::PENDING
       end
     end
+
+    def failed?
+      status == Result::Statuses::FAILED
+    end
   end
 end
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index 63bf210..c9e3d6f 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -167,7 +167,7 @@ describe Excelsior do
 
   describe '#errors' do
     it 'returns an error when a column is missing in the excel' do
-      import = UserImport.new('test/files/missing-column.xlsx')
+      import = UserImport.new('test/files/missing-column.xlsx').tap(&:run)
       assert import.errors[:missing_column].any?
     end
 
-- 
GitLab