environment_spec.rb 7.4 KB
Newer Older
1 2 3
require 'spec_helper'

describe Environment, models: true do
N
Nick Thomas 已提交
4
  subject(:environment) { create(:environment) }
5 6 7 8 9 10

  it { is_expected.to belong_to(:project) }
  it { is_expected.to have_many(:deployments) }

  it { is_expected.to delegate_method(:last_deployment).to(:deployments).as(:last) }

K
Kamil Trzcinski 已提交
11
  it { is_expected.to delegate_method(:stop_action).to(:last_deployment) }
12
  it { is_expected.to delegate_method(:manual_actions).to(:last_deployment) }
K
Kamil Trzcinski 已提交
13

14 15
  it { is_expected.to validate_presence_of(:name) }
  it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) }
16
  it { is_expected.to validate_length_of(:name).is_at_most(255) }
17

N
Nick Thomas 已提交
18 19
  it { is_expected.to validate_uniqueness_of(:slug).scoped_to(:project_id) }
  it { is_expected.to validate_length_of(:slug).is_at_most(24) }
20

N
Nick Thomas 已提交
21 22
  it { is_expected.to validate_length_of(:external_url).is_at_most(255) }
  it { is_expected.to validate_uniqueness_of(:external_url).scoped_to(:project_id) }
Z
Z.J. van de Weg 已提交
23 24 25 26 27 28

  describe '#nullify_external_url' do
    it 'replaces a blank url with nil' do
      env = build(:environment, external_url: "")

      expect(env.save).to be true
29
      expect(env.external_url).to be_nil
Z
Z.J. van de Weg 已提交
30 31
    end
  end
Z
Z.J. van de Weg 已提交
32

33
  describe '#includes_commit?' do
Z
Z.J. van de Weg 已提交
34 35
    context 'without a last deployment' do
      it "returns false" do
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
        expect(environment.includes_commit?('HEAD')).to be false
      end
    end

    context 'with a last deployment' do
      let(:project)     { create(:project) }
      let(:environment) { create(:environment, project: project) }

      let!(:deployment) do
        create(:deployment, environment: environment, sha: project.commit('master').id)
      end

      context 'in the same branch' do
        it 'returns true' do
          expect(environment.includes_commit?(RepoHelpers.sample_commit)).to be true
        end
      end

      context 'not in the same branch' do
        before do
          deployment.update(sha: project.commit('feature').id)
        end

        it 'returns false' do
          expect(environment.includes_commit?(RepoHelpers.sample_commit)).to be false
        end
Z
Z.J. van de Weg 已提交
62 63 64
      end
    end
  end
65

Z
Z.J. van de Weg 已提交
66
  describe '#first_deployment_for' do
67 68 69 70 71 72 73 74
    let(:project)       { create(:project) }
    let!(:environment)  { create(:environment, project: project) }
    let!(:deployment)   { create(:deployment, environment: environment, ref: commit.parent.id) }
    let!(:deployment1)  { create(:deployment, environment: environment, ref: commit.id) }
    let(:head_commit)   { project.commit }
    let(:commit)        { project.commit.parent }

    it 'returns deployment id for the environment' do
Z
Z.J. van de Weg 已提交
75
      expect(environment.first_deployment_for(commit)).to eq deployment1
76 77 78
    end

    it 'return nil when no deployment is found' do
Z
Z.J. van de Weg 已提交
79
      expect(environment.first_deployment_for(head_commit)).to eq nil
80 81 82
    end
  end

83 84 85 86
  describe '#environment_type' do
    subject { environment.environment_type }

    it 'sets a environment type if name has multiple segments' do
87
      environment.update!(name: 'production/worker.gitlab.com')
88 89 90 91 92

      is_expected.to eq('production')
    end

    it 'nullifies a type if it\'s a simple name' do
93
      environment.update!(name: 'production')
94 95 96 97

      is_expected.to be_nil
    end
  end
