1# frozen_string_literal: true 2 3require 'spec_helper' 4 5RSpec.describe Clusters::ClustersHierarchy do 6 describe '#base_and_ancestors' do 7 def base_and_ancestors(clusterable) 8 described_class.new(clusterable).base_and_ancestors 9 end 10 11 context 'project in nested group with clusters at every level' do 12 let!(:cluster) { create(:cluster, :project, projects: [project]) } 13 let!(:child) { create(:cluster, :group, groups: [child_group]) } 14 let!(:parent) { create(:cluster, :group, groups: [parent_group]) } 15 let!(:ancestor) { create(:cluster, :group, groups: [ancestor_group]) } 16 17 let(:ancestor_group) { create(:group) } 18 let(:parent_group) { create(:group, parent: ancestor_group) } 19 let(:child_group) { create(:group, parent: parent_group) } 20 let(:project) { create(:project, group: child_group) } 21 22 it 'returns clusters for project' do 23 expect(base_and_ancestors(project)).to eq([cluster, child, parent, ancestor]) 24 end 25 26 it 'returns clusters for child_group' do 27 expect(base_and_ancestors(child_group)).to eq([child, parent, ancestor]) 28 end 29 30 it 'returns clusters for parent_group' do 31 expect(base_and_ancestors(parent_group)).to eq([parent, ancestor]) 32 end 33 34 it 'returns clusters for ancestor_group' do 35 expect(base_and_ancestors(ancestor_group)).to eq([ancestor]) 36 end 37 end 38 39 context 'project in a namespace' do 40 let!(:cluster) { create(:cluster, :project) } 41 42 it 'returns clusters for project' do 43 expect(base_and_ancestors(cluster.project)).to eq([cluster]) 44 end 45 46 context 'cluster has management project' do 47 let(:management_project) { create(:project, namespace: cluster.first_project.namespace) } 48 49 before do 50 cluster.update!(management_project: management_project) 51 end 52 53 context 'management_project is in same namespace as cluster' do 54 it 'returns cluster for management_project' do 55 expect(base_and_ancestors(management_project)).to eq([cluster]) 56 end 57 end 58 59 context 'management_project is in a different namespace from cluster' do 60 let(:management_project) { create(:project) } 61 62 it 'returns nothing' do 63 expect(base_and_ancestors(management_project)).to be_empty 64 end 65 end 66 end 67 end 68 69 context 'cluster has management project' do 70 let!(:project_cluster) { create(:cluster, :project, projects: [project]) } 71 let!(:group_cluster) { create(:cluster, :group, groups: [group], management_project: management_project) } 72 73 let(:group) { create(:group) } 74 let(:project) { create(:project, group: group) } 75 let(:management_project) { create(:project, group: group) } 76 77 it 'returns clusters for management_project' do 78 expect(base_and_ancestors(management_project)).to eq([group_cluster]) 79 end 80 81 it 'returns clusters for project' do 82 expect(base_and_ancestors(project)).to eq([project_cluster, group_cluster]) 83 end 84 85 it 'returns clusters for group' do 86 expect(base_and_ancestors(group)).to eq([group_cluster]) 87 end 88 end 89 90 context 'project in nested group with clusters at some levels' do 91 let!(:child) { create(:cluster, :group, groups: [child_group]) } 92 let!(:ancestor) { create(:cluster, :group, groups: [ancestor_group], management_project: management_project) } 93 94 let(:ancestor_group) { create(:group) } 95 let(:parent_group) { create(:group, parent: ancestor_group) } 96 let(:child_group) { create(:group, parent: parent_group) } 97 let(:project) { create(:project, group: child_group) } 98 let(:management_project) { create(:project, group: child_group) } 99 100 it 'returns clusters for management_project' do 101 expect(base_and_ancestors(management_project)).to eq([ancestor, child]) 102 end 103 104 it 'returns clusters for project' do 105 expect(base_and_ancestors(project)).to eq([child, ancestor]) 106 end 107 108 it 'returns clusters for child_group' do 109 expect(base_and_ancestors(child_group)).to eq([child, ancestor]) 110 end 111 112 it 'returns clusters for parent_group' do 113 expect(base_and_ancestors(parent_group)).to eq([ancestor]) 114 end 115 116 it 'returns clusters for ancestor_group' do 117 expect(base_and_ancestors(ancestor_group)).to eq([ancestor]) 118 end 119 end 120 end 121end 122