Commit 41e0294d authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 7ff73cc4 578ab1bb
...@@ -85,7 +85,11 @@ export default { ...@@ -85,7 +85,11 @@ export default {
role="button" role="button"
@click="openFileInEditor" @click="openFileInEditor"
> >
<span class="multi-file-commit-list-file-path d-flex align-items-center"> <span
class="multi-file-commit-list-file-path d-flex align-items-center"
data-qa-selector="file_to_commit_content"
:data-qa-file-name="file.name"
>
<file-icon :file-name="file.name" class="gl-mr-3" /> <file-icon :file-name="file.name" class="gl-mr-3" />
<template v-if="file.prevName && file.prevName !== file.name"> <template v-if="file.prevName && file.prevName !== file.name">
{{ file.prevName }} &#x2192; {{ file.prevName }} &#x2192;
......
...@@ -58,8 +58,9 @@ export default { ...@@ -58,8 +58,9 @@ export default {
<new-entry-button <new-entry-button
:label="__('New file')" :label="__('New file')"
:show-label="false" :show-label="false"
class="d-flex border-0 p-0 mr-3 qa-new-file" class="d-flex border-0 p-0 mr-3"
icon="doc-new" icon="doc-new"
data-qa-selector="new_file_button"
@click="createNewFile()" @click="createNewFile()"
/> />
<upload <upload
...@@ -73,6 +74,7 @@ export default { ...@@ -73,6 +74,7 @@ export default {
:show-label="false" :show-label="false"
class="d-flex border-0 p-0" class="d-flex border-0 p-0"
icon="folder-new" icon="folder-new"
data-qa-selector="new_directory_button"
@click="createNewFolder()" @click="createNewFolder()"
/> />
</div> </div>
......
...@@ -90,6 +90,12 @@ export default { ...@@ -90,6 +90,12 @@ export default {
<svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]"> <svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]">
<use v-bind="{ 'xlink:href': spriteHref }" /> <use v-bind="{ 'xlink:href': spriteHref }" />
</svg> </svg>
<gl-icon v-else :name="folderIconName" :size="size" class="folder-icon" /> <gl-icon
v-else
:name="folderIconName"
:size="size"
class="folder-icon"
data-qa-selector="folder_icon_content"
/>
</span> </span>
</template> </template>
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :projects_limit = f.label :projects_limit
.col-sm-10 .col-sm-10
= f.number_field :projects_limit, min: 0, max: Gitlab::Database::MAX_INT_VALUE, class: 'form-control' = f.number_field :projects_limit, min: 0, max: Gitlab::Database::MAX_INT_VALUE, class: 'form-control gl-form-input'
.form-group.row .form-group.row
.col-sm-2.col-form-label.gl-pt-0 .col-sm-2.col-form-label.gl-pt-0
......
...@@ -4,4 +4,4 @@ ...@@ -4,4 +4,4 @@
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :note, s_('AdminNote|Note') = f.label :note, s_('AdminNote|Note')
.col-sm-10 .col-sm-10
= f.text_area :note, class: 'form-control' = f.text_area :note, class: 'form-control gl-form-input gl-form-textarea'
...@@ -8,19 +8,19 @@ ...@@ -8,19 +8,19 @@
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :name = f.label :name
.col-sm-10 .col-sm-10
= f.text_field :name, required: true, autocomplete: 'off', class: 'form-control' = f.text_field :name, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
%span.help-inline * required %span.help-inline * required
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :username = f.label :username
.col-sm-10 .col-sm-10
= f.text_field :username, required: true, autocomplete: 'off', autocorrect: 'off', autocapitalize: 'off', spellcheck: false, class: 'form-control' = f.text_field :username, required: true, autocomplete: 'off', autocorrect: 'off', autocapitalize: 'off', spellcheck: false, class: 'form-control gl-form-input'
%span.help-inline * required %span.help-inline * required
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :email = f.label :email
.col-sm-10 .col-sm-10
= f.text_field :email, required: true, autocomplete: 'off', class: 'form-control' = f.text_field :email, required: true, autocomplete: 'off', class: 'form-control gl-form-input'
%span.help-inline * required %span.help-inline * required
- if @user.new_record? - if @user.new_record?
...@@ -41,12 +41,12 @@ ...@@ -41,12 +41,12 @@
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :password = f.label :password
.col-sm-10 .col-sm-10
= f.password_field :password, disabled: f.object.force_random_password, class: 'form-control' = f.password_field :password, disabled: f.object.force_random_password, class: 'form-control gl-form-input'
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :password_confirmation = f.label :password_confirmation
.col-sm-10 .col-sm-10
= f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control' = f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control gl-form-input'
= render partial: 'access_levels', locals: { f: f } = render partial: 'access_levels', locals: { f: f }
...@@ -66,22 +66,22 @@ ...@@ -66,22 +66,22 @@
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :skype = f.label :skype
.col-sm-10 .col-sm-10
= f.text_field :skype, class: 'form-control' = f.text_field :skype, class: 'form-control gl-form-input'
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :linkedin = f.label :linkedin
.col-sm-10 .col-sm-10
= f.text_field :linkedin, class: 'form-control' = f.text_field :linkedin, class: 'form-control gl-form-input'
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :twitter = f.label :twitter
.col-sm-10 .col-sm-10
= f.text_field :twitter, class: 'form-control' = f.text_field :twitter, class: 'form-control gl-form-input'
.form-group.row .form-group.row
.col-sm-2.col-form-label .col-sm-2.col-form-label
= f.label :website_url = f.label :website_url
.col-sm-10 .col-sm-10
= f.text_field :website_url, class: 'form-control' = f.text_field :website_url, class: 'form-control gl-form-input'
= render 'admin/users/admin_notes', f: f = render 'admin/users/admin_notes', f: f
......
---
title: Add tooltips to requirement import and export buttons
merge_request: 52582
author: Kev @KevSlashNull
type: fixed
---
title: Apply new GitLab UI for inputs in admin/users directory
merge_request: 52290
author: Yogi (@yo)
type: other
...@@ -10,7 +10,6 @@ import { ...@@ -10,7 +10,6 @@ import {
GlLink, GlLink,
} from '@gitlab/ui'; } from '@gitlab/ui';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import DependencyLicenseLinks from './dependency_license_links.vue'; import DependencyLicenseLinks from './dependency_license_links.vue';
import DependencyVulnerabilities from './dependency_vulnerabilities.vue'; import DependencyVulnerabilities from './dependency_vulnerabilities.vue';
import DependencyLocation from './dependency_location.vue'; import DependencyLocation from './dependency_location.vue';
...@@ -45,7 +44,6 @@ export default { ...@@ -45,7 +44,6 @@ export default {
GlPopover, GlPopover,
GlLink, GlLink,
}, },
mixins: [glFeatureFlagsMixin()],
props: { props: {
dependencies: { dependencies: {
type: Array, type: Array,
...@@ -115,25 +113,23 @@ export default { ...@@ -115,25 +113,23 @@ export default {
> >
<template #head(location)="data"> <template #head(location)="data">
{{ data.label }} {{ data.label }}
<template v-if="glFeatures.pathToVulnerableDependency"> <gl-icon id="location-info" name="information" class="gl-text-blue-600" />
<gl-icon id="location-info" name="information" class="gl-text-blue-600" /> <gl-popover
<gl-popover target="location-info"
target="location-info" triggers="hover focus"
triggers="hover focus" placement="top"
placement="top" :title="s__('Dependencies|Location and dependency path')"
:title="s__('Dependencies|Location and dependency path')" >
> {{ $options.i18n.tooltipText }}
{{ $options.i18n.tooltipText }} <div class="gl-mt-4">
<div class="gl-mt-4"> <gl-link
<gl-link :href="$options.DEPENDENCY_PATH_LINK"
:href="$options.DEPENDENCY_PATH_LINK" target="_blank"
target="_blank" class="font-size-inherit"
class="font-size-inherit" >{{ $options.i18n.tooltipMoreText }}</gl-link
>{{ $options.i18n.tooltipMoreText }}</gl-link >
> </div>
</div> </gl-popover>
</gl-popover>
</template>
</template> </template>
<!-- toggleDetails and detailsShowing are scoped slot props provided by <!-- toggleDetails and detailsShowing are scoped slot props provided by
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
import { GlIcon, GlLink, GlPopover, GlIntersperse } from '@gitlab/ui'; import { GlIcon, GlLink, GlPopover, GlIntersperse } from '@gitlab/ui';
import { n__ } from '~/locale'; import { n__ } from '~/locale';
import DependencyPathViewer from './dependency_path_viewer.vue'; import DependencyPathViewer from './dependency_path_viewer.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export const VISIBLE_DEPENDENCY_COUNT = 2; export const VISIBLE_DEPENDENCY_COUNT = 2;
...@@ -15,7 +14,6 @@ export default { ...@@ -15,7 +14,6 @@ export default {
GlPopover, GlPopover,
GlIntersperse, GlIntersperse,
}, },
mixins: [glFeatureFlagsMixin()],
props: { props: {
location: { location: {
type: Object, type: Object,
...@@ -27,10 +25,10 @@ export default { ...@@ -27,10 +25,10 @@ export default {
return this.location.ancestors || []; return this.location.ancestors || [];
}, },
hasAncestors() { hasAncestors() {
return this.glFeatures.pathToVulnerableDependency && this.ancestors.length > 0; return this.ancestors.length > 0;
}, },
isTopLevelDependency() { isTopLevelDependency() {
return this.glFeatures.pathToVulnerableDependency && this.location.top_level; return this.location.top_level;
}, },
visibleDependencies() { visibleDependencies() {
return this.ancestors.slice(0, VISIBLE_DEPENDENCY_COUNT); return this.ancestors.slice(0, VISIBLE_DEPENDENCY_COUNT);
...@@ -39,7 +37,7 @@ export default { ...@@ -39,7 +37,7 @@ export default {
return Math.max(0, this.ancestors.length - VISIBLE_DEPENDENCY_COUNT); return Math.max(0, this.ancestors.length - VISIBLE_DEPENDENCY_COUNT);
}, },
showMoreLink() { showMoreLink() {
return this.glFeatures.pathToVulnerableDependency && this.remainingDependenciesCount > 0; return this.remainingDependenciesCount > 0;
}, },
nMoreMessage() { nMoreMessage() {
return n__('Dependencies|%d more', 'Dependencies|%d more', this.remainingDependenciesCount); return n__('Dependencies|%d more', 'Dependencies|%d more', this.remainingDependenciesCount);
......
<script> <script>
import { GlBadge, GlButton, GlButtonGroup, GlTabs, GlTab } from '@gitlab/ui'; import { GlBadge, GlButton, GlButtonGroup, GlTabs, GlTab, GlTooltipDirective } from '@gitlab/ui';
import { FilterState } from '../constants'; import { FilterState } from '../constants';
export default { export default {
directives: {
GlTooltip: GlTooltipDirective,
},
FilterState, FilterState,
components: { components: {
GlBadge, GlBadge,
...@@ -89,6 +92,8 @@ export default { ...@@ -89,6 +92,8 @@ export default {
<gl-button-group> <gl-button-group>
<gl-button <gl-button
v-if="showUploadCsv" v-if="showUploadCsv"
v-gl-tooltip
:title="__('Export as CSV')"
category="secondary" category="secondary"
:disabled="showCreateForm" :disabled="showCreateForm"
icon="export" icon="export"
...@@ -96,6 +101,8 @@ export default { ...@@ -96,6 +101,8 @@ export default {
/> />
<gl-button <gl-button
v-if="showUploadCsv" v-if="showUploadCsv"
v-gl-tooltip
:title="__('Import requirements')"
category="secondary" category="secondary"
class="js-import-requirements qa-import-requirements-button" class="js-import-requirements qa-import-requirements-button"
:disabled="showCreateForm" :disabled="showCreateForm"
......
...@@ -4,10 +4,6 @@ module Projects ...@@ -4,10 +4,6 @@ module Projects
class DependenciesController < Projects::ApplicationController class DependenciesController < Projects::ApplicationController
before_action :authorize_read_dependency_list! before_action :authorize_read_dependency_list!
before_action do
push_frontend_feature_flag(:path_to_vulnerable_dependency, project, default_enabled: true)
end
feature_category :dependency_scanning feature_category :dependency_scanning
def index def index
......
---
name: path_to_vulnerable_dependency
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40627
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/241739
milestone: '13.4'
type: development
group: group::composition analysis
default_enabled: true
...@@ -59,7 +59,6 @@ module Gitlab ...@@ -59,7 +59,6 @@ module Gitlab
path: file_path path: file_path
} }
return base_location if Feature.disabled?(:path_to_vulnerable_dependency, project, default_enabled: true)
return base_location unless dependency['iid'] return base_location unless dependency['iid']
base_location.merge({ base_location.merge({
......
...@@ -95,9 +95,11 @@ describe('DependenciesTable component', () => { ...@@ -95,9 +95,11 @@ describe('DependenciesTable component', () => {
it('renders the table header', () => { it('renders the table header', () => {
const expectedLabels = DependenciesTable.fields.map(({ label }) => label); const expectedLabels = DependenciesTable.fields.map(({ label }) => label);
const headerCells = wrapper.findAll('thead th').wrappers; const headerCells = wrapper.findAll('thead th');
expect(headerCells.map((cell) => cell.text())).toEqual(expectedLabels); expectedLabels.forEach((expectedLabel, i) => {
expect(headerCells.at(i).text()).toContain(expectedLabel);
});
}); });
it('does not render any rows', () => { it('does not render any rows', () => {
......
...@@ -12,11 +12,6 @@ describe('Dependency Location component', () => { ...@@ -12,11 +12,6 @@ describe('Dependency Location component', () => {
wrapper = shallowMount(DependencyLocation, { wrapper = shallowMount(DependencyLocation, {
propsData: { ...propsData }, propsData: { ...propsData },
stubs: { GlLink, DependencyPathViewer, GlIntersperse }, stubs: { GlLink, DependencyPathViewer, GlIntersperse },
provide: {
glFeatures: {
pathToVulnerableDependency: true,
},
},
...options, ...options,
}); });
}; };
...@@ -87,23 +82,4 @@ describe('Dependency Location component', () => { ...@@ -87,23 +82,4 @@ describe('Dependency Location component', () => {
expect(findPopover().exists()).toBe(false); expect(findPopover().exists()).toBe(false);
}); });
}); });
describe('with feature flag off', () => {
it.each`
name | location | path
${'no path'} | ${Paths.noPath} | ${'package.json'}
${'top level path'} | ${Paths.topLevelPath} | ${'package.json'}
${'short path'} | ${Paths.shortPath} | ${'package.json'}
${'long path'} | ${Paths.longPath} | ${'package.json'}
`('do not show dependency path for $name', ({ location, path }) => {
createComponent({
propsData: {
location,
},
provide: { glFeatures: { pathToVulnerableDependency: false } },
});
expect(wrapper.text()).toBe(path);
});
});
}); });
...@@ -67,19 +67,6 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Formatters::DependencyList do ...@@ -67,19 +67,6 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Formatters::DependencyList do
end end
end end
context 'when feature flag for dependency path is off' do
let(:dependency) { parsed_report['dependency_files'][0]['dependencies'][0] }
let(:location) { data[:location] }
before do
stub_feature_flags(path_to_vulnerable_dependency: false)
end
it { expect(location[:top_level]).to be_nil }
it { expect(location[:ancestors]).to be_nil }
it { expect(location[:path]).to eq('file.path') }
end
context 'with vulnerable dependency' do context 'with vulnerable dependency' do
let(:data) { formatter.format(dependency, package_manager, file_path, parsed_report['vulnerabilities'].first) } let(:data) { formatter.format(dependency, package_manager, file_path, parsed_report['vulnerabilities'].first) }
let(:dependency) { parsed_report['dependency_files'][0]['dependencies'][1] } let(:dependency) { parsed_report['dependency_files'][0]['dependencies'][1] }
......
...@@ -18,7 +18,8 @@ module QA ...@@ -18,7 +18,8 @@ module QA
end end
view 'app/assets/javascripts/ide/components/ide_tree.vue' do view 'app/assets/javascripts/ide/components/ide_tree.vue' do
element :new_file element :new_file_button
element :new_directory_button
end end
view 'app/assets/javascripts/ide/components/ide_tree_list.vue' do view 'app/assets/javascripts/ide/components/ide_tree_list.vue' do
...@@ -83,6 +84,10 @@ module QA ...@@ -83,6 +84,10 @@ module QA
element :changed_file_icon_content element :changed_file_icon_content
end end
view 'app/assets/javascripts/vue_shared/components/file_icon.vue' do
element :folder_icon_content
end
view 'app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue' do view 'app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue' do
element :preview_container element :preview_container
end end
...@@ -99,12 +104,20 @@ module QA ...@@ -99,12 +104,20 @@ module QA
element :file_upload_field element :file_upload_field
end end
view 'app/assets/javascripts/ide/components/commit_sidebar/list_item.vue' do
element :file_to_commit_content
end
def has_file?(file_name) def has_file?(file_name)
within_element(:file_list) do within_element(:file_list) do
has_text?(file_name) has_element?(:file_name_content, file_name: file_name)
end end
end end
def has_file_to_commit?(file_name)
has_element?(:file_to_commit_content, file_name: file_name)
end
def has_project_path?(project_path) def has_project_path?(project_path)
has_element?(:project_path_content, project_path: project_path) has_element?(:project_path_content, project_path: project_path)
end end
...@@ -115,6 +128,12 @@ module QA ...@@ -115,6 +128,12 @@ module QA
end end
end end
def has_folder_icon?(file_name)
within_element(:file_row_container, file_name: file_name) do
has_element?(:folder_icon_content)
end
end
def has_download_button?(file_name) def has_download_button?(file_name)
click_element(:file_row_container, file_name: file_name) click_element(:file_row_container, file_name: file_name)
within_element(:preview_container) do within_element(:preview_container) do
...@@ -141,7 +160,7 @@ module QA ...@@ -141,7 +160,7 @@ module QA
end end
def create_new_file_from_template(file_name, template) def create_new_file_from_template(file_name, template)
click_element(:new_file, Page::Component::WebIDE::Modal::CreateNewFile) click_element(:new_file_button, Page::Component::WebIDE::Modal::CreateNewFile)
within_element(:template_list) do within_element(:template_list) do
click_on file_name click_on file_name
...@@ -234,7 +253,7 @@ module QA ...@@ -234,7 +253,7 @@ module QA
end end
def add_file(file_name, file_text) def add_file(file_name, file_text)
click_element(:new_file, Page::Component::WebIDE::Modal::CreateNewFile) click_element(:new_file_button, Page::Component::WebIDE::Modal::CreateNewFile)
fill_element(:file_name_field, file_name) fill_element(:file_name_field, file_name)
click_button('Create file') click_button('Create file')
wait_until(reload: false) { has_file?(file_name) } wait_until(reload: false) { has_file?(file_name) }
...@@ -243,6 +262,13 @@ module QA ...@@ -243,6 +262,13 @@ module QA
end end
end end
def add_directory(directory_name)
click_element(:new_directory_button, Page::Component::WebIDE::Modal::CreateNewFile)
fill_element(:file_name_field, directory_name)
click_button('Create directory')
wait_until(reload: false) { has_file?(directory_name) }
end
def rename_file(file_name, new_file_name) def rename_file(file_name, new_file_name)
click_element(:file_name_content, file_name: file_name) click_element(:file_name_content, file_name: file_name)
click_element(:dropdown_button) click_element(:dropdown_button)
...@@ -273,6 +299,10 @@ module QA ...@@ -273,6 +299,10 @@ module QA
click_element(:dropdown_button) click_element(:dropdown_button)
click_element(:delete_button) click_element(:delete_button)
end end
def switch_to_commit_tab
click_element(:commit_mode_tab)
end
end end
end end
end end
......
# frozen_string_literal: true
module QA
RSpec.describe 'Create' do
describe 'Add a directory in Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'add-directory-project'
project.initialize_with_readme = true
end
end
before do
Flow::Login.sign_in
project.visit!
end
context 'when a directory with the same name already exists' do
let(:directory_name) { 'first_directory' }
before do
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.add_files([
{
file_path: 'first_directory/test_file.txt',
content: "Test file content"
}
])
end
project.visit!
Page::Project::Show.perform(&:open_web_ide!)
end
it 'throws an error' do
Page::Project::WebIDE::Edit.perform do |ide|
ide.add_directory(directory_name)
end
expect(page).to have_content('The name "first_directory" is already taken in this directory.')
end
end
context 'when user adds a new empty directory' do
let(:directory_name) { 'new_empty_directory' }
before do
Page::Project::Show.perform(&:open_web_ide!)
end
it 'shows in the tree view but cannot be committed' do
Page::Project::WebIDE::Edit.perform do |ide|
ide.add_directory(directory_name)
expect(ide).to have_file(directory_name)
expect(ide).to have_folder_icon(directory_name)
expect(ide).not_to have_file_addition_icon(directory_name)
ide.switch_to_commit_tab
expect(ide).not_to have_file_to_commit(directory_name)
end
end
end
end
end
end
...@@ -22,7 +22,7 @@ module QA ...@@ -22,7 +22,7 @@ module QA
context 'when a file with the same name already exists' do context 'when a file with the same name already exists' do
let(:file_name) { 'README.md' } let(:file_name) { 'README.md' }
it 'throws an error' do it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1136' do
Page::Project::WebIDE::Edit.perform do |ide| Page::Project::WebIDE::Edit.perform do |ide|
ide.upload_file(file_path) ide.upload_file(file_path)
end end
...@@ -34,7 +34,7 @@ module QA ...@@ -34,7 +34,7 @@ module QA
context 'when the file is a text file' do context 'when the file is a text file' do
let(:file_name) { 'text_file.txt' } let(:file_name) { 'text_file.txt' }
it 'shows the Edit tab with the text' do it 'shows the Edit tab with the text', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1138' do
Page::Project::WebIDE::Edit.perform do |ide| Page::Project::WebIDE::Edit.perform do |ide|
ide.upload_file(file_path) ide.upload_file(file_path)
...@@ -52,7 +52,7 @@ module QA ...@@ -52,7 +52,7 @@ module QA
context 'when the file is binary' do context 'when the file is binary' do
let(:file_name) { 'logo_sample.svg' } let(:file_name) { 'logo_sample.svg' }
it 'shows a Download button' do it 'shows a Download button', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1137' do
Page::Project::WebIDE::Edit.perform do |ide| Page::Project::WebIDE::Edit.perform do |ide|
ide.upload_file(file_path) ide.upload_file(file_path)
...@@ -70,7 +70,7 @@ module QA ...@@ -70,7 +70,7 @@ module QA
context 'when the file is an image' do context 'when the file is an image' do
let(:file_name) { 'dk.png' } let(:file_name) { 'dk.png' }
it 'shows an image viewer' do it 'shows an image viewer', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1139' do
Page::Project::WebIDE::Edit.perform do |ide| Page::Project::WebIDE::Edit.perform do |ide|
ide.upload_file(file_path) ide.upload_file(file_path)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment