diff options
Diffstat (limited to 'spec/features')
-rw-r--r-- | spec/features/environment_spec.rb | 48 | ||||
-rw-r--r-- | spec/features/environments_spec.rb | 16 | ||||
-rw-r--r-- | spec/features/issues/filtered_search/dropdown_label_spec.rb | 218 | ||||
-rw-r--r-- | spec/features/issues/spam_issues_spec.rb | 66 | ||||
-rw-r--r-- | spec/features/merge_requests/mini_pipeline_graph_spec.rb | 100 | ||||
-rw-r--r-- | spec/features/projects/blobs/shortcuts_blob_spec.rb | 37 | ||||
-rw-r--r-- | spec/features/projects/commit/cherry_pick_spec.rb (renamed from spec/features/projects/commits/cherry_pick_spec.rb) | 0 | ||||
-rw-r--r-- | spec/features/projects/compare_spec.rb (renamed from spec/features/compare_spec.rb) | 0 | ||||
-rw-r--r-- | spec/features/projects/services/mattermost_slash_command_spec.rb | 22 | ||||
-rw-r--r-- | spec/features/projects/services/slack_slash_command_spec.rb | 21 | ||||
-rw-r--r-- | spec/features/projects/view_on_env_spec.rb | 140 |
11 files changed, 531 insertions, 137 deletions
diff --git a/spec/features/environment_spec.rb b/spec/features/environment_spec.rb index 511c95b758f..2f49e89b4e4 100644 --- a/spec/features/environment_spec.rb +++ b/spec/features/environment_spec.rb @@ -64,10 +64,6 @@ feature 'Environment', :feature do expect(page).to have_link('Re-deploy') end - scenario 'does not show stop button' do - expect(page).not_to have_link('Stop') - end - scenario 'does not show terminal button' do expect(page).not_to have_terminal_button end @@ -116,27 +112,43 @@ feature 'Environment', :feature do end end - context 'with stop action' do - given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } - given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + context 'when environment is available' do + context 'with stop action' do + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } + given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } - scenario 'does show stop button' do - expect(page).to have_link('Stop') - end + scenario 'does show stop button' do + expect(page).to have_link('Stop') + end - scenario 'does allow to stop environment' do - click_link('Stop') + scenario 'does allow to stop environment' do + click_link('Stop') - expect(page).to have_content('close_app') - end + expect(page).to have_content('close_app') + end - context 'for reporter' do - let(:role) { :reporter } + context 'for reporter' do + let(:role) { :reporter } - scenario 'does not show stop button' do - expect(page).not_to have_link('Stop') + scenario 'does not show stop button' do + expect(page).not_to have_link('Stop') + end end end + + 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 end end end diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index c033b693213..78be7d36f47 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -52,6 +52,22 @@ feature 'Environments page', :feature, :js do scenario 'does show no deployments' do expect(page).to have_content('No deployments yet') end + + context 'for available environment' do + given(:environment) { create(:environment, project: project, state: :available) } + + scenario 'does not shows stop button' do + expect(page).not_to have_selector('.stop-env-link') + end + end + + context 'for stopped environment' do + given(:environment) { create(:environment, project: project, state: :stopped) } + + scenario 'does not shows stop button' do + expect(page).not_to have_selector('.stop-env-link') + end + end end context 'with deployments' do diff --git a/spec/features/issues/filtered_search/dropdown_label_spec.rb b/spec/features/issues/filtered_search/dropdown_label_spec.rb index 5079eb8dd00..c6a88e1b7b0 100644 --- a/spec/features/issues/filtered_search/dropdown_label_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_label_spec.rb @@ -1,39 +1,47 @@ -require 'rails_helper' +require 'spec_helper' describe 'Dropdown label', js: true, feature: true do - include WaitForAjax - - let!(:project) { create(:empty_project) } - let!(:user) { create(:user) } - let!(:bug_label) { create(:label, project: project, title: 'bug') } - let!(:uppercase_label) { create(:label, project: project, title: 'BUG') } - let!(:two_words_label) { create(:label, project: project, title: 'High Priority') } - let!(:wont_fix_label) { create(:label, project: project, title: 'Won"t Fix') } - let!(:wont_fix_single_label) { create(:label, project: project, title: 'Won\'t Fix') } - let!(:special_label) { create(:label, project: project, title: '!@#$%^+&*()')} - let!(:long_label) { create(:label, project: project, title: 'this is a very long title this is a very long title this is a very long title this is a very long title this is a very long title')} + let(:project) { create(:empty_project) } + let(:user) { create(:user) } let(:filtered_search) { find('.filtered-search') } let(:js_dropdown_label) { '#js-dropdown-label' } + let(:filter_dropdown) { find("#{js_dropdown_label} .filter-dropdown") } + + shared_context 'with labels' do + let!(:bug_label) { create(:label, project: project, title: 'bug-label') } + let!(:uppercase_label) { create(:label, project: project, title: 'BUG-LABEL') } + let!(:two_words_label) { create(:label, project: project, title: 'High Priority') } + let!(:wont_fix_label) { create(:label, project: project, title: 'Won"t Fix') } + let!(:wont_fix_single_label) { create(:label, project: project, title: 'Won\'t Fix') } + let!(:special_label) { create(:label, project: project, title: '!@#$%^+&*()') } + let!(:long_label) { create(:label, project: project, title: 'this is a very long title this is a very long title this is a very long title this is a very long title this is a very long title') } + end - def send_keys_to_filtered_search(input) - input.split("").each do |i| - filtered_search.send_keys(i) - sleep 3 - wait_for_ajax - sleep 3 - end + def init_label_search + filtered_search.set('label:') + # This ensures the dropdown is shown + expect(find(js_dropdown_label)).not_to have_css('.filter-dropdown-loading') end - def dropdown_label_size - page.all('#js-dropdown-label .filter-dropdown .filter-dropdown-item').size + def search_for_label(label) + init_label_search + filtered_search.send_keys(label) end def click_label(text) - find('#js-dropdown-label .filter-dropdown .filter-dropdown-item', text: text).click + filter_dropdown.find('.filter-dropdown-item', text: text).click + end + + def dropdown_label_size + filter_dropdown.all('.filter-dropdown-item').size + end + + def clear_search_field + find('.filtered-search-input-container .clear-search').click end before do - project.team << [user, :master] + project.add_master(user) login_as(user) create(:issue, project: project) @@ -42,11 +50,12 @@ describe 'Dropdown label', js: true, feature: true do describe 'keyboard navigation' do it 'selects label' do - send_keys_to_filtered_search('label:') + bug_label = create(:label, project: project, title: 'bug-label') + init_label_search filtered_search.native.send_keys(:down, :down, :enter) - expect(filtered_search.value).to eq("label:~#{special_label.name} ") + expect(filtered_search.value).to eq("label:~#{bug_label.title} ") end end @@ -54,171 +63,177 @@ describe 'Dropdown label', js: true, feature: true do it 'opens when the search bar has label:' do filtered_search.set('label:') - expect(page).to have_css(js_dropdown_label, visible: true) + expect(page).to have_css(js_dropdown_label) end it 'closes when the search bar is unfocused' do - find('body').click() + find('body').click - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) end - it 'should show loading indicator when opened' do + it 'shows loading indicator when opened and hides it when loaded' do filtered_search.set('label:') - expect(page).to have_css('#js-dropdown-label .filter-dropdown-loading', visible: true) - end - - it 'should hide loading indicator when loaded' do - send_keys_to_filtered_search('label:') - - expect(page).not_to have_css('#js-dropdown-label .filter-dropdown-loading') + expect(find(js_dropdown_label)).to have_css('.filter-dropdown-loading') + expect(find(js_dropdown_label)).not_to have_css('.filter-dropdown-loading') end - it 'should load all the labels when opened' do - send_keys_to_filtered_search('label:') + it 'loads all the labels when opened' do + bug_label = create(:label, project: project, title: 'bug-label') + filtered_search.set('label:') - expect(dropdown_label_size).to be > 0 + expect(filter_dropdown).to have_content(bug_label.title) + expect(dropdown_label_size).to eq(1) end end describe 'filtering' do - before do - filtered_search.set('label') - end - - it 'filters by name' do - send_keys_to_filtered_search(':b') + include_context 'with labels' - expect(dropdown_label_size).to eq(2) + before do + init_label_search end - it 'filters by case insensitive name' do - send_keys_to_filtered_search(':B') + it 'filters by case-insensitive name with or without symbol' do + search_for_label('b') + expect(filter_dropdown.find('.filter-dropdown-item', text: bug_label.title)).to be_visible + expect(filter_dropdown.find('.filter-dropdown-item', text: uppercase_label.title)).to be_visible expect(dropdown_label_size).to eq(2) - end - it 'filters by name with symbol' do - send_keys_to_filtered_search(':~bu') + clear_search_field + init_label_search - expect(dropdown_label_size).to eq(2) - end - - it 'filters by case insensitive name with symbol' do - send_keys_to_filtered_search(':~BU') + search_for_label('~bu') + expect(filter_dropdown.find('.filter-dropdown-item', text: bug_label.title)).to be_visible + expect(filter_dropdown.find('.filter-dropdown-item', text: uppercase_label.title)).to be_visible expect(dropdown_label_size).to eq(2) end - it 'filters by multiple words' do - send_keys_to_filtered_search(':Hig') + it 'filters by multiple words with or without symbol' do + filtered_search.send_keys('Hig') + expect(filter_dropdown.find('.filter-dropdown-item', text: two_words_label.title)).to be_visible expect(dropdown_label_size).to eq(1) - end - it 'filters by multiple words with symbol' do - send_keys_to_filtered_search(':~Hig') + clear_search_field + init_label_search + + filtered_search.send_keys('~Hig') + expect(filter_dropdown.find('.filter-dropdown-item', text: two_words_label.title)).to be_visible expect(dropdown_label_size).to eq(1) end - it 'filters by multiple words containing single quotes' do - send_keys_to_filtered_search(':won\'t') + it 'filters by multiple words containing single quotes with or without symbol' do + filtered_search.send_keys('won\'t') + expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_single_label.title)).to be_visible expect(dropdown_label_size).to eq(1) - end - it 'filters by multiple words containing single quotes with symbol' do - send_keys_to_filtered_search(':~won\'t') + clear_search_field + init_label_search + + filtered_search.send_keys('~won\'t') + expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_single_label.title)).to be_visible expect(dropdown_label_size).to eq(1) end - it 'filters by multiple words containing double quotes' do - send_keys_to_filtered_search(':won"t') + it 'filters by multiple words containing double quotes with or without symbol' do + filtered_search.send_keys('won"t') + expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_label.title)).to be_visible expect(dropdown_label_size).to eq(1) - end - it 'filters by multiple words containing double quotes with symbol' do - send_keys_to_filtered_search(':~won"t') + clear_search_field + init_label_search + filtered_search.send_keys('~won"t') + + expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_label.title)).to be_visible expect(dropdown_label_size).to eq(1) end - it 'filters by special characters' do - send_keys_to_filtered_search(':^+') + it 'filters by special characters with or without symbol' do + filtered_search.send_keys('^+') + expect(filter_dropdown.find('.filter-dropdown-item', text: special_label.title)).to be_visible expect(dropdown_label_size).to eq(1) - end - it 'filters by special characters with symbol' do - send_keys_to_filtered_search(':~^+') + clear_search_field + init_label_search + filtered_search.send_keys('~^+') + + expect(filter_dropdown.find('.filter-dropdown-item', text: special_label.title)).to be_visible expect(dropdown_label_size).to eq(1) end end describe 'selecting from dropdown' do + include_context 'with labels' + before do - filtered_search.set('label:') + init_label_search end it 'fills in the label name when the label has not been filled' do click_label(bug_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~#{bug_label.title} ") end it 'fills in the label name when the label is partially filled' do - send_keys_to_filtered_search('bu') + filtered_search.send_keys('bu') click_label(bug_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~#{bug_label.title} ") end it 'fills in the label name that contains multiple words' do click_label(two_words_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~\"#{two_words_label.title}\" ") end it 'fills in the label name that contains multiple words and is very long' do click_label(long_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~\"#{long_label.title}\" ") end it 'fills in the label name that contains double quotes' do click_label(wont_fix_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~'#{wont_fix_label.title}' ") end it 'fills in the label name with the correct capitalization' do click_label(uppercase_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~#{uppercase_label.title} ") end it 'fills in the label name with special characters' do click_label(special_label.title) - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:~#{special_label.title} ") end it 'selects `no label`' do - find('#js-dropdown-label .filter-dropdown-item', text: 'No Label').click + find("#{js_dropdown_label} .filter-dropdown-item", text: 'No Label').click - expect(page).to have_css(js_dropdown_label, visible: false) + expect(page).not_to have_css(js_dropdown_label) expect(filtered_search.value).to eq("label:none ") end end @@ -226,44 +241,47 @@ describe 'Dropdown label', js: true, feature: true do describe 'input has existing content' do it 'opens label dropdown with existing search term' do filtered_search.set('searchTerm label:') - expect(page).to have_css(js_dropdown_label, visible: true) + + expect(page).to have_css(js_dropdown_label) end it 'opens label dropdown with existing author' do filtered_search.set('author:@person label:') - expect(page).to have_css(js_dropdown_label, visible: true) + + expect(page).to have_css(js_dropdown_label) end it 'opens label dropdown with existing assignee' do filtered_search.set('assignee:@person label:') - expect(page).to have_css(js_dropdown_label, visible: true) + + expect(page).to have_css(js_dropdown_label) end it 'opens label dropdown with existing label' do filtered_search.set('label:~urgent label:') - expect(page).to have_css(js_dropdown_label, visible: true) + + expect(page).to have_css(js_dropdown_label) end it 'opens label dropdown with existing milestone' do filtered_search.set('milestone:%v2.0 label:') - expect(page).to have_css(js_dropdown_label, visible: true) + + expect(page).to have_css(js_dropdown_label) end end describe 'caching requests' do it 'caches requests after the first load' do - filtered_search.set('label') - send_keys_to_filtered_search(':') - initial_size = dropdown_label_size + create(:label, project: project, title: 'bug-label') + init_label_search - expect(initial_size).to be > 0 + expect(dropdown_label_size).to eq(1) create(:label, project: project) - find('.filtered-search-input-container .clear-search').click - filtered_search.set('label') - send_keys_to_filtered_search(':') + clear_search_field + init_label_search - expect(dropdown_label_size).to eq(initial_size) + expect(dropdown_label_size).to eq(1) end end end diff --git a/spec/features/issues/spam_issues_spec.rb b/spec/features/issues/spam_issues_spec.rb new file mode 100644 index 00000000000..4bc9b49f889 --- /dev/null +++ b/spec/features/issues/spam_issues_spec.rb @@ -0,0 +1,66 @@ +require 'rails_helper' + +describe 'New issue', feature: true do + include StubENV + + let(:project) { create(:project, :public) } + let(:user) { create(:user)} + + before do + stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') + + current_application_settings.update!( + akismet_enabled: true, + akismet_api_key: 'testkey', + recaptcha_enabled: true, + recaptcha_site_key: 'test site key', + recaptcha_private_key: 'test private key' + ) + + project.team << [user, :master] + login_as(user) + end + + context 'when identified as a spam' do + before do + WebMock.stub_request(:any, /.*akismet.com.*/).to_return(body: "true", status: 200) + + visit new_namespace_project_issue_path(project.namespace, project) + end + + it 'creates an issue after solving reCaptcha' do + fill_in 'issue_title', with: 'issue title' + fill_in 'issue_description', with: 'issue description' + + click_button 'Submit issue' + + # it is impossible to test recaptcha automatically and there is no possibility to fill in recaptcha + # recaptcha verification is skipped in test environment and it always returns true + expect(page).not_to have_content('issue title') + expect(page).to have_css('.recaptcha') + + click_button 'Submit issue' + + expect(page.find('.issue-details h2.title')).to have_content('issue title') + expect(page.find('.issue-details .description')).to have_content('issue description') + end + end + + context 'when not identified as a spam' do + before do + WebMock.stub_request(:any, /.*akismet.com.*/).to_return(body: 'false', status: 200) + + visit new_namespace_project_issue_path(project.namespace, project) + end + + it 'creates an issue' do + fill_in 'issue_title', with: 'issue title' + fill_in 'issue_description', with: 'issue description' + + click_button 'Submit issue' + + expect(page.find('.issue-details h2.title')).to have_content('issue title') + expect(page.find('.issue-details .description')).to have_content('issue description') + end + end +end diff --git a/spec/features/merge_requests/mini_pipeline_graph_spec.rb b/spec/features/merge_requests/mini_pipeline_graph_spec.rb new file mode 100644 index 00000000000..b08bd36bde9 --- /dev/null +++ b/spec/features/merge_requests/mini_pipeline_graph_spec.rb @@ -0,0 +1,100 @@ +require 'rails_helper' + +feature 'Mini Pipeline Graph', :js, :feature do + include WaitForAjax + + let(:user) { create(:user) } + let(:project) { create(:project, :public) } + let(:merge_request) { create(:merge_request, source_project: project) } + + let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: 'master', status: 'running', sha: project.commit.id) } + let(:build) { create(:ci_build, pipeline: pipeline, stage: 'test', commands: 'test') } + + before do + build.run + + login_as(user) + visit namespace_project_merge_request_path(project.namespace, project, merge_request) + end + + it 'should display a mini pipeline graph' do + expect(page).to have_selector('.mr-widget-pipeline-graph') + end + + describe 'build list toggle' do + let(:toggle) do + find('.mini-pipeline-graph-dropdown-toggle') + first('.mini-pipeline-graph-dropdown-toggle') + end + + it 'should expand when hovered' do + before_width = evaluate_script("$('.mini-pipeline-graph-dropdown-toggle:visible').outerWidth();") + + toggle.hover + + after_width = evaluate_script("$('.mini-pipeline-graph-dropdown-toggle:visible').outerWidth();") + + expect(before_width).to be < after_width + end + + it 'should show dropdown caret when hovered' do + toggle.hover + + expect(toggle).to have_selector('.fa-caret-down') + end + + it 'should show tooltip when hovered' do + toggle.hover + + expect(toggle.find(:xpath, '..')).to have_selector('.tooltip') + end + end + + describe 'builds list menu' do + let(:toggle) do + find('.mini-pipeline-graph-dropdown-toggle') + first('.mini-pipeline-graph-dropdown-toggle') + end + + before do + toggle.click + wait_for_ajax + end + + it 'should open when toggle is clicked' do + expect(toggle.find(:xpath, '..')).to have_selector('.mini-pipeline-graph-dropdown-menu') + end + + it 'should close when toggle is clicked again' do + toggle.click + + expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu') + end + + it 'should close when clicking somewhere else' do + find('body').click + + expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu') + end + + describe 'build list build item' do + let(:build_item) do + find('.mini-pipeline-graph-dropdown-item') + first('.mini-pipeline-graph-dropdown-item') + end + + it 'should visit the build page when clicked' do + build_item.click + find('.build-page') + + expect(current_path).to eql(namespace_project_build_path(project.namespace, project, build)) + end + + it 'should show tooltip when hovered' do + build_item.hover + + expect(build_item.find(:xpath, '..')).to have_selector('.tooltip') + end + end + end +end diff --git a/spec/features/projects/blobs/shortcuts_blob_spec.rb b/spec/features/projects/blobs/shortcuts_blob_spec.rb new file mode 100644 index 00000000000..30e2d587267 --- /dev/null +++ b/spec/features/projects/blobs/shortcuts_blob_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +feature 'Blob shortcuts', feature: true do + include TreeHelper + let(:project) { create(:project, :public, :repository) } + let(:path) { project.repository.ls_files(project.repository.root_ref)[0] } + let(:sha) { project.repository.commit.sha } + + describe 'On a file(blob)', js: true do + def get_absolute_url(path = "") + "http://#{page.server.host}:#{page.server.port}#{path}" + end + + def visit_blob(fragment = nil) + visit namespace_project_blob_path(project.namespace, project, tree_join('master', path), anchor: fragment) + end + + describe 'pressing "y"' do + it 'redirects to permalink with commit sha' do + visit_blob + + find('body').native.send_key('y') + + expect(page).to have_current_path(get_absolute_url(namespace_project_blob_path(project.namespace, project, tree_join(sha, path))), url: true) + end + + it 'maintains fragment hash when redirecting' do + fragment = "L1" + visit_blob(fragment) + + find('body').native.send_key('y') + + expect(page).to have_current_path(get_absolute_url(namespace_project_blob_path(project.namespace, project, tree_join(sha, path), anchor: fragment)), url: true) + end + end + end +end diff --git a/spec/features/projects/commits/cherry_pick_spec.rb b/spec/features/projects/commit/cherry_pick_spec.rb index 7baf7913424..7baf7913424 100644 --- a/spec/features/projects/commits/cherry_pick_spec.rb +++ b/spec/features/projects/commit/cherry_pick_spec.rb diff --git a/spec/features/compare_spec.rb b/spec/features/projects/compare_spec.rb index 43eb4000e58..43eb4000e58 100644 --- a/spec/features/compare_spec.rb +++ b/spec/features/projects/compare_spec.rb diff --git a/spec/features/projects/services/mattermost_slash_command_spec.rb b/spec/features/projects/services/mattermost_slash_command_spec.rb index 042a1ccab51..f5adb53a2dc 100644 --- a/spec/features/projects/services/mattermost_slash_command_spec.rb +++ b/spec/features/projects/services/mattermost_slash_command_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' feature 'Setup Mattermost slash commands', feature: true do - include WaitForAjax - let(:user) { create(:user) } let(:project) { create(:empty_project) } let(:service) { project.create_mattermost_slash_commands_service } @@ -15,11 +13,15 @@ feature 'Setup Mattermost slash commands', feature: true do visit edit_namespace_project_service_path(project.namespace, project, service) end - describe 'user visits the mattermost slash command config page', js: true do + describe 'user visits the mattermost slash command config page' do it 'shows a help message' do - wait_for_ajax + expect(page).to have_content("This service allows users to perform common") + end + + it 'shows a token placeholder' do + token_placeholder = find_field('service_token')['placeholder'] - expect(page).to have_content("This service allows GitLab users to perform common") + expect(token_placeholder).to eq('XXxxXXxxXXxxXXxxXXxxXXxx') end it 'shows the token after saving' do @@ -64,7 +66,7 @@ feature 'Setup Mattermost slash commands', feature: true do select_element = find('select#mattermost_team_id') selected_option = select_element.find('option[selected]') - expect(select_element['disabled']).to be(true) + expect(select_element['disabled']).to eq('disabled') expect(selected_option).to have_content(team_name.to_s) end @@ -93,7 +95,7 @@ feature 'Setup Mattermost slash commands', feature: true do select_element = find('select#mattermost_team_id') selected_option = select_element.find('option[selected]') - expect(select_element['disabled']).to be(false) + expect(select_element['disabled']).to be(nil) expect(selected_option).to have_content('Select team...') # The 'Select team...' placeholder is item `0`. expect(select_element.all('option').count).to eq(3) @@ -135,6 +137,12 @@ feature 'Setup Mattermost slash commands', feature: true do expect(value).to match("api/v3/projects/#{project.id}/services/mattermost_slash_commands/trigger") end + + it 'shows a token placeholder' do + token_placeholder = find_field('service_token')['placeholder'] + + expect(token_placeholder).to eq('XXxxXXxxXXxxXXxxXXxxXXxx') + end end end diff --git a/spec/features/projects/services/slack_slash_command_spec.rb b/spec/features/projects/services/slack_slash_command_spec.rb index 32b32f7ae8e..db903a0c8f0 100644 --- a/spec/features/projects/services/slack_slash_command_spec.rb +++ b/spec/features/projects/services/slack_slash_command_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' feature 'Slack slash commands', feature: true do - include WaitForAjax - given(:user) { create(:user) } given(:project) { create(:project) } given(:service) { project.create_slack_slash_commands_service } @@ -10,19 +8,20 @@ feature 'Slack slash commands', feature: true do background do project.team << [user, :master] login_as(user) - end - - scenario 'user visits the slack slash command config page and shows a help message', js: true do visit edit_namespace_project_service_path(project.namespace, project, service) + end - wait_for_ajax + it 'shows a token placeholder' do + token_placeholder = find_field('service_token')['placeholder'] - expect(page).to have_content('This service allows GitLab users to perform common') + expect(token_placeholder).to eq('XXxxXXxxXXxxXXxxXXxxXXxx') end - scenario 'shows the token after saving' do - visit edit_namespace_project_service_path(project.namespace, project, service) + it 'shows a help message' do + expect(page).to have_content('This service allows users to perform common') + end + it 'shows the token after saving' do fill_in 'service_token', with: 'token' click_on 'Save' @@ -31,9 +30,7 @@ feature 'Slack slash commands', feature: true do expect(value).to eq('token') end - scenario 'shows the correct trigger url' do - visit edit_namespace_project_service_path(project.namespace, project, service) - + it 'shows the correct trigger url' do value = find_field('url').value expect(value).to match("api/v3/projects/#{project.id}/services/slack_slash_commands/trigger") end diff --git a/spec/features/projects/view_on_env_spec.rb b/spec/features/projects/view_on_env_spec.rb new file mode 100644 index 00000000000..ce5c5f21167 --- /dev/null +++ b/spec/features/projects/view_on_env_spec.rb @@ -0,0 +1,140 @@ +require 'spec_helper' + +describe 'View on environment', js: true do + include WaitForAjax + + let(:branch_name) { 'feature' } + let(:file_path) { 'files/ruby/feature.rb' } + let(:project) { create(:project, :repository) } + let(:user) { project.creator } + + before do + project.add_master(user) + end + + context 'when the branch has a route map' do + let(:route_map) do + <<-MAP.strip_heredoc + - source: /files/(.*)\\..*/ + public: '\\1' + MAP + end + + before do + Files::CreateService.new( + project, + user, + start_branch: branch_name, + target_branch: branch_name, + commit_message: "Add .gitlab/route-map.yml", + file_path: '.gitlab/route-map.yml', + file_content: route_map + ).execute + + # Update the file so that we still have a commit that will have a file on the environment + Files::UpdateService.new( + project, + user, + start_branch: branch_name, + target_branch: branch_name, + commit_message: "Update feature", + file_path: file_path, + file_content: "# Noop" + ).execute + end + + context 'and an active deployment' do + let(:sha) { project.commit(branch_name).sha } + let(:environment) { create(:environment, project: project, name: 'review/feature', external_url: 'http://feature.review.example.com') } + let!(:deployment) { create(:deployment, environment: environment, ref: branch_name, sha: sha) } + + context 'when visiting the diff of a merge request for the branch' do + let(:merge_request) { create(:merge_request, :simple, source_project: project, source_branch: branch_name) } + + before do + login_as(user) + + visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request) + + wait_for_ajax + end + + it 'has a "View on env" button' do + within '.diffs' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + end + + context 'when visiting a comparison for the branch' do + before do + login_as(user) + + visit namespace_project_compare_path(project.namespace, project, from: 'master', to: branch_name) + + wait_for_ajax + end + + it 'has a "View on env" button' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + + context 'when visiting a comparison for the commit' do + before do + login_as(user) + + visit namespace_project_compare_path(project.namespace, project, from: 'master', to: sha) + + wait_for_ajax + end + + it 'has a "View on env" button' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + + context 'when visiting a blob on the branch' do + before do + login_as(user) + + visit namespace_project_blob_path(project.namespace, project, File.join(branch_name, file_path)) + + wait_for_ajax + end + + it 'has a "View on env" button' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + + context 'when visiting a blob on the commit' do + before do + login_as(user) + + visit namespace_project_blob_path(project.namespace, project, File.join(sha, file_path)) + + wait_for_ajax + end + + it 'has a "View on env" button' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + + context 'when visiting the commit' do + before do + login_as(user) + + visit namespace_project_commit_path(project.namespace, project, sha) + + wait_for_ajax + end + + it 'has a "View on env" button' do + expect(page).to have_link('View on feature.review.example.com', href: 'http://feature.review.example.com/ruby/feature') + end + end + end + end +end |