summaryrefslogtreecommitdiff
path: root/spec/finders/award_emojis_finder_spec.rb
blob: ccac475daadefe88c34f39076a22e56da350cdc8 (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
# frozen_string_literal: true

require 'spec_helper'

describe AwardEmojisFinder do
  set(:issue_1) { create(:issue) }
  set(:issue_1_thumbsup) { create(:award_emoji, name: 'thumbsup', awardable: issue_1) }
  set(:issue_1_thumbsdown) { create(:award_emoji, name: 'thumbsdown', awardable: issue_1) }
  # Create a matching set of emoji for a second issue.
  # These should never appear in our finder results
  set(:issue_2) { create(:issue) }
  set(:issue_2_thumbsup) { create(:award_emoji, name: 'thumbsup', awardable: issue_2) }
  set(:issue_2_thumbsdown) { create(:award_emoji, name: 'thumbsdown', awardable: issue_2) }

  describe 'param validation' do
    it 'raises an error if `name` is invalid' do
      expect { described_class.new(issue_1, { name: 'invalid' }).execute }.to raise_error(
        ArgumentError,
        'Invalid name param'
      )
    end

    it 'raises an error if `awarded_by` is invalid' do
      expectation = [ArgumentError, 'Invalid awarded_by param']

      expect { described_class.new(issue_1, { awarded_by: issue_2 }).execute }.to raise_error(*expectation)
      expect { described_class.new(issue_1, { awarded_by: 'not-an-id' }).execute }.to raise_error(*expectation)
      expect { described_class.new(issue_1, { awarded_by: 1.123 }).execute }.to raise_error(*expectation)
    end
  end

  describe '#execute' do
    it 'scopes to the awardable' do
      expect(described_class.new(issue_1).execute).to contain_exactly(
        issue_1_thumbsup, issue_1_thumbsdown
      )
    end

    it 'filters by emoji name' do
      expect(described_class.new(issue_1, { name: 'thumbsup' }).execute).to contain_exactly(issue_1_thumbsup)
      expect(described_class.new(issue_1, { name: '8ball' }).execute).to be_empty
    end

    it 'filters by user' do
      expect(described_class.new(issue_1, { awarded_by: issue_1_thumbsup.user }).execute).to contain_exactly(issue_1_thumbsup)
      expect(described_class.new(issue_1, { awarded_by: issue_2_thumbsup.user }).execute).to be_empty
    end
  end
end