K
Kamil Trzcinski 已提交
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

  describe '#stoppable?' do
    subject { environment.stoppable? }

    context 'when no other actions' do
      it { is_expected.to be_falsey }
    end

    context 'when matching action is defined' do
      let(:build) { create(:ci_build) }
      let!(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') }
      let!(:close_action) { create(:ci_build, pipeline: build.pipeline, name: 'close_app', when: :manual) }

      context 'when environment is available' do
        before do
          environment.start
        end

        it { is_expected.to be_truthy }
      end

      context 'when environment is stopped' do
        before do
          environment.stop
        end

        it { is_expected.to be_falsey }
      end
    end
  end
K
Kamil Trzcinski 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

  describe '#stop!' do
    let(:user) { create(:user) }

    subject { environment.stop!(user) }

    before do
      expect(environment).to receive(:stoppable?).and_call_original
    end

    context 'when no other actions' do
      it { is_expected.to be_nil }
    end

    context 'when matching action is defined' do
      let(:build) { create(:ci_build) }
      let!(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') }

      context 'when action did not yet finish' do
        let!(:close_action) { create(:ci_build, :manual, pipeline: build.pipeline, name: 'close_app') }

        it 'returns the same action' do
K
Kamil Trzcinski 已提交
150 151
          expect(subject).to eq(close_action)
          expect(subject.user).to eq(user)
K
Kamil Trzcinski 已提交
152 153 154 155 156 157 158 159
        end
      end

      context 'if action did finish' do
        let!(:close_action) { create(:ci_build, :manual, :success, pipeline: build.pipeline, name: 'close_app') }

        it 'returns a new action of the same type' do
          is_expected.to be_persisted
K
Kamil Trzcinski 已提交
160 161
          expect(subject.name).to eq(close_action.name)
          expect(subject.user).to eq(user)
K
Kamil Trzcinski 已提交
162 163 164 165
        end
      end
    end
  end
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

  describe 'recently_updated_on_branch?' do
    subject { environment.recently_updated_on_branch?('feature') }

    context 'when last deployment to environment is the most recent one' do
      before do
        create(:deployment, environment: environment, ref: 'feature')
      end

      it { is_expected.to be true }
    end

    context 'when last deployment to environment is not the most recent' do
      before do
        create(:deployment, environment: environment, ref: 'feature')
        create(:deployment, environment: environment, ref: 'master')
      end

      it { is_expected.to be false }
    end
  end
187 188 189 190 191 192 193 194 195 196 197

  describe '#actions_for' do
    let(:deployment) { create(:deployment, environment: environment) }
    let(:pipeline) { deployment.deployable.pipeline }
    let!(:review_action) { create(:ci_build, :manual, name: 'review-apps', pipeline: pipeline, environment: 'review/$CI_BUILD_REF_NAME' )}
    let!(:production_action) { create(:ci_build, :manual, name: 'production', pipeline: pipeline, environment: 'production' )}

    it 'returns a list of actions with matching environment' do
      expect(environment.actions_for('review/master')).to contain_exactly(review_action)
    end
  end
N
Nick Thomas 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

  describe '#slug' do
    it "is automatically generated" do
      expect(environment.slug).not_to be_nil
    end

    it "is not regenerated if name changes" do
      original_slug = environment.slug
      environment.update_attributes!(name: environment.name.reverse)

      expect(environment.slug).to eq(original_slug)
    end
  end

  describe '#generate_slug' do
    SUFFIX = "-[a-z0-9]{6}"
    {
      "staging-12345678901234567" => "staging-123456789" + SUFFIX,
      "9-staging-123456789012345" => "env-9-staging-123" + SUFFIX,
      "staging-1234567890123456"  => "staging-1234567890123456",
      "production"                => "production",
      "PRODUCTION"                => "production" + SUFFIX,
      "review/1-foo"              => "review-1-foo" + SUFFIX,
      "1-foo"                     => "env-1-foo" + SUFFIX,
      "1/foo"                     => "env-1-foo" + SUFFIX,
      "foo-"                      => "foo" + SUFFIX,
    }.each do |name, matcher|
      it "returns a slug matching #{matcher}, given #{name}" do
226
        slug = described_class.new(name: name).generate_slug
N
Nick Thomas 已提交
227 228 229 230 231

        expect(slug).to match(/\A#{matcher}\z/)
      end
    end
  end
232
end