Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
58c0ae1238
commit
afb35e2471
|
|
@ -603,7 +603,7 @@ export default {
|
|||
});
|
||||
},
|
||||
|
||||
addListItem: ({ commit }, { list, item, position, inProgress = false }) => {
|
||||
addListItem: ({ commit, dispatch }, { list, item, position, inProgress = false }) => {
|
||||
commit(types.ADD_BOARD_ITEM_TO_LIST, {
|
||||
listId: list.id,
|
||||
itemId: item.id,
|
||||
|
|
@ -611,6 +611,9 @@ export default {
|
|||
inProgress,
|
||||
});
|
||||
commit(types.UPDATE_BOARD_ITEM, item);
|
||||
if (!inProgress) {
|
||||
dispatch('setActiveId', { id: item.id, sidebarType: ISSUABLE });
|
||||
}
|
||||
},
|
||||
|
||||
removeListItem: ({ commit }, { listId, itemId }) => {
|
||||
|
|
|
|||
|
|
@ -91,6 +91,12 @@ class IssuesFinder < IssuableFinder
|
|||
by_issue_types(issues)
|
||||
end
|
||||
|
||||
# Negates all params found in `negatable_params`
|
||||
def filter_negated_items(items)
|
||||
issues = super
|
||||
by_negated_issue_types(issues)
|
||||
end
|
||||
|
||||
def by_confidential(items)
|
||||
return items if params[:confidential].nil?
|
||||
|
||||
|
|
@ -122,6 +128,13 @@ class IssuesFinder < IssuableFinder
|
|||
|
||||
items.with_issue_type(params[:issue_types])
|
||||
end
|
||||
|
||||
def by_negated_issue_types(items)
|
||||
issue_type_params = Array(not_params[:issue_types]).map(&:to_s) & WorkItem::Type.base_types.keys
|
||||
return items if issue_type_params.blank?
|
||||
|
||||
items.without_issue_type(issue_type_params)
|
||||
end
|
||||
end
|
||||
|
||||
IssuesFinder.prepend_mod_with('IssuesFinder')
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ module Ci
|
|||
delegate :interruptible, to: :metadata, prefix: false, allow_nil: true
|
||||
delegate :has_exposed_artifacts?, to: :metadata, prefix: false, allow_nil: true
|
||||
delegate :environment_auto_stop_in, to: :metadata, prefix: false, allow_nil: true
|
||||
delegate :runner_features, to: :metadata, prefix: false, allow_nil: false
|
||||
before_create :ensure_metadata
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -127,6 +127,7 @@ class Issue < ApplicationRecord
|
|||
project: [:route, { namespace: :route }])
|
||||
}
|
||||
scope :with_issue_type, ->(types) { where(issue_type: types) }
|
||||
scope :without_issue_type, ->(types) { where.not(issue_type: types) }
|
||||
|
||||
scope :public_only, -> {
|
||||
without_hidden.where(confidential: false)
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ MARKDOWN
|
|||
|
||||
if blocking_components_in_mr.any?
|
||||
markdown(<<~MARKDOWN)
|
||||
These deprecated components have already been migrated and can no longer be used. Please use [Pajamas components](https://design.gitlab.com/components/status/) instead.
|
||||
These deprecated components have already been migrated and can no longer be used. Please use [Pajamas components](https://design.gitlab.com/components/overview) instead.
|
||||
|
||||
* #{blocking_components_in_mr.join("\n* ")}
|
||||
|
||||
|
|
@ -70,7 +70,7 @@ end
|
|||
|
||||
if deprecated_components_in_mr.any?
|
||||
markdown(<<~MARKDOWN)
|
||||
These deprecated components are in the process of being migrated. Please consider using [Pajamas components](https://design.gitlab.com/components/status/) instead.
|
||||
These deprecated components are in the process of being migrated. Please consider using [Pajamas components](https://design.gitlab.com/components/overview) instead.
|
||||
|
||||
* #{deprecated_components_in_mr.join("\n* ")}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddRunnerFeaturesToCiBuildsMetadata < Gitlab::Database::Migration[1.0]
|
||||
enable_lock_retries!
|
||||
|
||||
def change
|
||||
add_column :ci_builds_metadata, :runner_features, :jsonb, default: {}, null: false
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
76bfbf3f12fed895c3cfb891080b5a452d1204c83ce96736048f857b33458ad1
|
||||
|
|
@ -11410,7 +11410,8 @@ CREATE TABLE ci_builds_metadata (
|
|||
expanded_environment_name character varying(255),
|
||||
secrets jsonb DEFAULT '{}'::jsonb NOT NULL,
|
||||
build_id bigint NOT NULL,
|
||||
id bigint NOT NULL
|
||||
id bigint NOT NULL,
|
||||
runner_features jsonb DEFAULT '{}'::jsonb NOT NULL
|
||||
);
|
||||
|
||||
CREATE SEQUENCE ci_builds_metadata_id_seq
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ GitLab.com generates an application ID and secret key for you to use.
|
|||
1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings.
|
||||
1. Add the provider configuration:
|
||||
|
||||
For Omnibus installations:
|
||||
For Omnibus installations authenticating against **GitLab.com**:
|
||||
|
||||
```ruby
|
||||
gitlab_rails['omniauth_providers'] = [
|
||||
|
|
@ -61,7 +61,20 @@ GitLab.com generates an application ID and secret key for you to use.
|
|||
]
|
||||
```
|
||||
|
||||
For installations from source:
|
||||
Or, for Omnibus installations authenticating against a different GitLab instance:
|
||||
|
||||
```ruby
|
||||
gitlab_rails['omniauth_providers'] = [
|
||||
{
|
||||
"name" => "gitlab",
|
||||
"app_id" => "YOUR_APP_ID",
|
||||
"app_secret" => "YOUR_APP_SECRET",
|
||||
"args" => { "scope" => "api", "client_options" => { "site" => "https://gitlab.example.com/api/v4" } }
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
For installations from source authenticating against **GitLab.com**:
|
||||
|
||||
```yaml
|
||||
- { name: 'gitlab',
|
||||
|
|
@ -70,6 +83,15 @@ GitLab.com generates an application ID and secret key for you to use.
|
|||
args: { scope: 'api' } }
|
||||
```
|
||||
|
||||
Or, for installations from source to authenticate against a different GitLab instance:
|
||||
|
||||
```yaml
|
||||
- { name: 'gitlab',
|
||||
app_id: 'YOUR_APP_ID',
|
||||
app_secret: 'YOUR_APP_SECRET',
|
||||
args: { scope: 'api', "client_options": { "site": 'https://gitlab.example.com/api/v4' } }
|
||||
```
|
||||
|
||||
1. Change `'YOUR_APP_ID'` to the Application ID from the GitLab.com application page.
|
||||
1. Change `'YOUR_APP_SECRET'` to the secret from the GitLab.com application page.
|
||||
1. Save the configuration file.
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ gem 'capybara', '~> 3.35.0'
|
|||
gem 'capybara-screenshot', '~> 1.0.23'
|
||||
gem 'rake', '~> 12.3.3'
|
||||
gem 'rspec', '~> 3.10'
|
||||
gem 'selenium-webdriver', '~> 4.0.0.beta4'
|
||||
gem 'selenium-webdriver', '~> 4.0.0.rc1'
|
||||
gem 'airborne', '~> 0.3.4', require: false # airborne is messing with rspec sandboxed mode so not requiring by default
|
||||
gem 'rest-client', '~> 2.1.0'
|
||||
gem 'rspec-retry', '~> 0.6.1', require: 'rspec/retry'
|
||||
|
|
@ -26,7 +26,7 @@ gem 'webdrivers', '~> 4.6'
|
|||
gem 'zeitwerk', '~> 2.4'
|
||||
gem 'influxdb-client', '~> 1.17'
|
||||
|
||||
gem 'chemlab', '~> 0.7'
|
||||
gem 'chemlab', '~> 0.8'
|
||||
gem 'chemlab-library-www-gitlab-com', '~> 0.1'
|
||||
|
||||
gem 'deprecation_toolkit', '~> 1.5.1', require: false
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ GEM
|
|||
capybara-screenshot (1.0.23)
|
||||
capybara (>= 1.0, < 4)
|
||||
launchy
|
||||
chemlab (0.7.2)
|
||||
chemlab (0.8.0)
|
||||
colorize (~> 0.8)
|
||||
i18n (~> 1.8)
|
||||
rake (>= 12, < 14)
|
||||
|
|
@ -135,7 +135,7 @@ GEM
|
|||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rake (12.3.3)
|
||||
regexp_parser (1.8.2)
|
||||
regexp_parser (2.1.1)
|
||||
require_all (3.0.0)
|
||||
rest-client (2.1.0)
|
||||
http-accept (>= 1.7.0, < 2.0)
|
||||
|
|
@ -174,7 +174,7 @@ GEM
|
|||
sawyer (0.8.2)
|
||||
addressable (>= 2.3.5)
|
||||
faraday (> 0.8, < 2.0)
|
||||
selenium-webdriver (4.0.0.beta4)
|
||||
selenium-webdriver (4.0.0.rc1)
|
||||
childprocess (>= 0.5, < 5.0)
|
||||
rexml (~> 3.2)
|
||||
rubyzip (>= 1.2.2)
|
||||
|
|
@ -216,7 +216,7 @@ DEPENDENCIES
|
|||
allure-rspec (~> 2.14.5)
|
||||
capybara (~> 3.35.0)
|
||||
capybara-screenshot (~> 1.0.23)
|
||||
chemlab (~> 0.7)
|
||||
chemlab (~> 0.8)
|
||||
chemlab-library-www-gitlab-com (~> 0.1)
|
||||
deprecation_toolkit (~> 1.5.1)
|
||||
faker (~> 2.19, >= 2.19.0)
|
||||
|
|
@ -235,7 +235,7 @@ DEPENDENCIES
|
|||
rspec-retry (~> 0.6.1)
|
||||
rspec_junit_formatter (~> 0.4.1)
|
||||
ruby-debug-ide (~> 0.7.0)
|
||||
selenium-webdriver (~> 4.0.0.beta4)
|
||||
selenium-webdriver (~> 4.0.0.rc1)
|
||||
timecop (~> 0.9.1)
|
||||
webdrivers (~> 4.6)
|
||||
zeitwerk (~> 2.4)
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ $:.unshift(File.expand_path('lib', __dir__))
|
|||
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = 'chemlab-library-gitlab'
|
||||
spec.version = '0.1.1'
|
||||
spec.version = '0.2.0'
|
||||
spec.authors = ['GitLab Quality']
|
||||
spec.email = ['quality@gitlab.com']
|
||||
|
||||
|
|
@ -18,5 +18,5 @@ Gem::Specification.new do |spec|
|
|||
|
||||
spec.require_paths = ['lib']
|
||||
|
||||
spec.add_runtime_dependency 'chemlab', '~> 0.7'
|
||||
spec.add_runtime_dependency 'chemlab', '~> 0.8'
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'chemlab/library'
|
||||
|
||||
# Chemlab Page Libraries for GitLab
|
||||
module Gitlab
|
||||
include Chemlab::Library
|
||||
|
||||
module Page
|
||||
module Main
|
||||
autoload :Login, 'gitlab/page/main/login'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module QA
|
||||
module Page
|
||||
module Component
|
||||
module WebIDE
|
||||
module WebTerminalPanel
|
||||
extend QA::Page::PageConcern
|
||||
|
||||
def self.prepended(base)
|
||||
super
|
||||
|
||||
base.class_eval do
|
||||
view 'app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue' do
|
||||
element :ide_right_sidebar, %q(:data-qa-selector="`ide_${side}_sidebar`") # rubocop:disable QA/ElementWithPattern
|
||||
end
|
||||
|
||||
view 'app/assets/javascripts/ide/components/ide_sidebar_nav.vue' do
|
||||
element :terminal_tab_button, %q(:data-qa-selector="`${tab.title.toLowerCase()}_tab_button`") # rubocop:disable QA/ElementWithPattern
|
||||
end
|
||||
|
||||
view 'app/assets/javascripts/ide/components/terminal/empty_state.vue' do
|
||||
element :start_web_terminal_button
|
||||
end
|
||||
|
||||
view 'app/assets/javascripts/ide/components/terminal/terminal.vue' do
|
||||
element :loading_container
|
||||
element :terminal_screen
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def has_finished_loading?
|
||||
has_no_element?(:loading_container, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
|
||||
end
|
||||
|
||||
def has_terminal_screen?
|
||||
wait_until(reload: false) do
|
||||
within_element :terminal_screen do
|
||||
# The DOM initially just includes the :terminal_screen element
|
||||
# and then the xterm package dynamically loads when the user
|
||||
# clicks the Start Web Terminal button. If it loads succesfully
|
||||
# an element with the class `xterm` is added to the DOM.
|
||||
# The xterm is a third-party library, so we can't add a selector
|
||||
find(".xterm")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def start_web_terminal
|
||||
within_element :ide_right_sidebar do
|
||||
click_element :terminal_tab_button
|
||||
end
|
||||
|
||||
click_element :start_web_terminal_button
|
||||
|
||||
has_element? :loading_container, text: "Starting"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -6,6 +6,7 @@ module QA
|
|||
module WebIDE
|
||||
class Edit < Page::Base
|
||||
prepend Page::Component::WebIDE::Alert
|
||||
prepend Page::Component::WebIDE::WebTerminalPanel
|
||||
include Page::Component::DropdownFilter
|
||||
|
||||
view 'app/assets/javascripts/ide/components/activity_bar.vue' do
|
||||
|
|
@ -330,5 +331,3 @@ module QA
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
QA::Page::Project::WebIDE::Edit.prepend_mod_with('Page::Component::WebIDE::WebTerminalPanel', namespace: QA)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,84 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module QA
|
||||
RSpec.describe(
|
||||
'Create',
|
||||
:runner,
|
||||
quarantine: {
|
||||
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179',
|
||||
type: :bug
|
||||
}
|
||||
) do
|
||||
describe 'Web IDE web terminal' do
|
||||
before do
|
||||
project = Resource::Project.fabricate_via_api! do |project|
|
||||
project.name = 'web-terminal-project'
|
||||
end
|
||||
|
||||
Resource::Repository::Commit.fabricate_via_api! do |commit|
|
||||
commit.project = project
|
||||
commit.commit_message = 'Add .gitlab/.gitlab-webide.yml'
|
||||
commit.add_files(
|
||||
[
|
||||
{
|
||||
file_path: '.gitlab/.gitlab-webide.yml',
|
||||
content: <<~YAML
|
||||
terminal:
|
||||
tags: ["web-ide"]
|
||||
script: sleep 60
|
||||
YAML
|
||||
}
|
||||
]
|
||||
)
|
||||
end
|
||||
|
||||
@runner = Resource::Runner.fabricate_via_api! do |runner|
|
||||
runner.project = project
|
||||
runner.name = "qa-runner-#{Time.now.to_i}"
|
||||
runner.tags = %w[web-ide]
|
||||
runner.image = 'gitlab/gitlab-runner:latest'
|
||||
runner.config = <<~END
|
||||
concurrent = 1
|
||||
|
||||
[session_server]
|
||||
listen_address = "0.0.0.0:8093"
|
||||
advertise_address = "localhost:8093"
|
||||
session_timeout = 120
|
||||
END
|
||||
end
|
||||
|
||||
Flow::Login.sign_in
|
||||
|
||||
project.visit!
|
||||
end
|
||||
|
||||
after do
|
||||
@runner.remove_via_api! if @runner
|
||||
end
|
||||
|
||||
it 'user starts the web terminal', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1593' do
|
||||
Page::Project::Show.perform(&:open_web_ide!)
|
||||
|
||||
# Start the web terminal and check that there were no errors
|
||||
# The terminal screen is a canvas element, so we can't read its content,
|
||||
# so we infer that it's working if:
|
||||
# a) The terminal JS package has loaded, and
|
||||
# b) It's not stuck in a "Loading/Starting" state, and
|
||||
# c) There's no alert stating there was a problem
|
||||
#
|
||||
# The terminal itself is a third-party package so we assume it is
|
||||
# adequately tested elsewhere.
|
||||
#
|
||||
# There are also FE specs
|
||||
# * spec/frontend/ide/components/terminal/terminal_controls_spec.js
|
||||
Page::Project::WebIDE::Edit.perform do |edit|
|
||||
edit.start_web_terminal
|
||||
|
||||
expect(edit).to have_no_alert
|
||||
expect(edit).to have_finished_loading
|
||||
expect(edit).to have_terminal_screen
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -81,6 +81,22 @@ then
|
|||
((ERRORCODE++))
|
||||
fi
|
||||
|
||||
# Do not use dashes (-) in directory names, use underscores (_) instead.
|
||||
# Number of directories with dashes as of 2021-09-17
|
||||
NUMBER_DASHES=2
|
||||
FIND_DASHES=$(find doc -type d -name "*-*" | wc -l)
|
||||
echo '=> Checking for directory names containing dashes...'
|
||||
echo
|
||||
if [ ${FIND_DASHES} -ne $NUMBER_DASHES ]
|
||||
then
|
||||
echo
|
||||
echo ' ✖ ERROR: The number of directory names containing dashes has changed. Use underscores instead of dashes for the directory names.' >&2
|
||||
echo ' ✖ If removing a directory containing dashes, update NUMBER_DASHES in lint-doc.sh.' >&2
|
||||
echo ' https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#work-with-directories-and-files'
|
||||
echo
|
||||
((ERRORCODE++))
|
||||
fi
|
||||
|
||||
# Run Vale and Markdownlint only on changed files. Only works on merged results
|
||||
# pipelines, so first checks if a merged results CI variable is present. If not present,
|
||||
# runs test on all files.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'yaml'
|
||||
|
||||
MINIMUM_MAX_FILES_IN_CACHE_MARGIN = 1.05
|
||||
RECOMMENDED_MAX_FILES_IN_CACHE_MARGIN = 1.25
|
||||
RUBOCOP_LIST_TARGET_FILES_COMMAND = 'bundle exec rubocop --list-target-files | wc -l'
|
||||
|
||||
RuboCopMaxFilesInCacheIsTooSmall = Class.new(StandardError)
|
||||
|
||||
rubocop_target_files_count = `#{RUBOCOP_LIST_TARGET_FILES_COMMAND}`.strip.to_i
|
||||
|
||||
raise Error, "#{RUBOCOP_LIST_TARGET_FILES_COMMAND} failed with status #{$?}!" if rubocop_target_files_count == 0
|
||||
|
||||
rubocop_target_files_count = rubocop_target_files_count.to_i
|
||||
rubocop_current_max_files_in_cache = YAML.load_file(File.expand_path('../.rubocop.yml', __dir__)).dig('AllCops', 'MaxFilesInCache').to_i
|
||||
minimum_max_files_in_cache = (rubocop_target_files_count * MINIMUM_MAX_FILES_IN_CACHE_MARGIN).round(-3)
|
||||
|
||||
# We want AllCops.MaxFilesInCache to be at least 5% above the actual files count at any time to give us enough time to increase it accordingly
|
||||
if rubocop_current_max_files_in_cache <= minimum_max_files_in_cache
|
||||
recommended_max_files_in_cache = (rubocop_target_files_count * RECOMMENDED_MAX_FILES_IN_CACHE_MARGIN).round(-3)
|
||||
raise RuboCopMaxFilesInCacheIsTooSmall, "Current count of RuboCop target file is #{rubocop_target_files_count} but AllCops.MaxFilesInCache is set to #{rubocop_current_max_files_in_cache}. We recommend to increase it to #{recommended_max_files_in_cache}."
|
||||
else
|
||||
puts "Current count of RuboCop target file is #{rubocop_target_files_count} and AllCops.MaxFilesInCache is set to #{rubocop_current_max_files_in_cache}. All good."
|
||||
exit(0)
|
||||
end
|
||||
|
|
@ -54,6 +54,7 @@ class StaticAnalysis
|
|||
Task.new(%w[bin/rake gettext:lint], 85),
|
||||
Task.new(%W[bundle exec license_finder --decisions-file config/dependency_decisions.yml --project-path #{project_path}], 20),
|
||||
Task.new(%w[bin/rake lint:static_verification], 35),
|
||||
Task.new(%w[scripts/rubocop-max-files-in-cache-check], 20),
|
||||
Task.new(%w[bin/rake config_lint], 10),
|
||||
Task.new(%w[bin/rake gitlab:sidekiq:all_queues_yml:check], 15),
|
||||
(Gitlab.ee? ? Task.new(%w[bin/rake gitlab:sidekiq:sidekiq_queues_yml:check], 11) : nil),
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ RSpec.describe 'Issue Boards new issue', :js do
|
|||
end
|
||||
end
|
||||
|
||||
it 'creates new issue' do
|
||||
it 'creates new issue and opens sidebar' do
|
||||
page.within(first('.board')) do
|
||||
click_button 'New issue'
|
||||
end
|
||||
|
|
@ -78,20 +78,6 @@ RSpec.describe 'Issue Boards new issue', :js do
|
|||
expect(page).to have_content(issue.to_reference)
|
||||
expect(page).to have_link(issue.title, href: /#{issue_path(issue)}/)
|
||||
end
|
||||
end
|
||||
|
||||
# TODO https://gitlab.com/gitlab-org/gitlab/-/issues/323446
|
||||
xit 'shows sidebar when creating new issue' do
|
||||
page.within(first('.board')) do
|
||||
click_button 'New issue'
|
||||
end
|
||||
|
||||
page.within(first('.board-new-issue-form')) do
|
||||
find('.form-control').set('bug')
|
||||
click_button 'Create issue'
|
||||
end
|
||||
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_selector('[data-testid="issue-boards-sidebar"]')
|
||||
end
|
||||
|
|
@ -108,10 +94,6 @@ RSpec.describe 'Issue Boards new issue', :js do
|
|||
|
||||
wait_for_requests
|
||||
|
||||
page.within(first('.board')) do
|
||||
find('.board-card').click
|
||||
end
|
||||
|
||||
page.within('[data-testid="sidebar-labels"]') do
|
||||
click_button 'Edit'
|
||||
|
||||
|
|
|
|||
|
|
@ -1331,20 +1331,54 @@ describe('addListItem', () => {
|
|||
list: mockLists[0],
|
||||
item: mockIssue,
|
||||
position: 0,
|
||||
inProgress: true,
|
||||
};
|
||||
|
||||
testAction(actions.addListItem, payload, {}, [
|
||||
{
|
||||
type: types.ADD_BOARD_ITEM_TO_LIST,
|
||||
payload: {
|
||||
listId: mockLists[0].id,
|
||||
itemId: mockIssue.id,
|
||||
atIndex: 0,
|
||||
inProgress: false,
|
||||
testAction(
|
||||
actions.addListItem,
|
||||
payload,
|
||||
{},
|
||||
[
|
||||
{
|
||||
type: types.ADD_BOARD_ITEM_TO_LIST,
|
||||
payload: {
|
||||
listId: mockLists[0].id,
|
||||
itemId: mockIssue.id,
|
||||
atIndex: 0,
|
||||
inProgress: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{ type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
|
||||
]);
|
||||
{ type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
|
||||
],
|
||||
[],
|
||||
);
|
||||
});
|
||||
|
||||
it('should commit ADD_BOARD_ITEM_TO_LIST and UPDATE_BOARD_ITEM mutations, dispatch setActiveId action when inProgress is false', () => {
|
||||
const payload = {
|
||||
list: mockLists[0],
|
||||
item: mockIssue,
|
||||
position: 0,
|
||||
};
|
||||
|
||||
testAction(
|
||||
actions.addListItem,
|
||||
payload,
|
||||
{},
|
||||
[
|
||||
{
|
||||
type: types.ADD_BOARD_ITEM_TO_LIST,
|
||||
payload: {
|
||||
listId: mockLists[0].id,
|
||||
itemId: mockIssue.id,
|
||||
atIndex: 0,
|
||||
inProgress: false,
|
||||
},
|
||||
},
|
||||
{ type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
|
||||
],
|
||||
[{ type: 'setActiveId', payload: { id: mockIssue.id, sidebarType: ISSUABLE } }],
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,13 @@ RSpec.describe Resolvers::BoardListIssuesResolver do
|
|||
expect(result).to match_array([issue1])
|
||||
end
|
||||
|
||||
it 'filters issues by negated issue type' do
|
||||
incident = create(:incident, project: project, labels: [label], relative_position: 15)
|
||||
result = resolve_board_list_issues(args: { filters: { not: { types: ['issue'] } } })
|
||||
|
||||
expect(result).to contain_exactly(incident)
|
||||
end
|
||||
|
||||
it 'raises an exception if both assignee_username and assignee_wildcard_id are present' do
|
||||
expect do
|
||||
resolve_board_list_issues(args: { filters: { assignee_username: ['username'], assignee_wildcard_id: 'NONE' } })
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ RSpec.describe Ci::Bridge do
|
|||
{ trigger: { project: 'my/project', branch: 'master' } }
|
||||
end
|
||||
|
||||
it { is_expected.to respond_to(:runner_features) }
|
||||
|
||||
it 'has many sourced pipelines' do
|
||||
expect(bridge).to have_many(:sourced_pipelines)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ RSpec.describe Ci::Build do
|
|||
|
||||
it { is_expected.to respond_to(:has_trace?) }
|
||||
it { is_expected.to respond_to(:trace) }
|
||||
it { is_expected.to respond_to(:runner_features) }
|
||||
|
||||
it { is_expected.to delegate_method(:merge_request?).to(:pipeline) }
|
||||
it { is_expected.to delegate_method(:merge_request_ref?).to(:pipeline) }
|
||||
|
|
|
|||
|
|
@ -56,12 +56,23 @@ RSpec.describe Boards::Issues::ListService do
|
|||
it_behaves_like 'issues list service'
|
||||
end
|
||||
|
||||
context 'when filtering by type' do
|
||||
it 'only returns the specified type' do
|
||||
issue = create(:labeled_issue, project: project, milestone: m1, labels: [development, p1], issue_type: 'incident')
|
||||
params = { board_id: board.id, id: list1.id, issue_types: 'incident' }
|
||||
context 'when filtering' do
|
||||
let_it_be(:incident) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1], issue_type: 'incident') }
|
||||
|
||||
expect(described_class.new(parent, user, params).execute).to eq [issue]
|
||||
context 'when filtering by type' do
|
||||
it 'only returns the specified type' do
|
||||
params = { board_id: board.id, id: list1.id, issue_types: 'incident' }
|
||||
|
||||
expect(described_class.new(parent, user, params).execute).to eq [incident]
|
||||
end
|
||||
end
|
||||
|
||||
context 'when filtering by negated type' do
|
||||
it 'only returns the specified type' do
|
||||
params = { board_id: board.id, id: list1.id, not: { issue_types: ['issue'] } }
|
||||
|
||||
expect(described_class.new(parent, user, params).execute).to contain_exactly(incident)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue