Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/ci/runner_spec.rb')
-rw-r--r--spec/models/ci/runner_spec.rb184
1 files changed, 146 insertions, 38 deletions
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 181351222c1..13eb7086586 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -1186,7 +1186,7 @@ RSpec.describe Ci::Runner do
end
end
- context 'Project-related queries' do
+ describe 'Project-related queries' do
let_it_be(:project1) { create(:project) }
let_it_be(:project2) { create(:project) }
@@ -1206,14 +1206,14 @@ RSpec.describe Ci::Runner do
end
end
- describe "belongs_to_one_project?" do
+ describe '#belongs_to_one_project?' do
it "returns false if there are two projects runner is assigned to" do
runner = create(:ci_runner, :project, projects: [project1, project2])
expect(runner.belongs_to_one_project?).to be_falsey
end
- it "returns true if there is only one project runner is assigned to" do
+ it 'returns true if there is only one project runner is assigned to' do
runner = create(:ci_runner, :project, projects: [project1])
expect(runner.belongs_to_one_project?).to be_truthy
@@ -1537,47 +1537,155 @@ RSpec.describe Ci::Runner do
it { is_expected.to eq(contacted_at_stored) }
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])
+ describe 'Group-related queries' do
+ # Groups
+ let_it_be(:top_level_group) { create(:group) }
+ let_it_be(:child_group) { create(:group, parent: top_level_group) }
+ let_it_be(:child_group2) { create(:group, parent: top_level_group) }
+ let_it_be(:other_top_level_group) { create(:group) }
+
+ # Projects
+ let_it_be(:top_level_group_project) { create(:project, group: top_level_group) }
+ let_it_be(:child_group_project) { create(:project, group: child_group) }
+ let_it_be(:other_top_level_group_project) { create(:project, group: other_top_level_group) }
- expect(described_class.belonging_to_group(group.id)).to contain_exactly(runner)
+ # Runners
+ let_it_be(:instance_runner) { create(:ci_runner, :instance) }
+ let_it_be(:top_level_group_runner) { create(:ci_runner, :group, groups: [top_level_group]) }
+ let_it_be(:child_group_runner) { create(:ci_runner, :group, groups: [child_group]) }
+ let_it_be(:child_group2_runner) { create(:ci_runner, :group, groups: [child_group2]) }
+ let_it_be(:other_top_level_group_runner) do
+ create(:ci_runner, :group, groups: [other_top_level_group])
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) }
+ let_it_be(:top_level_group_project_runner) do
+ create(:ci_runner, :project, projects: [top_level_group_project])
+ end
- 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)
+ let_it_be(:child_group_project_runner) do
+ create(:ci_runner, :project, projects: [child_group_project])
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
- )
+ let_it_be(:other_top_level_group_project_runner) do
+ create(:ci_runner, :project, projects: [other_top_level_group_project])
+ end
+
+ let_it_be(:shared_top_level_group_project_runner) do
+ create(:ci_runner, :project, projects: [top_level_group_project, child_group_project])
+ end
+
+ describe '.belonging_to_group' do
+ subject(:relation) { described_class.belonging_to_group(scope.id) }
+
+ context 'with scope set to top_level_group' do
+ let(:scope) { top_level_group }
+
+ it 'returns the group runners from the top_level_group' do
+ is_expected.to contain_exactly(top_level_group_runner)
+ end
+ end
+
+ context 'with scope set to child_group' do
+ let(:scope) { child_group }
+
+ it 'returns the group runners from the child_group' do
+ is_expected.to contain_exactly(child_group_runner)
+ end
+ end
+ end
+
+ describe '.belonging_to_group_and_ancestors' do
+ subject(:relation) { described_class.belonging_to_group_and_ancestors(child_group.id) }
+
+ it 'returns the group runners from the group and parent group' do
+ is_expected.to contain_exactly(child_group_runner, top_level_group_runner)
+ end
+ end
+
+ describe '.belonging_to_group_or_project_descendants' do
+ subject(:relation) { described_class.belonging_to_group_or_project_descendants(scope.id) }
+
+ context 'with scope set to top_level_group' do
+ let(:scope) { top_level_group }
+
+ it 'returns the expected group and project runners without duplicates', :aggregate_failures do
+ expect(relation).to contain_exactly(
+ top_level_group_runner,
+ top_level_group_project_runner,
+ child_group_runner,
+ child_group_project_runner,
+ child_group2_runner,
+ shared_top_level_group_project_runner
+ )
+
+ # Ensure no duplicates are returned
+ expect(relation.distinct).to match_array(relation)
+ end
+ end
+
+ context 'with scope set to child_group' do
+ let(:scope) { child_group }
+
+ it 'returns the expected group and project runners without duplicates', :aggregate_failures do
+ expect(relation).to contain_exactly(
+ child_group_runner,
+ child_group_project_runner,
+ shared_top_level_group_project_runner
+ )
+
+ # Ensure no duplicates are returned
+ expect(relation.distinct).to match_array(relation)
+ end
+ end
+ end
+
+ describe '.usable_from_scope' do
+ subject(:relation) { described_class.usable_from_scope(scope) }
+
+ context 'with scope set to top_level_group' do
+ let(:scope) { top_level_group }
+
+ it 'returns all runners usable from top_level_group without duplicates' do
+ expect(relation).to contain_exactly(
+ instance_runner,
+ top_level_group_runner,
+ top_level_group_project_runner,
+ child_group_runner,
+ child_group_project_runner,
+ child_group2_runner,
+ shared_top_level_group_project_runner
+ )
+
+ # Ensure no duplicates are returned
+ expect(relation.distinct).to match_array(relation)
+ end
+ end
+
+ context 'with scope set to child_group' do
+ let(:scope) { child_group }
+
+ it 'returns all runners usable from child_group' do
+ expect(relation).to contain_exactly(
+ instance_runner,
+ top_level_group_runner,
+ child_group_runner,
+ child_group_project_runner,
+ shared_top_level_group_project_runner
+ )
+ end
+ end
+
+ context 'with scope set to other_top_level_group' do
+ let(:scope) { other_top_level_group }
+
+ it 'returns all runners usable from other_top_level_group' do
+ expect(relation).to contain_exactly(
+ instance_runner,
+ other_top_level_group_runner,
+ other_top_level_group_project_runner
+ )
+ end
+ end
end
end