summaryrefslogtreecommitdiff
path: root/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
blob: ae628d3e56cceae19538120505130fbcd15a704e (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# frozen_string_literal: true

require 'spec_helper'

describe 'Toggling an AwardEmoji' do
  include GraphqlHelpers

  set(:current_user) { create(:user) }
  set(:project) { create(:project) }
  set(:awardable) { create(:note, project: project) }
  let(:emoji_name) { 'thumbsup' }
  let(:mutation) do
    variables = {
      awardable_id: GitlabSchema.id_from_object(awardable).to_s,
      name: emoji_name
    }

    graphql_mutation(:toggle_award_emoji, variables)
  end

  def mutation_response
    graphql_mutation_response(:toggle_award_emoji)
  end

  shared_examples 'a mutation that does not create or destroy an AwardEmoji' do
    it do
      expect do
        post_graphql_mutation(mutation, current_user: current_user)
      end.not_to change { AwardEmoji.count }
    end
  end

  def create_award_emoji(user)
    create(:award_emoji, name: emoji_name, awardable: awardable, user: user )
  end

  context 'when the user has permission' do
    before do
      project.add_developer(current_user)
    end

    context 'when the given awardable is not an Awardable' do
      let(:awardable) { create(:label, project: project) }

      it_behaves_like 'a mutation that does not create or destroy an AwardEmoji'

      it_behaves_like 'a mutation that returns top-level errors',
                      errors: ['Cannot award emoji to this resource']
    end

    context 'when the given awardable is an Awardable but still cannot be awarded an emoji' do
      let(:awardable) { create(:system_note, project: project) }

      it_behaves_like 'a mutation that does not create or destroy an AwardEmoji'

      it_behaves_like 'a mutation that returns top-level errors',
                      errors: ['Cannot award emoji to this resource']
    end

    context 'when the given awardable is an Awardable' do
      context 'when no emoji has been awarded by the current_user yet' do
        # Create an award emoji for another user. This therefore tests that
        # toggling is correctly scoped to the user's emoji only.
        let!(:award_emoji) { create_award_emoji(create(:user)) }

        it 'creates an emoji' do
          expect do
            post_graphql_mutation(mutation, current_user: current_user)
          end.to change { AwardEmoji.count }.by(1)
        end

        it 'returns the emoji' do
          post_graphql_mutation(mutation, current_user: current_user)

          expect(mutation_response['awardEmoji']['name']).to eq(emoji_name)
        end

        it 'returns toggledOn as true' do
          post_graphql_mutation(mutation, current_user: current_user)

          expect(mutation_response['toggledOn']).to eq(true)
        end

        describe 'marking Todos as done' do
          let(:user) { current_user}
          subject { post_graphql_mutation(mutation, current_user: user) }

          include_examples 'creating award emojis marks Todos as done'
        end

        context 'when there were active record validation errors' do
          before do
            expect_next_instance_of(AwardEmoji) do |award|
              expect(award).to receive(:valid?).at_least(:once).and_return(false)
              expect(award).to receive_message_chain(:errors, :full_messages).and_return(['Error 1', 'Error 2'])
            end
          end

          it_behaves_like 'a mutation that does not create or destroy an AwardEmoji'

          it_behaves_like 'a mutation that returns errors in the response', errors: ['Error 1', 'Error 2']

          it 'returns an empty awardEmoji' do
            post_graphql_mutation(mutation, current_user: current_user)

            expect(mutation_response).to have_key('awardEmoji')
            expect(mutation_response['awardEmoji']).to be_nil
          end
        end
      end

      context 'when an emoji has been awarded by the current_user' do
        let!(:award_emoji) { create_award_emoji(current_user) }

        it 'removes the emoji' do
          expect do
            post_graphql_mutation(mutation, current_user: current_user)
          end.to change { AwardEmoji.count }.by(-1)
        end

        it 'returns no errors' do
          post_graphql_mutation(mutation, current_user: current_user)

          expect(graphql_errors).to be_nil
        end

        it 'returns an empty awardEmoji' do
          post_graphql_mutation(mutation, current_user: current_user)

          expect(mutation_response).to have_key('awardEmoji')
          expect(mutation_response['awardEmoji']).to be_nil
        end

        it 'returns toggledOn as false' do
          post_graphql_mutation(mutation, current_user: current_user)

          expect(mutation_response['toggledOn']).to eq(false)
        end
      end
    end
  end

  context 'when the user does not have permission' do
    it_behaves_like 'a mutation that does not create or destroy an AwardEmoji'

    it_behaves_like 'a mutation that returns top-level errors',
                    errors: ['The resource that you are attempting to access does not exist or you don\'t have permission to perform this action']
  end
end