Skip to content

Lint factories per associated model class

Peter Leitzen requested to merge pl-factory-per-model into master

What does this MR do and why?

This MR removes the huge ee/spec/models/factories_spec.rb in favor of linting factories per associated model.

Linting is run in a isolated, outer context starting with Lint factories for <described_class>.

Contributes to #436420.

What's the impact?

  • Huge ee/spec/models/factories_spec.rb is removed and spec/support/shared_examples/lint_factories_shared_examples.rb added
  • The factory lints are split across model/lib specs
    • For example, spec/models/user_spec.rb gained 58 more examples (1408 -> 1466 examples)
    • Linting factories multiple times is avoided by ignoring certain example group callers (frontend fixtures, EE extensions, concerns)
    • Time added to model spec by lint factories is bearable. The biggest jump I saw was ~30 seconds for 10 minutes total time.
  • In CI, factories are now linted across multiple CI jobs (thanks to Knapsack)
  • Because not every model has a spec (yet) we are missing 59 factory specs (985 -> 926)
Click to expand
--- before-plain.txt	2024-04-23 14:39:34.010520878 +0200
+++ /home/peter/devel/gitlab/engineering-productivity-team/.local/factories-lint-after.txt	2024-04-23 14:35:55.769655194 +0200
@@ -1,7 +1,6 @@
       abuse_event factory
       abuse_report_event factory
       abuse_report factory
-      abuse_report_label factory
       abuse_trust_score factory
       achievement factory
       active_milestone factory
@@ -40,13 +39,10 @@
       approval_merge_request_rule factory
       approval_merge_request_rules_approved_approver factory
       approval_merge_request_rules_group factory
-      approval_merge_request_rule_source factory
       approval_policy_rule factory
       approval_project_rule factory
       approval_project_rules_group factory
       approval_project_rules_protected_branch factory
-      approval_project_rules_user factory
-      approver factory
       approver_group factory
       asana_integration factory
       assembla_integration factory
@@ -68,10 +64,7 @@
       aws_role factory
       background_migration_job factory
       backlog_list factory
-      backup_compression_options factory
       backup_options factory
-      backup_skippable_operations factory
-      backup_skippable_tasks factory
       bamboo_integration factory
       banned_user factory
       batched_background_migration factory
@@ -149,7 +142,6 @@
       ci_reports_sbom_report factory
       ci_reports_sbom_source factory
       ci_reports_security_aggregated_reports factory
-      ci_reports_security_evidence factory
       ci_reports_security_finding factory
       ci_reports_security_finding_key factory
       ci_reports_security_finding_signature factory
@@ -186,7 +178,6 @@
       ci_unit_test_failure factory
       ci_variable factory
       clickup_integration factory
-      clientless_access_token factory
       closed_issue_event factory
       closed_issue factory
       closed_iteration factory
@@ -206,10 +197,6 @@
       cluster_provider_gcp factory
       clusters_integrations_prometheus factory
       code_owner_rule factory
-      codequality_degradation_1 factory
-      codequality_degradation_2 factory
-      codequality_degradation_3 factory
-      codequality_degradation factory
       color factory
       commit factory
       commit_status factory
@@ -278,7 +265,6 @@
       debian_temporary_with_changes factory
       debian_temporary_with_files factory
       default_plan factory
-      dependency factory
       dependency_list_export factory
       dependency_proxy_blob factory
       dependency_proxy_group_setting factory
@@ -317,8 +303,6 @@
       discussion_note_on_personal_snippet factory
       discussion_note_on_project_snippet factory
       discussion_note_on_vulnerability factory
-      doorkeeper_access_grant factory
-      doorkeeper_access_token factory
       doorkeeper_application factory
       dora_configuration factory
       dora_daily_metrics factory
@@ -354,18 +338,10 @@
       epic factory
       epic_issue factory
       epic_list factory
-      epic_tree_node factory
       epic_user_preference factory
       error_tracking_client_key factory
       error_tracking_error_event factory
       error_tracking_error factory
-      error_tracking_open_api_error_event factory
-      error_tracking_open_api_error factory
-      error_tracking_open_api_error_stats factory
-      error_tracking_project factory
-      error_tracking_sentry_detailed_error factory
-      error_tracking_sentry_error_event factory
-      error_tracking_sentry_error factory
       event factory
       evidence factory
       ewm_integration factory
@@ -377,7 +353,6 @@
       external_status_checks_protected_branch factory
       external_user factory
       external_wiki_integration factory
-      feature_flag_issue factory
       file_diff_position factory
       file_uploader factory
       finding_link factory
@@ -390,24 +365,17 @@
       generic_package factory
       geo_cache_invalidation_event factory
       geo_ci_secure_file_registry factory
-      geo_ci_secure_file_state factory
       geo_container_repository_registry factory
-      geo_container_repository_state factory
       geo_dependency_proxy_blob_registry factory
-      geo_dependency_proxy_blob_state factory
       geo_dependency_proxy_manifest_registry factory
-      geo_dependency_proxy_manifest_state factory
       geo_design_management_repository_registry factory
       geo_design_management_repository_state factory
-      geo_event factory
       geo_event_log factory
       geo_event_log_state factory
       geo_group_wiki_repository_registry factory
