diff --git a/ee/app/graphql/ee/types/group_type.rb b/ee/app/graphql/ee/types/group_type.rb index 80d6adde6491b9046064b2b78304c82372ee9f11..47f13861c1aee2966599a4768f46687d1a971cb0 100644 --- a/ee/app/graphql/ee/types/group_type.rb +++ b/ee/app/graphql/ee/types/group_type.rb @@ -85,6 +85,7 @@ module GroupType field :billable_members_count, ::GraphQL::Types::Int, null: true, + authorize: :owner_access, description: 'Number of billable users in the group.' do argument :requested_hosted_plan, String, required: false, description: 'Plan from which to get billable members.' end diff --git a/ee/spec/graphql/ee/types/group_type_spec.rb b/ee/spec/graphql/ee/types/group_type_spec.rb index f5a461e3fed79c0b0c1463823d7356caaa4e2332..287399170a4165bdc86921732dc3ea2f191b439a 100644 --- a/ee/spec/graphql/ee/types/group_type_spec.rb +++ b/ee/spec/graphql/ee/types/group_type_spec.rb @@ -69,20 +69,15 @@ describe 'billable members count' do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, namespace: group) } - let_it_be(:user1) { create(:user) } - let_it_be(:user2) { create(:user) } - let_it_be(:user3) { create(:user) } - let_it_be(:user4) { create(:user) } - - before do - group.add_developer(user1) - group.add_guest(user2) - project.add_developer(user3) - project.add_guest(user4) - end - - it "returns billable users count including guests when no plan is provided" do - query = <<~GQL + let_it_be(:group_owner) { create(:user) } + let_it_be(:group_developer) { create(:user) } + let_it_be(:group_guest) { create(:user) } + let_it_be(:project_developer) { create(:user) } + let_it_be(:project_guest) { create(:user) } + + let(:current_user) { group_owner } + let(:query) do + <<~GQL query { group(fullPath: "#{group.full_path}") { id, @@ -90,46 +85,63 @@ } } GQL + end - result = GitlabSchema.execute(query, context: { current_user: user1 }).as_json + before do + group.add_owner(group_owner) + group.add_developer(group_developer) + group.add_guest(group_guest) + project.add_developer(project_developer) + project.add_guest(project_guest) + end - billable_members_count = result.dig('data', 'group', 'billableMembersCount') + subject(:billable_members_count) do + result = GitlabSchema.execute(query, context: { current_user: current_user }).as_json - expect(billable_members_count).to eq(4) + result.dig('data', 'group', 'billableMembersCount') end - it "returns billable users count including guests when a plan that should include guests is provided" do - query = <<~GQL - query { - group(fullPath: "#{group.full_path}") { - id, - billableMembersCount(requestedHostedPlan: "#{::Plan::SILVER}") - } - } - GQL + context 'when no plan is provided' do + it 'returns billable users count including guests' do + expect(billable_members_count).to eq(5) + end + end - result = GitlabSchema.execute(query, context: { current_user: user1 }).as_json + context 'when a plan is provided' do + let(:query) do + <<~GQL + query { + group(fullPath: "#{group.full_path}") { + id, + billableMembersCount(requestedHostedPlan: "#{plan}") + } + } + GQL + end - billable_members_count = result.dig('data', 'group', 'billableMembersCount') + context 'with a plan that should include guests is provided' do + let(:plan) { ::Plan::SILVER } - expect(billable_members_count).to eq(4) - end + it 'returns billable users count including guests' do + expect(billable_members_count).to eq(5) + end + end - it "returns billable users count excluding guests when a plan that should exclude guests is provided" do - query = <<~GQL - query { - group(fullPath: "#{group.full_path}") { - id, - billableMembersCount(requestedHostedPlan: "#{::Plan::ULTIMATE}") - } - } - GQL + context 'with a plan that should exclude guests is provided' do + let(:plan) { ::Plan::ULTIMATE } - result = GitlabSchema.execute(query, context: { current_user: user1 }).as_json + it 'returns billable users count excluding guests when a plan that should exclude guests is provided' do + expect(billable_members_count).to eq(3) + end + end + end - billable_members_count = result.dig('data', 'group', 'billableMembersCount') + context 'without owner authorization' do + let(:current_user) { group_developer } - expect(billable_members_count).to eq(2) + it 'does not return the billable members count' do + expect(billable_members_count).to be_nil + end end end