Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/merge_request_diff_spec.rb')
-rw-r--r--spec/models/merge_request_diff_spec.rb141
1 files changed, 139 insertions, 2 deletions
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index bcab2029942..2e68cd9e74a 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -172,6 +172,30 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
end
end
+ describe '#ensure_project_id' do
+ let_it_be(:merge_request) { create(:merge_request, :without_diffs) }
+
+ let(:diff) { build(:merge_request_diff, merge_request: merge_request, project_id: project_id) }
+
+ subject { diff.save! }
+
+ context 'when project_id is null' do
+ let(:project_id) { nil }
+
+ it do
+ expect { subject }.to change(diff, :project_id).from(nil).to(merge_request.target_project_id)
+ end
+ end
+
+ context 'when project_id is already set' do
+ let(:project_id) { create(:project, :stubbed_repository).id }
+
+ it do
+ expect { subject }.not_to change(diff, :project_id)
+ end
+ end
+ end
+
describe '#update_external_diff_store' do
let_it_be(:merge_request) { create(:merge_request) }
@@ -366,9 +390,10 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
shared_examples_for 'merge request diffs' do
let(:merge_request) { create(:merge_request) }
- let!(:diff) { merge_request.merge_request_diff.reload }
context 'when it was not cleaned by the system' do
+ let!(:diff) { merge_request.merge_request_diff.reload }
+
it 'returns persisted diffs' do
expect(diff).to receive(:load_diffs).and_call_original
@@ -377,6 +402,8 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
end
context 'when diff was cleaned by the system' do
+ let!(:diff) { merge_request.merge_request_diff.reload }
+
before do
diff.clean!
end
@@ -737,6 +764,63 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
end
end
+ describe '#get_patch_id_sha' do
+ let(:mr_diff) { create(:merge_request).merge_request_diff }
+
+ context 'when the patch_id exists on the model' do
+ it 'returns the patch_id' do
+ expect(mr_diff.patch_id_sha).not_to be_nil
+ expect(mr_diff.get_patch_id_sha).to eq(mr_diff.patch_id_sha)
+ end
+ end
+
+ context 'when the patch_id does not exist on the model' do
+ it 'retrieves the patch id, saves the model, and returns it' do
+ expect(mr_diff.patch_id_sha).not_to be_nil
+
+ patch_id = mr_diff.patch_id_sha
+ mr_diff.update!(patch_id_sha: nil)
+
+ expect(mr_diff.get_patch_id_sha).to eq(patch_id)
+ expect(mr_diff.reload.patch_id_sha).to eq(patch_id)
+ end
+
+ context 'when base_sha is nil' do
+ before do
+ mr_diff.update!(patch_id_sha: nil)
+ allow(mr_diff).to receive(:base_commit_sha).and_return(nil)
+ end
+
+ it 'returns nil' do
+ expect(mr_diff.reload.get_patch_id_sha).to be_nil
+ end
+ end
+
+ context 'when head_sha is nil' do
+ before do
+ mr_diff.update!(patch_id_sha: nil)
+ allow(mr_diff).to receive(:head_commit_sha).and_return(nil)
+ end
+
+ it 'returns nil' do
+ expect(mr_diff.reload.get_patch_id_sha).to be_nil
+ end
+ end
+
+ context 'when base_sha and head_sha dont match' do
+ before do
+ mr_diff.update!(patch_id_sha: nil)
+ allow(mr_diff).to receive(:head_commit_sha).and_return('123123')
+ allow(mr_diff).to receive(:base_commit_sha).and_return('43121')
+ end
+
+ it 'returns nil' do
+ expect(mr_diff.reload.get_patch_id_sha).to be_nil
+ end
+ end
+ end
+ end
+
describe '#save_diffs' do
it 'saves collected state' do
mr_diff = create(:merge_request).merge_request_diff
@@ -825,6 +909,57 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
expect(diff_file.diff).to include(content)
end
end
+
+ context 'handling generated files' do
+ let(:project) { create(:project, :repository) }
+ let(:target_branch) { project.default_branch }
+ let(:source_branch) { 'test-generated-diff-file' }
+ let(:generated_file_name) { 'generated.txt' }
+ let(:regular_file_name) { 'regular.rb' }
+ let(:merge_request) do
+ create(
+ :merge_request,
+ target_project: project,
+ source_project: project,
+ source_branch: source_branch,
+ target_branch: target_branch
+ )
+ end
+
+ let(:diff_files) do
+ merge_request.merge_request_diff.merge_request_diff_files
+ end
+
+ before do
+ project.repository.update_file(
+ project.creator,
+ '.gitattributes',
+ '*.txt gitlab-generated',
+ message: 'Update',
+ branch_name: target_branch)
+
+ create_file_in_repo(project, target_branch, source_branch, generated_file_name, "generated text\n")
+ create_file_in_repo(project, source_branch, source_branch, regular_file_name, "something else\n")
+ end
+
+ context 'with collapse_generated_diff_files feature flag' do
+ it 'sets generated field correctly' do
+ expect(diff_files.find_by(new_path: generated_file_name)).to be_generated
+ expect(diff_files.find_by(new_path: regular_file_name)).not_to be_generated
+ end
+ end
+
+ context 'without collapse_generated_diff_files feature flag' do
+ before do
+ stub_feature_flags(collapse_generated_diff_files: false)
+ end
+
+ it 'sets generated field correctly' do
+ expect(diff_files.find_by(new_path: generated_file_name)).not_to be_generated
+ expect(diff_files.find_by(new_path: regular_file_name)).not_to be_generated
+ end
+ end
+ end
end
end
@@ -905,6 +1040,7 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
include_examples 'merge request diffs'
it 'stores up-to-date diffs in the database' do
+ diff = merge_request.merge_request_diff.reload
expect(diff).not_to be_stored_externally
end
@@ -921,7 +1057,8 @@ RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
end
it 'stores diffs for old MR versions in external storage' do
- old_diff = diff
+ old_diff = merge_request.merge_request_diff.reload
+
merge_request.create_merge_request_diff
old_diff.migrate_files_to_external_storage!