-      geo_group_wiki_repository_state factory
       geo_job_artifact_registry factory
       geo_job_artifact_state factory
       geo_lfs_object_registry factory
-      geo_lfs_object_state factory
       geo_merge_request_diff_registry factory
       geo_node factory
       geo_node_namespace_link factory
@@ -415,10 +383,8 @@
       geo_node_with_selective_sync_for factory
       geo_package_file_registry factory
       geo_pages_deployment_registry factory
-      geo_pages_deployment_state factory
       geo_pipeline_artifact_registry factory
       geo_project_repository_registry factory
-      geo_project_state factory
       geo_project_wiki_repository_registry factory
       geo_repositories_changed_event factory
       geo_secondary_usage_data factory
@@ -428,12 +394,8 @@
       geo_upload_state factory
       geo_wiki_repository_state factory
       ghost_user_migration factory
-      gitaly_commit_author factory
-      gitaly_commit factory
-      gitaly_tag factory
       git_guardian_integration factory
       github_integration factory
-      gitlab_license factory
       gitlab_slack_application_integration factory
       gitlab_subscription_add_on factory
       gitlab_subscription_add_on_purchase factory
@@ -512,11 +474,6 @@
       incident_management_timeline_event factory
       incident_management_timeline_event_tag factory
       incident_management_timeline_event_tag_link factory
-      index_status factory
-      insight factory
-      insights_issues_by_team factory
-      insights_issues_by_team_per_month factory
-      insights_merge_requests_per_month factory
       instance_amazon_s3_configuration factory
       instance_audit_events_streaming_header factory
       instance_configuration factory
@@ -560,7 +517,6 @@
       label_link factory
       label_priority factory
       ldap_group_link factory
-      ldap_key factory
       legacy_diff_note_on_commit factory
       legacy_diff_note_on_merge_request factory
       lfs_file_lock factory
@@ -584,7 +540,6 @@
       merge_request_context_commit factory
       merge_request_diff_commit factory
       merge_request_diff_commit_user factory
-      merge_request_diff_detail factory
       merge_request_diff factory
       merge_request_diff_file factory
       merge_request factory
@@ -613,7 +568,6 @@
       ml_model_version_metadata factory
       ml_model_versions factory
       mock_ci_integration factory
-      mock_monitoring_integration factory
       namespace_aggregation_schedules factory
       namespace_ban factory
       namespace_ci_cd_settings factory
@@ -651,7 +605,6 @@
       oauth_access_grant factory
       oauth_access_token factory
       oauth_application factory
-      oauth_openid_request factory
       old_failed_status_check_response factory
       old_passed_status_check_response factory
       old_pending_status_check_response factory
@@ -663,9 +616,7 @@
       operations_feature_flag factory
       operations_feature_flags_client factory
       operations_feature_flag_user_list factory
-      operations_scope factory
       operations_strategy factory
-      orchestration_policy_yaml factory
       organization_detail factory
       organization factory
       organization_owner factory
@@ -693,7 +644,6 @@
       personal_snippet factory
       phone_number_validation factory
       phorge_integration factory
-      pipeline_execution_policy factory
       pipelines_email_integration factory
       pivotaltracker_integration factory
       plan factory
@@ -705,7 +655,6 @@
       pm_checkpoint factory
       pm_compressed_data_object factory
       pm_data_object factory
-      pm_identifier factory
       pm_license factory
       pm_package factory
       pm_package_version factory
@@ -717,7 +666,6 @@
       postgres_autovacuum_activity factory
       postgres_index_bloat_estimate factory
       postgres_index factory
-      predictions factory
       premium_plan factory
       premium_trial_plan factory
       programming_language factory
@@ -740,7 +688,6 @@
       project_error_tracking_setting factory
       project_export_job factory
       project factory
-      project_feature_usage factory
       project_group_link factory
       project_hook factory
       project_imported_event factory
@@ -789,7 +736,6 @@
       redirect_route factory
       redmine_integration factory
       reindex_action factory
-      reindexing_queued_action factory
       related_epic_link factory
       related_link_restriction factory
       relation_export_upload factory
@@ -797,7 +743,6 @@
       release factory
       release_link factory
       remote_development_agent_config factory
-      remote_development_namespace_cluster_agent_mapping factory
       remote_mirror factory
       reopened_issue factory
       reopened_merge_request factory
@@ -834,8 +779,6 @@
       sbom_source factory
       sbom_source_package factory
       sbom_vulnerabilities factory
-      scan_execution_policy factory
-      scan_result_policy factory
       scan_result_policy_read factory
       scan_result_policy_violation factory
       scim_identity factory
@@ -860,7 +803,6 @@
       silver_plan factory
       slack_integration factory
       slack_slash_commands_integration factory
-      smartcard_identity factory
       snippet factory
       snippet_repository factory
       snippet_repository_storage_move factory
@@ -922,7 +864,6 @@
       user_namespace factory
       user_permission_export_upload factory
       user_preference factory
-      users_ops_dashboard_project factory
       users_security_dashboard_project factory
       users_star_project factory
       users_statistics factory

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

How to set up and validate locally

# Run all model spec including all factory specs
bin/rspec <any model spec>

# Run only factory specs
bin/rspec <any model spec> -e "Lint factories for"
Edited by Peter Leitzen

Merge request reports