BigW Consortium Gitlab

environment_spec.rb 6.84 KB
Newer Older
Filipa Lacerda committed
1 2
require 'spec_helper'

3
feature 'Environment', :feature do
Filipa Lacerda committed
4 5 6 7 8 9 10 11 12
  given(:project) { create(:empty_project) }
  given(:user) { create(:user) }
  given(:role) { :developer }

  background do
    login_as(user)
    project.team << [user, role]
  end

13 14
  feature 'environment details page' do
    given!(:environment) { create(:environment, project: project) }
Filipa Lacerda committed
15
    given!(:deployment) { }
16
    given!(:action) { }
Filipa Lacerda committed
17 18

    before do
19
      visit_environment(environment)
Filipa Lacerda committed
20 21
    end

22 23 24 25
    scenario 'shows environment name' do
      expect(page).to have_content(environment.name)
    end

Filipa Lacerda committed
26 27 28 29 30 31 32
    context 'without deployments' do
      scenario 'does show no deployments' do
        expect(page).to have_content('You don\'t have any deployments right now.')
      end
    end

    context 'with deployments' do
33 34 35 36
      context 'when there is no related deployable' do
        given(:deployment) do
          create(:deployment, environment: environment, deployable: nil)
        end
Filipa Lacerda committed
37

38 39 40
        scenario 'does show deployment SHA' do
          expect(page).to have_link(deployment.short_sha)
          expect(page).not_to have_link('Re-deploy')
41 42
          expect(page).not_to have_terminal_button
        end
Filipa Lacerda committed
43 44
      end

45
      context 'with related deployable present' do
Filipa Lacerda committed
46 47
        given(:pipeline) { create(:ci_pipeline, project: project) }
        given(:build) { create(:ci_build, pipeline: pipeline) }
48 49 50 51

        given(:deployment) do
          create(:deployment, environment: environment, deployable: build)
        end
Filipa Lacerda committed
52 53 54 55

        scenario 'does show build name' do
          expect(page).to have_link("#{build.name} (##{build.id})")
          expect(page).to have_link('Re-deploy')
56 57 58
          expect(page).not_to have_terminal_button
        end

Filipa Lacerda committed
59
        context 'with manual action' do
60 61 62 63
          given(:action) do
            create(:ci_build, :manual, pipeline: pipeline,
                                       name: 'deploy to production')
          end
Filipa Lacerda committed
64 65

          scenario 'does show a play button' do
66
            expect(page).to have_link(action.name.humanize)
Filipa Lacerda committed
67 68 69
          end

          scenario 'does allow to play manual action' do
70 71 72 73 74 75 76
            expect(action).to be_manual

            expect { click_link(action.name.humanize) }
              .not_to change { Ci::Pipeline.count }

            expect(page).to have_content(action.name)
            expect(action.reload).to be_pending
Filipa Lacerda committed
77 78 79 80 81 82 83 84 85 86 87 88
          end

          context 'with external_url' do
            given(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') }
            given(:build) { create(:ci_build, pipeline: pipeline) }
            given(:deployment) { create(:deployment, environment: environment, deployable: build) }

            scenario 'does show an external link button' do
              expect(page).to have_link(nil, href: environment.external_url)
            end
          end

89 90 91 92 93 94 95 96 97
          context 'with terminal' do
            let(:project) { create(:kubernetes_project, :test_repo) }

            context 'for project master' do
              let(:role) { :master }

              scenario 'it shows the terminal button' do
                expect(page).to have_terminal_button
              end
98 99 100 101 102 103 104 105 106 107 108 109 110

              context 'web terminal', :js do
                before do
                  # Stub #terminals as it causes js-enabled feature specs to render the page incorrectly
                  allow_any_instance_of(Environment).to receive(:terminals) { nil }
                  visit terminal_namespace_project_environment_path(project.namespace, project, environment)
                end

                it 'displays a web terminal' do
                  expect(page).to have_selector('#terminal')
                  expect(page).to have_link(nil, href: environment.external_url)
                end
              end
111 112 113 114 115 116 117 118 119 120 121
            end

            context 'for developer' do
              let(:role) { :developer }

              scenario 'does not show terminal button' do
                expect(page).not_to have_terminal_button
              end
            end
          end

Kamil Trzcinski committed
122 123
          context 'when environment is available' do
            context 'with stop action' do
124 125 126 127 128 129 130 131 132 133
              given(:action) do
                create(:ci_build, :manual, pipeline: pipeline,
                                           name: 'close_app')
              end

              given(:deployment) do
                create(:deployment, environment: environment,
                                    deployable: build,
                                    on_stop: 'close_app')
              end
Filipa Lacerda committed
134

Kamil Trzcinski committed
135 136
              scenario 'does allow to stop environment' do
                click_link('Stop')
Filipa Lacerda committed
137

Kamil Trzcinski committed
138 139
                expect(page).to have_content('close_app')
              end
Filipa Lacerda committed
140

Kamil Trzcinski committed
141 142
              context 'for reporter' do
                let(:role) { :reporter }
Filipa Lacerda committed
143

Kamil Trzcinski committed
144 145 146
                scenario 'does not show stop button' do
                  expect(page).not_to have_link('Stop')
                end
Filipa Lacerda committed
147 148
              end
            end
Kamil Trzcinski committed
149 150 151 152 153 154 155 156 157 158 159 160 161 162

            context 'without stop action' do
              scenario 'does allow to stop environment' do
                click_link('Stop')
              end
            end
          end

          context 'when environment is stopped' do
            given(:environment) { create(:environment, project: project, state: :stopped) }

            scenario 'does not show stop button' do
              expect(page).not_to have_link('Stop')
            end
Filipa Lacerda committed
163 164 165 166 167
          end
        end
      end
    end
  end
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

  feature 'auto-close environment when branch is deleted' do
    given(:project) { create(:project) }

    given!(:environment) do
      create(:environment, :with_review_app, project: project,
                                             ref: 'feature')
    end

    scenario 'user visits environment page' do
      visit_environment(environment)

      expect(page).to have_link('Stop')
    end

    scenario 'user deletes the branch with running environment' do
      visit namespace_project_branches_path(project.namespace, project)

      remove_branch_with_hooks(project, user, 'feature') do
        page.within('.js-branch-feature') { find('a.btn-remove').click }
      end

      visit_environment(environment)

      expect(page).to have_no_link('Stop')
    end

    ##
    # This is a workaround for problem described in #24543
    #
    def remove_branch_with_hooks(project, user, branch)
      params = {
        oldrev: project.commit(branch).id,
        newrev: Gitlab::Git::BLANK_SHA,
        ref: "refs/heads/#{branch}"
      }

      yield

      GitPushService.new(project, user, params).execute
    end
  end

  def visit_environment(environment)
    visit namespace_project_environment_path(environment.project.namespace,
                                             environment.project,
                                             environment)
  end
216 217 218 219

  def have_terminal_button
    have_link(nil, href: terminal_namespace_project_environment_path(project.namespace, project, environment))
  end
Filipa Lacerda committed
220
end