diff options
Diffstat (limited to 'spec/models/hooks')
-rw-r--r-- | spec/models/hooks/project_hook_spec.rb | 11 | ||||
-rw-r--r-- | spec/models/hooks/service_hook_spec.rb | 10 | ||||
-rw-r--r-- | spec/models/hooks/system_hook_spec.rb | 10 | ||||
-rw-r--r-- | spec/models/hooks/web_hook_log_archived_spec.rb | 52 | ||||
-rw-r--r-- | spec/models/hooks/web_hook_spec.rb | 49 |
5 files changed, 79 insertions, 53 deletions
diff --git a/spec/models/hooks/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb index 88149465232..d811f67d16b 100644 --- a/spec/models/hooks/project_hook_spec.rb +++ b/spec/models/hooks/project_hook_spec.rb @@ -39,4 +39,15 @@ RSpec.describe ProjectHook do expect(hook.rate_limit).to be(100) end end + + describe '#application_context' do + let_it_be(:hook) { build(:project_hook) } + + it 'includes the type and project' do + expect(hook.application_context).to include( + related_class: 'ProjectHook', + project: hook.project + ) + end + end end diff --git a/spec/models/hooks/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb index 651716c3280..4ce2e729d89 100644 --- a/spec/models/hooks/service_hook_spec.rb +++ b/spec/models/hooks/service_hook_spec.rb @@ -30,4 +30,14 @@ RSpec.describe ServiceHook do expect(hook.rate_limit).to be_nil end end + + describe '#application_context' do + let(:hook) { build(:service_hook) } + + it 'includes the type' do + expect(hook.application_context).to eq( + related_class: 'ServiceHook' + ) + end + end end diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb index a72034f1ac5..a99263078b3 100644 --- a/spec/models/hooks/system_hook_spec.rb +++ b/spec/models/hooks/system_hook_spec.rb @@ -177,4 +177,14 @@ RSpec.describe SystemHook do expect(hook.rate_limit).to be_nil end end + + describe '#application_context' do + let(:hook) { build(:system_hook) } + + it 'includes the type' do + expect(hook.application_context).to eq( + related_class: 'SystemHook' + ) + end + end end diff --git a/spec/models/hooks/web_hook_log_archived_spec.rb b/spec/models/hooks/web_hook_log_archived_spec.rb deleted file mode 100644 index ac726dbaf4f..00000000000 --- a/spec/models/hooks/web_hook_log_archived_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe WebHookLogArchived do - let(:source_table) { WebHookLog } - let(:destination_table) { described_class } - - it 'has the same columns as the source table' do - column_names_from_source_table = column_names(source_table) - column_names_from_destination_table = column_names(destination_table) - - expect(column_names_from_destination_table).to match_array(column_names_from_source_table) - end - - it 'has the same null constraints as the source table' do - constraints_from_source_table = null_constraints(source_table) - constraints_from_destination_table = null_constraints(destination_table) - - expect(constraints_from_destination_table.to_a).to match_array(constraints_from_source_table.to_a) - end - - it 'inserts the same record as the one in the source table', :aggregate_failures do - expect { create(:web_hook_log) }.to change { destination_table.count }.by(1) - - event_from_source_table = source_table.connection.select_one( - "SELECT * FROM #{source_table.table_name} ORDER BY created_at desc LIMIT 1" - ) - event_from_destination_table = destination_table.connection.select_one( - "SELECT * FROM #{destination_table.table_name} ORDER BY created_at desc LIMIT 1" - ) - - expect(event_from_destination_table).to eq(event_from_source_table) - end - - def column_names(table) - table.connection.select_all(<<~SQL) - SELECT c.column_name - FROM information_schema.columns c - WHERE c.table_name = '#{table.table_name}' - SQL - end - - def null_constraints(table) - table.connection.select_all(<<~SQL) - SELECT c.column_name, c.is_nullable - FROM information_schema.columns c - WHERE c.table_name = '#{table.table_name}' - AND c.column_name != 'created_at' - SQL - end -end diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb index b528dbedd2c..1761b537dc0 100644 --- a/spec/models/hooks/web_hook_spec.rb +++ b/spec/models/hooks/web_hook_spec.rb @@ -268,11 +268,58 @@ RSpec.describe WebHook do end describe '#enable!' do - it 'makes a hook executable' do + it 'makes a hook executable if it was marked as failed' do hook.recent_failures = 1000 expect { hook.enable! }.to change(hook, :executable?).from(false).to(true) end + + it 'makes a hook executable if it is currently backed off' do + hook.disabled_until = 1.hour.from_now + + expect { hook.enable! }.to change(hook, :executable?).from(false).to(true) + end + + it 'does not update hooks unless necessary' do + expect(hook).not_to receive(:update!) + + hook.enable! + end + + it 'is idempotent on executable hooks' do + expect(hook).not_to receive(:update!) + + expect { hook.enable! }.not_to change(hook, :executable?) + end + end + + describe 'backoff!' do + it 'sets disabled_until to the next backoff' do + expect { hook.backoff! }.to change(hook, :disabled_until).to(hook.next_backoff.from_now) + end + + it 'increments the backoff count' do + expect { hook.backoff! }.to change(hook, :backoff_count).by(1) + end + + it 'does not let the backoff count exceed the maximum failure count' do + hook.backoff_count = described_class::MAX_FAILURES + + expect { hook.backoff! }.not_to change(hook, :backoff_count) + end + end + + describe 'failed!' do + it 'increments the failure count' do + expect { hook.failed! }.to change(hook, :recent_failures).by(1) + end + + it 'does not allow the failure count to exceed the maximum value' do + hook.recent_failures = described_class::MAX_FAILURES + expect(hook).not_to receive(:update!) + + expect { hook.failed! }.not_to change(hook, :recent_failures) + end end describe '#disable!' do |