From f743b5f02f6d63dfd829ed91ac2867fd9b08fc17 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Thu, 13 Sep 2018 14:45:10 +0200 Subject: [PATCH] Extract Settings from Product Import processor This encapsulates the data structure used by the entry processor to check various settings. It still requires a lot of work to move more logic to this new class. --- app/models/product_import/entry_processor.rb | 6 ++- app/models/product_import/settings.rb | 13 +++++ spec/models/product_import/settings_spec.rb | 51 ++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 app/models/product_import/settings.rb create mode 100644 spec/models/product_import/settings_spec.rb diff --git a/app/models/product_import/entry_processor.rb b/app/models/product_import/entry_processor.rb index 315721ffbb..028b973454 100644 --- a/app/models/product_import/entry_processor.rb +++ b/app/models/product_import/entry_processor.rb @@ -198,12 +198,14 @@ module ProductImport end def assign_defaults(object, entry) + settings = Settings.new(@import_settings) + # Assigns a default value for a specified field e.g. category='Vegetables', setting this value # either for all entries (overwrite_all), or only for those entries where the field was blank # in the spreadsheet (overwrite_empty), depending on selected import settings - return unless @import_settings.key?(:settings) && @import_settings[:settings][entry.supplier_id.to_s] && @import_settings[:settings][entry.supplier_id.to_s]['defaults'] + return unless settings.defaults(entry) - @import_settings[:settings][entry.supplier_id.to_s]['defaults'].each do |attribute, setting| + settings.defaults(entry).each do |attribute, setting| next unless setting['active'] case setting['mode'] diff --git a/app/models/product_import/settings.rb b/app/models/product_import/settings.rb new file mode 100644 index 0000000000..a97ee544ff --- /dev/null +++ b/app/models/product_import/settings.rb @@ -0,0 +1,13 @@ +module ProductImport + class Settings + def initialize(import_settings) + @import_settings = import_settings + end + + def defaults(entry) + @import_settings.key?(:settings) && + @import_settings[:settings][entry.supplier_id.to_s] && + @import_settings[:settings][entry.supplier_id.to_s]['defaults'] + end + end +end diff --git a/spec/models/product_import/settings_spec.rb b/spec/models/product_import/settings_spec.rb new file mode 100644 index 0000000000..768bc315ad --- /dev/null +++ b/spec/models/product_import/settings_spec.rb @@ -0,0 +1,51 @@ +require 'spec_helper' + +describe ProductImport::Settings do + let(:settings) { described_class.new(import_settings) } + + describe '#defaults' do + let(:entry) { instance_double(ProductImport::SpreadsheetEntry) } + let(:import_settings) { {} } + + context 'when there are no settings' do + it 'returns false' do + expect(settings.defaults(entry)).to be_falsey + end + end + + context 'when there are settings' do + let(:entry) do + instance_double(ProductImport::SpreadsheetEntry, supplier_id: 1) + end + let(:import_settings) { { settings: {} } } + + context 'and there is no data for the specified entry' do + it 'returns a falsey' do + expect(settings.defaults(entry)).to be_falsey + end + end + + context 'and there is data for the specified entry' do + context 'and it has no defaults' do + let(:import_settings) do + { settings: { '1' => { 'foo' => 'bar' } } } + end + + it 'returns a falsey' do + expect(settings.defaults(entry)).to be_falsey + end + end + + context 'and it has defaults' do + let(:import_settings) do + { settings: { '1' => { 'defaults' => 'default value' } } } + end + + it 'returns a truthy' do + expect(settings.defaults(entry)).to eq('default value') + end + end + end + end + end +end