From f5e28fd293fd144c5ea5c1b21575affe80a8489a Mon Sep 17 00:00:00 2001
From: Alexis Reigel <mail@koffeinfrei.org>
Date: Thu, 31 May 2018 16:59:05 +0200
Subject: [PATCH] add report (number of inserts, failures, total)

---
 lib/excelsior/import.rb | 12 ++++++++++--
 lib/excelsior/report.rb | 14 ++++++++++++++
 test/excelsior_test.rb  |  7 +++++++
 3 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 lib/excelsior/report.rb

diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index fd17e42..c859ce8 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -4,13 +4,14 @@ require 'active_record'
 require 'excelsior/source'
 require 'excelsior/mapping'
 require 'excelsior/error'
+require 'excelsior/report'
 
 module Excelsior
   class Import
     include Source
     include Mapping
 
-    attr_accessor :source, :fields, :errors
+    attr_accessor :source, :fields, :errors, :report
     attr_accessor :rows, :columns
 
     def initialize(file = nil)
@@ -23,6 +24,8 @@ module Excelsior
       @columns = @sheet.rows.shift
       @rows = @sheet.rows
 
+      @report = Report.new
+
       valid?
     end
 
@@ -56,7 +59,12 @@ module Excelsior
     end
 
     def add_model_errors(record, index)
-      return if record.errors.empty?
+      if record.errors.empty?
+        @report.inserted += 1
+        return
+      end
+
+      @report.failed += 1
 
       @errors[:model] ||= []
 
diff --git a/lib/excelsior/report.rb b/lib/excelsior/report.rb
new file mode 100644
index 0000000..ce93fca
--- /dev/null
+++ b/lib/excelsior/report.rb
@@ -0,0 +1,14 @@
+module Excelsior
+  Report = Struct.new(:inserted, :failed) do
+    def initialize(*args)
+      super(*args)
+
+      self.inserted ||= 0
+      self.failed ||= 0
+    end
+
+    def total
+      inserted + failed
+    end
+  end
+end
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index 40b3c3f..0fd4a65 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -81,4 +81,11 @@ class ExcelsiorTest < Minitest::Test
     assert import.errors[:model].any?
     assert_equal import.errors[:model], [Excelsior::Error.new(3, ["First name can't be blank"])]
   end
+
+  def test_report
+    import = UserImport.new("test/files/missing-first-name.xlsx").tap(&:run)
+    assert_equal 2, import.report.inserted
+    assert_equal 1, import.report.failed
+    assert_equal 3, import.report.total
+  end
 end
-- 
GitLab