environments_spec.rb 8.73 KB
Newer Older
1 2
require 'spec_helper'

3
feature 'Environments page', :feature, :js do
4 5 6
  given(:project) { create(:empty_project) }
  given(:user) { create(:user) }
  given(:role) { :developer }
7

8
  background do
9
    project.team << [user, role]
10
    sign_in(user)
11 12
  end

13 14
  given!(:environment) { }
  given!(:deployment) { }
15
  given!(:action) { }
16

17 18 19
  before do
    visit_environments(project)
  end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
20

21 22 23 24
  describe 'page tabs' do
    scenario 'shows "Available" and "Stopped" tab with links' do
      expect(page).to have_link('Available')
      expect(page).to have_link('Stopped')
25
    end
26 27 28 29 30 31 32

    describe 'with one available environment' do
      given(:environment) { create(:environment, project: project, state: :available) }

      describe 'in available tab page' do
        it 'should show one environment' do
          visit namespace_project_environments_path(project.namespace, project, scope: 'available')
33
          expect(page).to have_css('.environments-container')
34
          expect(page.all('.environment-name').length).to eq(1)
35 36 37 38 39 40
        end
      end

      describe 'in stopped tab page' do
        it 'should show no environments' do
          visit namespace_project_environments_path(project.namespace, project, scope: 'stopped')
41
          expect(page).to have_css('.environments-container')
42 43 44 45 46 47 48 49 50 51 52
          expect(page).to have_content('You don\'t have any environments right now')
        end
      end
    end

    describe 'with one stopped environment' do
      given(:environment) { create(:environment, project: project, state: :stopped) }

      describe 'in available tab page' do
        it 'should show no environments' do
          visit namespace_project_environments_path(project.namespace, project, scope: 'available')
53
          expect(page).to have_css('.environments-container')
54 55 56 57 58 59 60
          expect(page).to have_content('You don\'t have any environments right now')
        end
      end

      describe 'in stopped tab page' do
        it 'should show one environment' do
          visit namespace_project_environments_path(project.namespace, project, scope: 'stopped')
61
          expect(page).to have_css('.environments-container')
62
          expect(page.all('.environment-name').length).to eq(1)
63 64 65
        end
      end
    end
66
  end
67

68 69 70
  context 'without environments' do
    scenario 'does show no environments' do
      expect(page).to have_content('You don\'t have any environments right now.')
71 72
    end

73 74 75
    scenario 'does show 0 as counter for environments in both tabs' do
      expect(page.find('.js-available-environments-count').text).to eq('0')
      expect(page.find('.js-stopped-environments-count').text).to eq('0')
76 77 78
    end
  end

79 80
  describe 'when showing the environment' do
    given(:environment) { create(:environment, project: project) }
81

82 83 84 85 86 87 88
    scenario 'does show environment name' do
      expect(page).to have_link(environment.name)
    end

    scenario 'does show number of available and stopped environments' do
      expect(page.find('.js-available-environments-count').text).to eq('1')
      expect(page.find('.js-stopped-environments-count').text).to eq('0')
89
    end
90 91

    context 'without deployments' do
92
      scenario 'does show no deployments' do
93
        expect(page).to have_content('No deployments yet')
94
      end
95 96 97 98

      context 'for available environment' do
        given(:environment) { create(:environment, project: project, state: :available) }

Kamil Trzcinski's avatar
Kamil Trzcinski committed
99 100
        scenario 'does not shows stop button' do
          expect(page).not_to have_selector('.stop-env-link')
101 102 103 104 105 106 107
        end
      end

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

        scenario 'does not shows stop button' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
108
          expect(page).not_to have_selector('.stop-env-link')
109 110
        end
      end
111 112 113
    end

    context 'with deployments' do
114
      given(:project) { create(:project) }
115

116
      given(:deployment) do
117 118
        create(:deployment, environment: environment,
                            sha: project.commit.id)
119
      end
120

121
      scenario 'does show deployment SHA' do
122 123 124
        expect(page).to have_link(deployment.short_sha)
      end

125 126
      scenario 'does show deployment internal id' do
        expect(page).to have_content(deployment.iid)
127 128
      end

129
      context 'with build and manual actions' do
