summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/ci/config/rule/environments_spec.rb
blob: 857653c89b88b9d0b743f6976bd72c1ad1247bac (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
require 'spec_helper'

describe Gitlab::Ci::Config::Rule::Environments do
  let(:rule) { described_class.new(job, global) }
  let(:job) { global[:jobs][:deploy] }

  let(:global) do
    # We may need factory for that
    #
    Gitlab::Ci::Config::Node::Global.new(config)
  end

  before do
    # We will phase public `.compose!` out
    #
    global.compose!
    rule.apply!
  end

  context 'when environment is stoppable' do
    context 'when teardown job is not defined' do
      let(:config) do
        { deploy: {
            script: 'rspec',
            environment: {
              name: 'test',
              on_stop: 'teardown_job'
            }
          }
        }
      end

      it 'adds error about missing on stop job' do
        expect(global.errors)
          .to include 'jobs:deploy:environment on stop job not defined'
      end
    end

    context 'when teardown job is defined' do
      context 'when teardown job does not have environment defined' do
        let(:config) do
          { deploy: {
              script: 'rspec',
              environment: {
                name: 'test',
                on_stop: 'teardown'
              }
            },

            teardown: {
              script: 'echo teardown'
            }
          }
        end

        it 'adds error about incomplete teardown job' do
          expect(global.errors)
            .to include 'jobs:teardown environment not defined'
        end
      end

      context 'when teardown job has environment defined' do
        context 'when teardown job has invalid environment name' do
          let(:config) do
            { deploy: {
                script: 'rspec',
                environment: {
                  name: 'test',
                  on_stop: 'teardown'
                }
              },

              teardown: {
                script: 'echo teardown',
                environment: 'staging'
              }
            }
          end

          it 'adds errors about invalid environment name' do
            expect(global.errors)
              .to include 'jobs:teardown:environment name does not match ' \
                          'environment name defined in `deploy` job'
          end
        end

        context 'when teardown job has valid environment name' do
          context 'when teardown has invalid action name' do
            let(:config) do
              { deploy: {
                  script: 'rspec',
                  environment: {
                    name: 'test',
                    on_stop: 'teardown'
                  }
                },

                teardown: {
                  script: 'echo teardown',
                  environment: {
                    name: 'test',
                    action: 'start'
                  }
                }
              }
            end

            it 'adds error about invalid action name' do
              expect(global.errors)
                .to include 'jobs:teardown:environment action should be ' \
                            'defined as `stop`'
            end
          end

          context 'when teardown job has valid action name' do
            let(:config) do
              { deploy: {
                  script: 'rspec',
                  environment: {
                    name: 'test',
                    on_stop: 'teardown'
                  }
                },

                teardown: {
                  script: 'echo teardown',
                  environment: {
                    name: 'test',
                    action: 'stop'
                  }
                }
              }
            end

            it 'does not invalidate configuration' do
              expect(global).to be_valid
            end
          end
        end
      end
    end
  end
end