BigW Consortium Gitlab

environment_spec.rb 5.02 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
require 'spec_helper'

describe Environment, models: true do
  let(:environment) { create(:environment) }

  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) }

Kamil Trzcinski committed
11
  it { is_expected.to delegate_method(:stop_action).to(:last_deployment) }
Kamil Trzcinski committed
12

13 14 15
  it { is_expected.to validate_presence_of(:name) }
  it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) }
  it { is_expected.to validate_length_of(:name).is_within(0..255) }
16 17 18 19 20 21 22 23 24 25

  it { is_expected.to validate_length_of(:external_url).is_within(0..255) }

  # To circumvent a not null violation of the name column:
  # https://github.com/thoughtbot/shoulda-matchers/issues/336
  it 'validates uniqueness of :external_url' do
    create(:environment)

    is_expected.to validate_uniqueness_of(:external_url).scoped_to(:project_id)
  end
Z.J. van de Weg committed
26 27 28 29 30 31

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

      expect(env.save).to be true
32
      expect(env.external_url).to be_nil
Z.J. van de Weg committed
33 34
    end
  end
Z.J. van de Weg committed
35

36
  describe '#includes_commit?' do
Z.J. van de Weg committed
37 38
    context 'without a last deployment' do
      it "returns false" do
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
        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.J. van de Weg committed
65 66 67
      end
    end
  end
68

69
  describe '#first_deployment_for' do
70 71 72 73 74 75 76 77
    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
78
      expect(environment.first_deployment_for(commit)).to eq deployment1
79 80 81
    end

    it 'return nil when no deployment is found' do
82
      expect(environment.first_deployment_for(head_commit)).to eq nil
83 84 85
    end
  end

86 87 88 89
  describe '#environment_type' do
    subject { environment.environment_type }

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

      is_expected.to eq('production')
    end

    it 'nullifies a type if it\'s a simple name' do
96
      environment.update!(name: 'production')
97 98 99 100

      is_expected.to be_nil
    end
  end
Kamil Trzcinski committed
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

  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
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

  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
153 154
          expect(subject).to eq(close_action)
          expect(subject.user).to eq(user)
155 156 157 158 159 160 161 162
        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
163 164
          expect(subject.name).to eq(close_action.name)
          expect(subject.user).to eq(user)
165 166 167 168
        end
      end
    end
  end
169
end