diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb index ec6adc87bf4..a23c6e18d71 100644 --- a/app/models/integrations/jira.rb +++ b/app/models/integrations/jira.rb @@ -89,7 +89,6 @@ module Integrations site: URI.join(url, '/').to_s.delete_suffix('/'), # Intended to find the root context_path: (url.path.presence || '/').delete_suffix('/'), auth_type: :basic, - read_timeout: 120, use_cookies: true, additional_cookies: ['OBBasicAuth=fromDialog'], use_ssl: url.scheme == 'https' diff --git a/config/webpack.config.js b/config/webpack.config.js index e1a48ee2b41..7f220b584a3 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -198,6 +198,7 @@ if (!IS_PRODUCTION) { Object.assign(alias, { test_fixtures: path.join(ROOT_PATH, `tmp/tests/frontend/${fixtureDir}`), + test_fixtures_static: path.join(ROOT_PATH, 'spec/frontend/fixtures/static'), test_helpers: path.join(ROOT_PATH, 'spec/frontend_integration/test_helpers'), }); } diff --git a/jest.config.base.js b/jest.config.base.js index 7cf1136a073..d1478987fb8 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -54,6 +54,7 @@ module.exports = (path, options = {}) => { '^helpers(/.*)$': '/spec/frontend/__helpers__$1', '^vendor(/.*)$': '/vendor/assets/javascripts$1', [TEST_FIXTURES_PATTERN]: '/tmp/tests/frontend/fixtures$1', + '^test_fixtures_static(/.*)$': '/spec/frontend/fixtures/static$1', '\\.(jpg|jpeg|png|svg|css)$': '/spec/frontend/__mocks__/file_mock.js', 'emojis(/.*).json': '/fixtures/emojis$1.json', '^spec/test_constants$': '/spec/frontend/__helpers__/test_constants', diff --git a/lib/gitlab/jira/http_client.rb b/lib/gitlab/jira/http_client.rb index 13d3bb2b8dc..7abfe8e38e8 100644 --- a/lib/gitlab/jira/http_client.rb +++ b/lib/gitlab/jira/http_client.rb @@ -32,7 +32,6 @@ module Gitlab request_params = { headers: headers } request_params[:body] = body if body.present? request_params[:headers][:Cookie] = get_cookies if options[:use_cookies] - request_params[:timeout] = options[:read_timeout] if options[:read_timeout] request_params[:base_uri] = uri.to_s request_params.merge!(auth_params) diff --git a/lib/gitlab/zentao/query.rb b/lib/gitlab/zentao/query.rb index 8f3f7b6d316..d40ee80939a 100644 --- a/lib/gitlab/zentao/query.rb +++ b/lib/gitlab/zentao/query.rb @@ -7,8 +7,6 @@ module Gitlab ISSUES_DEFAULT_LIMIT = 20 ISSUES_MAX_LIMIT = 50 - attr_reader :client, :params - def initialize(integration, params) @client = Client.new(integration) @params = params @@ -32,6 +30,8 @@ module Gitlab private + attr_reader :client, :params + def query_options { order: query_order, diff --git a/lib/sidebars/projects/menus/zentao_menu.rb b/lib/sidebars/projects/menus/zentao_menu.rb index fe96fb6d9f4..db9e60326a4 100644 --- a/lib/sidebars/projects/menus/zentao_menu.rb +++ b/lib/sidebars/projects/menus/zentao_menu.rb @@ -6,11 +6,7 @@ module Sidebars class ZentaoMenu < ::Sidebars::Menu override :configure_menu_items def configure_menu_items - render?.tap do |render| - break unless render - - add_items - end + render?.tap { |render| add_items if render } end override :link diff --git a/spec/frontend/deprecated_jquery_dropdown_spec.js b/spec/frontend/deprecated_jquery_dropdown_spec.js index 7e4c6e131b4..bec91fe5fc5 100644 --- a/spec/frontend/deprecated_jquery_dropdown_spec.js +++ b/spec/frontend/deprecated_jquery_dropdown_spec.js @@ -1,10 +1,9 @@ /* eslint-disable no-param-reassign */ import $ from 'jquery'; +import mockProjects from 'test_fixtures_static/projects.json'; import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown'; import '~/lib/utils/common_utils'; -// eslint-disable-next-line import/no-deprecated -import { getJSONFixture } from 'helpers/fixtures'; import { visitUrl } from '~/lib/utils/url_utility'; jest.mock('~/lib/utils/url_utility', () => ({ @@ -68,8 +67,7 @@ describe('deprecatedJQueryDropdown', () => { loadFixtures('static/deprecated_jquery_dropdown.html'); test.dropdownContainerElement = $('.dropdown.inline'); test.$dropdownMenuElement = $('.dropdown-menu', test.dropdownContainerElement); - // eslint-disable-next-line import/no-deprecated - test.projectsData = getJSONFixture('static/projects.json'); + test.projectsData = JSON.parse(JSON.stringify(mockProjects)); }); afterEach(() => { diff --git a/spec/frontend/filterable_list_spec.js b/spec/frontend/filterable_list_spec.js index 556cf6f8137..3fd5d198e3a 100644 --- a/spec/frontend/filterable_list_spec.js +++ b/spec/frontend/filterable_list_spec.js @@ -1,5 +1,4 @@ -// eslint-disable-next-line import/no-deprecated -import { getJSONFixture, setHTMLFixture } from 'helpers/fixtures'; +import { setHTMLFixture } from 'helpers/fixtures'; import FilterableList from '~/filterable_list'; describe('FilterableList', () => { @@ -15,8 +14,6 @@ describe('FilterableList', () => {
`); - // eslint-disable-next-line import/no-deprecated - getJSONFixture('static/projects.json'); form = document.querySelector('form#project-filter-form'); filter = document.querySelector('.js-projects-list-filter'); holder = document.querySelector('.js-projects-list-holder'); diff --git a/spec/frontend/projects/projects_filterable_list_spec.js b/spec/frontend/projects/projects_filterable_list_spec.js index d4dbf85b5ca..a41e8b7bc09 100644 --- a/spec/frontend/projects/projects_filterable_list_spec.js +++ b/spec/frontend/projects/projects_filterable_list_spec.js @@ -1,5 +1,4 @@ -// eslint-disable-next-line import/no-deprecated -import { getJSONFixture, setHTMLFixture } from 'helpers/fixtures'; +import { setHTMLFixture } from 'helpers/fixtures'; import ProjectsFilterableList from '~/projects/projects_filterable_list'; describe('ProjectsFilterableList', () => { @@ -15,8 +14,6 @@ describe('ProjectsFilterableList', () => {
`); - // eslint-disable-next-line import/no-deprecated - getJSONFixture('static/projects.json'); form = document.querySelector('form#project-filter-form'); filter = document.querySelector('.js-projects-list-filter'); holder = document.querySelector('.js-projects-list-holder'); diff --git a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js index 1ed7844b395..7fdacbe83a2 100644 --- a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js +++ b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js @@ -1,6 +1,5 @@ import { shallowMount, createLocalVue } from '@vue/test-utils'; -// eslint-disable-next-line import/no-deprecated -import { getJSONFixture } from 'helpers/fixtures'; +import mockProjects from 'test_fixtures_static/projects.json'; import { trimText } from 'helpers/text_helper'; import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue'; import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue'; @@ -13,8 +12,7 @@ describe('ProjectListItem component', () => { let vm; let options; - // eslint-disable-next-line import/no-deprecated - const project = getJSONFixture('static/projects.json')[0]; + const project = JSON.parse(JSON.stringify(mockProjects))[0]; beforeEach(() => { options = { diff --git a/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js b/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js index 1f97d3ff3fa..de5cee846a1 100644 --- a/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js +++ b/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js @@ -2,8 +2,7 @@ import { GlSearchBoxByType, GlInfiniteScroll } from '@gitlab/ui'; import { mount, createLocalVue } from '@vue/test-utils'; import { head } from 'lodash'; import Vue from 'vue'; -// eslint-disable-next-line import/no-deprecated -import { getJSONFixture } from 'helpers/fixtures'; +import mockProjects from 'test_fixtures_static/projects.json'; import { trimText } from 'helpers/text_helper'; import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue'; import ProjectSelector from '~/vue_shared/components/project_selector/project_selector.vue'; @@ -13,8 +12,7 @@ const localVue = createLocalVue(); describe('ProjectSelector component', () => { let wrapper; let vm; - // eslint-disable-next-line import/no-deprecated - const allProjects = getJSONFixture('static/projects.json'); + const allProjects = mockProjects; const searchResults = allProjects.slice(0, 5); let selected = []; selected = selected.concat(allProjects.slice(0, 3)).concat(allProjects.slice(5, 8)); diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb index 0321b151633..76220987f18 100644 --- a/spec/models/integrations/jira_spec.rb +++ b/spec/models/integrations/jira_spec.rb @@ -495,6 +495,18 @@ RSpec.describe Integrations::Jira do end end + describe '#client' do + it 'uses the default GitLab::HTTP timeouts' do + timeouts = Gitlab::HTTP::DEFAULT_TIMEOUT_OPTIONS + stub_request(:get, 'http://jira.example.com/foo') + + expect(Gitlab::HTTP).to receive(:httparty_perform_request) + .with(Net::HTTP::Get, '/foo', hash_including(timeouts)).and_call_original + + jira_integration.client.get('/foo') + end + end + describe '#find_issue' do let(:issue_key) { 'JIRA-123' } let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}" } @@ -503,7 +515,7 @@ RSpec.describe Integrations::Jira do stub_request(:get, issue_url).with(basic_auth: [username, password]) end - it 'call the Jira API to get the issue' do + it 'calls the Jira API to get the issue' do jira_integration.find_issue(issue_key) expect(WebMock).to have_requested(:get, issue_url) diff --git a/spec/support/database/cross-join-allowlist.yml b/spec/support/database/cross-join-allowlist.yml index 86b2ba9333c..12eb8f837f1 100644 --- a/spec/support/database/cross-join-allowlist.yml +++ b/spec/support/database/cross-join-allowlist.yml @@ -16,9 +16,11 @@ - "./spec/controllers/groups/settings/ci_cd_controller_spec.rb" - "./spec/controllers/projects/settings/ci_cd_controller_spec.rb" - "./spec/features/admin/admin_runners_spec.rb" +- "./spec/features/groups/packages_spec.rb" - "./spec/features/ide/user_opens_merge_request_spec.rb" - "./spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb" - "./spec/features/projects/infrastructure_registry_spec.rb" +- "./spec/features/projects/packages_spec.rb" - "./spec/finders/ci/pipelines_for_merge_request_finder_spec.rb" - "./spec/finders/ci/runners_finder_spec.rb" - "./spec/frontend/fixtures/runner.rb" @@ -38,6 +40,7 @@ - "./spec/presenters/packages/detail/package_presenter_spec.rb" - "./spec/requests/api/ci/runner/runners_post_spec.rb" - "./spec/requests/api/graphql/ci/runner_spec.rb" +- "./spec/requests/api/graphql/group/packages_spec.rb" - "./spec/requests/api/graphql/group_query_spec.rb" - "./spec/requests/api/graphql/packages/composer_spec.rb" - "./spec/requests/api/graphql/packages/conan_spec.rb" @@ -45,12 +48,10 @@ - "./spec/requests/api/graphql/packages/nuget_spec.rb" - "./spec/requests/api/graphql/packages/package_spec.rb" - "./spec/requests/api/graphql/packages/pypi_spec.rb" +- "./spec/requests/api/graphql/project/packages_spec.rb" - "./spec/requests/api/package_files_spec.rb" - "./spec/services/environments/stop_service_spec.rb" - "./spec/services/merge_requests/post_merge_service_spec.rb" -- "./spec/support/shared_examples/features/packages_shared_examples.rb" -- "./spec/support/shared_examples/models/concerns/limitable_shared_examples.rb" -- "./spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb" -- "./spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb" -- "./spec/support/shared_examples/requests/graphql_shared_examples.rb" -- "./spec/support/shared_examples/services/packages_shared_examples.rb" +- "./spec/services/packages/conan/create_package_file_service_spec.rb" +- "./spec/services/packages/create_package_file_service_spec.rb" +- "./spec/services/packages/generic/create_package_file_service_spec.rb" diff --git a/spec/support/database/prevent_cross_joins.rb b/spec/support/database/prevent_cross_joins.rb index f5ed2a8f22e..94d4e934797 100644 --- a/spec/support/database/prevent_cross_joins.rb +++ b/spec/support/database/prevent_cross_joins.rb @@ -90,13 +90,23 @@ ActiveRecord::Relation.prepend( ALLOW_LIST = Set.new(YAML.load_file(File.join(__dir__, 'cross-join-allowlist.yml'))).freeze +# Based on https://github.com/rspec/rspec-core/blob/d57c371ee92b16211b80ac7b0b025968438f5297/lib/rspec/core/example.rb#L96-L104, +# but with file_path +def example_relative_file_path(example) + loaded_spec_files = RSpec.configuration.loaded_spec_files + + RSpec::Core::Metadata.ascending(example.metadata) do |meta| + break meta[:file_path] if loaded_spec_files.include?(meta[:absolute_file_path]) + end +end + RSpec.configure do |config| config.include(::Database::PreventCrossJoins::SpecHelpers) config.around do |example| Thread.current[:has_cross_join_exception] = false - if ALLOW_LIST.include?(example.file_path) + if ALLOW_LIST.include?(example_relative_file_path(example)) example.run else with_cross_joins_prevented { example.run }