From 663db47433a9261aa97fcfeae61a7b7ed78b05cd Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Mon, 24 Sep 2018 13:49:27 +0200 Subject: [PATCH] Move products_reset_count to ResetAbsent --- app/models/product_import/entry_processor.rb | 11 ++-- app/models/product_import/reset_absent.rb | 36 +++++++++---- .../product_import/entry_processor_spec.rb | 19 ++++++- .../product_import/reset_absent_spec.rb | 54 ++++++++++++++++--- 4 files changed, 99 insertions(+), 21 deletions(-) diff --git a/app/models/product_import/entry_processor.rb b/app/models/product_import/entry_processor.rb index 323b4859b8..a6ace4d659 100644 --- a/app/models/product_import/entry_processor.rb +++ b/app/models/product_import/entry_processor.rb @@ -4,7 +4,9 @@ module ProductImport class EntryProcessor - attr_reader :inventory_created, :inventory_updated, :products_created, :variants_created, :variants_updated, :products_reset_count, :supplier_products, :total_supplier_products, :import_settings + delegate :products_reset_count, to: :reset_absent + + attr_reader :inventory_created, :inventory_updated, :products_created, :variants_created, :variants_updated, :supplier_products, :total_supplier_products, :import_settings def initialize(importer, validator, import_settings, spreadsheet_data, editable_enterprises, import_time, updated_ids) @importer = importer @@ -20,7 +22,6 @@ module ProductImport @products_created = 0 @variants_created = 0 @variants_updated = 0 - @products_reset_count = 0 @supplier_products = {} @total_supplier_products = 0 end @@ -60,7 +61,11 @@ module ProductImport end def reset_absent_items - ResetAbsent.new(self).call + reset_absent.call + end + + def reset_absent + @reset_absent ||= ResetAbsent.new(self) end def total_saved_count diff --git a/app/models/product_import/reset_absent.rb b/app/models/product_import/reset_absent.rb index aad5ed4de9..439945bb06 100644 --- a/app/models/product_import/reset_absent.rb +++ b/app/models/product_import/reset_absent.rb @@ -2,6 +2,13 @@ require 'delegate' module ProductImport class ResetAbsent < SimpleDelegator + attr_reader :products_reset_count + + def initialize(decorated) + super + @products_reset_count = 0 + end + def call # For selected enterprises; set stock to zero for all products/inventory # that were not listed in the newly uploaded spreadsheet @@ -26,20 +33,29 @@ module ProductImport end unless suppliers_to_reset_inventories.empty? - @products_reset_count += VariantOverride. - where('variant_overrides.hub_id IN (?) - AND variant_overrides.id NOT IN (?)', suppliers_to_reset_inventories, import_settings[:updated_ids]). - update_all(count_on_hand: 0) + relation = VariantOverride + .where( + 'variant_overrides.hub_id IN (?) ' \ + 'AND variant_overrides.id NOT IN (?)', + suppliers_to_reset_inventories, + import_settings[:updated_ids] + ) + @products_reset_count += relation.update_all(count_on_hand: 0) end return if suppliers_to_reset_products.empty? - @products_reset_count += Spree::Variant.joins(:product). - where('spree_products.supplier_id IN (?) - AND spree_variants.id NOT IN (?) - AND spree_variants.is_master = false - AND spree_variants.deleted_at IS NULL', suppliers_to_reset_products, import_settings[:updated_ids]). - update_all(count_on_hand: 0) + relation = Spree::Variant + .joins(:product) + .where( + 'spree_products.supplier_id IN (?) ' \ + 'AND spree_variants.id NOT IN (?) ' \ + 'AND spree_variants.is_master = false ' \ + 'AND spree_variants.deleted_at IS NULL', + suppliers_to_reset_products, + import_settings[:updated_ids] + ) + @products_reset_count += relation.update_all(count_on_hand: 0) end private diff --git a/spec/models/product_import/entry_processor_spec.rb b/spec/models/product_import/entry_processor_spec.rb index 866bf742b8..88205a85d3 100644 --- a/spec/models/product_import/entry_processor_spec.rb +++ b/spec/models/product_import/entry_processor_spec.rb @@ -22,7 +22,7 @@ describe ProductImport::EntryProcessor do end describe '#reset_absent_items' do - let(:reset_absent) { double(ProductImport::ResetAbsent, call: true) } + let(:reset_absent) { instance_double(ProductImport::ResetAbsent, call: true) } before do allow(ProductImport::ResetAbsent) @@ -37,4 +37,21 @@ describe ProductImport::EntryProcessor do .to have_received(:new).with(entry_processor) end end + + describe '#products_reset_count' do + let(:reset_absent) { instance_double(ProductImport::ResetAbsent) } + + before do + allow(ProductImport::ResetAbsent) + .to receive(:new) + .and_return(reset_absent) + + allow(reset_absent).to receive(:products_reset_count) + end + + it 'delegates to ResetAbsent' do + entry_processor.products_reset_count + expect(reset_absent).to have_received(:products_reset_count) + end + end end diff --git a/spec/models/product_import/reset_absent_spec.rb b/spec/models/product_import/reset_absent_spec.rb index 2be1df43c7..f2addc9dc3 100644 --- a/spec/models/product_import/reset_absent_spec.rb +++ b/spec/models/product_import/reset_absent_spec.rb @@ -51,36 +51,76 @@ describe ProductImport::ResetAbsent do let(:import_settings) do { settings: { 'reset_all_absent' => true }, - updated_ids: [1], - enterprises_to_reset: [2] + updated_ids: [0], + enterprises_to_reset: [enterprise.id] } end before do - allow(entry_processor).to receive(:permission_by_id?).with(2) { true } + allow(entry_processor) + .to receive(:permission_by_id?).with(enterprise.id) { true } end context 'and not importing into inventory' do + let(:variant) { create(:variant) } + let(:enterprise) { variant.product.supplier } + before do allow(entry_processor) .to receive(:importing_into_inventory?) { false } end - it 'returns true' do - expect(reset_absent.call).to eq(true) + it 'returns the number of products reset' do + expect(reset_absent.call).to eq(2) end end context 'and importing into inventory' do + let(:variant) { create(:variant) } + let(:enterprise) { variant.product.supplier } + let(:variant_override) do + create(:variant_override, variant: variant, hub: enterprise) + end + + before do + variant_override + + allow(entry_processor) + .to receive(:permission_by_id?).with(enterprise.id) { true } + end + before do allow(entry_processor) .to receive(:importing_into_inventory?) { true } end - it 'returns true' do - expect(reset_absent.call).to eq(true) + it 'returns nil' do + expect(reset_absent.call).to be_nil end end end end + + describe '#products_reset_count' do + let(:variant) { create(:variant) } + let(:enterprise_id) { variant.product.supplier_id } + + before do + allow(entry_processor) + .to receive(:permission_by_id?).with(enterprise_id) { true } + end + + let(:import_settings) do + { + settings: { 'reset_all_absent' => true }, + updated_ids: [0], + enterprises_to_reset: [enterprise_id] + } + end + + it 'returns the number of reset products or variants' do + reset_absent.call + expect(reset_absent.products_reset_count).to eq(2) + end + end end