summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
blob: 2c2c048992f40fde6635c070c7fb74faf6d5f8fa (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::BackgroundMigration::MergeTopicsWithSameName, schema: 20220331133802 do
  def set_avatar(topic_id, avatar)
    topic = ::Projects::Topic.find(topic_id)
    topic.avatar = avatar
    topic.save!
    topic.avatar.absolute_path
  end

  it 'merges project topics with same case insensitive name' do
    namespaces = table(:namespaces)
    projects = table(:projects)
    topics = table(:topics)
    project_topics = table(:project_topics)

    group_1 = namespaces.create!(name: 'space1', type: 'Group', path: 'space1')
    group_2 = namespaces.create!(name: 'space2', type: 'Group', path: 'space2')
    group_3 = namespaces.create!(name: 'space3', type: 'Group', path: 'space3')
    proj_space_1 = namespaces.create!(name: 'proj1', path: 'proj1', type: 'Project', parent_id: group_1.id)
    proj_space_2 = namespaces.create!(name: 'proj2', path: 'proj2', type: 'Project', parent_id: group_2.id)
    proj_space_3 = namespaces.create!(name: 'proj3', path: 'proj3', type: 'Project', parent_id: group_3.id)
    project_1 = projects.create!(namespace_id: group_1.id, project_namespace_id: proj_space_1.id, visibility_level: 20)
    project_2 = projects.create!(namespace_id: group_2.id, project_namespace_id: proj_space_2.id, visibility_level: 10)
    project_3 = projects.create!(namespace_id: group_3.id, project_namespace_id: proj_space_3.id, visibility_level: 0)
    topic_1_keep = topics.create!(
      name: 'topic1',
      title: 'Topic 1',
      description: 'description 1 to keep',
      total_projects_count: 2,
      non_private_projects_count: 2
    )
    topic_1_remove = topics.create!(
      name: 'TOPIC1',
      title: 'Topic 1',
      description: 'description 1 to remove',
      total_projects_count: 2,
      non_private_projects_count: 1
    )
    topic_2_remove = topics.create!(
      name: 'topic2',
      title: 'Topic 2',
      total_projects_count: 0
    )
    topic_2_keep = topics.create!(
      name: 'TOPIC2',
      title: 'Topic 2',
      description: 'description 2 to keep',
      total_projects_count: 1
    )
    topic_3_remove_1 = topics.create!(
      name: 'topic3',
      title: 'Topic 3',
      total_projects_count: 2,
      non_private_projects_count: 1
    )
    topic_3_keep = topics.create!(
      name: 'Topic3',
      title: 'Topic 3',
      total_projects_count: 2,
      non_private_projects_count: 2
    )
    topic_3_remove_2 = topics.create!(
      name: 'TOPIC3',
      title: 'Topic 3',
      description: 'description 3 to keep',
      total_projects_count: 2,
      non_private_projects_count: 1
    )
    topic_4_keep = topics.create!(
      name: 'topic4',
      title: 'Topic 4'
    )

    project_topics_1 = []
    project_topics_3 = []
    project_topics_removed = []

    project_topics_1 << project_topics.create!(topic_id: topic_1_keep.id, project_id: project_1.id)
    project_topics_1 << project_topics.create!(topic_id: topic_1_keep.id, project_id: project_2.id)
    project_topics_removed << project_topics.create!(topic_id: topic_1_remove.id, project_id: project_2.id)
    project_topics_1 << project_topics.create!(topic_id: topic_1_remove.id, project_id: project_3.id)

    project_topics_3 << project_topics.create!(topic_id: topic_3_keep.id, project_id: project_1.id)
    project_topics_3 << project_topics.create!(topic_id: topic_3_keep.id, project_id: project_2.id)
    project_topics_removed << project_topics.create!(topic_id: topic_3_remove_1.id, project_id: project_1.id)
    project_topics_3 << project_topics.create!(topic_id: topic_3_remove_1.id, project_id: project_3.id)
    project_topics_removed << project_topics.create!(topic_id: topic_3_remove_2.id, project_id: project_1.id)
    project_topics_removed << project_topics.create!(topic_id: topic_3_remove_2.id, project_id: project_3.id)

    avatar_paths = {
      topic_1_keep: set_avatar(topic_1_keep.id, fixture_file_upload('spec/fixtures/avatars/avatar1.png')),
      topic_1_remove: set_avatar(topic_1_remove.id, fixture_file_upload('spec/fixtures/avatars/avatar2.png')),
      topic_2_remove: set_avatar(topic_2_remove.id, fixture_file_upload('spec/fixtures/avatars/avatar3.png')),
      topic_3_remove_1: set_avatar(topic_3_remove_1.id, fixture_file_upload('spec/fixtures/avatars/avatar4.png')),
      topic_3_remove_2: set_avatar(topic_3_remove_2.id, fixture_file_upload('spec/fixtures/avatars/avatar5.png'))
    }

    subject.perform(%w[topic1 topic2 topic3 topic4])

    # Topics
    [topic_1_keep, topic_2_keep, topic_3_keep, topic_4_keep].each(&:reload)
    expect(topic_1_keep.name).to eq('topic1')
    expect(topic_1_keep.description).to eq('description 1 to keep')
    expect(topic_1_keep.total_projects_count).to eq(3)
    expect(topic_1_keep.non_private_projects_count).to eq(2)
    expect(topic_2_keep.name).to eq('TOPIC2')
    expect(topic_2_keep.description).to eq('description 2 to keep')
    expect(topic_2_keep.total_projects_count).to eq(0)
    expect(topic_2_keep.non_private_projects_count).to eq(0)
    expect(topic_3_keep.name).to eq('Topic3')
    expect(topic_3_keep.description).to eq('description 3 to keep')
    expect(topic_3_keep.total_projects_count).to eq(3)
    expect(topic_3_keep.non_private_projects_count).to eq(2)
    expect(topic_4_keep.reload.name).to eq('topic4')

    [topic_1_remove, topic_2_remove, topic_3_remove_1, topic_3_remove_2].each do |topic|
      expect { topic.reload }.to raise_error(ActiveRecord::RecordNotFound)
    end

    # Topic avatars
    expect(topic_1_keep.avatar).to eq('avatar1.png')
    expect(File.exist?(::Projects::Topic.find(topic_1_keep.id).avatar.absolute_path)).to be_truthy
    expect(topic_2_keep.avatar).to eq('avatar3.png')
    expect(File.exist?(::Projects::Topic.find(topic_2_keep.id).avatar.absolute_path)).to be_truthy
    expect(topic_3_keep.avatar).to eq('avatar4.png')
    expect(File.exist?(::Projects::Topic.find(topic_3_keep.id).avatar.absolute_path)).to be_truthy

    [:topic_1_remove, :topic_2_remove, :topic_3_remove_1, :topic_3_remove_2].each do |topic|
      expect(File.exist?(avatar_paths[topic])).to be_falsey
    end

    # Project Topic assignments
    project_topics_1.each do |project_topic|
      expect(project_topic.reload.topic_id).to eq(topic_1_keep.id)
    end

    project_topics_3.each do |project_topic|
      expect(project_topic.reload.topic_id).to eq(topic_3_keep.id)
    end

    project_topics_removed.each do |project_topic|
      expect { project_topic.reload }.to raise_error(ActiveRecord::RecordNotFound)
    end
  end
end