summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/background_migration/nullify_last_error_from_project_mirror_data_spec.rb
blob: 62f908ed79be5832c83628e4c10c6dc274af272a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::BackgroundMigration::NullifyLastErrorFromProjectMirrorData, feature_category: :source_code_management do # rubocop:disable Layout/LineLength
  it 'nullifies last_error column on all rows' do
    namespaces = table(:namespaces)
    projects = table(:projects)
    project_import_states = table(:project_mirror_data)

    group = namespaces.create!(name: 'gitlab', path: 'gitlab-org')

    project_namespace_1 = namespaces.create!(name: 'gitlab', path: 'gitlab-org')
    project_namespace_2 = namespaces.create!(name: 'gitlab', path: 'gitlab-org')
    project_namespace_3 = namespaces.create!(name: 'gitlab', path: 'gitlab-org')

    project_1 = projects.create!(
      namespace_id: group.id,
      project_namespace_id: project_namespace_1.id,
      name: 'test1'
    )
    project_2 = projects.create!(
      namespace_id: group.id,
      project_namespace_id: project_namespace_2.id,
      name: 'test2'
    )
    project_3 = projects.create!(
      namespace_id: group.id,
      project_namespace_id: project_namespace_3.id,
      name: 'test3'
    )

    project_import_state_1 = project_import_states.create!(
      project_id: project_1.id,
      status: 0,
      last_update_started_at: 1.hour.ago,
      last_update_scheduled_at: 1.hour.ago,
      last_update_at: 1.hour.ago,
      last_successful_update_at: 2.days.ago,
      last_error: '13:fetch remote: "fatal: unable to look up user:pass@gitlab.com (port 9418) (nodename nor servname provided, or not known)\n": exit status 128.', # rubocop:disable Layout/LineLength
      correlation_id_value: SecureRandom.uuid,
      jid: SecureRandom.uuid
    )

    project_import_states.create!(
      project_id: project_2.id,
      status: 1,
      last_update_started_at: 1.hour.ago,
      last_update_scheduled_at: 1.hour.ago,
      last_update_at: 1.hour.ago,
      last_successful_update_at: nil,
      next_execution_timestamp: 1.day.from_now,
      last_error: '',
      correlation_id_value: SecureRandom.uuid,
      jid: SecureRandom.uuid
    )

    project_import_state_3 = project_import_states.create!(
      project_id: project_3.id,
      status: 2,
      last_update_started_at: 1.hour.ago,
      last_update_scheduled_at: 1.hour.ago,
      last_update_at: 1.hour.ago,
      last_successful_update_at: 1.hour.ago,
      next_execution_timestamp: 1.day.from_now,
      last_error: nil,
      correlation_id_value: SecureRandom.uuid,
      jid: SecureRandom.uuid
    )

    migration = described_class.new(
      start_id: project_import_state_1.id,
      end_id: project_import_state_3.id,
      batch_table: :project_mirror_data,
      batch_column: :id,
      sub_batch_size: 1,
      pause_ms: 0,
      connection: ApplicationRecord.connection
    )

    w_last_error_count = -> { project_import_states.where.not(last_error: nil).count } # rubocop:disable CodeReuse/ActiveRecord
    expect { migration.perform }.to change(&w_last_error_count).from(2).to(0)
  end
end