summaryrefslogtreecommitdiff
path: root/spec/features/projects/pipeline_schedules_spec.rb
blob: dfb973c37e557519e405d96ae12a555df3f51d7a (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
require 'spec_helper'

feature 'Pipeline Schedules', :feature do
  include PipelineSchedulesHelper

  let!(:project) { create(:project) }
  let!(:pipeline_schedule) { create(:ci_pipeline_schedule, :nightly, project: project ) }
  let!(:pipeline) { create(:ci_pipeline, pipeline_schedule: pipeline_schedule) }
  let(:scope) { nil }
  let!(:user) { create(:user) }

  before do
    project.add_master(user)

    gitlab_sign_in(user)
    visit_page
  end

  describe 'GET /projects/pipeline_schedules' do
    let(:visit_page) { visit_pipelines_schedules }

    it 'avoids N + 1 queries' do
      control_count = ActiveRecord::QueryRecorder.new { visit_pipelines_schedules }.count

      create_list(:ci_pipeline_schedule, 2, project: project)

      expect { visit_pipelines_schedules }.not_to exceed_query_limit(control_count)
    end

    describe 'The view' do
      it 'displays the required information description' do
        page.within('.pipeline-schedule-table-row') do
          expect(page).to have_content('pipeline schedule')
          expect(page).to have_content(pipeline_schedule.real_next_run.strftime('%b %d, %Y'))
          expect(page).to have_link('master')
          expect(page).to have_link("##{pipeline.id}")
        end
      end

      it 'creates a new scheduled pipeline' do
        click_link 'New schedule'

        expect(page).to have_content('Schedule a new pipeline')
      end

      it 'changes ownership of the pipeline' do
        click_link 'Take ownership'
        page.within('.pipeline-schedule-table-row') do
          expect(page).not_to have_content('No owner')
          expect(page).to have_link('John Doe')
        end
      end

      it 'edits the pipeline' do
        page.within('.pipeline-schedule-table-row') do
          click_link 'Edit'
        end

        expect(page).to have_content('Edit Pipeline Schedule')
      end

      it 'deletes the pipeline' do
        click_link 'Delete'

        expect(page).not_to have_content('pipeline schedule')
      end
    end

    context 'when ref is nil' do
      before do
        pipeline_schedule.update_attribute(:ref, nil)
        visit_pipelines_schedules
      end

      it 'shows a list of the pipeline schedules with empty ref column' do
        expect(first('.branch-name-cell').text).to eq('')
      end
    end
  end

  describe 'POST /projects/pipeline_schedules/new', js: true do
    let(:visit_page) { visit_new_pipeline_schedule }

    it 'sets defaults for timezone and target branch' do
      expect(page).to have_button('master')
      expect(page).to have_button('UTC')
    end

    it 'it creates a new scheduled pipeline' do
      fill_in_schedule_form
      save_pipeline_schedule

      expect(page).to have_content('my fancy description')
    end

    it 'it prevents an invalid form from being submitted' do
      save_pipeline_schedule

      expect(page).to have_content('This field is required')
    end
  end

  describe 'PATCH /projects/pipelines_schedules/:id/edit', js: true do
    let(:visit_page) do
      edit_pipeline_schedule
    end

    it 'it displays existing properties' do
      description = find_field('schedule_description').value
      expect(description).to eq('pipeline schedule')
      expect(page).to have_button('master')
      expect(page).to have_button('UTC')
    end

    it 'edits the scheduled pipeline' do
      fill_in 'schedule_description', with: 'my brand new description'

      save_pipeline_schedule

      expect(page).to have_content('my brand new description')
    end

    context 'when ref is nil' do
      before do
        pipeline_schedule.update_attribute(:ref, nil)
        edit_pipeline_schedule
      end

      it 'shows the pipeline schedule with default ref' do
        page.within('.js-target-branch-dropdown') do
          expect(first('.dropdown-toggle-text').text).to eq('master')
        end
      end
    end
  end

  def visit_new_pipeline_schedule
    visit new_namespace_project_pipeline_schedule_path(project.namespace, project, pipeline_schedule)
  end

  def edit_pipeline_schedule
    visit edit_namespace_project_pipeline_schedule_path(project.namespace, project, pipeline_schedule)
  end

  def visit_pipelines_schedules
    visit namespace_project_pipeline_schedules_path(project.namespace, project, scope: scope)
  end

  def select_timezone
    find('.js-timezone-dropdown').click
    click_link 'American Samoa'
  end

  def select_target_branch
    find('.js-target-branch-dropdown').click
    click_link 'master'
  end

  def save_pipeline_schedule
    click_button 'Save pipeline schedule'
  end

  def fill_in_schedule_form
    fill_in 'schedule_description', with: 'my fancy description'
    fill_in 'schedule_cron', with: '* 1 2 3 4'

    select_timezone
    select_target_branch
  end
end