Browse Source

Improve Zendesk import when DNS resolution fails etc.

Ryan Lue 6 years ago
parent
commit
30beecd3e7

+ 1 - 1
lib/import/zendesk/object_attribute/base.rb

@@ -26,7 +26,7 @@ module Import
 
         def attribute_config(object, name, attribute)
           {
-            object:        object,
+            object:        object.to_s,
             name:          name,
             display:       attribute.title,
             data_type:     data_type(attribute),

+ 12 - 1
lib/sequencer/unit/import/zendesk/sub_sequence/base.rb

@@ -40,7 +40,18 @@ class Sequencer
             def resource_iteration(&block)
               resource_collection.public_send(resource_iteration_method, &block)
             rescue ZendeskAPI::Error::NetworkError => e
-              return if e.response.status.to_s == '403' && resource_klass.in?(%w[UserField OrganizationField])
+              case e.response.status.to_s
+              when '403'
+                return if resource_klass.in?(%w[UserField OrganizationField])
+              when /^5\d\d$/
+                raise if (fail_count ||= 1) > 10
+
+                logger.error e
+                logger.info "Sleeping 10 seconds after ZendeskAPI::Error::NetworkError and retry (##{fail_count}/10)."
+                sleep 10
+
+                (fail_count += 1) && retry
+              end
 
               raise
             end

+ 46 - 0
spec/lib/import/zendesk/object_attribute/base_examples.rb

@@ -0,0 +1,46 @@
+require 'rails_helper'
+
+RSpec.shared_examples Import::Zendesk::ObjectAttribute::Base do
+  let(:attribute) do
+    double(
+      title:                 'Example attribute',
+      description:           'Example attribute description',
+      removable:             false,
+      active:                true,
+      position:              12,
+      visible_in_portal:     true,
+      required_in_portal:    true,
+      required:              true,
+      type:                  'input',
+      custom_field_options:  [],
+      regexp_for_validation: '',
+    )
+  end
+
+  describe 'exception handling' do
+    let(:error_text) { Faker::Lorem.sentence }
+    it 'extends ObjectManager Attribute exception message' do
+      expect(ObjectManager::Attribute).to receive(:add).and_raise(RuntimeError, error_text)
+
+      expect do
+        described_class.new('Ticket', 'example_field', attribute)
+      end.to raise_error(RuntimeError, /'example_field': #{error_text}$/)
+    end
+  end
+
+  describe 'argument handling' do
+    it 'takes an ObjectLookup name as the first argument' do
+      expect(ObjectManager::Attribute)
+        .to receive(:add).with(hash_including(object: 'Ticket'))
+
+      described_class.new('Ticket', 'example_field', attribute)
+    end
+
+    it 'accepts a constant ObjectLookup name' do
+      expect(ObjectManager::Attribute)
+        .to receive(:add).with(hash_including(object: 'Ticket'))
+
+      described_class.new(Ticket, 'example_field', attribute)
+    end
+  end
+end

+ 0 - 34
spec/lib/import/zendesk/object_attribute/base_spec.rb

@@ -1,34 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Import::Zendesk::ObjectAttribute::Base do
-
-  it 'extends ObjectManager Attribute exception text' do
-
-    attribute = double(
-      title:              'Example attribute',
-      description:        'Example attribute description',
-      removable:          false,
-      active:             true,
-      position:           12,
-      visible_in_portal:  true,
-      required_in_portal: true,
-      required:           true,
-      type:               'input',
-    )
-
-    error_text = 'some error'
-    expect(ObjectManager::Attribute).to receive(:add).and_raise(RuntimeError, error_text)
-
-    exception = nil
-    begin
-      described_class.new('Ticket', 'example_field', attribute)
-    rescue => e
-      exception = e
-    end
-
-    expect(exception).not_to be nil
-    expect(exception).to be_a(RuntimeError)
-    expect(exception.message).to include(error_text)
-    expect(exception.message).not_to eq(error_text)
-  end
-end

+ 2 - 0
spec/lib/import/zendesk/object_attribute/checkbox_spec.rb

@@ -1,6 +1,8 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Checkbox do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports boolean object attribute from checkbox object field' do
 

+ 2 - 0
spec/lib/import/zendesk/object_attribute/date_spec.rb

@@ -1,9 +1,11 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 # required due to some of rails autoloading issues
 require 'import/zendesk/object_attribute/date'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Date do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports date object attribute from date object field' do
 

+ 2 - 0
spec/lib/import/zendesk/object_attribute/decimal_spec.rb

@@ -1,6 +1,8 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Decimal do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports input object attribute from decimal object field' do
 

+ 2 - 0
spec/lib/import/zendesk/object_attribute/dropdown_spec.rb

@@ -1,6 +1,8 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Dropdown do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports select object attribute from dropdown object field' do
 

+ 2 - 0
spec/lib/import/zendesk/object_attribute/integer_spec.rb

@@ -1,9 +1,11 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 # required due to some of rails autoloading issues
 require 'import/zendesk/object_attribute/integer'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Integer do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports integer object attribute from integer object field' do
 

+ 2 - 0
spec/lib/import/zendesk/object_attribute/regexp_spec.rb

@@ -1,9 +1,11 @@
 require 'rails_helper'
+require 'lib/import/zendesk/object_attribute/base_examples'
 
 # required due to some of rails autoloading issues
 require 'import/zendesk/object_attribute/regexp'
 
 RSpec.describe Import::Zendesk::ObjectAttribute::Regexp do
+  it_behaves_like Import::Zendesk::ObjectAttribute::Base
 
   it 'imports input object attribute from regexp object field' do
 

Some files were not shown because too many files changed in this diff