diff options
90 files changed, 288 insertions, 416 deletions
diff --git a/.rubocop_todo/layout/space_inside_block_braces.yml b/.rubocop_todo/layout/space_inside_block_braces.yml index 4714e3e64bf..85c980c6509 100644 --- a/.rubocop_todo/layout/space_inside_block_braces.yml +++ b/.rubocop_todo/layout/space_inside_block_braces.yml @@ -71,14 +71,6 @@ Layout/SpaceInsideBlockBraces: - 'ee/spec/finders/status_page/incidents_finder_spec.rb' - 'ee/spec/frontend/fixtures/epic.rb' - 'ee/spec/frontend/fixtures/projects.rb' - - 'ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb' - - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb' - - 'ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb' - - 'ee/spec/graphql/mutations/dast_site_validations/revoke_spec.rb' - - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb' - - 'ee/spec/graphql/mutations/releases/update_spec.rb' - - 'ee/spec/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb' - - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb' - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb' - 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb' - 'ee/spec/helpers/ee/registrations_helper_spec.rb' @@ -115,80 +107,9 @@ Layout/SpaceInsideBlockBraces: - 'ee/spec/models/vulnerabilities/feedback_spec.rb' - 'ee/spec/models/vulnerabilities/finding_spec.rb' - 'ee/spec/presenters/epic_issue_presenter_spec.rb' - - 'ee/spec/requests/api/analytics/code_review_analytics_spec.rb' - - 'ee/spec/requests/api/analytics/group_activity_analytics_spec.rb' - - 'ee/spec/requests/api/ci/minutes_spec.rb' - - 'ee/spec/requests/api/epic_links_spec.rb' - - 'ee/spec/requests/api/graphql/boards/board_lists_query_spec.rb' - - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb' - - 'ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb' - - 'ee/spec/requests/api/graphql/group_query_spec.rb' - - 'ee/spec/requests/api/graphql/iteration_spec.rb' - - 'ee/spec/requests/api/graphql/mutations/dast_site_validations/revoke_spec.rb' - - 'ee/spec/requests/api/graphql/mutations/epic_tree/reorder_spec.rb' - - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb' - - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb' - - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb' - - 'ee/spec/requests/api/graphql/project/dast_profiles_spec.rb' - - 'ee/spec/requests/api/graphql/project/dast_site_validations_spec.rb' - - 'ee/spec/requests/api/graphql/project/issues_spec.rb' - - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb' - - 'ee/spec/requests/api/group_variables_spec.rb' - - 'ee/spec/requests/api/internal/base_spec.rb' - - 'ee/spec/requests/api/managed_licenses_spec.rb' - - 'ee/spec/requests/api/members_spec.rb' - - 'ee/spec/requests/api/projects_spec.rb' - - 'ee/spec/requests/api/protected_branches_spec.rb' - - 'ee/spec/requests/api/releases_spec.rb' - - 'ee/spec/requests/groups/contribution_analytics_spec.rb' - - 'ee/spec/requests/lfs_http_spec.rb' - - 'ee/spec/requests/projects/security/policies_controller_spec.rb' - 'ee/spec/serializers/member_user_entity_spec.rb' - 'ee/spec/serializers/merge_request_poll_widget_entity_spec.rb' - 'ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb' - - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb' - - 'ee/spec/services/audit_events/unregister_runner_audit_event_service_spec.rb' - - 'ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb' - - 'ee/spec/services/auto_merge/merge_train_service_spec.rb' - - 'ee/spec/services/ci/runners/register_runner_service_spec.rb' - - 'ee/spec/services/ee/design_management/delete_designs_service_spec.rb' - - 'ee/spec/services/ee/design_management/save_designs_service_spec.rb' - - 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb' - - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb' - - 'ee/spec/services/ee/notification_service_spec.rb' - - 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb' - - 'ee/spec/services/epic_issues/create_service_spec.rb' - - 'ee/spec/services/epics/create_service_spec.rb' - - 'ee/spec/services/epics/descendant_count_service_spec.rb' - - 'ee/spec/services/epics/transfer_service_spec.rb' - - 'ee/spec/services/geo/container_repository_sync_service_spec.rb' - - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb' - - 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb' - - 'ee/spec/services/geo/repository_sync_service_spec.rb' - - 'ee/spec/services/geo/wiki_sync_service_spec.rb' - - 'ee/spec/services/gitlab_subscriptions/activate_service_spec.rb' - - 'ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb' - - 'ee/spec/services/group_saml/sign_up_service_spec.rb' - - 'ee/spec/services/groups/epics_count_service_spec.rb' - - 'ee/spec/services/groups/memberships/export_service_spec.rb' - - 'ee/spec/services/iterations/cadences/create_iterations_in_advance_service_spec.rb' - - 'ee/spec/services/merge_trains/check_status_service_spec.rb' - - 'ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb' - - 'ee/spec/services/projects/destroy_service_spec.rb' - - 'ee/spec/services/projects/update_mirror_service_spec.rb' - - 'ee/spec/services/quick_actions/interpret_service_spec.rb' - - 'ee/spec/services/requirements_management/create_requirement_service_spec.rb' - - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb' - - 'ee/spec/services/resource_access_tokens/create_service_spec.rb' - - 'ee/spec/services/search/group_service_spec.rb' - - 'ee/spec/services/security/ingestion/tasks/ingest_findings_spec.rb' - - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb' - - 'ee/spec/services/sitemap/create_service_spec.rb' - - 'ee/spec/services/software_license_policies/update_service_spec.rb' - - 'ee/spec/services/status_page/publish_attachments_service_spec.rb' - - 'ee/spec/services/system_notes/epics_service_spec.rb' - - 'ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb' - - 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb' - 'ee/spec/support/shared_examples/features/ultimate_trial_callout_shared_examples.rb' - 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb' - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb' @@ -287,18 +208,6 @@ Layout/SpaceInsideBlockBraces: - 'spec/frontend/fixtures/raw.rb' - 'spec/frontend/fixtures/snippet.rb' - 'spec/frontend/fixtures/todos.rb' - - 'spec/graphql/mutations/merge_requests/set_labels_spec.rb' - - 'spec/graphql/mutations/releases/create_spec.rb' - - 'spec/graphql/mutations/releases/delete_spec.rb' - - 'spec/graphql/mutations/releases/update_spec.rb' - - 'spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb' - - 'spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb' - - 'spec/graphql/resolvers/project_jobs_resolver_spec.rb' - - 'spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb' - - 'spec/graphql/resolvers/projects_resolver_spec.rb' - - 'spec/graphql/types/ci/job_token_scope_type_spec.rb' - - 'spec/graphql/types/issue_type_spec.rb' - - 'spec/graphql/types/user_type_spec.rb' - 'spec/helpers/application_settings_helper_spec.rb' - 'spec/helpers/blob_helper_spec.rb' - 'spec/helpers/gitlab_script_tag_helper_spec.rb' @@ -374,118 +283,9 @@ Layout/SpaceInsideBlockBraces: - 'spec/presenters/packages/conan/package_presenter_spec.rb' - 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb' - 'spec/presenters/project_presenter_spec.rb' - - 'spec/requests/api/branches_spec.rb' - - 'spec/requests/api/ci/jobs_spec.rb' - - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb' - - 'spec/requests/api/ci/runner/jobs_trace_spec.rb' - - 'spec/requests/api/ci/secure_files_spec.rb' - - 'spec/requests/api/ci/triggers_spec.rb' - - 'spec/requests/api/ci/variables_spec.rb' - - 'spec/requests/api/commits_spec.rb' - - 'spec/requests/api/conan_instance_packages_spec.rb' - - 'spec/requests/api/conan_project_packages_spec.rb' - - 'spec/requests/api/dependency_proxy_spec.rb' - - 'spec/requests/api/go_proxy_spec.rb' - - 'spec/requests/api/graphql/boards/board_list_issues_query_spec.rb' - - 'spec/requests/api/graphql/boards/board_lists_query_spec.rb' - - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb' - - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb' - - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb' - - 'spec/requests/api/graphql/mutations/releases/create_spec.rb' - - 'spec/requests/api/graphql/mutations/releases/update_spec.rb' - - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb' - - 'spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb' - - 'spec/requests/api/graphql/packages/conan_spec.rb' - - 'spec/requests/api/graphql/packages/helm_spec.rb' - - 'spec/requests/api/graphql/packages/package_spec.rb' - - 'spec/requests/api/graphql/project/base_service_spec.rb' - - 'spec/requests/api/graphql/project/jira_import_spec.rb' - - 'spec/requests/api/group_variables_spec.rb' - - 'spec/requests/api/groups_spec.rb' - - 'spec/requests/api/helpers_spec.rb' - - 'spec/requests/api/internal/base_spec.rb' - - 'spec/requests/api/markdown_spec.rb' - - 'spec/requests/api/maven_packages_spec.rb' - - 'spec/requests/api/metrics/dashboard/annotations_spec.rb' - - 'spec/requests/api/notes_spec.rb' - - 'spec/requests/api/npm_project_packages_spec.rb' - - 'spec/requests/api/nuget_group_packages_spec.rb' - - 'spec/requests/api/pages/pages_spec.rb' - - 'spec/requests/api/pages_domains_spec.rb' - - 'spec/requests/api/personal_access_tokens_spec.rb' - - 'spec/requests/api/project_hooks_spec.rb' - - 'spec/requests/api/project_templates_spec.rb' - - 'spec/requests/api/projects_spec.rb' - - 'spec/requests/api/pypi_packages_spec.rb' - - 'spec/requests/api/release/links_spec.rb' - - 'spec/requests/api/releases_spec.rb' - - 'spec/requests/api/snippets_spec.rb' - - 'spec/requests/api/unleash_spec.rb' - - 'spec/requests/git_http_spec.rb' - - 'spec/requests/groups/milestones_controller_spec.rb' - - 'spec/requests/lfs_http_spec.rb' - - 'spec/requests/oauth/tokens_controller_spec.rb' - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb' - 'spec/serializers/cluster_entity_spec.rb' - 'spec/serializers/import/provider_repo_serializer_spec.rb' - - 'spec/services/auto_merge/base_service_spec.rb' - - 'spec/services/auto_merge_service_spec.rb' - - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb' - - 'spec/services/ci/parse_dotenv_artifact_service_spec.rb' - - 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb' - - 'spec/services/ci/process_build_service_spec.rb' - - 'spec/services/ci/runners/register_runner_service_spec.rb' - - 'spec/services/ci/runners/update_runner_service_spec.rb' - - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb' - - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb' - - 'spec/services/clusters/integrations/create_service_spec.rb' - - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb' - - 'spec/services/deployments/create_for_build_service_spec.rb' - - 'spec/services/git/branch_push_service_spec.rb' - - 'spec/services/groups/destroy_service_spec.rb' - - 'spec/services/groups/merge_requests_count_service_spec.rb' - - 'spec/services/groups/update_service_spec.rb' - - 'spec/services/groups/update_statistics_service_spec.rb' - - 'spec/services/import/validate_remote_git_endpoint_service_spec.rb' - - 'spec/services/issues/referenced_merge_requests_service_spec.rb' - - 'spec/services/jira_import/start_import_service_spec.rb' - - 'spec/services/lfs/push_service_spec.rb' - - 'spec/services/members/invite_service_spec.rb' - - 'spec/services/merge_requests/push_options_handler_service_spec.rb' - - 'spec/services/merge_requests/refresh_service_spec.rb' - - 'spec/services/merge_requests/update_service_spec.rb' - - 'spec/services/milestones/transfer_service_spec.rb' - - 'spec/services/notes/copy_service_spec.rb' - - 'spec/services/notification_service_spec.rb' - - 'spec/services/packages/composer/create_package_service_spec.rb' - - 'spec/services/packages/create_dependency_service_spec.rb' - - 'spec/services/packages/debian/extract_deb_metadata_service_spec.rb' - - 'spec/services/packages/debian/parse_debian822_service_spec.rb' - - 'spec/services/packages/debian/sign_distribution_service_spec.rb' - - 'spec/services/packages/helm/process_file_service_spec.rb' - - 'spec/services/packages/npm/create_package_service_spec.rb' - - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb' - - 'spec/services/pages/delete_service_spec.rb' - - 'spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb' - - 'spec/services/projects/enable_deploy_key_service_spec.rb' - - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb' - - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb' - - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb' - - 'spec/services/projects/participants_service_spec.rb' - - 'spec/services/projects/update_statistics_service_spec.rb' - - 'spec/services/quick_actions/interpret_service_spec.rb' - - 'spec/services/releases/destroy_service_spec.rb' - - 'spec/services/releases/update_service_spec.rb' - - 'spec/services/resource_access_tokens/create_service_spec.rb' - - 'spec/services/search/group_service_spec.rb' - - 'spec/services/snippets/update_service_spec.rb' - - 'spec/services/suggestions/apply_service_spec.rb' - - 'spec/services/system_notes/merge_requests_service_spec.rb' - - 'spec/services/terraform/remote_state_handler_spec.rb' - - 'spec/services/todo_service_spec.rb' - - 'spec/services/todos/destroy/design_service_spec.rb' - - 'spec/services/todos/destroy/entity_leave_service_spec.rb' - - 'spec/services/web_hook_service_spec.rb' - 'spec/support/helpers/cycle_analytics_helpers.rb' - 'spec/support/redis/redis_shared_examples.rb' - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb' diff --git a/app/services/packages/debian/extract_metadata_service.rb b/app/services/packages/debian/extract_metadata_service.rb index f94587919b9..eb8227d1296 100644 --- a/app/services/packages/debian/extract_metadata_service.rb +++ b/app/services/packages/debian/extract_metadata_service.rb @@ -61,12 +61,12 @@ module Packages def fields strong_memoize(:fields) do if file_type_debian? - package_file.file.use_file do |file_path| - ::Packages::Debian::ExtractDebMetadataService.new(file_path).execute + package_file.file.use_open_file(unlink_early: false) do |file| + ::Packages::Debian::ExtractDebMetadataService.new(file.file_path).execute end elsif file_type_meta? - package_file.file.use_file do |file_path| - ::Packages::Debian::ParseDebian822Service.new(File.read(file_path)).execute.each_value.first + package_file.file.use_open_file do |file| + ::Packages::Debian::ParseDebian822Service.new(file.read).execute.each_value.first end end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 9bc8bb428fb..6381ee67ce7 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -26,7 +26,7 @@ module Projects return ::Projects::CreateFromTemplateService.new(current_user, params).execute end - @project = Project.new(params) + @project = Project.new(params.merge(creator: current_user)) validate_import_source_enabled! @@ -45,20 +45,14 @@ module Projects set_project_name_from_path # get namespace id - namespace_id = params[:namespace_id] - - if namespace_id - # Find matching namespace and check if it allowed - # for current user if namespace_id passed. - unless current_user.can?(:create_projects, parent_namespace) - @project.namespace_id = nil - deny_namespace - return @project - end - else - # Set current user namespace if namespace_id is nil - @project.namespace_id = current_user.namespace_id - end + namespace_id = params[:namespace_id] || current_user.namespace_id + @project.namespace_id = namespace_id.to_i + + @project.check_personal_projects_limit + return @project if @project.errors.any? + + validate_create_permissions + return @project if @project.errors.any? @relations_block&.call(@project) yield(@project) if block_given? @@ -92,7 +86,9 @@ module Projects protected - def deny_namespace + def validate_create_permissions + return if current_user.can?(:create_projects, parent_namespace) + @project.errors.add(:namespace, "is not valid") end diff --git a/app/uploaders/object_storage.rb b/app/uploaders/object_storage.rb index 891df5180d8..063aca7937c 100644 --- a/app/uploaders/object_storage.rb +++ b/app/uploaders/object_storage.rb @@ -224,6 +224,10 @@ module ObjectStorage def initialize(file) @file = file end + + def file_path + @file.path + end end # allow to configure and overwrite the filename @@ -275,9 +279,9 @@ module ObjectStorage end end - def use_open_file(&blk) + def use_open_file(unlink_early: true) Tempfile.open(path) do |file| - file.unlink + file.unlink if unlink_early file.binmode if file_storage? @@ -291,6 +295,8 @@ module ObjectStorage file.seek(0, IO::SEEK_SET) yield OpenFile.new(file) + ensure + file.unlink unless unlink_early end end diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml index e8176e9f8bb..224afbff39a 100644 --- a/app/views/admin/hooks/edit.html.haml +++ b/app/views/admin/hooks/edit.html.haml @@ -15,6 +15,6 @@ = render 'shared/web_hooks/test_button', hook: @hook = link_to _('Delete'), admin_hook_path(@hook), method: :delete, class: 'btn gl-button btn-danger float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this webhook?'), confirm_btn_variant: 'danger' } - %hr +%hr - = render partial: 'admin/hook_logs/index', locals: { hook: @hook, hook_logs: @hook_logs } += render partial: 'shared/hook_logs/index', locals: { hook: @hook, hook_logs: @hook_logs } diff --git a/app/views/projects/hook_logs/_index.html.haml b/app/views/projects/hook_logs/_index.html.haml deleted file mode 100644 index 6a46b0b3510..00000000000 --- a/app/views/projects/hook_logs/_index.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -- docs_link_url = help_page_path('user/project/integrations/webhooks', anchor: 'troubleshoot-webhooks') -- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url } -- link_end = '</a>'.html_safe - -.row.gl-mt-3.gl-mb-3 - .col-lg-3 - %h4.gl-mt-0 - = _('Recent events') - %p= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end } - .col-lg-9 - = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs } diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml index 74af65904cd..b350455807d 100644 --- a/app/views/projects/hooks/edit.html.haml +++ b/app/views/projects/hooks/edit.html.haml @@ -18,4 +18,4 @@ %hr -= render partial: 'projects/hook_logs/index', locals: { hook: @hook, hook_logs: @hook_logs, project: @project } += render partial: 'shared/hook_logs/index', locals: { hook: @hook, hook_logs: @hook_logs, project: @project } diff --git a/app/views/projects/settings/integrations/edit.html.haml b/app/views/projects/settings/integrations/edit.html.haml index a250daafdbb..46276e6c6c9 100644 --- a/app/views/projects/settings/integrations/edit.html.haml +++ b/app/views/projects/settings/integrations/edit.html.haml @@ -6,4 +6,5 @@ = render 'form', integration: @integration - if @web_hook_logs - = render partial: 'projects/hook_logs/index', locals: { hook: @integration.service_hook, hook_logs: @web_hook_logs, project: @project } + %hr + = render partial: 'shared/hook_logs/index', locals: { hook: @integration.service_hook, hook_logs: @web_hook_logs, project: @project } diff --git a/app/views/admin/hook_logs/_index.html.haml b/app/views/shared/hook_logs/_index.html.haml index 6a46b0b3510..6a46b0b3510 100644 --- a/app/views/admin/hook_logs/_index.html.haml +++ b/app/views/shared/hook_logs/_index.html.haml diff --git a/doc/administration/raketasks/project_import_export.md b/doc/administration/raketasks/project_import_export.md index f623d4e4526..f3a9845d129 100644 --- a/doc/administration/raketasks/project_import_export.md +++ b/doc/administration/raketasks/project_import_export.md @@ -17,11 +17,7 @@ GitLab provides Rake tasks relating to project import and export. For more infor You can query an import through the [Project import/export API](../../api/project_import_export.md#import-status). As described in the API documentation, the query may return an import error or exceptions. -## Import large projects - -If you have a larger project, consider using a Rake task, as described in our [developer documentation](../../development/import_project.md#importing-via-a-rake-task). - -## Import/export tasks +## Import/export Rake tasks The GitLab import/export version can be checked by using the following command: @@ -57,3 +53,38 @@ Note the following: - The exports are stored in a temporary directory and are deleted every 24 hours by a specific worker. + +### Import large projects using a Rake task + +If you have a larger project, consider using a Rake task as described in our [developer documentation](../../development/import_project.md#importing-via-a-rake-task). + +### Export using a Rake task + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25598) in GitLab 12.9. + +You can use a Rake task to export large project. + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `username` | string | yes | User name | +| `namespace_path` | string | yes | Namespace path | +| `project_path` | string | yes | Project name | +| `archive_path` | string | yes | Path to file to store the export project tarball | + +```shell +gitlab-rake "gitlab:import_export:export[username, namespace_path, project_path, archive_path]" +``` + +## Troubleshooting + +If you are having trouble with import/export, you can enable debug mode using the same Rake task: + +```shell +# Import +IMPORT_DEBUG=true gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file_to_import.tar.gz]" + +# Export +EXPORT_DEBUG=true gitlab-rake "gitlab:import_export:export[root, group/subgroup, projectnametoexport, /tmp/export_file.tar.gz]" +``` diff --git a/doc/development/documentation/structure.md b/doc/development/documentation/structure.md index a02046d4466..47eb9ad5144 100644 --- a/doc/development/documentation/structure.md +++ b/doc/development/documentation/structure.md @@ -148,35 +148,57 @@ Avoid these heading titles: ## Troubleshooting -Troubleshooting can be one of two categories: +Troubleshooting topics should be the last topics on a page. They can also be on a standalone page that includes only troubleshooting information. -- **Troubleshooting task.** This information is written the same way as a [standard task](#task). +Troubleshooting can be one of three categories: + +- **An introductory topic.** This topic introduces the troubleshooting section of a page. + For example: + + ```markdown + ## Troubleshooting + + When working with <x feature>, you might encounter the following issues. + ``` + +- **Troubleshooting task.** The title should be similar to a [standard task](#task). For example, "Run debug tools" or "Verify syntax." -- **Troubleshooting reference.** This information has a specific format. -Troubleshooting reference information should be in this format: +- **Troubleshooting reference.** This information includes the error message. For example: -```markdown -# Title (the error message or a description of it) + ```markdown + ### The error message or a description of it -You might get an error that states <error message>. + You might get an error that states <error message>. -This issue occurs when... + This issue occurs when... -The workaround is... -``` + The workaround is... + ``` -If multiple causes or workarounds exist, consider putting them into a table format. + If multiple causes or workarounds exist, consider putting them into a table format. ### Troubleshooting headings -For the heading: +For the heading of a **Troubleshooting reference** topic: - Consider including at least a partial error message. - Use fewer than 70 characters. If you do not put the full error in the title, include it in the body text. +### Related topics + +If inline links are not sufficient, you can create a topic called **Related topics** +and include an unordered list of related topics. This topic should be above the Troubleshooting section. + +```markdown +# Related topics + +- [Configure your pipeline](link-to-topic) +- [Trigger a pipeline manually](link-to-topic) +``` + ## General heading text guidelines In general, for heading text: @@ -272,18 +294,6 @@ If you need to add more than one task, consider using subsections for each distinct task. ``` -### Related topics - -If inline links are not sufficient, you can create a topic called **Related topics** -and include an unordered list of related topics. This topic should be above the Troubleshooting section. - -```markdown -# Related topics - -- [Configure your pipeline](link-to-topic) -- [Trigger a pipeline manually](link-to-topic) -``` - ### Topics and resources pages This page has a list of links that point to important sections diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md index f69b2c686aa..d8b6456469a 100644 --- a/doc/development/migration_style_guide.md +++ b/doc/development/migration_style_guide.md @@ -581,7 +581,7 @@ end Verify the index is not being used anymore with this Thanos query: ```sql -sum(rate(pg_stat_user_indexes_idx_tup_read{env="gprd", indexrelname="index_ci_name", type="patroni-ci"}[5m])) +sum by (type)(rate(pg_stat_user_indexes_idx_scan{env="gprd", indexrelname="index_groups_on_parent_id_id"}[5m])) ``` Note that it is not necessary to check if the index exists prior to diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md index 008aef69691..48f9cadd11b 100644 --- a/doc/security/two_factor_authentication.md +++ b/doc/security/two_factor_authentication.md @@ -142,7 +142,12 @@ The one-time password (OTP) verification can be done using a command: ssh git@<hostname> 2fa_verify ``` -After the OTP is verified, Git over SSH operations can be used for a session duration of +In GitLab 15.3 and later, users can authenticate by either: + +- Entering the correct OTP. +- Responding to a device push notification, if [FortiAuthenticator is enabled](../user/profile/account/two_factor_authentication.md#enable-one-time-password-using-fortiauthenticator). + +After the successful authentication, Git over SSH operations can be used for a session duration of 15 minutes (default) with the associated SSH key. ### Security limitation diff --git a/qa/qa/service/praefect_manager.rb b/qa/qa/service/praefect_manager.rb index e500745c4f1..c332e7a6198 100644 --- a/qa/qa/service/praefect_manager.rb +++ b/qa/qa/service/praefect_manager.rb @@ -101,7 +101,7 @@ module QA wait_until_shell_command_matches( "docker inspect -f {{.State.Running}} #{name}", /true/, - sleep_interval: 3, + sleep_interval: 1, max_duration: 180, retry_on_exception: true ) diff --git a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb index 150378016e1..2b96c35415e 100644 --- a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb +++ b/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb @@ -20,11 +20,6 @@ module QA praefect_manager.wait_for_replication(project.id) end - after do - # Leave the cluster in a suitable state for subsequent tests - praefect_manager.start_all_nodes - end - it 'reads from each node', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347833' do pre_read_data = praefect_manager.query_read_distribution @@ -42,14 +37,12 @@ module QA context 'when a node is unhealthy' do before do - praefect_manager.start_all_nodes praefect_manager.stop_secondary_node - praefect_manager.wait_for_secondary_node_health_check_failure end after do # Leave the cluster in a suitable state for subsequent tests - praefect_manager.start_all_nodes + praefect_manager.start_secondary_node end it 'does not read from the unhealthy node', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347834' do diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb index e27f37abedf..47be7e0620b 100644 --- a/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb +++ b/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb @@ -15,7 +15,6 @@ module QA end after do - praefect_manager.start_all_nodes praefect_manager.remove_repo_from_disk(repo1["relative_path"]) praefect_manager.remove_repo_from_disk(repo2["relative_path"]) praefect_manager.remove_repository_from_praefect_database(repo1["relative_path"]) diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb index a275bc28631..ba7b712964c 100644 --- a/spec/controllers/projects/hooks_controller_spec.rb +++ b/spec/controllers/projects/hooks_controller_spec.rb @@ -98,7 +98,7 @@ RSpec.describe Projects::HooksController do def it_renders_correctly expect(response).to have_gitlab_http_status(:ok) expect(response).to render_template(:edit) - expect(response).to render_template('projects/hook_logs/_index') + expect(response).to render_template('shared/hook_logs/_index') end end diff --git a/spec/services/auto_merge/base_service_spec.rb b/spec/services/auto_merge/base_service_spec.rb index 3f535b83788..6c804a14620 100644 --- a/spec/services/auto_merge/base_service_spec.rb +++ b/spec/services/auto_merge/base_service_spec.rb @@ -254,7 +254,7 @@ RSpec.describe AutoMerge::BaseService do subject { service.abort(merge_request, reason) } let(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds) } - let(:reason) { 'an error'} + let(:reason) { 'an error' } it_behaves_like 'Canceled or Dropped' diff --git a/spec/services/auto_merge_service_spec.rb b/spec/services/auto_merge_service_spec.rb index 335c608c206..043b413acff 100644 --- a/spec/services/auto_merge_service_spec.rb +++ b/spec/services/auto_merge_service_spec.rb @@ -97,7 +97,7 @@ RSpec.describe AutoMergeService do end context 'when strategy is not present' do - let(:strategy) { } + let(:strategy) {} it 'returns nil' do is_expected.to be_nil @@ -140,7 +140,7 @@ RSpec.describe AutoMergeService do end context 'when strategy is not specified' do - let(:strategy) { } + let(:strategy) {} it 'chooses the most preferred strategy' do is_expected.to eq(:merge_when_pipeline_succeeds) diff --git a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb index 9add096d782..7c698242921 100644 --- a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb +++ b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe Ci::CreatePipelineService do let_it_be(:group) { create(:group, :private) } - let_it_be(:group_variable) { create(:ci_group_variable, group: group, key: 'RUNNER_TAG', value: 'group')} + let_it_be(:group_variable) { create(:ci_group_variable, group: group, key: 'RUNNER_TAG', value: 'group') } let_it_be(:project) { create(:project, :repository, group: group) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb index 88cec0cde9a..6e48141226d 100644 --- a/spec/services/ci/create_pipeline_service/rules_spec.rb +++ b/spec/services/ci/create_pipeline_service/rules_spec.rb @@ -557,7 +557,7 @@ RSpec.describe Ci::CreatePipelineService do end context 'when the compare_to ref exists' do - let(:compare_to) { 'feature_1'} + let(:compare_to) { 'feature_1' } context 'when the rule matches' do it 'creates job1 and job2' do @@ -609,7 +609,7 @@ RSpec.describe Ci::CreatePipelineService do EOY end - let(:compare_to) { 'feature_1'} + let(:compare_to) { 'feature_1' } context 'when the rule matches' do it 'creates job1' do diff --git a/spec/services/ci/deployments/destroy_service_spec.rb b/spec/services/ci/deployments/destroy_service_spec.rb index e33d9e00d5f..60a57c05728 100644 --- a/spec/services/ci/deployments/destroy_service_spec.rb +++ b/spec/services/ci/deployments/destroy_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe ::Ci::Deployments::DestroyService do let_it_be(:project) { create(:project, :repository) } let(:environment) { create(:environment, project: project) } - let(:commits) { project.repository.commits(nil, { limit: 3 })} + let(:commits) { project.repository.commits(nil, { limit: 3 }) } let!(:deploy) do create( :deployment, diff --git a/spec/services/ci/parse_dotenv_artifact_service_spec.rb b/spec/services/ci/parse_dotenv_artifact_service_spec.rb index aaab849cd93..7b3af33ac72 100644 --- a/spec/services/ci/parse_dotenv_artifact_service_spec.rb +++ b/spec/services/ci/parse_dotenv_artifact_service_spec.rb @@ -292,7 +292,7 @@ RSpec.describe Ci::ParseDotenvArtifactService do end context 'when build does not have a dotenv artifact' do - let!(:artifact) { } + let!(:artifact) {} it 'raises an error' do expect { subject }.to raise_error(ArgumentError) diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb index 7868629d34d..289e004fcce 100644 --- a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb +++ b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb @@ -87,7 +87,7 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection describe '#processing_processables' do it 'returns processables marked as processing' do - expect(collection.processing_processables.map { |processable| processable[:id]} ) + expect(collection.processing_processables.map { |processable| processable[:id] } ) .to contain_exactly(build_a.id, build_b.id, test_a.id, test_b.id, deploy.id) end end diff --git a/spec/services/ci/process_build_service_spec.rb b/spec/services/ci/process_build_service_spec.rb index b54fc45d36a..2fcb4ce73ff 100644 --- a/spec/services/ci/process_build_service_spec.rb +++ b/spec/services/ci/process_build_service_spec.rb @@ -101,7 +101,7 @@ RSpec.describe Ci::ProcessBuildService, '#execute' do context 'when build has delayed option' do before do - allow(Ci::BuildScheduleWorker).to receive(:perform_at) { } + allow(Ci::BuildScheduleWorker).to receive(:perform_at) {} end let(:build) { create(:ci_build, :created, :schedulable, user: user, project: project) } diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb index 03dcf851e53..f233075224b 100644 --- a/spec/services/ci/runners/register_runner_service_spec.rb +++ b/spec/services/ci/runners/register_runner_service_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute' do let(:registration_token) { 'abcdefg123456' } - let(:token) { } + let(:token) {} let(:args) { {} } before do diff --git a/spec/services/ci/runners/update_runner_service_spec.rb b/spec/services/ci/runners/update_runner_service_spec.rb index b02ea8f58b0..e008fde9982 100644 --- a/spec/services/ci/runners/update_runner_service_spec.rb +++ b/spec/services/ci/runners/update_runner_service_spec.rb @@ -38,7 +38,7 @@ RSpec.describe Ci::Runners::UpdateRunnerService do end context 'with cost factor params' do - let(:params) { { public_projects_minutes_cost_factor: 1.1, private_projects_minutes_cost_factor: 2.2 }} + let(:params) { { public_projects_minutes_cost_factor: 1.1, private_projects_minutes_cost_factor: 2.2 } } it 'updates the runner cost factors' do expect(update).to be_truthy diff --git a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb index ebc57af77a0..a452a65829a 100644 --- a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb @@ -9,8 +9,8 @@ RSpec.describe Ci::StuckBuilds::DropPendingService do create(:ci_build, pipeline: pipeline, runner: runner) end - let(:created_at) { } - let(:updated_at) { } + let(:created_at) {} + let(:updated_at) {} subject(:service) { described_class.new } diff --git a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb index 1416fab3d25..a4f9f97fffc 100644 --- a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb @@ -44,7 +44,7 @@ RSpec.describe Ci::StuckBuilds::DropScheduledService do end context 'when there are no stale scheduled builds' do - let(:job) { } + let(:job) {} it 'does not drop the stale scheduled build yet' do expect { service.execute }.not_to raise_error diff --git a/spec/services/clusters/integrations/create_service_spec.rb b/spec/services/clusters/integrations/create_service_spec.rb index 016511a3c01..9104e07504d 100644 --- a/spec/services/clusters/integrations/create_service_spec.rb +++ b/spec/services/clusters/integrations/create_service_spec.rb @@ -68,7 +68,7 @@ RSpec.describe Clusters::Integrations::CreateService, '#execute' do end it 'errors' do - expect { service.execute}.to raise_error(ArgumentError) + expect { service.execute }.to raise_error(ArgumentError) end end diff --git a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb index a4f018aec0c..064f9e42e96 100644 --- a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb +++ b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb @@ -136,7 +136,7 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do context 'With RBAC enabled cluster' do let(:rbac) { true } - let(:role_binding_name) { "gitlab-#{namespace}"} + let(:role_binding_name) { "gitlab-#{namespace}" } before do cluster.platform_kubernetes.rbac! diff --git a/spec/services/deployments/create_for_build_service_spec.rb b/spec/services/deployments/create_for_build_service_spec.rb index 38d94580512..a2e1acadcc1 100644 --- a/spec/services/deployments/create_for_build_service_spec.rb +++ b/spec/services/deployments/create_for_build_service_spec.rb @@ -41,7 +41,7 @@ RSpec.describe Deployments::CreateForBuildService do end context 'when the corresponding environment does not exist' do - let!(:environment) { } + let!(:environment) {} it 'does not create a deployment record' do expect { subject }.not_to change { Deployment.count } diff --git a/spec/services/git/branch_push_service_spec.rb b/spec/services/git/branch_push_service_spec.rb index 8d41b20c8a9..36a723db9e8 100644 --- a/spec/services/git/branch_push_service_spec.rb +++ b/spec/services/git/branch_push_service_spec.rb @@ -573,7 +573,7 @@ RSpec.describe Git::BranchPushService, services: true do before do allow(project).to receive(:default_branch).and_return('feature') - expect(project).to receive(:change_head) { 'feature'} + expect(project).to receive(:change_head) { 'feature' } end it 'push to first branch updates HEAD' do diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb index f43f64fdf89..f6f395052a8 100644 --- a/spec/services/groups/destroy_service_spec.rb +++ b/spec/services/groups/destroy_service_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Groups::DestroyService do let!(:group) { create(:group) } let!(:nested_group) { create(:group, parent: group) } let!(:project) { create(:project, :repository, :legacy_storage, namespace: group) } - let!(:notification_setting) { create(:notification_setting, source: group)} + let!(:notification_setting) { create(:notification_setting, source: group) } let(:gitlab_shell) { Gitlab::Shell.new } let(:remove_path) { group.path + "+#{group.id}+deleted" } @@ -271,7 +271,7 @@ RSpec.describe Groups::DestroyService do end context 'the shared_with group is deleted' do - let!(:group2_subgroup) { create(:group, :private, parent: group2)} + let!(:group2_subgroup) { create(:group, :private, parent: group2) } let!(:group2_subgroup_project) { create(:project, :private, group: group2_subgroup) } it 'updates project authorizations so users of both groups lose access', :aggregate_failures do diff --git a/spec/services/groups/merge_requests_count_service_spec.rb b/spec/services/groups/merge_requests_count_service_spec.rb index 10c7ba5fca4..8bd350d6f0e 100644 --- a/spec/services/groups/merge_requests_count_service_spec.rb +++ b/spec/services/groups/merge_requests_count_service_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe Groups::MergeRequestsCountService, :use_clean_rails_memory_store_caching do let_it_be(:user) { create(:user) } - let_it_be(:group) { create(:group, :public)} + let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :repository, namespace: group) } let_it_be(:merge_request) { create(:merge_request, source_project: project, target_project: project) } diff --git a/spec/services/groups/open_issues_count_service_spec.rb b/spec/services/groups/open_issues_count_service_spec.rb index fca09bfdebe..923caa6c150 100644 --- a/spec/services/groups/open_issues_count_service_spec.rb +++ b/spec/services/groups/open_issues_count_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_caching do - let_it_be(:group) { create(:group, :public)} + let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :public, namespace: group) } let_it_be(:user) { create(:user) } let_it_be(:issue) { create(:issue, :opened, project: project) } diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb index 856dd4a2567..92957abc918 100644 --- a/spec/services/groups/update_service_spec.rb +++ b/spec/services/groups/update_service_spec.rb @@ -371,7 +371,7 @@ RSpec.describe Groups::UpdateService do end it "hasn't changed the path" do - expect { service.execute}.not_to change { internal_group.reload.path} + expect { service.execute }.not_to change { internal_group.reload.path } end end end diff --git a/spec/services/groups/update_statistics_service_spec.rb b/spec/services/groups/update_statistics_service_spec.rb index 5bef51c2727..84b18b670a7 100644 --- a/spec/services/groups/update_statistics_service_spec.rb +++ b/spec/services/groups/update_statistics_service_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Groups::UpdateStatisticsService do let(:statistics) { %w(wiki_size) } - subject(:service) { described_class.new(group, statistics: statistics)} + subject(:service) { described_class.new(group, statistics: statistics) } describe '#execute', :aggregate_failures do context 'when group is nil' do diff --git a/spec/services/import/fogbugz_service_spec.rb b/spec/services/import/fogbugz_service_spec.rb index c9477dba7a5..7b86c5c45b0 100644 --- a/spec/services/import/fogbugz_service_spec.rb +++ b/spec/services/import/fogbugz_service_spec.rb @@ -119,7 +119,7 @@ RSpec.describe Import::FogbugzService do let(:error_messages_array) { instance_double(Array, join: "something went wrong") } let(:errors_double) { instance_double(ActiveModel::Errors, full_messages: error_messages_array, :[] => nil) } let(:project_double) { instance_double(Project, persisted?: false, errors: errors_double) } - let(:project_creator) { instance_double(Gitlab::FogbugzImport::ProjectCreator, execute: project_double )} + let(:project_creator) { instance_double(Gitlab::FogbugzImport::ProjectCreator, execute: project_double ) } before do allow(Gitlab::FogbugzImport::ProjectCreator).to receive(:new).and_return(project_creator) diff --git a/spec/services/import/validate_remote_git_endpoint_service_spec.rb b/spec/services/import/validate_remote_git_endpoint_service_spec.rb index 9dc862b6ca3..221ac2cd73a 100644 --- a/spec/services/import/validate_remote_git_endpoint_service_spec.rb +++ b/spec/services/import/validate_remote_git_endpoint_service_spec.rb @@ -25,7 +25,7 @@ RSpec.describe Import::ValidateRemoteGitEndpointService do end context 'when uri is using git:// protocol' do - subject { described_class.new(url: 'git://demo.host/repo')} + subject { described_class.new(url: 'git://demo.host/repo') } it 'returns success' do result = subject.execute diff --git a/spec/services/issues/referenced_merge_requests_service_spec.rb b/spec/services/issues/referenced_merge_requests_service_spec.rb index dc55ba8ebea..16166c1fa33 100644 --- a/spec/services/issues/referenced_merge_requests_service_spec.rb +++ b/spec/services/issues/referenced_merge_requests_service_spec.rb @@ -106,7 +106,7 @@ RSpec.describe Issues::ReferencedMergeRequestsService do end describe '#closed_by_merge_requests' do - let(:closed_issue) { build(:issue, :closed, project: project)} + let(:closed_issue) { build(:issue, :closed, project: project) } it 'returns the open merge requests that close this issue' do create_closing_mr(source_project: project, state: 'closed') diff --git a/spec/services/jira_import/start_import_service_spec.rb b/spec/services/jira_import/start_import_service_spec.rb index 510f58f0e75..c0db3012a30 100644 --- a/spec/services/jira_import/start_import_service_spec.rb +++ b/spec/services/jira_import/start_import_service_spec.rb @@ -136,7 +136,7 @@ RSpec.describe JiraImport::StartImportService do end context 'when multiple Jira imports for same Jira project' do - let!(:jira_imports) { create_list(:jira_import_state, 3, :finished, project: project, jira_project_key: fake_key)} + let!(:jira_imports) { create_list(:jira_import_state, 3, :finished, project: project, jira_project_key: fake_key) } it 'creates Jira label title with correct number' do jira_import = subject.payload[:import_data] diff --git a/spec/services/lfs/push_service_spec.rb b/spec/services/lfs/push_service_spec.rb index e1564ca2359..f52bba94eea 100644 --- a/spec/services/lfs/push_service_spec.rb +++ b/spec/services/lfs/push_service_spec.rb @@ -98,7 +98,7 @@ RSpec.describe Lfs::PushService do end def batch_spec(*objects, upload: true, verify: false) - { 'transfer' => 'basic', 'objects' => objects.map {|o| object_spec(o, upload: upload) } } + { 'transfer' => 'basic', 'objects' => objects.map { |o| object_spec(o, upload: upload) } } end def object_spec(object, upload: true, verify: false) diff --git a/spec/services/markdown_content_rewriter_service_spec.rb b/spec/services/markdown_content_rewriter_service_spec.rb index 91a117536ca..d94289856cf 100644 --- a/spec/services/markdown_content_rewriter_service_spec.rb +++ b/spec/services/markdown_content_rewriter_service_spec.rb @@ -8,7 +8,7 @@ RSpec.describe MarkdownContentRewriterService do let_it_be(:target_parent) { create(:project, :public) } let(:content) { 'My content' } - let(:issue) { create(:issue, project: source_parent, description: content)} + let(:issue) { create(:issue, project: source_parent, description: content) } describe '#initialize' do it 'raises an error if source_parent is not a Project' do diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb index d25c8996931..6dbe161ee02 100644 --- a/spec/services/members/invite_service_spec.rb +++ b/spec/services/members/invite_service_spec.rb @@ -455,7 +455,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_ end context 'when access_level is lower than inheriting member' do - let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::GUEST }} + let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::GUEST } } it 'does not add the member and returns an error' do msg = "Access level should be greater than or equal " \ @@ -467,7 +467,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_ end context 'when access_level is the same as the inheriting member' do - let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::DEVELOPER }} + let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::DEVELOPER } } it 'adds the member with correct access_level' do expect_to_create_members(count: 1) @@ -477,7 +477,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_ end context 'when access_level is greater than the inheriting member' do - let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::MAINTAINER }} + let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::MAINTAINER } } it 'adds the member with correct access_level' do expect_to_create_members(count: 1) diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb index 338057f23d5..391377ad801 100644 --- a/spec/services/merge_requests/push_options_handler_service_spec.rb +++ b/spec/services/merge_requests/push_options_handler_service_spec.rb @@ -179,7 +179,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' end @@ -231,7 +231,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the merge request to merge when pipeline succeeds' @@ -284,7 +284,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can remove the source branch when it is merged' @@ -337,7 +337,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the target of a merge request' @@ -390,7 +390,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the title of a merge request' @@ -443,7 +443,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the description of a merge request' @@ -503,7 +503,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the draft of a merge request' @@ -564,7 +564,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can change labels of a merge request', 2 @@ -617,7 +617,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can change labels of a merge request', 1 @@ -672,7 +672,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do context 'with an existing branch that has a merge request open' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can set the milestone of a merge request' @@ -713,7 +713,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do shared_examples 'with an existing branch that has a merge request open in foss' do let(:changes) { existing_branch_changes } - let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)} + let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch) } it_behaves_like 'a service that does not create a merge request' it_behaves_like 'a service that can change assignees of a merge request', 1 diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 4b7dd84474a..09d06b8b2ab 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -185,7 +185,7 @@ RSpec.describe MergeRequests::RefreshService do end context 'when pipeline exists for the source branch' do - let!(:pipeline) { create(:ci_empty_pipeline, ref: @merge_request.source_branch, project: @project, sha: @commits.first.sha)} + let!(:pipeline) { create(:ci_empty_pipeline, ref: @merge_request.source_branch, project: @project, sha: @commits.first.sha) } subject { service.new(project: @project, current_user: @user).execute(@oldrev, @newrev, 'refs/heads/master') } diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb index 212f75d853f..a4cd9ed608b 100644 --- a/spec/services/merge_requests/update_service_spec.rb +++ b/spec/services/merge_requests/update_service_spec.rb @@ -91,7 +91,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer do context 'usage counters' do let(:merge_request2) { create(:merge_request) } - let(:draft_merge_request) { create(:merge_request, :draft_merge_request)} + let(:draft_merge_request) { create(:merge_request, :draft_merge_request) } it 'update as expected' do expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) diff --git a/spec/services/milestones/transfer_service_spec.rb b/spec/services/milestones/transfer_service_spec.rb index afbc9c7dca2..b15d90d685c 100644 --- a/spec/services/milestones/transfer_service_spec.rb +++ b/spec/services/milestones/transfer_service_spec.rb @@ -11,9 +11,9 @@ RSpec.describe Milestones::TransferService do let(:new_group) { create(:group) } let(:old_group) { create(:group) } let(:project) { create(:project, namespace: old_group) } - let(:group_milestone) { create(:milestone, group: old_group)} - let(:group_milestone2) { create(:milestone, group: old_group)} - let(:project_milestone) { create(:milestone, project: project)} + let(:group_milestone) { create(:milestone, group: old_group) } + let(:group_milestone2) { create(:milestone, group: old_group) } + let(:project_milestone) { create(:milestone, project: project) } let!(:issue_with_group_milestone) { create(:issue, project: project, milestone: group_milestone) } let!(:issue_with_project_milestone) { create(:issue, project: project, milestone: project_milestone) } let!(:mr_with_group_milestone) { create(:merge_request, source_project: project, source_branch: 'branch-1', milestone: group_milestone) } @@ -43,7 +43,7 @@ RSpec.describe Milestones::TransferService do context 'when milestone is from an ancestor group' do let(:old_group_ancestor) { create(:group) } let(:old_group) { create(:group, parent: old_group_ancestor) } - let(:group_milestone) { create(:milestone, group: old_group_ancestor)} + let(:group_milestone) { create(:milestone, group: old_group_ancestor) } it 'recreates the missing group milestones at project level' do expect { service.execute }.to change(project.milestones, :count).by(1) diff --git a/spec/services/notes/copy_service_spec.rb b/spec/services/notes/copy_service_spec.rb index ea47087b88f..f146a49e929 100644 --- a/spec/services/notes/copy_service_spec.rb +++ b/spec/services/notes/copy_service_spec.rb @@ -138,7 +138,7 @@ RSpec.describe Notes::CopyService do context 'notes with upload' do let(:uploader) { build(:file_uploader, project: from_noteable.project) } - let(:text) { "Simple text with image: #{uploader.markdown_link} "} + let(:text) { "Simple text with image: #{uploader.markdown_link} " } let!(:note) { create(:note, noteable: from_noteable, note: text, project: from_noteable.project) } it 'rewrites note content correctly' do diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index 98fe8a40c61..b0b0ee8f879 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -2006,19 +2006,19 @@ RSpec.describe NotificationService, :mailer do context 'participating' do it_behaves_like 'participating by assignee notification' do - let(:participant) { create(:user, username: 'user-participant')} + let(:participant) { create(:user, username: 'user-participant') } let(:issuable) { merge_request } let(:notification_trigger) { notification.new_merge_request(merge_request, @u_disabled) } end it_behaves_like 'participating by note notification' do - let(:participant) { create(:user, username: 'user-participant')} + let(:participant) { create(:user, username: 'user-participant') } let(:issuable) { merge_request } let(:notification_trigger) { notification.new_merge_request(merge_request, @u_disabled) } end context 'by author' do - let(:participant) { create(:user, username: 'user-participant')} + let(:participant) { create(:user, username: 'user-participant') } before do merge_request.author = participant diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb index b04a6c8382f..26429a7b5d9 100644 --- a/spec/services/packages/composer/create_package_service_spec.rb +++ b/spec/services/packages/composer/create_package_service_spec.rb @@ -88,7 +88,7 @@ RSpec.describe Packages::Composer::CreatePackageService do end context 'belonging to another project' do - let(:other_project) { create(:project)} + let(:other_project) { create(:project) } let!(:other_package) { create(:composer_package, name: package_name, version: 'dev-master', project: other_project) } it 'fails with an error' do diff --git a/spec/services/packages/create_dependency_service_spec.rb b/spec/services/packages/create_dependency_service_spec.rb index 55414ea68fe..f95e21cd045 100644 --- a/spec/services/packages/create_dependency_service_spec.rb +++ b/spec/services/packages/create_dependency_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Packages::CreateDependencyService do describe '#execute' do - let_it_be(:namespace) {create(:namespace)} + let_it_be(:namespace) { create(:namespace) } let_it_be(:version) { '1.0.1' } let_it_be(:package_name) { "@#{namespace.path}/my-app" } diff --git a/spec/services/packages/debian/extract_deb_metadata_service_spec.rb b/spec/services/packages/debian/extract_deb_metadata_service_spec.rb index ee3f3d179dc..66a9ca5f9e0 100644 --- a/spec/services/packages/debian/extract_deb_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_deb_metadata_service_spec.rb @@ -31,7 +31,7 @@ RSpec.describe Packages::Debian::ExtractDebMetadataService do let(:file_name) { 'README.md' } it 'raise error' do - expect {subject.execute}.to raise_error(described_class::CommandFailedError, /is not a Debian format archive/i) + expect { subject.execute }.to raise_error(described_class::CommandFailedError, /is not a Debian format archive/i) end end end diff --git a/spec/services/packages/debian/extract_metadata_service_spec.rb b/spec/services/packages/debian/extract_metadata_service_spec.rb index e3911dbbfe0..02c81ad1644 100644 --- a/spec/services/packages/debian/extract_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_metadata_service_spec.rb @@ -11,15 +11,10 @@ RSpec.describe Packages::Debian::ExtractMetadataService do end RSpec.shared_examples 'Test Debian ExtractMetadata Service' do |expected_file_type, expected_architecture, expected_fields| - it "returns file_type #{expected_file_type.inspect}" do + it "returns file_type #{expected_file_type.inspect}, architecture #{expected_architecture.inspect} and fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}", :aggregate_failures do expect(subject[:file_type]).to eq(expected_file_type) - end - - it "returns architecture #{expected_architecture.inspect}" do expect(subject[:architecture]).to eq(expected_architecture) - end - it "returns fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}" do if expected_fields.nil? expect(subject[:fields]).to be_nil else diff --git a/spec/services/packages/debian/parse_debian822_service_spec.rb b/spec/services/packages/debian/parse_debian822_service_spec.rb index cad4e81f350..ff146fda250 100644 --- a/spec/services/packages/debian/parse_debian822_service_spec.rb +++ b/spec/services/packages/debian/parse_debian822_service_spec.rb @@ -102,7 +102,7 @@ RSpec.describe Packages::Debian::ParseDebian822Service do let(:input) { ' continuation' } it 'raise error' do - expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error. Unexpected continuation line') + expect { subject.execute }.to raise_error(described_class::InvalidDebian822Error, 'Parse error. Unexpected continuation line') end end @@ -116,7 +116,7 @@ RSpec.describe Packages::Debian::ParseDebian822Service do end it 'raise error' do - expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate field 'Source' in section 'Package: libsample0'") + expect { subject.execute }.to raise_error(described_class::InvalidDebian822Error, "Duplicate field 'Source' in section 'Package: libsample0'") end end @@ -128,7 +128,7 @@ RSpec.describe Packages::Debian::ParseDebian822Service do end it 'raise error' do - expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error on line Hello') + expect { subject.execute }.to raise_error(described_class::InvalidDebian822Error, 'Parse error on line Hello') end end @@ -142,7 +142,7 @@ RSpec.describe Packages::Debian::ParseDebian822Service do end it 'raise error' do - expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate section 'Package: libsample0'") + expect { subject.execute }.to raise_error(described_class::InvalidDebian822Error, "Duplicate section 'Package: libsample0'") end end end diff --git a/spec/services/packages/debian/sign_distribution_service_spec.rb b/spec/services/packages/debian/sign_distribution_service_spec.rb index 2aec0e50636..fc070b6e45e 100644 --- a/spec/services/packages/debian/sign_distribution_service_spec.rb +++ b/spec/services/packages/debian/sign_distribution_service_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Packages::Debian::SignDistributionService do end context 'with an existing key' do - let!(:key) { create("debian_#{container_type}_distribution_key", distribution: distribution)} + let!(:key) { create("debian_#{container_type}_distribution_key", distribution: distribution) } it 'returns the content signed', :aggregate_failures do expect(Packages::Debian::GenerateDistributionKeyService).not_to receive(:new) diff --git a/spec/services/packages/helm/process_file_service_spec.rb b/spec/services/packages/helm/process_file_service_spec.rb index d22c1de2335..1be0153a4a5 100644 --- a/spec/services/packages/helm/process_file_service_spec.rb +++ b/spec/services/packages/helm/process_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' RSpec.describe Packages::Helm::ProcessFileService do - let(:package) { create(:helm_package, without_package_files: true, status: 'processing')} + let(:package) { create(:helm_package, without_package_files: true, status: 'processing') } let!(:package_file) { create(:helm_package_file, without_loaded_metadatum: true, package: package) } let(:channel) { 'stable' } let(:service) { described_class.new(channel, package_file) } diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb index 5b41055397b..a3e59913918 100644 --- a/spec/services/packages/npm/create_package_service_spec.rb +++ b/spec/services/packages/npm/create_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' RSpec.describe Packages::Npm::CreatePackageService do - let(:namespace) {create(:namespace)} + let(:namespace) { create(:namespace) } let(:project) { create(:project, namespace: namespace) } let(:user) { create(:user) } let(:version) { '1.0.1' } @@ -129,7 +129,7 @@ RSpec.describe Packages::Npm::CreatePackageService do end describe 'max file size validation' do - let(:max_file_size) { 5.bytes} + let(:max_file_size) { 5.bytes } shared_examples_for 'max file size validation failure' do it 'returns a 400 error', :aggregate_failures do @@ -160,7 +160,7 @@ RSpec.describe Packages::Npm::CreatePackageService do end context "when encoded package data is padded with '='" do - let(:max_file_size) { 4.bytes} + let(:max_file_size) { 4.bytes } # 'Hello' (size = 5 bytes) => 'SGVsbG8=' let(:encoded_package_data) { 'SGVsbG8=' } @@ -168,7 +168,7 @@ RSpec.describe Packages::Npm::CreatePackageService do end context "when encoded package data is padded with '=='" do - let(:max_file_size) { 3.bytes} + let(:max_file_size) { 3.bytes } # 'Hell' (size = 4 bytes) => 'SGVsbA==' let(:encoded_package_data) { 'SGVsbA==' } diff --git a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb index f23ed0e5fbc..bb84e0cd361 100644 --- a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb +++ b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb @@ -47,9 +47,9 @@ RSpec.describe Packages::Rubygems::DependencyResolverService do end context 'package with dependencies' do - let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package)} - let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package)} - let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package)} + let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package) } + let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package) } + let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package) } it 'returns a set of dependencies' do expected_result = [{ @@ -68,11 +68,11 @@ RSpec.describe Packages::Rubygems::DependencyResolverService do end context 'package with multiple versions' do - let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package)} - let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package)} - let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package)} + let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package) } + let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package) } + let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package) } let(:package2) { create(:package, project: project, name: package.name, version: '9.9.9') } - let(:dependency_link4) { create(:packages_dependency_link, :rubygems, package: package2)} + let(:dependency_link4) { create(:packages_dependency_link, :rubygems, package: package2) } it 'returns a set of dependencies' do expected_result = [{ diff --git a/spec/services/pages/delete_service_spec.rb b/spec/services/pages/delete_service_spec.rb index 29d9a47c72e..8b9e72ac9b1 100644 --- a/spec/services/pages/delete_service_spec.rb +++ b/spec/services/pages/delete_service_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' RSpec.describe Pages::DeleteService do let_it_be(:admin) { create(:admin) } - let(:project) { create(:project, path: "my.project")} - let(:service) { described_class.new(project, admin)} + let(:project) { create(:project, path: "my.project") } + let(:service) { described_class.new(project, admin) } before do project.mark_pages_as_deployed diff --git a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb index 22cada7816b..4de36452684 100644 --- a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb +++ b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb @@ -58,7 +58,7 @@ RSpec.describe Projects::ContainerRepository::ThirdParty::DeleteTagsService do stub_put_manifest_request('Ba', 500, {}) end - it { is_expected.to eq(status: :error, message: "could not delete tags: #{tags.join(', ')}")} + it { is_expected.to eq(status: :error, message: "could not delete tags: #{tags.join(', ')}") } context 'when a large list of tag updates fails' do let(:tags) { Array.new(1000) { |i| "tag_#{i}" } } diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 9486f69fa01..e112c1e2497 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -253,6 +253,39 @@ RSpec.describe Projects::CreateService, '#execute' do end end + context 'user with project limit' do + let_it_be(:user_with_projects_limit) { create(:user, projects_limit: 0) } + + let(:params) { opts.merge!(namespace_id: target_namespace.id) } + + subject(:project) { create_project(user_with_projects_limit, params) } + + context 'under personal namespace' do + let(:target_namespace) { user_with_projects_limit.namespace } + + it 'cannot create a project' do + expect(project.errors.errors.length).to eq 1 + expect(project.errors.messages[:limit_reached].first).to eq(_('Personal project creation is not allowed. Please contact your administrator with questions')) + end + end + + context 'under group namespace' do + let_it_be(:group) do + create(:group).tap do |group| + group.add_owner(user_with_projects_limit) + end + end + + let(:target_namespace) { group } + + it 'can create a project' do + expect(project).to be_valid + expect(project).to be_saved + expect(project.errors.errors.length).to eq 0 + end + end + end + context 'membership overrides', :sidekiq_inline do let_it_be(:group) { create(:group, :private) } let_it_be(:subgroup_for_projects) { create(:group, :private, parent: group) } diff --git a/spec/services/projects/enable_deploy_key_service_spec.rb b/spec/services/projects/enable_deploy_key_service_spec.rb index f297ec374cf..c0b3992037e 100644 --- a/spec/services/projects/enable_deploy_key_service_spec.rb +++ b/spec/services/projects/enable_deploy_key_service_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Projects::EnableDeployKeyService do let(:deploy_key) { create(:deploy_key, public: true) } let(:project) { create(:project) } - let(:user) { project.creator} + let(:user) { project.creator } let!(:params) { { key_id: deploy_key.id } } it 'enables the key' do diff --git a/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb index 047ebe65dff..d472d6493c3 100644 --- a/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Projects::LfsPointers::LfsDownloadLinkListService do let(:lfs_endpoint) { "#{import_url}/info/lfs/objects/batch" } let!(:project) { create(:project, import_url: import_url) } let(:new_oids) { { 'oid1' => 123, 'oid2' => 125 } } - let(:headers) { { 'X-Some-Header' => '456' }} + let(:headers) { { 'X-Some-Header' => '456' } } let(:remote_uri) { URI.parse(lfs_endpoint) } let(:request_object) { HTTParty::Request.new(Net::HTTP::Post, '/') } diff --git a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb index 04c6349bf52..b67b4d64c1d 100644 --- a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb @@ -250,7 +250,7 @@ RSpec.describe Projects::LfsPointers::LfsDownloadService do end context 'that is not blocked' do - let(:redirect_link) { "http://example.com/"} + let(:redirect_link) { "http://example.com/" } before do stub_full_request(download_link).to_return(status: 301, headers: { 'Location' => redirect_link }) diff --git a/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb index 981d7027a17..adcc2b85706 100644 --- a/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' RSpec.describe Projects::LfsPointers::LfsObjectDownloadListService do let(:import_url) { 'http://www.gitlab.com/demo/repo.git' } - let(:default_endpoint) { "#{import_url}/info/lfs/objects/batch"} - let(:group) { create(:group, lfs_enabled: true)} + let(:default_endpoint) { "#{import_url}/info/lfs/objects/batch" } + let(:group) { create(:group, lfs_enabled: true) } let!(:project) { create(:project, namespace: group, import_url: import_url, lfs_enabled: true) } let!(:lfs_objects_project) { create_list(:lfs_objects_project, 2, project: project) } let!(:existing_lfs_objects) { LfsObject.pluck(:oid, :size).to_h } @@ -75,7 +75,7 @@ RSpec.describe Projects::LfsPointers::LfsObjectDownloadListService do end context 'when import url has credentials' do - let(:import_url) { 'http://user:password@www.gitlab.com/demo/repo.git'} + let(:import_url) { 'http://user:password@www.gitlab.com/demo/repo.git' } it 'adds the credentials to the new endpoint' do expect(Projects::LfsPointers::LfsDownloadLinkListService) diff --git a/spec/services/projects/participants_service_spec.rb b/spec/services/projects/participants_service_spec.rb index 61edfd23700..fc745cd669f 100644 --- a/spec/services/projects/participants_service_spec.rb +++ b/spec/services/projects/participants_service_spec.rb @@ -107,7 +107,7 @@ RSpec.describe Projects::ParticipantsService do shared_examples 'return project members' do context 'when there is a project in group namespace' do let_it_be(:public_group) { create(:group, :public) } - let_it_be(:public_project) { create(:project, :public, namespace: public_group)} + let_it_be(:public_project) { create(:project, :public, namespace: public_group) } let_it_be(:public_group_owner) { create(:user) } @@ -125,9 +125,9 @@ RSpec.describe Projects::ParticipantsService do context 'when there is a private group and a public project' do let_it_be(:public_group) { create(:group, :public) } let_it_be(:private_group) { create(:group, :private, :nested) } - let_it_be(:public_project) { create(:project, :public, namespace: public_group)} + let_it_be(:public_project) { create(:project, :public, namespace: public_group) } - let_it_be(:project_issue) { create(:issue, project: public_project)} + let_it_be(:project_issue) { create(:issue, project: public_project) } let_it_be(:public_group_owner) { create(:user) } let_it_be(:private_group_member) { create(:user) } diff --git a/spec/services/projects/update_statistics_service_spec.rb b/spec/services/projects/update_statistics_service_spec.rb index 6987185b549..1cc69e7e2fe 100644 --- a/spec/services/projects/update_statistics_service_spec.rb +++ b/spec/services/projects/update_statistics_service_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Projects::UpdateStatisticsService do using RSpec::Parameterized::TableSyntax - let(:service) { described_class.new(project, nil, statistics: statistics)} + let(:service) { described_class.new(project, nil, statistics: statistics) } let(:statistics) { %w(repository_size) } describe '#execute' do diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb index 3f11eaa7e93..ae36871fcde 100644 --- a/spec/services/quick_actions/interpret_service_spec.rb +++ b/spec/services/quick_actions/interpret_service_spec.rb @@ -1888,7 +1888,7 @@ RSpec.describe QuickActions::InterpretService do context '/target_branch command' do let(:non_empty_project) { create(:project, :repository) } let(:another_merge_request) { create(:merge_request, author: developer, source_project: non_empty_project) } - let(:service) { described_class.new(non_empty_project, developer)} + let(:service) { described_class.new(non_empty_project, developer) } it 'updates target_branch if /target_branch command is executed' do _, updates, _ = service.execute('/target_branch merge-test', merge_request) diff --git a/spec/services/releases/destroy_service_spec.rb b/spec/services/releases/destroy_service_spec.rb index bc5bff0b31d..46550ac5bef 100644 --- a/spec/services/releases/destroy_service_spec.rb +++ b/spec/services/releases/destroy_service_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Releases::DestroyService do end context 'when release is not found' do - let!(:release) { } + let!(:release) {} it 'returns an error' do is_expected.to include(status: :error, diff --git a/spec/services/releases/update_service_spec.rb b/spec/services/releases/update_service_spec.rb index 932a7fab5ec..7461470a844 100644 --- a/spec/services/releases/update_service_spec.rb +++ b/spec/services/releases/update_service_spec.rb @@ -45,7 +45,7 @@ RSpec.describe Releases::UpdateService do end context 'when the release does not exist' do - let!(:release) { } + let!(:release) {} it_behaves_like 'a failed update' end diff --git a/spec/services/resource_access_tokens/create_service_spec.rb b/spec/services/resource_access_tokens/create_service_spec.rb index 127948549b0..442232920f9 100644 --- a/spec/services/resource_access_tokens/create_service_spec.rb +++ b/spec/services/resource_access_tokens/create_service_spec.rb @@ -16,7 +16,7 @@ RSpec.describe ResourceAccessTokens::CreateService do describe '#execute' do shared_examples 'token creation fails' do - let(:resource) { create(:project)} + let(:resource) { create(:project) } it 'does not add the project bot as a member' do expect { subject }.not_to change { resource.members.count } diff --git a/spec/services/search/group_service_spec.rb b/spec/services/search/group_service_spec.rb index 7beeec98b23..152d0700cc1 100644 --- a/spec/services/search/group_service_spec.rb +++ b/spec/services/search/group_service_spec.rb @@ -11,7 +11,7 @@ RSpec.describe Search::GroupService do # These projects shouldn't be found let!(:outside_project) { create(:project, :public, name: "Outside #{term}") } - let!(:private_project) { create(:project, :private, namespace: nested_group, name: "Private #{term}" )} + let!(:private_project) { create(:project, :private, namespace: nested_group, name: "Private #{term}" ) } let!(:other_project) { create(:project, :public, namespace: nested_group, name: term.reverse) } # These projects should be found diff --git a/spec/services/snippets/update_service_spec.rb b/spec/services/snippets/update_service_spec.rb index f61d33e2436..67cc258b4b6 100644 --- a/spec/services/snippets/update_service_spec.rb +++ b/spec/services/snippets/update_service_spec.rb @@ -140,7 +140,7 @@ RSpec.describe Snippets::UpdateService do context 'when snippet_actions param is used' do let(:file_path) { 'CHANGELOG' } - let(:created_file_path) { 'New file'} + let(:created_file_path) { 'New file' } let(:content) { 'foobar' } let(:snippet_actions) { [{ action: :move, previous_path: snippet.file_name, file_path: file_path }, { action: :create, file_path: created_file_path, content: content }] } let(:base_opts) do diff --git a/spec/services/suggestions/apply_service_spec.rb b/spec/services/suggestions/apply_service_spec.rb index 6052882813e..e34324d5fe2 100644 --- a/spec/services/suggestions/apply_service_spec.rb +++ b/spec/services/suggestions/apply_service_spec.rb @@ -359,7 +359,7 @@ RSpec.describe Suggestions::ApplyService do end context 'multiple suggestions' do - let(:author_emails) { suggestions.map {|s| s.note.author.commit_email_or_default } } + let(:author_emails) { suggestions.map { |s| s.note.author.commit_email_or_default } } let(:first_author) { suggestion.note.author } let(:commit) { project.repository.commit } diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb index 2a6adef2155..81c48fb6e15 100644 --- a/spec/services/system_note_service_spec.rb +++ b/spec/services/system_note_service_spec.rb @@ -434,7 +434,7 @@ RSpec.describe SystemNoteService do describe '.created_timelog' do let(:issue) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)} + let(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) } it 'calls TimeTrackingService' do expect_next_instance_of(::SystemNotes::TimeTrackingService) do |service| @@ -447,7 +447,7 @@ RSpec.describe SystemNoteService do describe '.remove_timelog' do let(:issue) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)} + let(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) } it 'calls TimeTrackingService' do expect_next_instance_of(::SystemNotes::TimeTrackingService) do |service| diff --git a/spec/services/system_notes/merge_requests_service_spec.rb b/spec/services/system_notes/merge_requests_service_spec.rb index 58d2489f878..3e66ccef106 100644 --- a/spec/services/system_notes/merge_requests_service_spec.rb +++ b/spec/services/system_notes/merge_requests_service_spec.rb @@ -167,8 +167,8 @@ RSpec.describe ::SystemNotes::MergeRequestsService do end describe '.change_branch' do - let(:old_branch) { 'old_branch'} - let(:new_branch) { 'new_branch'} + let(:old_branch) { 'old_branch' } + let(:new_branch) { 'new_branch' } it_behaves_like 'a system note' do let(:action) { 'branch' } diff --git a/spec/services/system_notes/time_tracking_service_spec.rb b/spec/services/system_notes/time_tracking_service_spec.rb index 65e8632b3ba..be86e8cf388 100644 --- a/spec/services/system_notes/time_tracking_service_spec.rb +++ b/spec/services/system_notes/time_tracking_service_spec.rb @@ -112,7 +112,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService do context 'when the timelog has a positive time spent value' do let_it_be(:noteable, reload: true) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: 1800, spent_at: '2022-03-30T00:00:00.000Z')} + let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: 1800, spent_at: '2022-03-30T00:00:00.000Z') } it 'sets the note text' do expect(subject.note).to eq "added 30m of time spent at 2022-03-30" @@ -122,7 +122,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService do context 'when the timelog has a negative time spent value' do let_it_be(:noteable, reload: true) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: -1800, spent_at: '2022-03-30T00:00:00.000Z')} + let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: -1800, spent_at: '2022-03-30T00:00:00.000Z') } it 'sets the note text' do expect(subject.note).to eq "subtracted 30m of time spent at 2022-03-30" @@ -136,7 +136,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService do context 'when the timelog has a positive time spent value' do let_it_be(:noteable, reload: true) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: 1800, spent_at: '2022-03-30T00:00:00.000Z')} + let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: 1800, spent_at: '2022-03-30T00:00:00.000Z') } it 'sets the note text' do expect(subject.note).to eq "deleted 30m of spent time from 2022-03-30" @@ -146,7 +146,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService do context 'when the timelog has a negative time spent value' do let_it_be(:noteable, reload: true) { create(:issue, project: project) } - let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: -1800, spent_at: '2022-03-30T00:00:00.000Z')} + let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: -1800, spent_at: '2022-03-30T00:00:00.000Z') } it 'sets the note text' do expect(subject.note).to eq "deleted -30m of spent time from 2022-03-30" diff --git a/spec/services/terraform/remote_state_handler_spec.rb b/spec/services/terraform/remote_state_handler_spec.rb index 19c1d4109e9..369309e4d5a 100644 --- a/spec/services/terraform/remote_state_handler_spec.rb +++ b/spec/services/terraform/remote_state_handler_spec.rb @@ -171,7 +171,7 @@ RSpec.describe Terraform::RemoteStateHandler do end context 'with no lock ID (force-unlock)' do - let(:lock_id) { } + let(:lock_id) {} it 'unlocks the state' do state = handler.unlock! diff --git a/spec/services/timelogs/delete_service_spec.rb b/spec/services/timelogs/delete_service_spec.rb index 6f70bf0b68d..ee1133af6b3 100644 --- a/spec/services/timelogs/delete_service_spec.rb +++ b/spec/services/timelogs/delete_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Timelogs::DeleteService do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project, :public) } let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)} + let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) } let(:service) { described_class.new(timelog, user) } @@ -49,7 +49,7 @@ RSpec.describe Timelogs::DeleteService do context 'when the timelog deletion fails' do let(:user) { author } - let!(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)} + let!(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) } before do allow(timelog).to receive(:destroy).and_return(false) diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb index 1cb44366457..5188f10f9a0 100644 --- a/spec/services/todo_service_spec.rb +++ b/spec/services/todo_service_spec.rb @@ -207,7 +207,7 @@ RSpec.describe TodoService do end it_behaves_like 'an incident management tracked event', :incident_management_incident_todo do - let(:current_user) { john_doe} + let(:current_user) { john_doe } end end end @@ -1139,7 +1139,7 @@ RSpec.describe TodoService do it 'updates related todos for the user with the new_state' do method_call - expect(collection.all? { |todo| todo.reload.state?(new_state)}).to be_truthy + expect(collection.all? { |todo| todo.reload.state?(new_state) }).to be_truthy end if new_resolved_by diff --git a/spec/services/todos/destroy/design_service_spec.rb b/spec/services/todos/destroy/design_service_spec.rb index 61a6718dc9d..92b25d94dc6 100644 --- a/spec/services/todos/destroy/design_service_spec.rb +++ b/spec/services/todos/destroy/design_service_spec.rb @@ -9,8 +9,8 @@ RSpec.describe Todos::Destroy::DesignService do let_it_be(:design_2) { create(:design) } let_it_be(:design_3) { create(:design) } - let_it_be(:create_action) { create(:design_action, design: design)} - let_it_be(:create_action_2) { create(:design_action, design: design_2)} + let_it_be(:create_action) { create(:design_action, design: design) } + let_it_be(:create_action_2) { create(:design_action, design: design_2) } describe '#execute' do before do @@ -23,8 +23,8 @@ RSpec.describe Todos::Destroy::DesignService do subject { described_class.new([design.id, design_2.id, design_3.id]).execute } context 'when the design has been archived' do - let_it_be(:archive_action) { create(:design_action, design: design, event: :deletion)} - let_it_be(:archive_action_2) { create(:design_action, design: design_3, event: :deletion)} + let_it_be(:archive_action) { create(:design_action, design: design, event: :deletion) } + let_it_be(:archive_action_2) { create(:design_action, design: design_3, event: :deletion) } it 'removes todos for that design' do expect { subject }.to change { Todo.count }.from(4).to(1) diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb index 339ffc44e4d..fed3ae7a543 100644 --- a/spec/services/web_hook_service_spec.rb +++ b/spec/services/web_hook_service_spec.rb @@ -190,7 +190,7 @@ RSpec.describe WebHookService, :request_store, :clean_gitlab_redis_shared_state end context 'when auth credentials are present' do - let_it_be(:url) {'https://example.org'} + let_it_be(:url) { 'https://example.org' } let_it_be(:project_hook) { create(:project_hook, url: 'https://demo:demo@example.org/') } it 'uses the credentials' do @@ -205,7 +205,7 @@ RSpec.describe WebHookService, :request_store, :clean_gitlab_redis_shared_state end context 'when auth credentials are partial present' do - let_it_be(:url) {'https://example.org'} + let_it_be(:url) { 'https://example.org' } let_it_be(:project_hook) { create(:project_hook, url: 'https://demo@example.org/') } it 'uses the credentials anyways' do diff --git a/spec/services/work_items/create_service_spec.rb b/spec/services/work_items/create_service_spec.rb index 4009c85bacd..92da0c8f227 100644 --- a/spec/services/work_items/create_service_spec.rb +++ b/spec/services/work_items/create_service_spec.rb @@ -170,7 +170,7 @@ RSpec.describe WorkItems::CreateService do let_it_be(:parent) { create(:work_item, :task, project: project) } it_behaves_like 'fails creating work item and returns errors' do - let(:error_message) { 'only Issue and Incident can be parent of Task.'} + let(:error_message) { 'only Issue and Incident can be parent of Task.' } end end @@ -197,7 +197,7 @@ RSpec.describe WorkItems::CreateService do end it_behaves_like 'fails creating work item and returns errors' do - let(:error_message) { 'No matching task found. Make sure that you are adding a valid task ID.'} + let(:error_message) { 'No matching task found. Make sure that you are adding a valid task ID.' } end end end diff --git a/spec/services/work_items/parent_links/create_service_spec.rb b/spec/services/work_items/parent_links/create_service_spec.rb index ccd23977149..0ba41373544 100644 --- a/spec/services/work_items/parent_links/create_service_spec.rb +++ b/spec/services/work_items/parent_links/create_service_spec.rb @@ -12,10 +12,10 @@ RSpec.describe WorkItems::ParentLinks::CreateService do let_it_be(:task1) { create(:work_item, :task, project: project) } let_it_be(:task2) { create(:work_item, :task, project: project) } let_it_be(:guest_task) { create(:work_item, :task) } - let_it_be(:invalid_task) { build_stubbed(:work_item, :task, id: non_existing_record_id)} + let_it_be(:invalid_task) { build_stubbed(:work_item, :task, id: non_existing_record_id) } let_it_be(:another_project) { (create :project) } let_it_be(:other_project_task) { create(:work_item, :task, iid: 100, project: another_project) } - let_it_be(:existing_parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item)} + let_it_be(:existing_parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item) } let(:parent_link_class) { WorkItems::ParentLink } let(:issuable_type) { :task } diff --git a/spec/services/work_items/parent_links/destroy_service_spec.rb b/spec/services/work_items/parent_links/destroy_service_spec.rb index 497f7b67266..654a03ef6f7 100644 --- a/spec/services/work_items/parent_links/destroy_service_spec.rb +++ b/spec/services/work_items/parent_links/destroy_service_spec.rb @@ -9,7 +9,7 @@ RSpec.describe WorkItems::ParentLinks::DestroyService do let_it_be(:project) { create(:project) } let_it_be(:work_item) { create(:work_item, project: project) } let_it_be(:task) { create(:work_item, :task, project: project) } - let_it_be(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item)} + let_it_be(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item) } let(:parent_link_class) { WorkItems::ParentLink } diff --git a/spec/services/work_items/widgets/description_service/update_service_spec.rb b/spec/services/work_items/widgets/description_service/update_service_spec.rb index 37b3f03fc6a..582d9dc85f7 100644 --- a/spec/services/work_items/widgets/description_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/description_service/update_service_spec.rb @@ -17,7 +17,7 @@ RSpec.describe WorkItems::Widgets::DescriptionService::UpdateService do ) end - let(:widget) { work_item.widgets.find {|widget| widget.is_a?(WorkItems::Widgets::Description) } } + let(:widget) { work_item.widgets.find { |widget| widget.is_a?(WorkItems::Widgets::Description) } } describe '#update' do subject { described_class.new(widget: widget, current_user: current_user).before_update_callback(params: params) } diff --git a/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb index 4e155d18fc0..9a425d5308c 100644 --- a/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb @@ -11,7 +11,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do let_it_be(:child_work_item) { create(:work_item, :task, project: project) } let_it_be(:existing_link) { create(:parent_link, work_item: child_work_item, work_item_parent: work_item) } - let(:widget) { work_item.widgets.find {|widget| widget.is_a?(WorkItems::Widgets::Hierarchy) } } + let(:widget) { work_item.widgets.find { |widget| widget.is_a?(WorkItems::Widgets::Hierarchy) } } let(:not_found_error) { 'No matching task found. Make sure that you are adding a valid task ID.' } shared_examples 'raises a WidgetError' do @@ -43,7 +43,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do let_it_be(:child_work_item4) { create(:work_item, :task, project: project) } context 'when work_items_hierarchy feature flag is disabled' do - let(:params) { { children: [child_work_item4] }} + let(:params) { { children: [child_work_item4] } } before do stub_feature_flags(work_items_hierarchy: false) @@ -55,7 +55,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do end context 'when user has insufficient permissions to link work items' do - let(:params) { { children: [child_work_item4] }} + let(:params) { { children: [child_work_item4] } } it_behaves_like 'raises a WidgetError' do let(:message) { not_found_error } @@ -68,7 +68,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do end context 'with valid params' do - let(:params) { { children: [child_work_item2, child_work_item3] }} + let(:params) { { children: [child_work_item2, child_work_item3] } } it 'correctly sets work item parent' do subject @@ -79,7 +79,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do end context 'when child is already assigned' do - let(:params) { { children: [child_work_item] }} + let(:params) { { children: [child_work_item] } } it_behaves_like 'raises a WidgetError' do let(:message) { 'Task(s) already assigned' } @@ -89,7 +89,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do context 'when child type is invalid' do let_it_be(:child_issue) { create(:work_item, project: project) } - let(:params) { { children: [child_issue] }} + let(:params) { { children: [child_issue] } } it_behaves_like 'raises a WidgetError' do let(:message) do @@ -103,7 +103,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do context 'when updating parent' do let_it_be(:work_item) { create(:work_item, :task, project: project) } - let(:params) {{ parent: parent_work_item } } + let(:params) { { parent: parent_work_item } } context 'when work_items_hierarchy feature flag is disabled' do before do @@ -152,9 +152,9 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService do end context 'when type is invalid' do - let_it_be(:parent_task) { create(:work_item, :task, project: project)} + let_it_be(:parent_task) { create(:work_item, :task, project: project) } - let(:params) {{ parent: parent_task } } + let(:params) { { parent: parent_task } } it_behaves_like 'raises a WidgetError' do let(:message) do diff --git a/spec/uploaders/object_storage_spec.rb b/spec/uploaders/object_storage_spec.rb index 1bcc43b81a8..a4f6116f7d7 100644 --- a/spec/uploaders/object_storage_spec.rb +++ b/spec/uploaders/object_storage_spec.rb @@ -256,8 +256,22 @@ RSpec.describe ObjectStorage do describe '#use_open_file' do context 'when file is stored locally' do - it "returns the file" do - expect { |b| uploader.use_open_file(&b) }.to yield_with_args(an_instance_of(ObjectStorage::Concern::OpenFile)) + it "returns the file unlinked" do + expect { |b| uploader.use_open_file(&b) }.to yield_with_args( + satisfying do |f| + expect(f).to be_an_instance_of(ObjectStorage::Concern::OpenFile) + expect(f.file_path).to be_nil + end + ) + end + + it "returns the file not unlinked" do + expect { |b| uploader.use_open_file(unlink_early: false, &b) }.to yield_with_args( + satisfying do |f| + expect(f).to be_an_instance_of(ObjectStorage::Concern::OpenFile) + expect(File.exist?(f.file_path)).to be_truthy + end + ) end end |