1# frozen_string_literal: true
2
3require 'rake_helper'
4
5RSpec.describe 'gitlab:pages', :silence_stdout do
6  before(:context) do
7    Rake.application.rake_require 'tasks/gitlab/pages'
8  end
9
10  describe 'migrate_legacy_storage task' do
11    subject { run_rake_task('gitlab:pages:migrate_legacy_storage') }
12
13    it 'calls migration service' do
14      expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything,
15                              ignore_invalid_entries: false,
16                              mark_projects_as_not_deployed: false) do |service|
17        expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original
18      end
19
20      subject
21    end
22
23    it 'uses PAGES_MIGRATION_THREADS environment variable' do
24      stub_env('PAGES_MIGRATION_THREADS', '5')
25
26      expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything,
27                              ignore_invalid_entries: false,
28                              mark_projects_as_not_deployed: false) do |service|
29        expect(service).to receive(:execute_with_threads).with(threads: 5, batch_size: 10).and_call_original
30      end
31
32      subject
33    end
34
35    it 'uses PAGES_MIGRATION_BATCH_SIZE environment variable' do
36      stub_env('PAGES_MIGRATION_BATCH_SIZE', '100')
37
38      expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything,
39                              ignore_invalid_entries: false,
40                              mark_projects_as_not_deployed: false) do |service|
41        expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 100).and_call_original
42      end
43
44      subject
45    end
46
47    it 'uses PAGES_MIGRATION_IGNORE_INVALID_ENTRIES environment variable' do
48      stub_env('PAGES_MIGRATION_IGNORE_INVALID_ENTRIES', 'true')
49
50      expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything,
51                              ignore_invalid_entries: true,
52                              mark_projects_as_not_deployed: false) do |service|
53        expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original
54      end
55
56      subject
57    end
58
59    it 'uses PAGES_MIGRATION_MARK_PROJECTS_AS_NOT_DEPLOYED environment variable' do
60      stub_env('PAGES_MIGRATION_MARK_PROJECTS_AS_NOT_DEPLOYED', 'true')
61
62      expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything,
63                              ignore_invalid_entries: false,
64                              mark_projects_as_not_deployed: true) do |service|
65        expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original
66      end
67
68      subject
69    end
70  end
71
72  describe 'clean_migrated_zip_storage task' do
73    it 'removes only migrated deployments' do
74      regular_deployment = create(:pages_deployment)
75      migrated_deployment = create(:pages_deployment, :migrated)
76
77      regular_deployment.project.update_pages_deployment!(regular_deployment)
78      migrated_deployment.project.update_pages_deployment!(migrated_deployment)
79
80      expect(PagesDeployment.all).to contain_exactly(regular_deployment, migrated_deployment)
81
82      run_rake_task('gitlab:pages:clean_migrated_zip_storage')
83
84      expect(PagesDeployment.all).to contain_exactly(regular_deployment)
85      expect(PagesDeployment.find_by_id(regular_deployment.id)).not_to be_nil
86      expect(PagesDeployment.find_by_id(migrated_deployment.id)).to be_nil
87    end
88  end
89
90  describe 'gitlab:pages:deployments:migrate_to_object_storage' do
91    subject { run_rake_task('gitlab:pages:deployments:migrate_to_object_storage') }
92
93    before do
94      stub_pages_object_storage(::Pages::DeploymentUploader, enabled: object_storage_enabled)
95    end
96
97    let!(:deployment) { create(:pages_deployment, file_store: store) }
98    let(:object_storage_enabled) { true }
99
100    context 'when local storage is used' do
101      let(:store) { ObjectStorage::Store::LOCAL }
102
103      context 'and remote storage is defined' do
104        it 'migrates file to remote storage' do
105          subject
106
107          expect(deployment.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
108        end
109      end
110
111      context 'and remote storage is not defined' do
112        let(:object_storage_enabled) { false }
113
114        it 'fails to migrate to remote storage' do
115          subject
116
117          expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
118        end
119      end
120    end
121
122    context 'when remote storage is used' do
123      let(:store) { ObjectStorage::Store::REMOTE }
124
125      it 'file stays on remote storage' do
126        subject
127
128        expect(deployment.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
129      end
130    end
131  end
132
133  describe 'gitlab:pages:deployments:migrate_to_local' do
134    subject { run_rake_task('gitlab:pages:deployments:migrate_to_local') }
135
136    before do
137      stub_pages_object_storage(::Pages::DeploymentUploader, enabled: object_storage_enabled)
138    end
139
140    let!(:deployment) { create(:pages_deployment, file_store: store) }
141    let(:object_storage_enabled) { true }
142
143    context 'when remote storage is used' do
144      let(:store) { ObjectStorage::Store::REMOTE }
145
146      context 'and job has remote file store defined' do
147        it 'migrates file to local storage' do
148          subject
149
150          expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
151        end
152      end
153    end
154
155    context 'when local storage is used' do
156      let(:store) { ObjectStorage::Store::LOCAL }
157
158      it 'file stays on local storage' do
159        subject
160
161        expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
162      end
163    end
164  end
165end
166