teammate_spec.rb 5.1 KB
Newer Older
1 2
# frozen_string_literal: true

3 4
require 'fast_spec_helper'

5 6
require 'rspec-parameterized'

7 8
require 'gitlab/danger/teammate'

9
describe Gitlab::Danger::Teammate do
10 11
  subject { described_class.new(options.stringify_keys) }
  let(:options) { { username: 'luigi', projects: projects, role: role } }
12
  let(:projects) { { project => capabilities } }
13 14
  let(:role) { 'Engineer, Manage' }
  let(:labels) { [] }
15 16
  let(:project) { double }

17 18
  context 'when having multiple capabilities' do
    let(:capabilities) { ['reviewer backend', 'maintainer frontend', 'trainee_maintainer qa'] }
19 20

    it '#reviewer? supports multiple roles per project' do
21
      expect(subject.reviewer?(project, :backend, labels)).to be_truthy
22 23 24
    end

    it '#traintainer? supports multiple roles per project' do
25
      expect(subject.traintainer?(project, :qa, labels)).to be_truthy
26 27 28
    end

    it '#maintainer? supports multiple roles per project' do
29 30 31 32
      expect(subject.maintainer?(project, :frontend, labels)).to be_truthy
    end

    context 'when labels contain Create and the category is test' do
33
      let(:labels) { ['devops::create'] }
34 35 36 37 38 39 40 41 42 43 44

      context 'when role is Test Automation Engineer, Create' do
        let(:role) { 'Test Automation Engineer, Create' }

        it '#reviewer? returns true' do
          expect(subject.reviewer?(project, :test, labels)).to be_truthy
        end

        it '#maintainer? returns false' do
          expect(subject.maintainer?(project, :test, labels)).to be_falsey
        end
45 46 47 48 49 50 51 52

        context 'when hyperlink is mangled in the role' do
          let(:role) { '<a href="#">Test Automation Engineer</a>, Create' }

          it '#reviewer? returns true' do
            expect(subject.reviewer?(project, :test, labels)).to be_truthy
          end
        end
53 54
      end

55 56 57 58 59 60 61 62
      context 'when role is Test Automation Engineer' do
        let(:role) { 'Test Automation Engineer' }

        it '#reviewer? returns false' do
          expect(subject.reviewer?(project, :test, labels)).to be_falsey
        end
      end

63 64 65 66 67 68 69
      context 'when role is Test Automation Engineer, Manage' do
        let(:role) { 'Test Automation Engineer, Manage' }

        it '#reviewer? returns false' do
          expect(subject.reviewer?(project, :test, labels)).to be_falsey
        end
      end
70 71 72 73 74 75 76 77 78 79 80 81

      context 'when role is Backend Engineer, Engineering Productivity' do
        let(:role) { 'Backend Engineer, Engineering Productivity' }

        it '#reviewer? returns true' do
          expect(subject.reviewer?(project, :engineering_productivity, labels)).to be_truthy
        end

        it '#maintainer? returns false' do
          expect(subject.maintainer?(project, :engineering_productivity, labels)).to be_falsey
        end
      end
82 83 84
    end
  end

85
  context 'when having single capability' do
86 87 88
    let(:capabilities) { 'reviewer backend' }

    it '#reviewer? supports one role per project' do
89
      expect(subject.reviewer?(project, :backend, labels)).to be_truthy
90 91 92
    end

    it '#traintainer? supports one role per project' do
93
      expect(subject.traintainer?(project, :database, labels)).to be_falsey
94 95 96
    end

    it '#maintainer? supports one role per project' do
97
      expect(subject.maintainer?(project, :frontend, labels)).to be_falsey
98 99
    end
  end
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 150 151 152 153 154 155 156 157 158 159

  describe '#status' do
    let(:capabilities) { ['dish washing'] }

    context 'with empty cache' do
      context 'for successful request' do
        it 'returns the response' do
          mock_status = double(does_not: 'matter')
          expect(Gitlab::Danger::RequestHelper).to receive(:http_get_json)
                                                       .and_return(mock_status)

          expect(subject.status).to be mock_status
        end
      end

      context 'for failing request' do
        it 'returns nil' do
          expect(Gitlab::Danger::RequestHelper).to receive(:http_get_json)
                                                       .and_raise(Gitlab::Danger::RequestHelper::HTTPError.new)

          expect(subject.status).to be nil
        end
      end
    end

    context 'with filled cache' do
      it 'returns the cached response' do
        mock_status = double(does_not: 'matter')
        expect(Gitlab::Danger::RequestHelper).to receive(:http_get_json)
                                                     .and_return(mock_status)
        subject.status

        expect(Gitlab::Danger::RequestHelper).not_to receive(:http_get_json)
        expect(subject.status).to be mock_status
      end
    end
  end

  describe '#out_of_office?' do
    using RSpec::Parameterized::TableSyntax

    let(:capabilities) { ['dry head'] }

    where(:status, :result) do
      nil                              | false
      {}                               | false
      { message: 'dear reader' }       | false
      { message: 'OOO: massage' }      | true
      { message: 'love it SOOO much' } | true
    end

    with_them do
      before do
        expect(Gitlab::Danger::RequestHelper).to receive(:http_get_json)
                                                     .and_return(status&.stringify_keys)
      end

      it { expect(subject.out_of_office?).to be result }
    end
  end
160
end