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

project_members_spec.rb « project « graphql « api « requests « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 984a0adb8c6a8d36a156b03e88f988babf270c91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'getting project members information' do
  include GraphqlHelpers

  let_it_be(:parent_group) { create(:group, :public) }
  let_it_be(:parent_project) { create(:project, :public, group: parent_group) }
  let_it_be(:user) { create(:user) }
  let_it_be(:user_1) { create(:user, username: 'user') }
  let_it_be(:user_2) { create(:user, username: 'test') }

  before_all do
    [user_1, user_2].each { |user| parent_group.add_guest(user) }
  end

  context 'when the request is correct' do
    it_behaves_like 'a working graphql query' do
      before do
        fetch_members(project: parent_project)
      end
    end

    it 'returns project members successfully' do
      fetch_members(project: parent_project)

      expect(graphql_errors).to be_nil
      expect_array_response(user_1, user_2)
    end

    it 'returns members that match the search query' do
      fetch_members(project: parent_project, args: { search: 'test' })

      expect(graphql_errors).to be_nil
      expect_array_response(user_2)
    end
  end

  context 'member relations' do
    let_it_be(:child_group) { create(:group, :public, parent: parent_group) }
    let_it_be(:child_project) { create(:project, :public, group: child_group) }
    let_it_be(:invited_group) { create(:group, :public) }
    let_it_be(:child_user) { create(:user) }
    let_it_be(:invited_user) { create(:user) }
    let_it_be(:group_link) { create(:project_group_link, project: child_project, group: invited_group) }

    before_all do
      child_project.add_guest(child_user)
      invited_group.add_guest(invited_user)
    end

    it 'returns direct members' do
      fetch_members(project: child_project, args: { relations: [:DIRECT] })

      expect(graphql_errors).to be_nil
      expect_array_response(child_user)
    end

    it 'returns invited members plus inherited members' do
      fetch_members(project: child_project, args: { relations: [:INVITED_GROUPS] })

      expect(graphql_errors).to be_nil
      expect_array_response(invited_user, user_1, user_2)
    end

    it 'returns direct, inherited, descendant, and invited members' do
      fetch_members(project: child_project, args: { relations: [:DIRECT, :INHERITED, :DESCENDANTS, :INVITED_GROUPS] })

      expect(graphql_errors).to be_nil
      expect_array_response(child_user, user_1, user_2, invited_user)
    end

    it 'returns an error for an invalid member relation' do
      fetch_members(project: child_project, args: { relations: [:OBLIQUE] })

      expect(graphql_errors.first)
        .to include('path' => %w[query project projectMembers relations],
                    'message' => a_string_including('invalid value ([OBLIQUE])'))
    end
  end

  context 'when unauthenticated' do
    it 'returns members' do
      fetch_members(current_user: nil, project: parent_project)

      expect(graphql_errors).to be_nil
      expect_array_response(user_1, user_2)
    end
  end

  def fetch_members(project:, current_user: user, args: {})
    post_graphql(members_query(project.full_path, args), current_user: current_user)
  end

  def members_query(group_path, args = {})
    members_node = <<~NODE
    edges {
      node {
        user {
          id
        }
      }
    }
    NODE

    graphql_query_for('project',
      { full_path: group_path },
      [query_graphql_field('projectMembers', args, members_node)]
    )
  end

  def expect_array_response(*items)
    expect(response).to have_gitlab_http_status(:success)
    member_gids = graphql_data_at(:project, :project_members, :edges, :node, :user, :id)
    expect(member_gids).to match_array(items.map { |u| global_id_of(u) })
  end
end