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

project_group_link_entity_spec.rb « group_link « serializers « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9f09020b91d6483e93bd14ea09e3a69840f04d2c (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
119
120
121
122
123
124
125
126
127
128
129
130
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe GroupLink::ProjectGroupLinkEntity, feature_category: :groups_and_projects do
  let_it_be(:current_user) { create(:user) }
  let_it_be(:project_group_link) { create(:project_group_link) }

  let(:entity) { described_class.new(project_group_link, { current_user: current_user, source: project_group_link.project }) }

  subject(:as_json) do
    entity.as_json
  end

  it 'matches json schema' do
    expect(entity.to_json).to match_schema('group_link/project_group_link')
  end

  context 'when current user is a direct member' do
    before do
      allow(entity).to receive(:direct_member?).and_return(true)
      allow(entity).to receive(:can?).and_call_original
    end

    describe 'can_update' do
      using RSpec::Parameterized::TableSyntax

      where(
        :can_admin_project_member,
        :can_manage_group_link_with_owner_access,
        :expected_can_update
      ) do
        false | false | false
        true  | false | false
        true  | true  | true
      end

      with_them do
        before do
          allow(entity)
            .to receive(:can?)
            .with(current_user, :admin_project_member, project_group_link.shared_from)
            .and_return(can_admin_project_member)
          allow(entity)
            .to receive(:can?)
            .with(current_user, :manage_group_link_with_owner_access, project_group_link)
            .and_return(can_manage_group_link_with_owner_access)
        end

        it "exposes `can_update` as `#{params[:expected_can_update]}`" do
          expect(entity.as_json[:can_update]).to be expected_can_update
        end
      end
    end

    describe 'can_remove' do
      context 'when current user has `destroy_project_group_link` ability' do
        before do
          allow(entity)
            .to receive(:can?)
            .with(current_user, :destroy_project_group_link, project_group_link)
            .and_return(true)
        end

        it 'exposes `can_remove` as `true`' do
          expect(entity.as_json[:can_remove]).to be(true)
        end
      end

      context 'when current user does not have `destroy_project_group_link` ability' do
        before do
          allow(entity)
            .to receive(:can?)
            .with(current_user, :destroy_project_group_link, project_group_link)
            .and_return(false)
        end

        it 'exposes `can_remove` as `false`' do
          expect(entity.as_json[:can_remove]).to be(false)
        end
      end
    end
  end

  context 'when current user is not a direct member' do
    before do
      allow(entity).to receive(:direct_member?).and_return(false)
    end

    it 'exposes `can_update` and `can_remove` as `false`' do
      json = entity.as_json

      expect(json[:can_update]).to be false
      expect(json[:can_remove]).to be false
    end
  end

  context 'when current user is not a project member' do
    context 'when group is public' do
      it 'does expose shared_with_group details' do
        expect(as_json[:shared_with_group].keys).to include(:id, :avatar_url, :web_url, :name)
      end

      it 'does expose source details' do
        expect(as_json[:source].keys).to include(:id, :full_name)
      end

      it 'sets is_shared_with_group_private to false' do
        expect(as_json[:is_shared_with_group_private]).to be false
      end
    end

    context 'when group is private' do
      let_it_be(:private_group) { create(:group, :private) }
      let_it_be(:project_group_link) { create(:project_group_link, group: private_group) }

      it 'does not expose shared_with_group details' do
        expect(as_json[:shared_with_group].keys).to contain_exactly(:id)
      end

      it 'does not expose source details' do
        expect(as_json[:source]).to be_nil
      end

      it 'sets is_shared_with_group_private to true' do
        expect(as_json[:is_shared_with_group_private]).to be true
      end
    end
  end
end