diff options
Diffstat (limited to 'spec/models/merge_request_diff_spec.rb')
-rw-r--r-- | spec/models/merge_request_diff_spec.rb | 212 |
1 files changed, 211 insertions, 1 deletions
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb index 6706083fd91..a5493d1650b 100644 --- a/spec/models/merge_request_diff_spec.rb +++ b/spec/models/merge_request_diff_spec.rb @@ -9,6 +9,10 @@ RSpec.describe MergeRequestDiff do let(:diff_with_commits) { create(:merge_request).merge_request_diff } + before do + stub_feature_flags(diffs_gradual_load: false) + end + describe 'validations' do subject { diff_with_commits } @@ -415,7 +419,7 @@ RSpec.describe MergeRequestDiff do context 'when persisted files available' do it 'returns paginated diffs' do - diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: {}) + diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options) expect(diffs).to be_a(Gitlab::Diff::FileCollection::MergeRequestDiffBatch) expect(diffs.diff_files.size).to eq(10) @@ -423,6 +427,150 @@ RSpec.describe MergeRequestDiff do next_page: 2, total_pages: 2) end + + it 'sorts diff files directory first' do + diff_with_commits.update!(sorted: false) # Mark as unsorted so it'll re-order + + expect(diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options).diff_file_paths).to eq([ + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/images/wm.svg', + 'files/js/commit.coffee', + 'files/lfs/lfs_object.iso', + 'files/ruby/popen.rb', + 'files/ruby/regex.rb', + 'files/.DS_Store', + 'files/whitespace' + ]) + end + + context 'when sort_diffs feature flag is disabled' do + before do + stub_feature_flags(sort_diffs: false) + end + + it 'does not sort diff files directory first' do + expect(diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options).diff_file_paths).to eq([ + '.DS_Store', + '.gitattributes', + '.gitignore', + '.gitmodules', + 'CHANGELOG', + 'README', + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/.DS_Store' + ]) + end + end + end + end + + describe '#diffs' do + let(:diff_options) { {} } + + shared_examples_for 'fetching full diffs' do + it 'returns diffs from repository comparison' do + expect_next_instance_of(Compare) do |comparison| + expect(comparison).to receive(:diffs) + .with(diff_options) + .and_call_original + end + + diff_with_commits.diffs(diff_options) + end + + it 'returns a Gitlab::Diff::FileCollection::Compare with full diffs' do + diffs = diff_with_commits.diffs(diff_options) + + expect(diffs).to be_a(Gitlab::Diff::FileCollection::Compare) + expect(diffs.diff_files.size).to eq(20) + end + end + + context 'when no persisted files available' do + before do + diff_with_commits.clean! + end + + it_behaves_like 'fetching full diffs' + end + + context 'when diff_options include ignore_whitespace_change' do + it_behaves_like 'fetching full diffs' do + let(:diff_options) do + { ignore_whitespace_change: true } + end + end + end + + context 'when persisted files available' do + it 'returns diffs' do + diffs = diff_with_commits.diffs(diff_options) + + expect(diffs).to be_a(Gitlab::Diff::FileCollection::MergeRequestDiff) + expect(diffs.diff_files.size).to eq(20) + end + + it 'sorts diff files directory first' do + diff_with_commits.update!(sorted: false) # Mark as unsorted so it'll re-order + + expect(diff_with_commits.diffs(diff_options).diff_file_paths).to eq([ + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/images/wm.svg', + 'files/js/commit.coffee', + 'files/lfs/lfs_object.iso', + 'files/ruby/popen.rb', + 'files/ruby/regex.rb', + 'files/.DS_Store', + 'files/whitespace', + 'foo/bar/.gitkeep', + 'with space/README.md', + '.DS_Store', + '.gitattributes', + '.gitignore', + '.gitmodules', + 'CHANGELOG', + 'README', + 'gitlab-grack', + 'gitlab-shell' + ]) + end + + context 'when sort_diffs feature flag is disabled' do + before do + stub_feature_flags(sort_diffs: false) + end + + it 'does not sort diff files directory first' do + expect(diff_with_commits.diffs(diff_options).diff_file_paths).to eq([ + '.DS_Store', + '.gitattributes', + '.gitignore', + '.gitmodules', + 'CHANGELOG', + 'README', + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/.DS_Store', + 'files/images/wm.svg', + 'files/js/commit.coffee', + 'files/lfs/lfs_object.iso', + 'files/ruby/popen.rb', + 'files/ruby/regex.rb', + 'files/whitespace', + 'foo/bar/.gitkeep', + 'gitlab-grack', + 'gitlab-shell', + 'with space/README.md' + ]) + end + end end end @@ -501,6 +649,68 @@ RSpec.describe MergeRequestDiff do expect(mr_diff.empty?).to be_truthy end + it 'persists diff files sorted directory first' do + mr_diff = create(:merge_request).merge_request_diff + diff_files_paths = mr_diff.merge_request_diff_files.map { |file| file.new_path.presence || file.old_path } + + expect(diff_files_paths).to eq([ + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/images/wm.svg', + 'files/js/commit.coffee', + 'files/lfs/lfs_object.iso', + 'files/ruby/popen.rb', + 'files/ruby/regex.rb', + 'files/.DS_Store', + 'files/whitespace', + 'foo/bar/.gitkeep', + 'with space/README.md', + '.DS_Store', + '.gitattributes', + '.gitignore', + '.gitmodules', + 'CHANGELOG', + 'README', + 'gitlab-grack', + 'gitlab-shell' + ]) + end + + context 'when sort_diffs feature flag is disabled' do + before do + stub_feature_flags(sort_diffs: false) + end + + it 'persists diff files unsorted by directory first' do + mr_diff = create(:merge_request).merge_request_diff + diff_files_paths = mr_diff.merge_request_diff_files.map { |file| file.new_path.presence || file.old_path } + + expect(diff_files_paths).to eq([ + '.DS_Store', + '.gitattributes', + '.gitignore', + '.gitmodules', + 'CHANGELOG', + 'README', + 'bar/branch-test.txt', + 'custom-highlighting/test.gitlab-custom', + 'encoding/iso8859.txt', + 'files/.DS_Store', + 'files/images/wm.svg', + 'files/js/commit.coffee', + 'files/lfs/lfs_object.iso', + 'files/ruby/popen.rb', + 'files/ruby/regex.rb', + 'files/whitespace', + 'foo/bar/.gitkeep', + 'gitlab-grack', + 'gitlab-shell', + 'with space/README.md' + ]) + end + end + it 'expands collapsed diffs before saving' do mr_diff = create(:merge_request, source_branch: 'expand-collapse-lines', target_branch: 'master').merge_request_diff diff_file = mr_diff.merge_request_diff_files.find_by(new_path: 'expand-collapse/file-5.txt') |