130 131
        given(:pipeline) { create(:ci_pipeline, project: project) }
        given(:build) { create(:ci_build, pipeline: pipeline) }
132

133
        given(:action) do
134
          create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production')
135 136
        end

137 138
        given(:deployment) do
          create(:deployment, environment: environment,
139
                              deployable: build,
140
                              sha: project.commit.id)
141
        end
142

143
        scenario 'does show a play button' do
Filipa Lacerda's avatar
Filipa Lacerda committed
144
          find('.js-dropdown-play-icon-container').click
145
          expect(page).to have_content(action.name.humanize)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
146 147
        end

148
        scenario 'does allow to play manual action', js: true do
149
          expect(action).to be_manual
150

Filipa Lacerda's avatar
Filipa Lacerda committed
151
          find('.js-dropdown-play-icon-container').click
152
          expect(page).to have_content(action.name.humanize)
153

154
          expect { find('.js-manual-action-link').trigger('click') }
155 156
            .not_to change { Ci::Pipeline.count }
        end
157

158 159 160
        scenario 'does show build name and id' do
          expect(page).to have_link("#{build.name} ##{build.id}")
        end
161

162 163 164
        scenario 'does not show stop button' do
          expect(page).not_to have_selector('.stop-env-link')
        end
165

166 167 168
        scenario 'does not show external link button' do
          expect(page).not_to have_css('external-url')
        end
169

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

174 175 176 177
        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) }
178

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

184
        context 'with stop action' do
185 186 187 188 189 190 191 192 193
          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
194

195 196
          scenario 'does show stop button' do
            expect(page).to have_selector('.stop-env-link')
197
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
198

199 200
          context 'for reporter' do
            let(:role) { :reporter }
Kamil Trzcinski's avatar
Kamil Trzcinski committed
201

202 203
            scenario 'does not show stop button' do
              expect(page).not_to have_selector('.stop-env-link')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
204
            end
Filipa Lacerda's avatar
Filipa Lacerda committed
205
          end
206
        end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
207

208 209 210 211 212
        context 'with terminal' do
          let(:project) { create(:kubernetes_project, :test_repo) }

          context 'for project master' do
            let(:role) { :master }
Kamil Trzcinski's avatar
Kamil Trzcinski committed
213

214 215
            scenario 'it shows the terminal button' do
              expect(page).to have_terminal_button
Kamil Trzcinski's avatar
Kamil Trzcinski committed
216
            end
217
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
218

219 220
          context 'for developer' do
            let(:role) { :developer }
Kamil Trzcinski's avatar
Kamil Trzcinski committed
221

222 223
            scenario 'does not show terminal button' do
              expect(page).not_to have_terminal_button
Kamil Trzcinski's avatar
Kamil Trzcinski committed
224
            end
Filipa Lacerda's avatar
Filipa Lacerda committed
225
          end
226
        end
227 228 229 230
      end
    end
  end

231 232
  scenario 'does have a New environment button' do
    expect(page).to have_link('New environment')
233
  end
234

235 236
  describe 'when creating a new environment' do
    before do
237
      visit_environments(project)
238
    end
239 240

    context 'when logged as developer' do
241
      before do
242 243 244
        within(".top-area") do
          click_link 'New environment'
        end
245
      end
246 247 248

      context 'for valid name' do
        before do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
249
          fill_in('Name', with: 'production')
250
          click_on 'Save'
251 252
        end

253
        scenario 'does create a new pipeline' do
254
          expect(page).to have_content('production')
255 256 257 258 259
        end
      end

      context 'for invalid name' do
        before do
260
          fill_in('Name', with: 'name,with,commas')
261
          click_on 'Save'
262 263
        end

264 265 266
        scenario 'does show errors' do
          expect(page).to have_content('Name can contain only letters')
        end
267 268 269 270
      end
    end

    context 'when logged as reporter' do
271
      given(:role) { :reporter }
272

273
      scenario 'does not have a New environment link' do
274 275 276 277
        expect(page).not_to have_link('New environment')
      end
    end
  end
278

279 280 281 282
  def have_terminal_button
    have_link(nil, href: terminal_namespace_project_environment_path(project.namespace, project, environment))
  end

283 284 285
  def visit_environments(project)
    visit namespace_project_environments_path(project.namespace, project)
  end
286
end