Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-04-21 21:09:59 +00:00
parent 1bc88c3806
commit 52ebfa1ac3
29 changed files with 169 additions and 107 deletions

View File

@ -408,25 +408,6 @@ export default {
'ee/app/assets/javascripts/roadmap/components/roadmap_filters.vue',
'ee/app/assets/javascripts/roadmap/components/roadmap_shell.vue',
'ee/app/assets/javascripts/roadmap/components/roadmap_timeline_section.vue',
'ee/app/assets/javascripts/security_configuration/components/configuration_page_layout.vue',
'ee/app/assets/javascripts/security_configuration/components/configuration_snippet_modal.vue',
'ee/app/assets/javascripts/security_configuration/components/container_scanning_for_registry_feature_card.vue',
'ee/app/assets/javascripts/security_configuration/corpus_management/components/corpus_upload_button.vue',
'ee/app/assets/javascripts/security_configuration/dast_pre_scan_verification/components/pre_scan_verification_alert.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/components/base_dast_profile_form.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_profiles_list.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_site_profiles_list.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_variables_form_group.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_variables_modal.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/dast_profile_selector/site_profile_summary.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/dast_profiles_configurator/dast_profiles_configurator.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/dast_scanner_profiles/components/dast_scanner_profile_form.vue',
'ee/app/assets/javascripts/security_configuration/dast_profiles/dast_site_profiles/components/dast_site_profile_form.vue',
'ee/app/assets/javascripts/security_configuration/dast_site_validation/components/dast_site_validation_modal.vue',
'ee/app/assets/javascripts/security_configuration/dast_site_validation/components/dast_site_validation_revoke_modal.vue',
'ee/app/assets/javascripts/security_configuration/sast/components/app.vue',
'ee/app/assets/javascripts/security_configuration/secret_detection/components/exclusion_delete_modal.vue',
'ee/app/assets/javascripts/security_configuration/secret_detection/components/exclusion_form_drawer.vue',
'ee/app/assets/javascripts/security_dashboard/components/agent/agent_vulnerability_report.vue',
'ee/app/assets/javascripts/security_dashboard/components/pipeline/pipeline_vulnerability_report.vue',
'ee/app/assets/javascripts/security_dashboard/components/pipeline/vulnerability_finding_modal.vue',

View File

@ -109,8 +109,6 @@ Gitlab/FeatureFlagWithoutActor:
- 'ee/lib/gitlab/llm/tanuki_bot.rb'
- 'ee/lib/gitlab/search/zoekt/client.rb'
- 'ee/lib/gitlab/usage_data_counters/epic_activity_unique_counter.rb'
- 'ee/lib/gitlab_subscriptions/billable_users_utils.rb'
- 'ee/lib/gitlab_subscriptions/member_management/promotion_management_utils.rb'
- 'ee/lib/search/zoekt/circuit_breaker.rb'
- 'ee/spec/lib/gitlab/product_analytics/developments/setup_spec.rb'
- 'ee/spec/models/gitlab_subscriptions/features_spec.rb'

View File

@ -589,7 +589,6 @@ Layout/LineEndStringConcatenationIndentation:
- 'spec/support/helpers/stub_gitlab_calls.rb'
- 'spec/support/matchers/have_gitlab_http_status.rb'
- 'spec/support/permissions_check.rb'
- 'spec/support/rspec_run_time.rb'
- 'spec/support/shared_examples/features/inviting_members_shared_examples.rb'
- 'spec/support/shared_examples/features/project_upload_files_shared_examples.rb'
- 'spec/support/shared_examples/features/value_streams_dashboard_shared_examples.rb'

View File

@ -668,7 +668,6 @@ Layout/LineLength:
- 'ee/app/services/ee/groups/import_export/import_service.rb'
- 'ee/app/services/ee/groups/update_service.rb'
- 'ee/app/services/ee/ip_restrictions/update_service.rb'
- 'ee/app/services/ee/issuable/common_system_notes_service.rb'
- 'ee/app/services/ee/issues/base_service.rb'
- 'ee/app/services/ee/issues/clone_service.rb'
- 'ee/app/services/ee/merge_requests/merge_base_service.rb'
@ -803,7 +802,6 @@ Layout/LineLength:
- 'ee/lib/ee/api/entities/application_setting.rb'
- 'ee/lib/ee/api/entities/dependency.rb'
- 'ee/lib/ee/api/entities/epic.rb'
- 'ee/lib/ee/api/entities/group.rb'
- 'ee/lib/ee/api/entities/member.rb'
- 'ee/lib/ee/api/entities/namespace.rb'
- 'ee/lib/ee/api/entities/project.rb'

View File

@ -1 +0,0 @@
# Empty after resolving Lint/SafeNavigationConsistency

View File

@ -171,7 +171,6 @@ Lint/UnusedMethodArgument:
- 'app/workers/gitlab/jira_import/import_issue_worker.rb'
- 'app/workers/issues/rebalancing_worker.rb'
- 'app/workers/personal_access_tokens/expired_notification_worker.rb'
- 'app/workers/projects/inactive_projects_deletion_cron_worker.rb'
- 'app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb'
- 'config/initializers/00_active_record_disable_joins.rb'
- 'config/initializers/active_record_table_definition.rb'

View File

@ -91,7 +91,6 @@ Rails/Date:
- 'ee/spec/requests/gitlab_subscriptions/api/internal/users_spec.rb'
- 'ee/spec/requests/groups/settings/access_tokens_controller_spec.rb'
- 'ee/spec/requests/projects/settings/access_tokens_controller_spec.rb'
- 'ee/spec/serializers/ee/group_child_entity_spec.rb'
- 'ee/spec/services/app_sec/dast/profile_schedules/audit/update_service_spec.rb'
- 'ee/spec/services/audit_event_service_spec.rb'
- 'ee/spec/services/ci/minutes/additional_packs/create_service_spec.rb'

View File

@ -6,7 +6,6 @@ Rake/Require:
- 'lib/tasks/contracts/pipeline_schedules.rake'
- 'lib/tasks/contracts/pipelines.rake'
- 'lib/tasks/gitlab/artifacts/migrate.rake'
- 'lib/tasks/gitlab/backup.rake'
- 'lib/tasks/gitlab/docs/redirect.rake'
- 'lib/tasks/gitlab/graphql.rake'
- 'lib/tasks/gitlab/lfs/migrate.rake'

View File

@ -17,7 +17,6 @@ Rake/TopLevelMethodDefinition:
- 'lib/tasks/gettext.rake'
- 'lib/tasks/gitlab/assets.rake'
- 'lib/tasks/gitlab/background_migrations.rake'
- 'lib/tasks/gitlab/backup.rake'
- 'lib/tasks/gitlab/cleanup.rake'
- 'lib/tasks/gitlab/click_house/migration.rake'
- 'lib/tasks/gitlab/container_registry.rake'

View File

@ -376,7 +376,6 @@ RSpec/BeEq:
- 'ee/spec/requests/users/identity_verification_controller_spec.rb'
- 'ee/spec/requests/users/registrations_identity_verification_controller_spec.rb'
- 'ee/spec/serializers/ee/admin/abuse_report_details_entity_spec.rb'
- 'ee/spec/serializers/ee/group_child_entity_spec.rb'
- 'ee/spec/serializers/ee/note_entity_spec.rb'
- 'ee/spec/serializers/environment_entity_spec.rb'
- 'ee/spec/serializers/epic_note_entity_spec.rb'
@ -497,7 +496,6 @@ RSpec/BeEq:
- 'ee/spec/support_specs/stub_saas_features_spec.rb'
- 'ee/spec/workers/app_sec/container_scanning/scan_image_worker_spec.rb'
- 'ee/spec/workers/click_house/rebuild_materialized_view_cron_worker_spec.rb'
- 'ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb'
- 'ee/spec/workers/ee/repository_check/batch_worker_spec.rb'
- 'ee/spec/workers/ee/repository_check/single_repository_worker_spec.rb'
- 'ee/spec/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker_spec.rb'

View File

@ -1706,7 +1706,6 @@ RSpec/FeatureCategory:
- 'spec/helpers/gitlab_routing_helper_spec.rb'
- 'spec/helpers/gitlab_script_tag_helper_spec.rb'
- 'spec/helpers/graph_helper_spec.rb'
- 'spec/helpers/hooks_helper_spec.rb'
- 'spec/helpers/icons_helper_spec.rb'
- 'spec/helpers/instance_configuration_helper_spec.rb'
- 'spec/helpers/invite_members_helper_spec.rb'
@ -2140,7 +2139,6 @@ RSpec/FeatureCategory:
- 'spec/lib/gitlab/ci/status/bridge/waiting_for_resource_spec.rb'
- 'spec/lib/gitlab/ci/status/build/action_spec.rb'
- 'spec/lib/gitlab/ci/status/build/cancelable_spec.rb'
- 'spec/lib/gitlab/ci/status/build/common_spec.rb'
- 'spec/lib/gitlab/ci/status/build/created_spec.rb'
- 'spec/lib/gitlab/ci/status/build/erased_spec.rb'
- 'spec/lib/gitlab/ci/status/build/factory_spec.rb'

View File

@ -113,7 +113,6 @@ Style/HashEachMethods:
- 'spec/models/user_spec.rb'
- 'spec/presenters/ci/pipeline_presenter_spec.rb'
- 'spec/presenters/commit_status_presenter_spec.rb'
- 'spec/requests/api/project_templates_spec.rb'
- 'spec/services/system_notes/incident_service_spec.rb'
- 'spec/support/helpers/database/multiple_databases_helpers.rb'
- 'spec/support/helpers/reactive_caching_helpers.rb'

View File

@ -1453,7 +1453,6 @@ Style/InlineDisableAnnotation:
- 'ee/lib/ee/gitlab/object_hierarchy.rb'
- 'ee/lib/ee/gitlab/quick_actions/users_extractor.rb'
- 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/ee/users/internal.rb'
- 'ee/lib/elastic/instance_proxy_util.rb'
- 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/elastic/latest/note_class_proxy.rb'
@ -2034,7 +2033,6 @@ Style/InlineDisableAnnotation:
- 'lib/tasks/tokens.rake'
- 'lib/unnested_in_filters/dsl.rb'
- 'lib/uploaded_file.rb'
- 'lib/users/internal.rb'
- 'locale/unfound_translations.rb'
- 'metrics_server/dependencies.rb'
- 'metrics_server/metrics_server.rb'

View File

@ -30,7 +30,6 @@ Style/MutableConstant:
- 'lib/gitlab/seeder.rb'
- 'lib/gitlab/sidekiq_signals.rb'
- 'lib/gitlab/web_hooks/recursion_detection/uuid.rb'
- 'lib/tasks/gitlab/backup.rake'
- 'scripts/perf/gc/collect_gc_stats.rb'
- 'spec/support/helpers/jira_integration_helpers.rb'
- 'tooling/danger/stable_branch.rb'

View File

@ -1,46 +0,0 @@
#import "~/graphql_shared/fragments/ci_icon.fragment.graphql"
fragment BaseProject on Project {
id
fullPath
archived
nameWithNamespace
webUrl
topics
forksCount
avatarUrl
starCount
visibility
openMergeRequestsCount
openIssuesCount
descriptionHtml
createdAt
updatedAt
lastActivityAt
group {
id
}
mergeRequestsAccessLevel {
stringValue
}
issuesAccessLevel {
stringValue
}
forkingAccessLevel {
stringValue
}
userPermissions {
removeProject
viewEditPage
}
maxAccessLevel {
integerValue
}
isCatalogResource
exploreCatalogPath
pipeline {
detailedStatus {
...CiIcon
}
}
}

View File

@ -1,5 +1,50 @@
#import "./base_project.fragment.graphql"
#import "~/graphql_shared/fragments/ci_icon.fragment.graphql"
fragment Project on Project {
...BaseProject
id
fullPath
archived
nameWithNamespace
webUrl
topics
forksCount
avatarUrl
starCount
visibility
openMergeRequestsCount
openIssuesCount
descriptionHtml
createdAt
updatedAt
lastActivityAt
group {
id
}
mergeRequestsAccessLevel {
stringValue
}
issuesAccessLevel {
stringValue
}
forkingAccessLevel {
stringValue
}
userPermissions {
removeProject
viewEditPage
}
maxAccessLevel {
integerValue
}
isCatalogResource
exploreCatalogPath
pipeline {
id
detailedStatus {
...CiIcon
}
}
markedForDeletionOn
isAdjournedDeletionEnabled
permanentDeletionDate
}

View File

@ -1,5 +1,5 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "ee_else_ce/graphql_shared/fragments/project.fragment.graphql"
#import "~/graphql_shared/fragments/project.fragment.graphql"
query getOrganizationProjects(
$id: OrganizationsOrganizationID!

View File

@ -1,5 +1,5 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "ee_else_ce/graphql_shared/fragments/project.fragment.graphql"
#import "~/graphql_shared/fragments/project.fragment.graphql"
query getYourWorkProjects(
$archived: ProjectArchived = EXCLUDE

View File

@ -1,5 +1,5 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "ee_else_ce/graphql_shared/fragments/project.fragment.graphql"
#import "~/graphql_shared/fragments/project.fragment.graphql"
query getYourWorkUserProjects(
$contributed: Boolean = false

View File

@ -1,4 +1,4 @@
import ProjectListItemDescription from './project_list_item_description.vue';
import ProjectListItemDescription from '~/vue_shared/components/projects_list/project_list_item_description.vue';
export default {
component: ProjectListItemDescription,
@ -28,3 +28,13 @@ Default.args = {
The app integrates with smart home devices and local transportation data to provide real-time suggestions for energy savings and greener commutes.</p>`,
},
};
export const PendingDeletionProject = Template.bind({});
PendingDeletionProject.args = {
...Default.args,
project: {
...Default.args.project,
markedForDeletionOn: '2024-12-01',
permanentDeletionDate: '2024-12-07',
},
};

View File

@ -1,11 +1,20 @@
<script>
import { GlSprintf, GlIcon } from '@gitlab/ui';
import { SHORT_DATE_FORMAT } from '~/vue_shared/constants';
import { s__ } from '~/locale';
import { formatDate, newDate } from '~/lib/utils/datetime_utility';
import SafeHtml from '~/vue_shared/directives/safe_html';
import ListItemDescription from '~/vue_shared/components/resource_lists/list_item_description.vue';
export default {
name: 'ProjectListItemDescription',
i18n: {
scheduledDeletion: s__('Projects|Scheduled for deletion on %{date}'),
},
components: {
ListItemDescription,
GlSprintf,
GlIcon,
},
directives: {
SafeHtml,
@ -17,6 +26,12 @@ export default {
},
},
computed: {
isPendingDeletion() {
return Boolean(this.project.markedForDeletionOn);
},
formattedDate() {
return formatDate(newDate(this.project.permanentDeletionDate), SHORT_DATE_FORMAT);
},
showDescription() {
return this.project.descriptionHtml && !this.project.archived;
},
@ -25,5 +40,13 @@ export default {
</script>
<template>
<list-item-description v-if="showDescription" :description-html="project.descriptionHtml" />
<div v-if="isPendingDeletion" class="md gl-mt-2 gl-text-sm gl-text-secondary">
<gl-icon name="calendar" />
<gl-sprintf :message="$options.i18n.scheduledDeletion">
<template #date>
{{ formattedDate }}
</template>
</gl-sprintf>
</div>
<list-item-description v-else-if="showDescription" :description-html="project.descriptionHtml" />
</template>

View File

@ -5,6 +5,7 @@ import { __ } from '~/locale';
export default {
name: 'ProjectListItemInactiveBadge',
i18n: {
pendingDeletion: __('Pending deletion'),
archived: __('Archived'),
},
components: {
@ -17,7 +18,17 @@ export default {
},
},
computed: {
isPendingDeletion() {
return Boolean(this.project.markedForDeletionOn);
},
inactiveBadge() {
if (this.isPendingDeletion) {
return {
variant: 'warning',
text: this.$options.i18n.pendingDeletion,
};
}
if (this.project.archived) {
return {
variant: 'info',

View File

@ -5,9 +5,9 @@ import {
renderDeleteSuccessToast,
deleteParams,
} from 'ee_else_ce/vue_shared/components/projects_list/utils';
import ProjectListItemDescription from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_description.vue';
import ProjectListItemDescription from '~/vue_shared/components/projects_list/project_list_item_description.vue';
import ProjectListItemActions from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_actions.vue';
import ProjectListItemInactiveBadge from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_inactive_badge.vue';
import ProjectListItemInactiveBadge from '~/vue_shared/components/projects_list/project_list_item_inactive_badge.vue';
import { VISIBILITY_TYPE_ICON, PROJECT_VISIBILITY_TYPE } from '~/visibility_level/constants';
import { ACCESS_LEVEL_LABELS, ACCESS_LEVEL_NO_ACCESS_INTEGER } from '~/access_level/constants';
import { FEATURABLE_ENABLED } from '~/featurable/constants';

View File

@ -1559,7 +1559,7 @@ This is not applicable yet as multiple indices functionality is not fully implem
{{< /alert >}}
Currently GitLab can only handle a single version of setting. Any setting/schema changes would require reindexing everything from scratch. Since reindexing can take a long time, this can cause search functionality downtime.
Currently, GitLab can only handle a single version of setting. Any setting/schema changes would require reindexing everything from scratch. Since reindexing can take a long time, this can cause search functionality downtime.
To avoid downtime, GitLab is working to support multiple indices that
can function at the same time. Whenever the schema changes, the administrator
@ -1571,7 +1571,7 @@ index.
This is also helpful for migrating to new servers, for example, moving to/from AWS.
Currently we are on the process of migrating to this new design. Everything is hardwired to work with one single version for now.
Currently, we are on the process of migrating to this new design. Everything is hardwired to work with one single version for now.
## Performance Monitoring
@ -1586,12 +1586,12 @@ is impacting overall performance relative to the time spent doing other things.
GitLab also exports [Prometheus metrics](../administration/monitoring/prometheus/gitlab_metrics.md)
for indexing queues, which can help diagnose performance bottlenecks and determine
whether or not your GitLab instance or Elasticsearch server can keep up with
whether your GitLab instance or Elasticsearch server can keep up with
the volume of updates.
### Logs
All of the indexing happens in Sidekiq, so much of the relevant logs for the
All indexing happens in Sidekiq, so much of the relevant logs for the
Elasticsearch integration can be found in
[`sidekiq.log`](../administration/logs/_index.md#sidekiqlog). In particular, all
Sidekiq workers that make requests to Elasticsearch in any way will log the
@ -1631,6 +1631,7 @@ in the cluster back the request in GitLab.
- [Creating indices from scratch](advanced_search/tips.md#creating-all-indices-from-scratch-and-populating-with-local-data)
- [Index data](advanced_search/tips.md#index-data)
- [Updating dependent associations in the index](advanced_search/tips.md#dependent-association-index-updates)
- [Kibana](advanced_search/tips.md#kibana)
- [Running tests with Elasticsearch](advanced_search/tips.md#testing)
- [Testing migrations](advanced_search/tips.md#advanced-search-migrations)

View File

@ -100,6 +100,18 @@ Elastic::ProcessBookkeepingService.track!(*MergeRequest.all)
Elastic::ProcessBookkeepingService.new.execute
```
## Dependent association index updates
You can use elastic_index_dependant_association to automatically update associated records in the index
when specific fields change. For example, to reindex all work items when a project's `visibility_level` changes
```ruby
elastic_index_dependant_association :work_items, on_change: :visibility_level, depends_on_finished_migration: :add_mapping_migration
```
The `depends_on_finished_migration` parameter is optional and ensures the update only occurs after the specified advanced
search migration has completed (such as a migration that added the necessary field to the mapping).
## Testing
{{< alert type="warning" >}}

View File

@ -19961,9 +19961,6 @@ msgstr ""
msgid "DastProfiles|No variables found"
msgstr ""
msgid "DastProfiles|Not Validated"
msgstr ""
msgid "DastProfiles|Number of workers that passive scan in parallel. Defaults to the number of available CPUs."
msgstr ""
@ -20270,9 +20267,6 @@ msgstr ""
msgid "DastProfiles|Validate site profile"
msgstr ""
msgid "DastProfiles|Validated"
msgstr ""
msgid "DastProfiles|Validation status"
msgstr ""
@ -57400,6 +57394,9 @@ msgstr ""
msgid "Simulate a pipeline created for the default branch"
msgstr ""
msgid "Single component can be selected for component filter to be able to filter by version."
msgstr ""
msgid "Site profile failed to delete"
msgstr ""

View File

@ -1,9 +1,9 @@
import { GlTruncateText } from '@gitlab/ui';
import { GlIcon, GlSprintf, GlTruncateText } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ProjectListItemDescription from '~/vue_shared/components/projects_list/project_list_item_description.vue';
import ListItemDescription from '~/vue_shared/components/resource_lists/list_item_description.vue';
describe('ProjectListItemDescriptionCE', () => {
describe('ProjectListItemDescription', () => {
let wrapper;
const defaultProps = {
@ -15,11 +15,12 @@ describe('ProjectListItemDescriptionCE', () => {
const createComponent = ({ props = {} } = {}) => {
wrapper = shallowMountExtended(ProjectListItemDescription, {
propsData: { ...defaultProps, ...props },
stubs: { GlTruncateText },
stubs: { GlTruncateText, GlSprintf },
});
};
const findListItemDescription = () => wrapper.findComponent(ListItemDescription);
const findGlIcon = () => wrapper.findComponent(GlIcon);
describe('when project has a description but is archived', () => {
it('does not render description', () => {
@ -59,4 +60,21 @@ describe('ProjectListItemDescriptionCE', () => {
expect(findListItemDescription().exists()).toBe(false);
});
});
describe('when pending deletion', () => {
it('renders correct icon and scheduled for deletion information', () => {
createComponent({
props: {
project: {
...defaultProps.project,
markedForDeletionOn: '2024-12-24',
permanentDeletionDate: '2024-12-31',
},
},
});
expect(findGlIcon().props('name')).toBe('calendar');
expect(wrapper.text().replace(/\s+/g, ' ')).toBe('Scheduled for deletion on Dec 31, 2024');
});
});
});

View File

@ -55,4 +55,32 @@ describe('ProjectListItemInactiveBadgeCE', () => {
expect(findGlBadge().exists()).toBe(false);
});
});
describe.each`
archived | markedForDeletionOn | variant | text
${false} | ${null} | ${false} | ${false}
${true} | ${null} | ${'info'} | ${'Archived'}
${false} | ${'2024-01-01'} | ${'warning'} | ${'Pending deletion'}
${true} | ${'2024-01-01'} | ${'warning'} | ${'Pending deletion'}
`(
'when project.archived is $archived and project.markedForDeletionOn is $markedForDeletionOn',
({ archived, markedForDeletionOn, variant, text }) => {
beforeEach(() => {
createComponent({
props: {
project: {
...project,
archived,
markedForDeletionOn,
},
},
});
});
it('renders the badge correctly', () => {
expect(findGlBadge().exists() && findGlBadge().props('variant')).toBe(variant);
expect(findGlBadge().exists() && findGlBadge().text()).toBe(text);
});
},
);
});

View File

@ -3,9 +3,9 @@ import { GlAvatarLabeled, GlIcon, GlTooltip } from '@gitlab/ui';
import projects from 'test_fixtures/api/users/projects/get.json';
import { stubComponent } from 'helpers/stub_component';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import ProjectListItemDescription from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_description.vue';
import ProjectListItemDescription from '~/vue_shared/components/projects_list/project_list_item_description.vue';
import ProjectListItemActions from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_actions.vue';
import ProjectListItemInactiveBadge from 'ee_else_ce/vue_shared/components/projects_list/project_list_item_inactive_badge.vue';
import ProjectListItemInactiveBadge from '~/vue_shared/components/projects_list/project_list_item_inactive_badge.vue';
import ProjectsListItem from '~/vue_shared/components/projects_list/projects_list_item.vue';
import { ACTION_EDIT, ACTION_DELETE } from '~/vue_shared/components/list_actions/constants';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';