summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/ci/status/bridge/factory_spec.rb
blob: 6081f104e42d0fc7751523d42e7e239edfef9799 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Ci::Status::Bridge::Factory do
  let(:user) { create(:user) }
  let(:project) { bridge.project }
  let(:status) { factory.fabricate! }
  let(:factory) { described_class.new(bridge, user) }

  before do
    stub_not_protect_default_branch

    project.add_developer(user)
  end

  context 'when bridge is created' do
    let(:bridge) { create_bridge(:created) }

    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Created
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq s_('CiStatusText|created')
      expect(status.icon).to eq 'status_created'
      expect(status.favicon).to eq 'favicon_status_created'
      expect(status.label).to be_nil
      expect(status).not_to have_details
      expect(status).not_to have_action
    end
  end

  context 'when bridge is failed' do
    let(:bridge) { create_bridge(:failed) }

    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Failed
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Bridge::Failed]
    end

    it 'fabricates a failed bridge status' do
      expect(status).to be_a Gitlab::Ci::Status::Bridge::Failed
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq s_('CiStatusText|failed')
      expect(status.icon).to eq 'status_failed'
      expect(status.favicon).to eq 'favicon_status_failed'
      expect(status.label).to be_nil
      expect(status.status_tooltip).to eq "#{s_('CiStatusText|failed')} - (unknown failure)"
      expect(status).not_to have_details
      expect(status).not_to have_action
    end

    context 'failed with downstream_pipeline_creation_failed' do
      before do
        bridge.options = { downstream_errors: ['No stages / jobs for this pipeline.', 'other error'] }
        bridge.failure_reason = 'downstream_pipeline_creation_failed'
      end

      it 'fabricates correct status_tooltip' do
        expect(status.status_tooltip).to eq(
          "#{s_('CiStatusText|failed')} - (downstream pipeline can not be created, No stages / jobs for this pipeline., other error)"
        )
      end
    end
  end

  context 'when bridge is a manual action' do
    let(:bridge) { create_bridge(:playable) }

    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::Manual
    end

    it 'matches correct extended statuses' do
      expect(factory.extended_statuses)
        .to eq [Gitlab::Ci::Status::Bridge::Manual,
                Gitlab::Ci::Status::Bridge::Play,
                Gitlab::Ci::Status::Bridge::Action]
    end

    it 'fabricates action detailed status' do
      expect(status).to be_a Gitlab::Ci::Status::Bridge::Action
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq s_('CiStatusText|manual')
      expect(status.group).to eq 'manual'
      expect(status.icon).to eq 'status_manual'
      expect(status.favicon).to eq 'favicon_status_manual'
      expect(status.illustration).to include(:image, :size, :title, :content)
      expect(status.label).to include 'manual play action'
      expect(status).not_to have_details
      expect(status.action_path).to include 'play'
    end

    context 'when user has ability to play action' do
      before do
        bridge.downstream_project.add_developer(user)
      end

      it 'fabricates status that has action' do
        expect(status).to have_action
      end
    end

    context 'when user does not have ability to play action' do
      it 'fabricates status that has no action' do
        expect(status).not_to have_action
      end
    end
  end

  context 'when bridge is waiting for resource' do
    let(:bridge) { create_bridge(:waiting_for_resource, :resource_group) }

    it 'matches correct core status' do
      expect(factory.core_status).to be_a Gitlab::Ci::Status::WaitingForResource
    end

    it 'fabricates status with correct details' do
      expect(status.text).to eq 'waiting'
      expect(status.group).to eq 'waiting-for-resource'
      expect(status.icon).to eq 'status_pending'
      expect(status.favicon).to eq 'favicon_pending'
      expect(status.illustration).to include(:image, :size, :title)
      expect(status).not_to have_details
    end
  end

  private

  def create_bridge(*traits)
    upstream_project = create(:project, :repository)
    downstream_project = create(:project, :repository)
    upstream_pipeline = create(:ci_pipeline, :running, project: upstream_project)
    trigger = { trigger: { project: downstream_project.full_path, branch: 'feature' } }

    create(:ci_bridge, *traits, options: trigger, pipeline: upstream_pipeline)
  end
end