Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									de0c73ffc5
								
							
						
					
					
						commit
						729eabcb41
					
				|  | @ -1,5 +1,6 @@ | |||
| import { deprecatedCreateFlash as flash } from '~/flash'; | ||||
| import { s__, sprintf } from '~/locale'; | ||||
| import { differenceInMilliseconds } from '~/lib/utils/datetime_utility'; | ||||
| 
 | ||||
| // Renders math using KaTeX in any element with the
 | ||||
| // `js-render-math` class
 | ||||
|  | @ -111,7 +112,7 @@ class SafeMathRenderer { | |||
| 
 | ||||
|       // Give the browser time to reflow the svg
 | ||||
|       waitForReflow(() => { | ||||
|         const deltaTime = Date.now() - this.startTime; | ||||
|         const deltaTime = differenceInMilliseconds(this.startTime); | ||||
|         this.totalMS += deltaTime; | ||||
| 
 | ||||
|         this.renderElement(); | ||||
|  |  | |||
|  | @ -216,8 +216,9 @@ export const timeFor = (time, expiredLabel) => { | |||
|   return timeago.format(time, `${timeagoLanguageCode}-remaining`).trim(); | ||||
| }; | ||||
| 
 | ||||
| export const millisecondsPerDay = 1000 * 60 * 60 * 24; | ||||
| 
 | ||||
| export const getDayDifference = (a, b) => { | ||||
|   const millisecondsPerDay = 1000 * 60 * 60 * 24; | ||||
|   const date1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); | ||||
|   const date2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); | ||||
| 
 | ||||
|  | @ -709,7 +710,7 @@ export const dateFromParams = (year, month, day) => { | |||
|  * A utility function which computes the difference in seconds | ||||
|  * between 2 dates. | ||||
|  * | ||||
|  * @param {Date} startDate the start sate | ||||
|  * @param {Date} startDate the start date | ||||
|  * @param {Date} endDate the end date | ||||
|  * | ||||
|  * @return {Int} the difference in seconds | ||||
|  | @ -717,3 +718,18 @@ export const dateFromParams = (year, month, day) => { | |||
| export const differenceInSeconds = (startDate, endDate) => { | ||||
|   return (endDate.getTime() - startDate.getTime()) / 1000; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * A utility function which computes the difference in milliseconds | ||||
|  * between 2 dates. | ||||
|  * | ||||
|  * @param {Date|Int} startDate the start date. Can be either a date object or a unix timestamp. | ||||
|  * @param {Date|Int} endDate the end date. Can be either a date object or a unix timestamp. Defaults to now. | ||||
|  * | ||||
|  * @return {Int} the difference in milliseconds | ||||
|  */ | ||||
| export const differenceInMilliseconds = (startDate, endDate = Date.now()) => { | ||||
|   const startDateInMS = startDate instanceof Date ? startDate.getTime() : startDate; | ||||
|   const endDateInMS = endDate instanceof Date ? endDate.getTime() : endDate; | ||||
|   return endDateInMS - startDateInMS; | ||||
| }; | ||||
|  |  | |||
|  | @ -1,10 +1,12 @@ | |||
| import { differenceInMilliseconds } from '~/lib/utils/datetime_utility'; | ||||
| 
 | ||||
| export default (fn, { interval = 2000, timeout = 60000 } = {}) => { | ||||
|   const startTime = Date.now(); | ||||
| 
 | ||||
|   return new Promise((resolve, reject) => { | ||||
|     const stop = arg => (arg instanceof Error ? reject(arg) : resolve(arg)); | ||||
|     const next = () => { | ||||
|       if (timeout === 0 || Date.now() - startTime < timeout) { | ||||
|       if (timeout === 0 || differenceInMilliseconds(startTime) < timeout) { | ||||
|         setTimeout(fn.bind(null, next, stop), interval); | ||||
|       } else { | ||||
|         reject(new Error('SIMPLE_POLL_TIMEOUT')); | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| <script> | ||||
| import { get } from 'lodash'; | ||||
| import { mapActions, mapState, mapGetters } from 'vuex'; | ||||
| import { GlCard, GlDeprecatedButton, GlLoadingIcon } from '@gitlab/ui'; | ||||
| import { GlCard, GlButton, GlLoadingIcon } from '@gitlab/ui'; | ||||
| import Tracking from '~/tracking'; | ||||
| import { mapComputed } from '~/vuex_shared/bindings'; | ||||
| import { | ||||
|  | @ -14,7 +14,7 @@ import { SET_CLEANUP_POLICY_BUTTON, CLEANUP_POLICY_CARD_HEADER } from '../consta | |||
| export default { | ||||
|   components: { | ||||
|     GlCard, | ||||
|     GlDeprecatedButton, | ||||
|     GlButton, | ||||
|     GlLoadingIcon, | ||||
|     ExpirationPolicyFields, | ||||
|   }, | ||||
|  | @ -104,24 +104,25 @@ export default { | |||
|       </template> | ||||
|       <template #footer> | ||||
|         <div class="gl-display-flex gl-justify-content-end"> | ||||
|           <gl-deprecated-button | ||||
|           <gl-button | ||||
|             ref="cancel-button" | ||||
|             type="reset" | ||||
|             class="gl-mr-3 gl-display-block" | ||||
|             :disabled="isCancelButtonDisabled" | ||||
|           > | ||||
|             {{ __('Cancel') }} | ||||
|           </gl-deprecated-button> | ||||
|           <gl-deprecated-button | ||||
|           </gl-button> | ||||
|           <gl-button | ||||
|             ref="save-button" | ||||
|             type="submit" | ||||
|             :disabled="isSubmitButtonDisabled" | ||||
|             variant="success" | ||||
|             category="primary" | ||||
|             class="gl-display-flex gl-justify-content-center gl-align-items-center js-no-auto-disable" | ||||
|           > | ||||
|             {{ $options.i18n.SET_CLEANUP_POLICY_BUTTON }} | ||||
|             <gl-loading-icon v-if="isLoading" class="gl-ml-3" /> | ||||
|           </gl-deprecated-button> | ||||
|           </gl-button> | ||||
|         </div> | ||||
|       </template> | ||||
|     </gl-card> | ||||
|  |  | |||
|  | @ -2,18 +2,20 @@ | |||
| 
 | ||||
| module Mutations | ||||
|   module Ci | ||||
|     class PipelineCancel < BaseMutation | ||||
|     class PipelineCancel < Base | ||||
|       graphql_name 'PipelineCancel' | ||||
| 
 | ||||
|       authorize :update_pipeline | ||||
| 
 | ||||
|       def resolve | ||||
|         result = ::Ci::CancelUserPipelinesService.new.execute(current_user) | ||||
|       def resolve(id:) | ||||
|         pipeline = authorized_find!(id: id) | ||||
| 
 | ||||
|         { | ||||
|           success: result.success?, | ||||
|           errors: [result&.message] | ||||
|         } | ||||
|         if pipeline.cancelable? | ||||
|           pipeline.cancel_running | ||||
|           { success: true, errors: [] } | ||||
|         else | ||||
|           { success: false, errors: ['Pipeline is not cancelable'] } | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
|       = s_('AdminSettings|Try using the latest version of Integrations instead.') | ||||
|     .gl-alert-actions | ||||
|       = link_to _('Go to Integrations'), integrations_admin_application_settings_path, class: 'btn btn-info gl-alert-action gl-button' | ||||
|       = link_to _('Learn more'), help_page_path('user/admin_area/settings/project_integration_management'), class: 'btn gl-alert-action btn-secondary gl-button', target: '_blank', rel: 'noopener noreferrer' | ||||
|       = link_to _('Learn more'), help_page_path('user/admin_area/settings/project_integration_management'), class: 'btn btn-default gl-alert-action btn-secondary gl-button', target: '_blank', rel: 'noopener noreferrer' | ||||
| 
 | ||||
| %h3.page-title Service templates | ||||
| %p.light= s_('AdminSettings|Service template allows you to set default values for integrations') | ||||
|  |  | |||
|  | @ -135,10 +135,12 @@ | |||
|           %img.modal-profile-crop-image{ alt: s_("Profiles|Avatar cropper") } | ||||
|         .crop-controls | ||||
|           .btn-group | ||||
|             %button.btn.btn-primary{ data: { method: 'zoom', option: '0.1' } } | ||||
|               %span.fa.fa-search-plus | ||||
|             %button.btn.btn-primary{ data: { method: 'zoom', option: '-0.1' } } | ||||
|               %span.fa.fa-search-minus | ||||
|               %span | ||||
|                 = sprite_icon('search-minus') | ||||
|             %button.btn.btn-primary{ data: { method: 'zoom', option: '0.1' } } | ||||
|               %span | ||||
|                 = sprite_icon('search-plus') | ||||
|       .modal-footer | ||||
|         %button.btn.btn-primary.js-upload-user-avatar{ type: 'button' } | ||||
|           = s_("Profiles|Set new profile picture") | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Replace fa-search-* icons with GitLab SVG icons | ||||
| merge_request: 40580 | ||||
| author: | ||||
| type: changed | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Stricter default timeouts for outgoing HTTP requests | ||||
| merge_request: 39188 | ||||
| author: | ||||
| type: other | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Create IssueLink for Vulnerabilities that do not have them | ||||
| merge_request: 40726 | ||||
| author: | ||||
| type: fixed | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Add Conan lock file support to Dependency Scanning | ||||
| merge_request: 39811 | ||||
| author: | ||||
| type: added | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Add issue importers usage pings (FogBugz, Phabricator, Jira) | ||||
| merge_request: 40382 | ||||
| author: | ||||
| type: added | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: 'GraphQL: Updates PipelineCancel mutation' | ||||
| merge_request: 40764 | ||||
| author: | ||||
| type: changed | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Migrating setup policy button in registry settings | ||||
| merge_request: 40668 | ||||
| author: | ||||
| type: changed | ||||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Add warning to stop Puma and Sidekiq when restoring from backup | ||||
| merge_request: 40791 | ||||
| author: | ||||
| type: other | ||||
|  | @ -0,0 +1,48 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class CreateMissingVulnerabilitiesIssueLinks < ActiveRecord::Migration[6.0] | ||||
|   class VulnerabilitiesFeedback < ActiveRecord::Base | ||||
|     include EachBatch | ||||
|     self.table_name = 'vulnerability_feedback' | ||||
|   end | ||||
| 
 | ||||
|   class VulnerabilitiesIssueLink < ActiveRecord::Base | ||||
|     self.table_name = 'vulnerability_issue_links' | ||||
|     LINK_TYPE_CREATED = 2 | ||||
|   end | ||||
| 
 | ||||
|   include Gitlab::Database::MigrationHelpers | ||||
| 
 | ||||
|   DOWNTIME = false | ||||
| 
 | ||||
|   disable_ddl_transaction! | ||||
| 
 | ||||
|   def up | ||||
|     VulnerabilitiesFeedback.where('issue_id IS NOT NULL').each_batch do |relation| | ||||
|       timestamp = Time.now | ||||
|       issue_links = relation | ||||
|         .joins("JOIN vulnerability_occurrences vo ON vo.project_id = vulnerability_feedback.project_id AND vo.report_type = vulnerability_feedback.category AND encode(vo.project_fingerprint, 'hex') = vulnerability_feedback.project_fingerprint") | ||||
|         .where('vo.vulnerability_id IS NOT NULL') | ||||
|         .pluck(:vulnerability_id, :issue_id) | ||||
|         .map do |v_id, i_id| | ||||
|           { | ||||
|             vulnerability_id: v_id, | ||||
|             issue_id: i_id, | ||||
|             link_type: VulnerabilitiesIssueLink::LINK_TYPE_CREATED, | ||||
|             created_at: timestamp, | ||||
|             updated_at: timestamp | ||||
|           } | ||||
|         end | ||||
| 
 | ||||
|       next if issue_links.empty? | ||||
| 
 | ||||
|       VulnerabilitiesIssueLink.insert_all( | ||||
|         issue_links, | ||||
|         returning: false | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def down | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,30 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class UpdateLocationFingerprintForCsFindings < ActiveRecord::Migration[6.0] | ||||
|   include Gitlab::Database::MigrationHelpers | ||||
| 
 | ||||
|   DOWNTIME = false | ||||
| 
 | ||||
|   disable_ddl_transaction! | ||||
| 
 | ||||
|   BATCH_SIZE = 1_000 | ||||
|   INTERVAL = 2.minutes | ||||
| 
 | ||||
|   # 815_565 records | ||||
|   def up | ||||
|     return unless Gitlab.ee? | ||||
| 
 | ||||
|     migration = Gitlab::BackgroundMigration::UpdateLocationFingerprintForCsFindings | ||||
|     migration_name = migration.to_s.demodulize | ||||
|     relation = migration::Finding.container_scanning | ||||
|     queue_background_migration_jobs_by_range_at_intervals(relation, | ||||
|                                                           migration_name, | ||||
|                                                           INTERVAL, | ||||
|                                                           batch_size: BATCH_SIZE) | ||||
|   end | ||||
| 
 | ||||
|   def down | ||||
|     # no-op | ||||
|     # intentionally blank | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1 @@ | |||
| e8fc0809b5bd3248dc625602deeaaef16e2db6b33d8eaf51fdcc1c67dee49e17 | ||||
|  | @ -0,0 +1 @@ | |||
| e24f8495b7458ce57e148017ef6cae901e7f3997fca247afeff524a43e739431 | ||||
|  | @ -10656,6 +10656,11 @@ input PipelineCancelInput { | |||
|   A unique identifier for the client performing the mutation. | ||||
|   """ | ||||
|   clientMutationId: String | ||||
| 
 | ||||
|   """ | ||||
|   The id of the pipeline to mutate | ||||
|   """ | ||||
|   id: CiPipelineID! | ||||
| } | ||||
| 
 | ||||
| """ | ||||
|  |  | |||
|  | @ -31967,6 +31967,20 @@ | |||
|           "description": "Autogenerated input type of PipelineCancel", | ||||
|           "fields": null, | ||||
|           "inputFields": [ | ||||
|             { | ||||
|               "name": "id", | ||||
|               "description": "The id of the pipeline to mutate", | ||||
|               "type": { | ||||
|                 "kind": "NON_NULL", | ||||
|                 "name": null, | ||||
|                 "ofType": { | ||||
|                   "kind": "SCALAR", | ||||
|                   "name": "CiPipelineID", | ||||
|                   "ofType": null | ||||
|                 } | ||||
|               }, | ||||
|               "defaultValue": null | ||||
|             }, | ||||
|             { | ||||
|               "name": "clientMutationId", | ||||
|               "description": "A unique identifier for the client performing the mutation.", | ||||
|  |  | |||
|  | @ -152,17 +152,20 @@ The CI/CD YAML configuration example above works for testing against static envi | |||
| but it can be extended to work with [review apps](../../../ci/review_apps) or | ||||
| [dynamic environments](../../../ci/environments) with a few extra steps. | ||||
| 
 | ||||
| The best approach is to capture the dynamic URL into a custom environment variable that | ||||
| is then [inherited](../../../ci/variables/README.md#inherit-environment-variables) | ||||
| by the `load_performance` job. The k6 test script to be run should then be configured to | ||||
| use that environment URL, such as: ``http.get(`${__ENV.ENVIRONMENT_URL`})``. | ||||
| The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/env-file/) | ||||
| as a job artifact to be shared, then use a custom environment variable we've provided named `K6_DOCKER_OPTIONS` | ||||
| to configure the k6 Docker container to use the file. With this, k6 can then use any | ||||
| environment variables from the `.env` file in scripts using standard JavaScript, | ||||
| such as: ``http.get(`${__ENV.ENVIRONMENT_URL`})``. | ||||
| 
 | ||||
| For example: | ||||
| 
 | ||||
| 1. In the `review` job: | ||||
|     1. Capture the dynamic URL and save it into a `.env` file, e.g. `echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env`. | ||||
|     1. Set the `.env` file to be an [`artifacts:reports:dotenv` report](../../../ci/variables/README.md#inherit-environment-variables). | ||||
| 1. Set the `load_performance` job to depend on the review job, so it inherits the environment variable. | ||||
|    1. Capture the dynamic URL and save it into a `.env` file, e.g. `echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env`. | ||||
|    1. Set the `.env` file to be a [job artifact](../../../ci/pipelines/job_artifacts.md#job-artifacts). | ||||
| 1. In the `load_performance` job: | ||||
|    1. Set it to depend on the review job, so it inherits the env file. | ||||
|    1. Set the `K6_DOCKER_OPTIONS` variable with the [Docker cli option for env files](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file), for example `--env-file review.env`. | ||||
| 1. Configure the k6 test script to use the environment variable in it's steps. | ||||
| 
 | ||||
| Your `.gitlab-ci.yml` file might be similar to: | ||||
|  | @ -184,15 +187,16 @@ review: | |||
|     - run_deploy_script | ||||
|     - echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env | ||||
|   artifacts: | ||||
|     reports: | ||||
|       dotenv: | ||||
|         review.env | ||||
|     paths: | ||||
|       - review.env | ||||
|   rules: | ||||
|     - if: '$CI_COMMIT_BRANCH'  # Modify to match your pipeline rules, or use `only/except` if needed. | ||||
| 
 | ||||
| load_performance: | ||||
|   dependencies: | ||||
|     - review | ||||
|   variables: | ||||
|     K6_DOCKER_OPTIONS: '--env-file review.env' | ||||
|   rules: | ||||
|     - if: '$CI_COMMIT_BRANCH'  # Modify to match your pipeline rules, or use `only/except` if needed. | ||||
| ``` | ||||
|  |  | |||
|  | @ -0,0 +1,13 @@ | |||
| # frozen_string_literal: true | ||||
| # rubocop:disable Style/Documentation | ||||
| 
 | ||||
| module Gitlab | ||||
|   module BackgroundMigration | ||||
|     class UpdateLocationFingerprintForCsFindings | ||||
|       def perform(start_id, stop_id) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| Gitlab::BackgroundMigration::UpdateLocationFingerprintForCsFindings.prepend_if_ee('EE::Gitlab::BackgroundMigration::UpdateLocationFingerprintForCsFindings') | ||||
|  | @ -8,6 +8,7 @@ load_performance: | |||
|     K6_VERSION: 0.27.0 | ||||
|     K6_TEST_FILE: github.com/loadimpact/k6/samples/http_get.js | ||||
|     K6_OPTIONS: '' | ||||
|     K6_DOCKER_OPTIONS: '' | ||||
|   services: | ||||
|     - docker:19.03.11-dind | ||||
|   script: | ||||
|  | @ -17,7 +18,7 @@ load_performance: | |||
|           export DOCKER_HOST='tcp://localhost:2375' | ||||
|         fi | ||||
|       fi | ||||
|     - docker run --rm -v "$(pwd)":/k6 -w /k6 $K6_IMAGE:$K6_VERSION run $K6_TEST_FILE --summary-export=load-performance.json $K6_OPTIONS | ||||
|     - docker run --rm -v "$(pwd)":/k6 -w /k6 $K6_DOCKER_OPTIONS $K6_IMAGE:$K6_VERSION run $K6_TEST_FILE --summary-export=load-performance.json $K6_OPTIONS | ||||
|   artifacts: | ||||
|     reports: | ||||
|       load_performance: load-performance.json | ||||
|  |  | |||
|  | @ -114,6 +114,7 @@ gemnasium-dependency_scanning: | |||
|         - '{package-lock.json,*/package-lock.json,*/*/package-lock.json}' | ||||
|         - '{yarn.lock,*/yarn.lock,*/*/yarn.lock}' | ||||
|         - '{packages.lock.json,*/packages.lock.json,*/*/packages.lock.json}' | ||||
|         - '{conan.lock,*/conan.lock,*/*/conan.lock}' | ||||
| 
 | ||||
| gemnasium-maven-dependency_scanning: | ||||
|   extends: .ds-analyzer | ||||
|  |  | |||
|  | @ -14,10 +14,11 @@ load_performance: | |||
|     K6_VERSION: 0.27.0 | ||||
|     K6_TEST_FILE: github.com/loadimpact/k6/samples/http_get.js | ||||
|     K6_OPTIONS: '' | ||||
|     K6_DOCKER_OPTIONS: '' | ||||
|   services: | ||||
|     - docker:stable-dind | ||||
|   script: | ||||
|     - docker run --rm -v "$(pwd)":/k6 -w /k6 $K6_IMAGE:$K6_VERSION run $K6_TEST_FILE --summary-export=load-performance.json $K6_OPTIONS | ||||
|     - docker run --rm -v "$(pwd)":/k6 -w /k6 $K6_DOCKER_OPTIONS $K6_IMAGE:$K6_VERSION run $K6_TEST_FILE --summary-export=load-performance.json $K6_OPTIONS | ||||
|   artifacts: | ||||
|     reports: | ||||
|       load_performance: load-performance.json | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ module Gitlab | |||
|     def self.perform_request(http_method, path, options, &block) | ||||
|       log_info = options.delete(:extra_log_info) | ||||
|       options_with_timeouts = | ||||
|         if !options.has_key?(:timeout) && Feature.enabled?(:http_default_timeouts) | ||||
|         if !options.has_key?(:timeout) | ||||
|           options.with_defaults(DEFAULT_TIMEOUT_OPTIONS) | ||||
|         else | ||||
|           options | ||||
|  |  | |||
|  | @ -524,6 +524,11 @@ module Gitlab | |||
|             gitea: projects_imported_count('gitea', time_period), | ||||
|             git: projects_imported_count('git', time_period), | ||||
|             manifest: projects_imported_count('manifest', time_period) | ||||
|           }, | ||||
|           issues_imported: { | ||||
|             jira: distinct_count(::JiraImportState.where(time_period), :user_id), | ||||
|             fogbugz: projects_imported_count('fogbugz', time_period), | ||||
|             phabricator: projects_imported_count('phabricator', time_period) | ||||
|           } | ||||
|         } | ||||
|       end | ||||
|  |  | |||
|  | @ -16,6 +16,11 @@ | |||
|   category: compliance | ||||
|   redis_slot: compliance | ||||
|   aggregation: weekly | ||||
| - name: i_compliance_audit_events_api | ||||
|   category: compliance | ||||
|   redis_slot: compliance | ||||
|   expiry: 42 | ||||
|   aggregation: weekly | ||||
| # Analytics category | ||||
| - name: g_analytics_contribution | ||||
|   category: analytics | ||||
|  |  | |||
|  | @ -47,6 +47,11 @@ namespace :gitlab do | |||
|         begin | ||||
|           unless ENV['force'] == 'yes' | ||||
|             warning = <<-MSG.strip_heredoc | ||||
|               Be sure to stop Puma, Sidekiq, and any other process that | ||||
|               connects to the database before proceeding. For Omnibus | ||||
|               installs, see the following link for more information: | ||||
|               https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-gitlab-installations | ||||
| 
 | ||||
|               Before restoring the database, we will remove all existing | ||||
|               tables to avoid future upgrade problems. Be aware that if you have | ||||
|               custom tables in the GitLab database these tables and all data will be | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ module QA | |||
| 
 | ||||
|       attr_reader :api_resource, :api_response | ||||
|       attr_writer :api_client | ||||
|       attr_accessor :user | ||||
|       attr_accessor :api_user | ||||
| 
 | ||||
|       def api_support? | ||||
|         respond_to?(:api_get_path) && | ||||
|  | @ -120,7 +120,7 @@ module QA | |||
| 
 | ||||
|       def api_client | ||||
|         @api_client ||= begin | ||||
|           Runtime::API::Client.new(:gitlab, is_new_session: !current_url.start_with?('http'), user: user) | ||||
|           Runtime::API::Client.new(:gitlab, is_new_session: !current_url.start_with?('http'), user: api_user) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|  |  | |||
|  | @ -73,7 +73,7 @@ module QA | |||
| 
 | ||||
|       def api_post_body | ||||
|         { | ||||
|           namespace: user.username, | ||||
|           namespace_path: user.username, | ||||
|           name: name, | ||||
|           path: name | ||||
|         } | ||||
|  |  | |||
|  | @ -9,7 +9,6 @@ module QA | |||
| 
 | ||||
|       attribute :sandbox do | ||||
|         Sandbox.fabricate_via_api! do |sandbox| | ||||
|           sandbox.user = user | ||||
|           sandbox.api_client = api_client | ||||
|         end | ||||
|       end | ||||
|  |  | |||
|  | @ -148,7 +148,7 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       def fetching_own_data? | ||||
|         user&.username == username || Runtime::User.username == username | ||||
|         api_user&.username == username || Runtime::User.username == username | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ module QA | |||
|       let(:api_client) { Runtime::API::Client.new(:gitlab, ip_limits: true) } | ||||
|       let(:request) { Runtime::API::Request.new(api_client, '/users') } | ||||
| 
 | ||||
|       it 'GET /users', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/441' do | ||||
|       it 'GET /users', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/441' do | ||||
|         5.times do | ||||
|           get request.url | ||||
|           expect_status(200) | ||||
|  |  | |||
|  | @ -8,13 +8,13 @@ module QA | |||
|       let(:api_client) { Runtime::API::Client.new(:gitlab) } | ||||
|       let(:request) { Runtime::API::Request.new(api_client, '/users') } | ||||
| 
 | ||||
|       it 'GET /users', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/460' do | ||||
|       it 'GET /users', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/460' do | ||||
|         get request.url | ||||
| 
 | ||||
|         expect_status(200) | ||||
|       end | ||||
| 
 | ||||
|       it 'GET /users/:username with a valid username', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/480' do | ||||
|       it 'GET /users/:username with a valid username', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/480' do | ||||
|         get request.url, { params: { username: Runtime::User.username } } | ||||
| 
 | ||||
|         expect_status(200) | ||||
|  | @ -23,7 +23,7 @@ module QA | |||
|         ) | ||||
|       end | ||||
| 
 | ||||
|       it 'GET /users/:username with an invalid username', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/462' do | ||||
|       it 'GET /users/:username with an invalid username', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/462' do | ||||
|         get request.url, { params: { username: SecureRandom.hex(10) } } | ||||
| 
 | ||||
|         expect_status(200) | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ module QA | |||
|         push_commit('Initial commit') | ||||
|       end | ||||
| 
 | ||||
|       it 'closes via pushing a commit', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/423' do | ||||
|       it 'closes via pushing a commit', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/423' do | ||||
|         push_commit("Closes ##{issue_id}", false) | ||||
| 
 | ||||
|         Support::Retrier.retry_until(max_duration: 10, sleep_interval: 1) do | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ module QA | |||
|         praefect_manager.reset_primary_to_original | ||||
|       end | ||||
| 
 | ||||
|       it 'automatically fails over', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/976' do | ||||
|       it 'automatically fails over', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/976' do | ||||
|         # Create a new project with a commit and wait for it to replicate | ||||
|         Resource::Repository::ProjectPush.fabricate! do |push| | ||||
|           push.project = project | ||||
|  | @ -66,7 +66,7 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       context 'when recovering from dataloss after failover' do | ||||
|         it 'allows reconciliation', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238187', type: :stale }, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/977' do | ||||
|         it 'allows reconciliation', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238187', type: :stale }, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/977' do | ||||
|           # Start the old primary node again | ||||
|           praefect_manager.start_primary_node | ||||
|           praefect_manager.wait_for_health_check_current_primary_node | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ module QA | |||
|           praefect_manager.reset_primary_to_original | ||||
|         end | ||||
| 
 | ||||
|         it 'recovers from dataloss', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238186', type: :investigating }, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/978' do | ||||
|         it 'recovers from dataloss', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238186', type: :investigating }, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/978' do | ||||
|           # Create a new project with a commit and wait for it to replicate | ||||
|           praefect_manager.wait_for_replication(project.id) | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when moving from one Gitaly storage to another', :orchestrated, :repository_storage, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/973' do | ||||
|       context 'when moving from one Gitaly storage to another', :orchestrated, :repository_storage, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/973' do | ||||
|         let(:source_storage) { { type: :gitaly, name: 'default' } } | ||||
|         let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.additional_repository_storage } } | ||||
| 
 | ||||
|  | @ -43,7 +43,7 @@ module QA | |||
|       # Note: This test doesn't have the :orchestrated tag because it runs in the Test::Integration::Praefect | ||||
|       # scenario with other tests that aren't considered orchestrated. | ||||
|       # It also runs on staging using nfs-file07 as non-cluster storage and nfs-file22 as cluster/praefect storage | ||||
|       context 'when moving from Gitaly to Gitaly Cluster', :requires_praefect, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/974' do | ||||
|       context 'when moving from Gitaly to Gitaly Cluster', :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/974' do | ||||
|         let(:source_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } } | ||||
|         let(:destination_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } } | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ module QA | |||
|           Runtime::Feature.disable_and_verify('gitaly_distributed_reads') | ||||
|         end | ||||
| 
 | ||||
|         it 'reads from each node', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/979' do | ||||
|         it 'reads from each node', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/979' do | ||||
|           pre_read_data = praefect_manager.query_read_distribution | ||||
| 
 | ||||
|           wait_for_reads_to_increase(project, number_of_reads_per_loop, pre_read_data) | ||||
|  | @ -53,7 +53,7 @@ module QA | |||
|             praefect_manager.wait_for_reliable_connection | ||||
|           end | ||||
| 
 | ||||
|           it 'does not read from the unhealthy node', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/980' do | ||||
|           it 'does not read from the unhealthy node', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/980' do | ||||
|             pre_read_data = praefect_manager.query_read_distribution | ||||
| 
 | ||||
|             read_from_project(project, number_of_reads_per_loop * 10) | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ module QA | |||
|         praefect_manager.clear_replication_queue | ||||
|       end | ||||
| 
 | ||||
|       it 'allows replication of different repository after interruption', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/975' do | ||||
|       it 'allows replication of different repository after interruption', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/975' do | ||||
|         # We want to fill the replication queue with 10 `in_progress` jobs, | ||||
|         # while a lock has been acquired, which is when the problem occurred | ||||
|         # as reported in https://gitlab.com/gitlab-org/gitaly/-/issues/2801 | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ module QA | |||
|     let(:project_name) { "api-basics-#{SecureRandom.hex(8)}" } | ||||
|     let(:sanitized_project_path) { CGI.escape("#{Runtime::User.username}/#{project_name}") } | ||||
| 
 | ||||
|     it 'user creates a project with a file and deletes them afterwards', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/420' do | ||||
|     it 'user creates a project with a file and deletes them afterwards', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/420' do | ||||
|       create_project_request = Runtime::API::Request.new(@api_client, '/projects') | ||||
|       post create_project_request.url, path: project_name, name: project_name | ||||
| 
 | ||||
|  | @ -76,7 +76,7 @@ module QA | |||
|         SVG | ||||
|       end | ||||
| 
 | ||||
|       it 'sets no-cache headers as expected', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/421' do | ||||
|       it 'sets no-cache headers as expected', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/421' do | ||||
|         create_project_request = Runtime::API::Request.new(@api_client, '/projects') | ||||
|         post create_project_request.url, path: project_name, name: project_name | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'download archives of each user project then check they are different', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/427' do | ||||
|       it 'download archives of each user project then check they are different', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/427' do | ||||
|         archive_checksums = {} | ||||
| 
 | ||||
|         users.each do |user_key, user_info| | ||||
|  | @ -51,7 +51,6 @@ module QA | |||
|           project.add_name_uuid = false | ||||
|           project.name = project_name | ||||
|           project.path_with_namespace = "#{user.username}/#{project_name}" | ||||
|           project.user = user | ||||
|           project.api_client = api_client | ||||
|         end | ||||
| 
 | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       context 'when deleted via API' do | ||||
|         it 'is not found', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/931' do | ||||
|         it 'is not found', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/931' do | ||||
|           delete(pipeline_data_request.url) | ||||
|           expect(JSON.parse(get(pipeline_data_request.url))['message'].downcase).to have_content('404 not found') | ||||
|         end | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Configure', :orchestrated, :mattermost do | ||||
|     describe 'Mattermost support' do | ||||
|       it 'user creates a group with a mattermost team', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/665' do | ||||
|       it 'user creates a group with a mattermost team', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/665' do | ||||
|         Flow::Login.sign_in | ||||
|         Page::Main::Menu.perform(&:go_to_groups) | ||||
| 
 | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'user transfers a project between groups', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/406' do | ||||
|       it 'user transfers a project between groups', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/406' do | ||||
|         Page::File::Show.perform(&:go_to_general_settings) | ||||
| 
 | ||||
|         Page::Project::Settings::Main.perform(&:expand_advanced_settings) | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ module QA | |||
|         group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER) | ||||
|       end | ||||
| 
 | ||||
|       it 'allows using 2FA recovery code once only', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/972' do | ||||
|       it 'allows using 2FA recovery code once only', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/972' do | ||||
|         recovery_code = enable_2fa_for_user_and_fetch_recovery_code(developer_user) | ||||
| 
 | ||||
|         Flow::Login.sign_in(as: developer_user, skip_page_validation: true) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage', :smoke do | ||||
|     describe 'basic user login' do | ||||
|       it 'user logs in using basic credentials and logs out', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/424' do | ||||
|       it 'user logs in using basic credentials and logs out', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/424' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Page::Main::Menu.perform do |menu| | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ module QA | |||
|         group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER) | ||||
|       end | ||||
| 
 | ||||
|       it 'allows enforcing 2FA via UI and logging in with 2FA', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/898' do | ||||
|       it 'allows enforcing 2FA via UI and logging in with 2FA', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/898' do | ||||
|         enforce_two_factor_authentication_on_group(group) | ||||
| 
 | ||||
|         enable_two_factor_authentication_for_user(developer_user) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage', :orchestrated, :ldap_no_tls, :ldap_tls do | ||||
|     describe 'LDAP login' do | ||||
|       it 'user logs into GitLab using LDAP credentials', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/668' do | ||||
|       it 'user logs into GitLab using LDAP credentials', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/668' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Page::Main::Menu.perform do |menu| | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage', :orchestrated, :mattermost do | ||||
|     describe 'Mattermost login' do | ||||
|       it 'user logs into Mattermost using GitLab OAuth', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/666' do | ||||
|       it 'user logs into Mattermost using GitLab OAuth', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/666' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Support::Retrier.retry_on_exception do | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage', :orchestrated, :instance_saml do | ||||
|     describe 'Instance wide SAML SSO' do | ||||
|       it 'User logs in to gitlab with SAML SSO', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/671' do | ||||
|       it 'User logs in to gitlab with SAML SSO', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/671' do | ||||
|         Runtime::Browser.visit(:gitlab, Page::Main::Login) | ||||
| 
 | ||||
|         Page::Main::Login.perform(&:sign_in_with_saml) | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ module QA | |||
|   end | ||||
| 
 | ||||
|   RSpec.describe 'Manage', :skip_signup_disabled do | ||||
|     describe 'standard', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/936' do | ||||
|     describe 'standard', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/936' do | ||||
|       it_behaves_like 'registration and login' | ||||
| 
 | ||||
|       context 'when user account is deleted', :requires_admin do | ||||
|  | @ -36,7 +36,7 @@ module QA | |||
|           end | ||||
|         end | ||||
| 
 | ||||
|         it 'allows recreating with same credentials', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/937' do | ||||
|         it 'allows recreating with same credentials', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/937' do | ||||
|           expect(Page::Main::Menu.perform(&:signed_in?)).to be_falsy | ||||
| 
 | ||||
|           Flow::Login.sign_in(as: user, skip_page_validation: true) | ||||
|  | @ -64,7 +64,7 @@ module QA | |||
|   end | ||||
| 
 | ||||
|   RSpec.describe 'Manage', :orchestrated, :ldap_no_tls, :skip_signup_disabled do | ||||
|     describe 'while LDAP is enabled', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/935' do | ||||
|     describe 'while LDAP is enabled', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/935' do | ||||
|       it_behaves_like 'registration and login' | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage' do | ||||
|     describe 'Add project member' do | ||||
|       it 'user adds project member', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/482' do | ||||
|       it 'user adds project member', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/482' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage', :smoke do | ||||
|     describe 'Project creation' do | ||||
|       it 'user creates a new project', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/429' do | ||||
|       it 'user creates a new project', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/429' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         created_project = Resource::Project.fabricate_via_browser_ui! do |project| | ||||
|  |  | |||
|  | @ -41,13 +41,13 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when logged in as a new user', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/465' do | ||||
|       context 'when logged in as a new user', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/465' do | ||||
|         it_behaves_like 'loads all images' do | ||||
|           let(:new_user) { @new_user } | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when logged in as a new admin', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/463' do | ||||
|       context 'when logged in as a new admin', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/463' do | ||||
|         it_behaves_like 'loads all images' do | ||||
|           let(:new_user) { @new_admin } | ||||
|         end | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ module QA | |||
|         Page::Main::Menu.perform(&:sign_out_if_signed_in) | ||||
|       end | ||||
| 
 | ||||
|       it 'user imports a GitHub repo', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/385' do | ||||
|       it 'user imports a GitHub repo', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/385' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         imported_project # import the project | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Manage' do | ||||
|     describe 'Project activity' do | ||||
|       it 'user creates an event in the activity page upon Git push', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/407' do | ||||
|       it 'user creates an event in the activity page upon Git push', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/407' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Resource::Repository::ProjectPush.fabricate! do |push| | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'is received by a user for project invitation', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/676' do | ||||
|       it 'is received by a user for project invitation', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/676' do | ||||
|         Flow::Project.add_member(project: project, username: user.username) | ||||
| 
 | ||||
|         expect(page).to have_content(/@#{user.username}(\n| )?Given access/) | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ module QA | |||
|         end.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'mentions a user in a comment', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/452' do | ||||
|       it 'mentions a user in a comment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/452' do | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|           show.select_all_activities_filter | ||||
|           show.comment("cc-ing you here @#{user.username}") | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'collapses and expands reply for comments in an issue', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/434' do | ||||
|       it 'collapses and expands reply for comments in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/434' do | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|           one_reply = "1 reply" | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ module QA | |||
|         Resource::Issue.fabricate_via_api!.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'comments on an issue and edits the comment', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/450' do | ||||
|       it 'comments on an issue and edits the comment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/450' do | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|           first_version_of_comment = 'First version of the comment' | ||||
|           second_version_of_comment = 'Second version of the comment' | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'creates an issue', :reliable, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/432' do | ||||
|       it 'creates an issue', :reliable, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/432' do | ||||
|         issue = Resource::Issue.fabricate_via_browser_ui! | ||||
| 
 | ||||
|         Page::Project::Menu.perform(&:click_issues) | ||||
|  | @ -19,7 +19,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'closes an issue', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/225303', type: :bug }, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/852' do | ||||
|       it 'closes an issue', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/225303', type: :bug }, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/852' do | ||||
|         closed_issue.visit! | ||||
| 
 | ||||
|         Page::Project::Issue::Show.perform do |issue_page| | ||||
|  | @ -48,7 +48,7 @@ module QA | |||
|           Resource::Issue.fabricate_via_api!.visit! | ||||
|         end | ||||
| 
 | ||||
|         it 'comments on an issue with an attachment', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/393' do | ||||
|         it 'comments on an issue with an attachment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/393' do | ||||
|           Page::Project::Issue::Show.perform do |show| | ||||
|             show.comment('See attached banana for scale', attachment: file_to_attach) | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ module QA | |||
|         Page::Project::Menu.perform(&:click_issues) | ||||
|       end | ||||
| 
 | ||||
|       it 'successfully exports issues list as CSV', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/764' do | ||||
|       it 'successfully exports issues list as CSV', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/764' do | ||||
|         Page::Project::Issue::Index.perform do |index| | ||||
|           index.click_export_as_csv_button | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ module QA | |||
|         Resource::Issue.fabricate_via_api!.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'filters comments and activities in an issue', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/425' do | ||||
|       it 'filters comments and activities in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/425' do | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|           my_own_comment = "My own comment" | ||||
|           made_the_issue_confidential = "made the issue confidential" | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ module QA | |||
|         end.project.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'shows issue suggestions when creating a new issue', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/412' do | ||||
|       it 'shows issue suggestions when creating a new issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/412' do | ||||
|         Page::Project::Show.perform(&:go_to_new_issue) | ||||
|         Page::Project::Issue::New.perform do |new_page| | ||||
|           new_page.fill_title("issue") | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'imports issues from Jira', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/896' do | ||||
|       it 'imports issues from Jira', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/896' do | ||||
|         set_up_jira_integration | ||||
|         import_jira_issues | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ module QA | |||
|         end.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'mentions another user in an issue', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/446' do | ||||
|       it 'mentions another user in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/446' do | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|           at_username = "@#{user.username}" | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'focuses on issue board', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/820' do | ||||
|       it 'focuses on issue board', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/820' do | ||||
|         project.visit! | ||||
| 
 | ||||
|         Page::Project::Menu.perform(&:go_to_boards) | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a group milestone', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/922' do | ||||
|       it 'creates a group milestone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/922' do | ||||
|         group_milestone = Resource::GroupMilestone.fabricate_via_browser_ui! do |milestone| | ||||
|           milestone.title = title | ||||
|           milestone.description = description | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a project milestone', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/901' do | ||||
|       it 'creates a project milestone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/901' do | ||||
|         project_milestone = Resource::ProjectMilestone.fabricate_via_browser_ui! do |milestone| | ||||
|           milestone.title = title | ||||
|           milestone.description = description | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'relates and unrelates one issue to/from another', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/541' do | ||||
|       it 'relates and unrelates one issue to/from another', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/541' do | ||||
|         issue_1.visit! | ||||
| 
 | ||||
|         Page::Project::Issue::Show.perform do |show| | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'user adds a design and annotates it', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/955' do | ||||
|       it 'user adds a design and annotates it', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/955' do | ||||
|         issue.visit! | ||||
| 
 | ||||
|         Page::Project::Issue::Show.perform do |issue| | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'closes an issue via pushing a commit', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/827' do | ||||
|       it 'closes an issue via pushing a commit', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/827' do | ||||
|         issue_key = Vendor::Jira::JiraAPI.perform do |jira_api| | ||||
|           jira_api.create_issue(jira_project_key) | ||||
|         end | ||||
|  | @ -51,7 +51,7 @@ module QA | |||
|         expect_issue_done(issue_key) | ||||
|       end | ||||
| 
 | ||||
|       it 'closes an issue via a merge request', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/828' do | ||||
|       it 'closes an issue via a merge request', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/828' do | ||||
|         issue_key = Vendor::Jira::JiraAPI.perform do |jira_api| | ||||
|           jira_api.create_issue(jira_project_key) | ||||
|         end | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a basic merge request', :smoke, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/409' do | ||||
|       it 'creates a basic merge request', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/409' do | ||||
|         Resource::MergeRequest.fabricate_via_browser_ui! do |merge_request| | ||||
|           merge_request.project = project | ||||
|           merge_request.title = merge_request_title | ||||
|  | @ -29,7 +29,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a merge request with a milestone and label', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/514' do | ||||
|       it 'creates a merge request with a milestone and label', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/514' do | ||||
|         gitlab_account_username = "@#{Runtime::User.username}" | ||||
| 
 | ||||
|         milestone = Resource::ProjectMilestone.fabricate_via_api! do |milestone| | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'can merge feature branch fork to mainline', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/928' do | ||||
|       it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/928' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         merge_request.visit! | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/30226', type: :bug } do | ||||
|     describe 'Merge request rebasing' do | ||||
|       it 'user rebases source branch of merge request', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/398' do | ||||
|       it 'user rebases source branch of merge request', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/398' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         project = Resource::Project.fabricate_via_api! do |project| | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ module QA | |||
|         merge_request.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'user squashes commits while merging', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/418' do | ||||
|       it 'user squashes commits while merging', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/418' do | ||||
|         Page::MergeRequest::Show.perform do |merge_request_page| | ||||
|           merge_request_page.retry_on_exception(reload: true) do | ||||
|             expect(merge_request_page).to have_text('to be squashed') | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ module QA | |||
|         merge_request.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'views the merge request email patches', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/416' do | ||||
|       it 'views the merge request email patches', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/416' do | ||||
|         Page::MergeRequest::Show.perform(&:view_email_patches) | ||||
| 
 | ||||
|         expect(page.text).to start_with('From') | ||||
|  | @ -23,7 +23,7 @@ module QA | |||
|         expect(page).to have_content("diff --git a/#{merge_request.file_name} b/#{merge_request.file_name}") | ||||
|       end | ||||
| 
 | ||||
|       it 'views the merge request plain diff', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/417' do | ||||
|       it 'views the merge request plain diff', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/417' do | ||||
|         Page::MergeRequest::Show.perform(&:view_plain_diff) | ||||
| 
 | ||||
|         expect(page.text).to start_with("diff --git a/#{merge_request.file_name} b/#{merge_request.file_name}") | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ module QA | |||
|         project.visit! | ||||
|       end | ||||
| 
 | ||||
|       it 'lists branches correctly after CRUD operations', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/413' do | ||||
|       it 'lists branches correctly after CRUD operations', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/413' do | ||||
|         Page::Project::Menu.perform(&:go_to_repository_branches) | ||||
| 
 | ||||
|         expect(page).to have_content(master_branch) | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ module QA | |||
|         project.wait_for_push_new_branch | ||||
|       end | ||||
| 
 | ||||
|       it 'user performs a deep clone', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/475' do | ||||
|       it 'user performs a deep clone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/475' do | ||||
|         Git::Repository.perform do |repository| | ||||
|           repository.uri = project.repository_http_location.uri | ||||
|           repository.use_default_credentials | ||||
|  | @ -37,7 +37,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'user performs a shallow clone', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/411' do | ||||
|       it 'user performs a shallow clone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/411' do | ||||
|         Git::Repository.perform do |repository| | ||||
|           repository.uri = project.repository_http_location.uri | ||||
|           repository.use_default_credentials | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do | ||||
|     describe 'Files management' do | ||||
|       it 'user creates, edits and deletes a file via the Web', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/451' do | ||||
|       it 'user creates, edits and deletes a file via the Web', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/451' do | ||||
|         Runtime::Browser.visit(:gitlab, Page::Main::Login) | ||||
|         Page::Main::Login.perform(&:sign_in_using_credentials) | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| module QA | ||||
|   RSpec.describe 'Create', :orchestrated, :repository_storage, :requires_admin, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/217002', type: :investigating } do | ||||
|   RSpec.describe 'Create', :orchestrated, :repository_storage, :requires_admin do | ||||
|     describe 'Gitaly repository storage' do | ||||
|       let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } | ||||
|       let(:parent_project) do | ||||
|  | @ -22,7 +22,7 @@ module QA | |||
|         parent_project.add_member(user) | ||||
|       end | ||||
| 
 | ||||
|       it 'creates a 2nd fork after moving the parent project', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/713' do | ||||
|       it 'creates a 2nd fork after moving the parent project', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/713' do | ||||
|         Flow::Login.sign_in(as: user) | ||||
| 
 | ||||
|         fork_project.visit! | ||||
|  | @ -30,7 +30,7 @@ module QA | |||
|         parent_project.change_repository_storage(QA::Runtime::Env.additional_repository_storage) | ||||
| 
 | ||||
|         second_fork_project = Resource::Fork.fabricate_via_api! do |fork| | ||||
|           fork.name = "second-fork" | ||||
|           fork.name = "second-fork-of-#{parent_project.name}" | ||||
|           fork.user = user | ||||
|           fork.upstream = parent_project | ||||
|         end.project | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do | ||||
|     describe 'Push over HTTP using Git protocol version 2', :requires_git_protocol_v2 do | ||||
|       it 'user pushes to the repository', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/469' do | ||||
|       it 'user pushes to the repository', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/469' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         # Create a project to push to | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ module QA | |||
|         Page::Main::Menu.perform(&:sign_out_if_signed_in) | ||||
|       end | ||||
| 
 | ||||
|       it 'user pushes to the repository', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/386' do | ||||
|       it 'user pushes to the repository', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/386' do | ||||
|         project = Resource::Project.fabricate_via_api! do |project| | ||||
|           project.name = 'git-protocol-project' | ||||
|         end | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do | ||||
|     describe 'Git push over HTTP', :ldap_no_tls, :smoke do | ||||
|       it 'user using a personal access token pushes code to the repository', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/430' do | ||||
|       it 'user using a personal access token pushes code to the repository', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/430' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         access_token = Resource::PersonalAccessToken.fabricate!.access_token | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do | ||||
|     describe 'Push mirror a repository over HTTP' do | ||||
|       it 'configures and syncs a (push) mirrored repository', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/414' do | ||||
|       it 'configures and syncs a (push) mirrored repository', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/414' do | ||||
|         Runtime::Browser.visit(:gitlab, Page::Main::Login) | ||||
|         Page::Main::Login.perform(&:sign_in_using_credentials) | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ module QA | |||
|         set_file_size_limit(nil) | ||||
|       end | ||||
| 
 | ||||
|       it 'push successful when the file size is under the limit', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/456' do | ||||
|       it 'push successful when the file size is under the limit', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/456' do | ||||
|         set_file_size_limit(5) | ||||
| 
 | ||||
|         retry_on_fail do | ||||
|  | @ -36,7 +36,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'push fails when the file size is above the limit', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/458' do | ||||
|       it 'push fails when the file size is above the limit', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/458' do | ||||
|         set_file_size_limit(2) | ||||
| 
 | ||||
|         retry_on_fail do | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do | ||||
|     describe 'Git push over HTTP', :ldap_no_tls do | ||||
|       it 'user pushes code to the repository', :smoke, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/426' do | ||||
|       it 'user pushes code to the repository', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/426' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Resource::Repository::ProjectPush.fabricate! do |push| | ||||
|  | @ -18,7 +18,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'pushes to a project using a specific Praefect repository storage', :smoke, :requires_admin, :requires_praefect, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/742' do | ||||
|       it 'pushes to a project using a specific Praefect repository storage', :smoke, :requires_admin, :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/742' do | ||||
|         Flow::Login.sign_in_as_admin | ||||
| 
 | ||||
|         project = Resource::Project.fabricate_via_api! do |storage_project| | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'pushes code to the repository via SSH', :smoke, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/969' do | ||||
|       it 'pushes code to the repository via SSH', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/969' do | ||||
|         Resource::Repository::ProjectPush.fabricate! do |push| | ||||
|           push.project = project | ||||
|           push.ssh_key = @key | ||||
|  | @ -41,7 +41,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'pushes multiple branches and tags together', :smoke, status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/970' do | ||||
|       it 'pushes multiple branches and tags together', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/970' do | ||||
|         branches = [] | ||||
|         tags = [] | ||||
|         Git::Repository.perform do |repository| | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       context 'when developers and maintainers are allowed to push to a protected branch' do | ||||
|         it 'user with push rights successfully pushes to the protected branch', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/447' do | ||||
|         it 'user with push rights successfully pushes to the protected branch', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/447' do | ||||
|           create_protected_branch(allowed_to_push: { | ||||
|             roles: Resource::ProtectedBranch::Roles::DEVS_AND_MAINTAINERS | ||||
|           }) | ||||
|  | @ -30,7 +30,7 @@ module QA | |||
|       end | ||||
| 
 | ||||
|       context 'when developers and maintainers are not allowed to push to a protected branch' do | ||||
|         it 'user without push rights fails to push to the protected branch', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/449' do | ||||
|         it 'user without push rights fails to push to the protected branch', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/449' do | ||||
|           create_protected_branch(allowed_to_push: { | ||||
|             roles: Resource::ProtectedBranch::Roles::NO_ONE | ||||
|           }) | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ module QA | |||
|       Flow::Login.sign_in | ||||
|     end | ||||
| 
 | ||||
|     it 'user can add an SSH key', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/929' do | ||||
|     it 'user can add an SSH key', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/929' do | ||||
|       key = Resource::SSHKey.fabricate_via_browser_ui! do |resource| | ||||
|         resource.title = key_title | ||||
|       end | ||||
|  | @ -20,7 +20,7 @@ module QA | |||
| 
 | ||||
|     # Note this context ensures that the example it contains is executed after the example above. Be aware of the order of execution if you add new examples in either context. | ||||
|     context 'after adding an ssh key' do | ||||
|       it 'can delete an ssh key', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/930' do | ||||
|       it 'can delete an ssh key', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/930' do | ||||
|         Page::Main::Menu.perform(&:click_settings_link) | ||||
|         Page::Profile::Menu.perform(&:click_ssh_keys) | ||||
|         Page::Profile::SSHKeys.perform do |ssh_keys| | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ module QA | |||
|         find('pre').text | ||||
|       end | ||||
| 
 | ||||
|       it 'user views raw email patch', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/442' do | ||||
|       it 'user views raw email patch', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/442' do | ||||
|         view_commit | ||||
| 
 | ||||
|         Page::Project::Commit::Show.perform(&:select_email_patches) | ||||
|  | @ -53,7 +53,7 @@ module QA | |||
|         expect(page).to have_content('diff --git a/second b/second') | ||||
|       end | ||||
| 
 | ||||
|       it 'user views raw commit diff', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/439' do | ||||
|       it 'user views raw commit diff', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/439' do | ||||
|         view_commit | ||||
| 
 | ||||
|         Page::Project::Commit::Show.perform(&:select_plain_diff) | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/826' do | ||||
|       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/826' do | ||||
|         Resource::Repository::Push.fabricate! do |push| | ||||
|           push.repository_http_uri = repository_uri_http | ||||
|           push.file_name = new_file | ||||
|  | @ -65,7 +65,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'clones, pushes, and pulls a snippet over SSH, deletes via UI', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/825' do | ||||
|       it 'clones, pushes, and pulls a snippet over SSH, deletes via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/825' do | ||||
|         Resource::Repository::Push.fabricate! do |push| | ||||
|           push.repository_ssh_uri = repository_uri_ssh | ||||
|           push.ssh_key = ssh_key | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it 'clones, pushes, and pulls a project snippet over HTTP, edits via UI', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/833' do | ||||
|       it 'clones, pushes, and pulls a project snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/833' do | ||||
|         Resource::Repository::Push.fabricate! do |push| | ||||
|           push.repository_http_uri = repository_uri_http | ||||
|           push.file_name = new_file | ||||
|  | @ -65,7 +65,7 @@ module QA | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'clones, pushes, and pulls a project snippet over SSH, deletes via UI', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/832' do | ||||
|       it 'clones, pushes, and pulls a project snippet over SSH, deletes via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/832' do | ||||
|         Resource::Repository::Push.fabricate! do |push| | ||||
|           push.repository_ssh_uri = repository_uri_ssh | ||||
|           push.ssh_key = ssh_key | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create', :smoke do | ||||
|     describe 'Personal snippet creation' do | ||||
|       it 'User creates a personal snippet', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/840' do | ||||
|       it 'User creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/840' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Page::Main::Menu.perform do |menu| | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| module QA | ||||
|   RSpec.describe 'Create' do # to be converted to a smoke test once proved to be stable | ||||
|     describe 'Project snippet creation' do | ||||
|       it 'User creates a project snippet', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/839' do | ||||
|       it 'User creates a project snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/839' do | ||||
|         Flow::Login.sign_in | ||||
| 
 | ||||
|         Resource::ProjectSnippet.fabricate_via_browser_ui! do |snippet| | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ module QA | |||
|         Flow::Login.sign_in | ||||
|       end | ||||
| 
 | ||||
|       it "creates the first file in an empty project via Web IDE", status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/847' do | ||||
|       it "creates the first file in an empty project via Web IDE", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/847' do | ||||
|         # In the first iteration, the test opens Web IDE by modifying the URL to address past regressions. | ||||
|         # Once the Web IDE button is introduced for empty projects, the test will be modified to go through UI. | ||||
|         # See https://gitlab.com/gitlab-org/gitlab/-/issues/27915 and https://gitlab.com/gitlab-org/gitlab/-/issues/27535. | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ module QA | |||
|         let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } | ||||
| 
 | ||||
|         context 'when no fork is present' do | ||||
|           it 'suggests to create a fork when a user clicks Web IDE in the main project', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/959' do | ||||
|           it 'suggests to create a fork when a user clicks Web IDE in the main project', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/959' do | ||||
|             Flow::Login.sign_in(as: user) | ||||
| 
 | ||||
|             parent_project.visit! | ||||
|  | @ -34,7 +34,7 @@ module QA | |||
|             end | ||||
|           end | ||||
| 
 | ||||
|           it 'opens the fork when a user clicks Web IDE in the main project', status_issue: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/960' do | ||||
|           it 'opens the fork when a user clicks Web IDE in the main project', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/960' do | ||||
|             Flow::Login.sign_in(as: user) | ||||
|             fork_project.upstream.visit! | ||||
|             Page::Project::Show.perform do |project_page| | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue