diff options
Diffstat (limited to 'spec/models/merge_request_diff_spec.rb')
-rw-r--r-- | spec/models/merge_request_diff_spec.rb | 141 |
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! |