1# frozen_string_literal: true
2
3module QA
4  RSpec.describe 'Create', :requires_admin, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/261793', type: :investigating } do
5    describe 'View merge request merge-ref diff' do
6      let(:project) do
7        Resource::Project.fabricate_via_api! do |project|
8          project.name = 'merge-ref-diff'
9        end
10      end
11
12      let(:merge_request) do
13        Resource::MergeRequest.fabricate_via_api! do |merge_request|
14          merge_request.project = project
15          merge_request.title = 'This is a merge request'
16          merge_request.description = '... for viewing merge-ref and merge-base diffs'
17          merge_request.file_content = 'This exists on the source branch only'
18        end
19      end
20
21      let(:new_file_name) { "added_file-#{SecureRandom.hex(8)}.txt" }
22
23      context 'when the feature flag default_merge_ref_for_diffs is enabled' do
24        before do
25          Runtime::Feature.enable('default_merge_ref_for_diffs', project: project)
26
27          commit_to_branch(merge_request.target_branch, new_file_name)
28          commit_to_branch(merge_request.source_branch, new_file_name)
29
30          Flow::Login.sign_in
31
32          merge_request.visit!
33        end
34
35        it 'views the merge-ref diff by default', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347651' do
36          Page::MergeRequest::Show.perform do |mr_page|
37            mr_page.click_diffs_tab
38            mr_page.click_target_version_dropdown
39
40            expect(mr_page.version_dropdown_content).to include("#{project.default_branch} (HEAD)")
41            expect(mr_page.version_dropdown_content).not_to include("#{project.default_branch} (base)")
42            expect(mr_page).to have_file(merge_request.file_name)
43            expect(mr_page).not_to have_file(new_file_name)
44          end
45        end
46      end
47
48      context 'when the feature flag default_merge_ref_for_diffs is disabled' do
49        before do
50          Runtime::Feature.disable('default_merge_ref_for_diffs', project: project)
51
52          commit_to_branch(merge_request.target_branch, new_file_name)
53          commit_to_branch(merge_request.source_branch, new_file_name)
54
55          Flow::Login.sign_in
56
57          merge_request.visit!
58        end
59
60        it 'views the merge-base diff by default', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347650' do
61          Page::MergeRequest::Show.perform do |mr_page|
62            mr_page.click_diffs_tab
63            mr_page.click_target_version_dropdown
64
65            expect(mr_page.version_dropdown_content).to include("#{project.default_branch} (HEAD)")
66            expect(mr_page.version_dropdown_content).to include("#{project.default_branch} (base)")
67            expect(mr_page).to have_file(merge_request.file_name)
68            expect(mr_page).to have_file(new_file_name)
69          end
70        end
71      end
72
73      def commit_to_branch(branch, file)
74        Resource::Repository::Commit.fabricate_via_api! do |commit|
75          commit.project = merge_request.project
76          commit.branch = branch
77          commit.commit_message = "Add new file on #{branch}"
78          commit.add_files(
79            [
80                {
81                    file_path: file,
82                    content: "This exists on source and target branches"
83                }
84            ]
85          )
86        end
87      end
88    end
89  end
90end
91