spec/factories.rb (441 lines of code) (raw):

# frozen_string_literal: true FactoryBot.define do # in more recent rubocop versions, this will be flagd as a violation of FactoryBot/IdSequence, # however this is a false positive and removing it will break the tests. sequence(:id) { |n| n } # rubocop:disable FactoryBot/IdSequence,Lint/RedundantCopDisableDirective sequence(:minor) { |n| n } sequence(:sha) { SecureRandom.hex(20) } sequence(:created_at, aliases: %w[updated_at finished_at]) do Time.now.utc.iso8601 end factory :auto_deploy_ref, class: 'ReleaseTools::AutoDeploy::Version' do major { 42 } minor { generate(:minor) } patch { Time.now.strftime('%Y%m%d%H%M') } gitlab_sha { generate(:sha) } omnibus_sha { generate(:sha) } initialize_with { new("#{major}.#{minor}.#{patch}-#{gitlab_sha[0, 11]}.#{omnibus_sha[0, 11]}") } end factory :gitlab_response, class: 'Gitlab::ObjectifiedHash' do skip_create initialize_with do # NOTE: API responses are in JSON format, meaning String-based keys new(**attributes.deep_stringify_keys) end end factory :comparison, aliases: [:compare], parent: :gitlab_response do commit { nil } commits { [] } compare_timeout { false } diffs { [] } web_url { "https://example.com/foo/bar/compare/foo...bar" } end factory :commit_ref, parent: :gitlab_response do type { 'branch' } name { 'master' } trait :tag do type { 'tag' } name { 'v1.2.0' } end end factory :commit, parent: :gitlab_response do id { generate(:sha) } title { 'foo' } message { 'bar' } short_id { id[0, 8] } parent_ids { [] } author_name { 'GitLab Release Tools Bot' } created_at authored_date { created_at } committed_date { created_at } status { 'success' } trailers { {} } last_pipeline { association(:pipeline, sha: id, status: status) } web_url { "https://example.com/my-group/project/-/commits/#{id}" } factory :release_metadata_commit do transient do version do ReleaseTools::ProductVersion.from_auto_deploy(association(:auto_deploy_ref)).version end auto_deploy { 'true' } end trailers do association(:gitlab_response, 'Product-Version': version, 'Auto-Deploy': auto_deploy.to_s) end end end factory :branch, parent: :gitlab_response do name { 'master' } merged { true } default { true } protected { true } developers_can_push { false } developers_can_merge { false } can_push { true } web_url { "https://example.com/my-group/my-project/-/tree/#{name}" } commit end factory :deployment, parent: :gitlab_response do id iid { id } ref { 'master' } sha status { 'success' } created_at updated_at { created_at } trait(:success) trait(:failed) { status { 'failed' } } trait(:running) { status { 'running' } } # Omnibus deployments are on auto-deploy tags factory :omnibus_deployment do ref { association(:auto_deploy_ref, omnibus_sha: sha) } end end factory :issue, parent: :gitlab_response do id iid { id } project_id { generate(:id) } state { 'opened' } assignees { [] } author { association(:user) } labels { [] } web_url { "https://example.com/foo/bar/-/issues/#{iid}" } title { "A title for issue #{iid}" } references { association(:gitlab_response, short: "##{iid}", relative: "##{iid}", full: "my-group/my-project##{iid}") } created_at trait(:closed) { state { 'closed' } } trait(:opened) { state { 'opened' } } end factory :cve_issue, parent: :issue do id title { "cve issue #{id}" } credit { 'foo' } cve_id { id } cvss_base_score { 0 } cvss_severity { 'None' } cvss_string { 'asdf' } valid_yaml? { true } vulnerability_description { "A bug." } trait :low_severity do cvss_base_score { 2 } cvss_severity { 'Low' } end trait :medium_severity do cvss_base_score { 4 } cvss_severity { 'Medium' } end trait :high_severity do cvss_base_score { 6 } cvss_severity { 'High' } end trait :critical_severity do cvss_base_score { 9 } cvss_severity { 'Critical' } end trait :invalid_yaml do valid_yaml? { false } end end factory :merge_request, parent: :gitlab_response do id iid { id } project_id { generate(:id) } state { 'opened' } source_branch { 'feature-branch' } target_branch { 'master' } assignees { [] } labels { [] } web_url { "https://example.com/foo/bar/-/merge_requests/#{iid}" } merge_when_pipeline_succeeds { false } first_deployed_to_production_at { nil } title { 'MR title' } description { 'MR description' } draft { false } trait(:closed) { state { 'closed' } } trait(:locked) { state { 'locked' } } trait(:merged) { state { 'merged' } } trait(:opened) { state { 'opened' } } trait(:draft) do title { 'DRAFT: MR title' } draft { true } end end factory :pipeline, parent: :gitlab_response do id status { 'created' } ref { 'new-pipeline' } name { 'Pipeline' } sha web_url { "https://example.com/foo/bar/-/pipelines/#{id}" } created_at updated_at { created_at } project_id { 130 } trait(:created) { status { 'created' } } trait(:waiting_for_resource) { status { 'waiting_for_resource' } } trait(:preparing) { status { 'preparing' } } trait(:pending) { status { 'pending' } } trait(:running) { status { 'running' } } trait(:success) do status { 'success' } detailed_status { { text: "passed", label: "passed", group: "success" } } finished_at end trait(:failed) do status { 'failed' } finished_at end trait(:canceled) { status { 'canceled' } } trait(:skipped) { status { 'skipped' } } trait(:manual) { status { 'manual' } } trait(:scheduled) { status { 'scheduled' } } trait(:trigger) { source { 'trigger' } } end factory :pipeline_schedule, parent: :gitlab_response do id description { 'pipeline-schedule' } active { true } last_pipeline { association(:pipeline) } trait(:disabled) { status { 'false' } } end factory :project, parent: :gitlab_response do id name { "Project #{id}" } name_with_namespace { name } description { name } path { name.downcase.underscore } path_with_namespace { path } created_at updated_at { created_at } default_branch { 'main' } trait :fork do forked_from_project { attributes_for(:project) } end end factory :remote_mirror, parent: :gitlab_response do id enabled { 'true' } keep_divergent_refs { 'true' } only_protected_branches { 'true' } update_status { 'finished' } url { "https://*****:*****@example.com/foo/bar.git" } last_error { nil } last_update_at { generate(:updated_at) } last_successful_update_at { last_update_at } last_update_started_at { last_update_at } trait(:disabled) { enabled { 'false' } } trait :failed do update_status { 'failed' } last_successful_update_at { nil } last_error do <<~ERROR Some refs have diverged and have not been updated on the remote: refs/heads/15-0-stable-ee refs/heads/master ERROR end end end factory :job, parent: :gitlab_response do id name { 'new-job' } stage { 'stage1' } status { 'created' } pipeline user created_at updated_at { created_at } web_url { "https://example.com/foo/bar/-/jobs/#{id}" } trait(:success) do status { 'success' } finished_at end trait(:failed) do status { 'failed' } finished_at end trait(:running) do status { 'running' } end trait(:manual) do status { 'manual' } end trait(:pending) do status { 'pending' } end trait(:skipped) do status { 'skipped' } end trait(:canceled) do status { 'canceled' } end end factory :bridge_job, parent: :gitlab_response do id name { 'new-bridge-job' } stage { 'stage1' } status { 'created' } pipeline user downstream_pipeline { association(:pipeline) } created_at updated_at { created_at } trait(:success) do status { 'success' } finished_at end trait(:running) do status { 'running' } end trait(:failed) do status { 'failed' } finished_at end end factory :user, parent: :gitlab_response do id name { 'GitLab User' } username { 'gitlab-user' } end factory :diff, parent: :gitlab_response do diff do <<~HEREDOC --- a/doc/update/5.4-to-6.0.md +++ b/doc/update/5.4-to-6.0.md @@ -71,4 +71,6 @@ sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production +sudo -u git -H bundle exec rake gitlab:assets:compile RAILS_ENV=production +```### 6. Update config files" HEREDOC end new_path { 'doc/update/5.4-to-6.0.md' } old_path { new_path } a_mode { nil } b_mode { '100644' } new_file { false } renamed_file { false } deleted_file { false } end factory :component_metadata, class: Hash do sha version { sha } ref { 'master' } tag { false } initialize_with { attributes.transform_keys(&:to_s) } end factory :releases_metadata, class: Hash do omnibus_gitlab_ee { association(:component_metadata) } gitlab_ee { association(:component_metadata) } gitaly { association(:component_metadata) } gitlab_elasticsearch_indexer { association(:component_metadata) } gitlab_pages { association(:component_metadata) } gitlab_shell { association(:component_metadata) } gitlab_kas { association(:component_metadata) } cng_ee { association(:component_metadata) } gitlab_assets_tag { association(:component_metadata) } mailroom { association(:component_metadata, sha: nil, version: '1.2.3') } initialize_with do attributes.transform_keys do |k| if k == :gitlab_assets_tag || k.to_s == 'gitlab_kas' k.to_s else k.to_s.tr('_', '-') end end end end factory :product_version, class: 'ReleaseTools::ProductVersion' do transient do auto_deploy_ref do association(:auto_deploy_ref, omnibus_sha: metadata.dig('releases', 'omnibus-gitlab-ee', 'sha'), gitlab_sha: metadata.dig('releases', 'gitlab-ee', 'sha')) end version do ReleaseTools::ProductVersion.from_auto_deploy(auto_deploy_ref).version end security { false } releases { association(:releases_metadata) } metadata_commit_id { generate(:sha) } metadata do { 'security' => security, 'releases' => releases } end end after(:build) do |product_version, evaluator| info = ReleaseTools::ProductVersion::MetadataInfo.new( commit_id: evaluator.metadata_commit_id, content: evaluator.metadata ) product_version.instance_variable_set(:@full_metadata, info) end initialize_with do new(version) end end factory :note, parent: :gitlab_response do id noteable_id { nil } noteable_type { 'Issue' } noteable_iid { noteable_id } type { 'DiscussionNote' } body { "Note text" } attachment { nil } author { association(:user) } created_at updated_at { created_at } system { false } resolvable { false } confidential { false } commands_changes { {} } end factory :security_implementation_issue, class: 'ReleaseTools::Security::ImplementationIssue' do skip_create transient do project_id { generate(:id) } end issue { association(:issue, project_id: project_id) } merge_requests { build_list(:merge_request, 4, project_id: project_id) } initialize_with { new(issue, merge_requests) } end factory :label_event, parent: :gitlab_response do id user { association(:user) } created_at resource_type { 'Issue' } resource_id { generate(:id) } label { association(:gitlab_response, name: 'change::in-progress', color: '#0033CC') } action { 'add' } trait :add do action { 'add' } end trait :remove do action { 'remove' } end trait :change_in_progress_label do label { association(:gitlab_response, name: 'change::in-progress', color: '#0033CC') } end trait :change_cancelled_label do label { association(:gitlab_response, name: 'change::cancelled', color: '#428BCA') } end end factory :tag, parent: :gitlab_response do name { 'tag' } target { 'asdf1234' } message { 'foo' } protected { true } commit end factory :token, parent: :gitlab_response do id name { 'a token' } expires_at { (Date.today + 1.year).iso8601 } revoked { false } active { true } trait :revoked do revoked { true } active { false } end trait :expired do expires_at { (Date.today - 1.day).iso8601 } active { false } end end end