diff options
Diffstat (limited to 'spec/models/ci/runner_spec.rb')
-rw-r--r-- | spec/models/ci/runner_spec.rb | 112 |
1 files changed, 92 insertions, 20 deletions
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 5142f70fa2c..6830a8daa3b 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -48,7 +48,7 @@ RSpec.describe Ci::Runner do let(:runner) { create(:ci_runner, :group, groups: [group]) } it 'disallows assigning group if already assigned to a group' do - runner.runner_namespaces << build(:ci_runner_namespace) + runner.runner_namespaces << create(:ci_runner_namespace) expect(runner).not_to be_valid expect(runner.errors.full_messages).to include('Runner needs to be assigned to exactly one group') @@ -203,28 +203,56 @@ RSpec.describe Ci::Runner do end end - describe '.belonging_to_parent_group_of_project' do - let(:project) { create(:project, group: group) } - let(:group) { create(:group) } - let(:runner) { create(:ci_runner, :group, groups: [group]) } - let!(:unrelated_group) { create(:group) } - let!(:unrelated_project) { create(:project, group: unrelated_group) } - let!(:unrelated_runner) { create(:ci_runner, :group, groups: [unrelated_group]) } + shared_examples '.belonging_to_parent_group_of_project' do + let!(:group1) { create(:group) } + let!(:project1) { create(:project, group: group1) } + let!(:runner1) { create(:ci_runner, :group, groups: [group1]) } + + let!(:group2) { create(:group) } + let!(:project2) { create(:project, group: group2) } + let!(:runner2) { create(:ci_runner, :group, groups: [group2]) } + + let(:project_id) { project1.id } + + subject(:result) { described_class.belonging_to_parent_group_of_project(project_id) } it 'returns the specific group runner' do - expect(described_class.belonging_to_parent_group_of_project(project.id)).to contain_exactly(runner) + expect(result).to contain_exactly(runner1) end - context 'with a parent group with a runner' do - let(:runner) { create(:ci_runner, :group, groups: [parent_group]) } - let(:project) { create(:project, group: group) } - let(:group) { create(:group, parent: parent_group) } - let(:parent_group) { create(:group) } + context 'with a parent group with a runner', :sidekiq_inline do + before do + group1.update!(parent: group2) + end - it 'returns the group runner from the parent group' do - expect(described_class.belonging_to_parent_group_of_project(project.id)).to contain_exactly(runner) + it 'returns the group runner from the group and the parent group' do + expect(result).to contain_exactly(runner1, runner2) end end + + context 'with multiple project ids' do + let(:project_id) { [project1.id, project2.id] } + + it 'raises ArgumentError' do + expect { result }.to raise_error(ArgumentError) + end + end + end + + context 'when use_traversal_ids* are enabled' do + it_behaves_like '.belonging_to_parent_group_of_project' + end + + context 'when use_traversal_ids* are disabled' do + before do + stub_feature_flags( + use_traversal_ids: false, + use_traversal_ids_for_ancestors: false, + use_traversal_ids_for_ancestor_scopes: false + ) + end + + it_behaves_like '.belonging_to_parent_group_of_project' end describe '.owned_or_instance_wide' do @@ -1358,7 +1386,7 @@ RSpec.describe Ci::Runner do it { is_expected.to eq(contacted_at_stored) } end - describe '.belonging_to_group' do + describe '.legacy_belonging_to_group' do shared_examples 'returns group runners' do it 'returns the specific group runner' do group = create(:group) @@ -1366,7 +1394,7 @@ RSpec.describe Ci::Runner do unrelated_group = create(:group) create(:ci_runner, :group, groups: [unrelated_group]) - expect(described_class.belonging_to_group(group.id)).to contain_exactly(runner) + expect(described_class.legacy_belonging_to_group(group.id)).to contain_exactly(runner) end context 'runner belonging to parent group' do @@ -1376,13 +1404,13 @@ RSpec.describe Ci::Runner do context 'when include_parent option is passed' do it 'returns the group runner from the parent group' do - expect(described_class.belonging_to_group(group.id, include_ancestors: true)).to contain_exactly(parent_runner) + expect(described_class.legacy_belonging_to_group(group.id, include_ancestors: true)).to contain_exactly(parent_runner) end end context 'when include_parent option is not passed' do it 'does not return the group runner from the parent group' do - expect(described_class.belonging_to_group(group.id)).to be_empty + expect(described_class.legacy_belonging_to_group(group.id)).to be_empty end end end @@ -1398,4 +1426,48 @@ RSpec.describe Ci::Runner do it_behaves_like 'returns group runners' end end + + describe '.belonging_to_group' do + it 'returns the specific group runner' do + group = create(:group) + runner = create(:ci_runner, :group, groups: [group]) + unrelated_group = create(:group) + create(:ci_runner, :group, groups: [unrelated_group]) + + expect(described_class.belonging_to_group(group.id)).to contain_exactly(runner) + end + end + + describe '.belonging_to_group_and_ancestors' do + let_it_be(:parent_group) { create(:group) } + let_it_be(:parent_runner) { create(:ci_runner, :group, groups: [parent_group]) } + let_it_be(:group) { create(:group, parent: parent_group) } + + it 'returns the group runner from the parent group' do + expect(described_class.belonging_to_group_and_ancestors(group.id)).to contain_exactly(parent_runner) + end + end + + describe '.belonging_to_group_or_project_descendants' do + it 'returns the specific group runners' do + group1 = create(:group) + group2 = create(:group, parent: group1) + group3 = create(:group) + + project1 = create(:project, namespace: group1) + project2 = create(:project, namespace: group2) + project3 = create(:project, namespace: group3) + + runner1 = create(:ci_runner, :group, groups: [group1]) + runner2 = create(:ci_runner, :group, groups: [group2]) + _runner3 = create(:ci_runner, :group, groups: [group3]) + runner4 = create(:ci_runner, :project, projects: [project1]) + runner5 = create(:ci_runner, :project, projects: [project2]) + _runner6 = create(:ci_runner, :project, projects: [project3]) + + expect(described_class.belonging_to_group_or_project_descendants(group1.id)).to contain_exactly( + runner1, runner2, runner4, runner5 + ) + end + end end |