gitlab-org--gitlab-foss/spec/workers/concerns/worker_attributes_spec.rb

144 lines
5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe WorkerAttributes do
using RSpec::Parameterized::TableSyntax
let(:worker) do
Class.new do
def self.name
"TestWorker"
end
include ApplicationWorker
end
end
let(:child_worker) do
Class.new(worker) do
def self.name
"TestChildworker"
end
end
end
describe 'class attributes' do
# rubocop: disable Layout/LineLength
where(:getter, :setter, :default, :values, :expected) do
:get_feature_category | :feature_category | nil | [:foo] | :foo
:get_urgency | :urgency | :low | [:high] | :high
:get_data_consistency | :data_consistency | :always | [:sticky] | :sticky
:get_worker_resource_boundary | :worker_resource_boundary | :unknown | [:cpu] | :cpu
:get_weight | :weight | 1 | [3] | 3
:get_tags | :tags | [] | [:foo, :bar] | [:foo, :bar]
:get_deduplicate_strategy | :deduplicate | :until_executing | [:none] | :none
:get_deduplication_options | :deduplicate | {} | [:none, including_scheduled: true] | { including_scheduled: true }
:worker_has_external_dependencies? | :worker_has_external_dependencies! | false | [] | true
:idempotent? | :idempotent! | false | [] | true
:big_payload? | :big_payload! | false | [] | true
end
# rubocop: enable Layout/LineLength
with_them do
context 'when the attribute is set' do
before do
worker.public_send(setter, *values)
end
it 'returns the expected value' do
expect(worker.public_send(getter)).to eq(expected)
expect(child_worker.public_send(getter)).to eq(expected)
end
end
context 'when the attribute is not set' do
it 'returns the default value' do
expect(worker.public_send(getter)).to eq(default)
expect(child_worker.public_send(getter)).to eq(default)
end
end
context 'when the attribute is set in the child worker' do
before do
child_worker.public_send(setter, *values)
end
it 'returns the default value for the parent, and the expected value for the child' do
expect(worker.public_send(getter)).to eq(default)
expect(child_worker.public_send(getter)).to eq(expected)
end
end
end
end
describe '.data_consistency' do
context 'with invalid data_consistency' do
it 'raise exception' do
expect { worker.data_consistency(:invalid) }
.to raise_error('Invalid data consistency: invalid')
end
end
context 'when feature_flag is provided' do
before do
stub_feature_flags(test_feature_flag: false)
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
end
it 'returns correct feature flag value' do
worker.data_consistency(:sticky, feature_flag: :test_feature_flag)
expect(worker.get_data_consistency_feature_flag_enabled?).not_to be(true)
expect(child_worker.get_data_consistency_feature_flag_enabled?).not_to be(true)
end
end
end
describe '#deduplication_enabled?' do
subject(:deduplication_enabled?) { worker.deduplication_enabled? }
context 'when no feature flag is set' do
before do
worker.deduplicate(:until_executing)
end
it 'returns true' do
expect(worker.deduplication_enabled?).to be(true)
expect(child_worker.deduplication_enabled?).to be(true)
end
end
context 'when feature flag is set' do
before do
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
worker.deduplicate(:until_executing, feature_flag: :my_feature_flag)
end
context 'when the FF is enabled' do
before do
stub_feature_flags(my_feature_flag: true)
end
it 'returns true' do
expect(worker.deduplication_enabled?).to be(true)
expect(child_worker.deduplication_enabled?).to be(true)
end
end
context 'when the FF is disabled' do
before do
stub_feature_flags(my_feature_flag: false)
end
it 'returns false' do
expect(worker.deduplication_enabled?).to be(false)
expect(child_worker.deduplication_enabled?).to be(false)
end
end
end
end
end