diff options
Diffstat (limited to 'spec/features/issuables/markdown_references/jira_spec.rb')
-rw-r--r-- | spec/features/issuables/markdown_references/jira_spec.rb | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb new file mode 100644 index 00000000000..fa0ab88624e --- /dev/null +++ b/spec/features/issuables/markdown_references/jira_spec.rb @@ -0,0 +1,187 @@ +require "rails_helper" + +describe "Jira", :js do + let(:user) { create(:user) } + let(:actual_project) { create(:project, :public, :repository) } + let(:merge_request) { create(:merge_request, target_project: actual_project, source_project: actual_project) } + let(:issue_actual_project) { create(:issue, project: actual_project) } + let!(:other_project) { create(:project, :public) } + let!(:issue_other_project) { create(:issue, project: other_project) } + let(:issues) { [issue_actual_project, issue_other_project] } + + shared_examples "correct references" do + before do + remotelink = double(:remotelink, all: [], build: double(save!: true)) + + stub_request(:get, "https://jira.example.com/rest/api/2/issue/JIRA-5") + stub_request(:post, "https://jira.example.com/rest/api/2/issue/JIRA-5/comment") + allow_any_instance_of(JIRA::Resource::Issue).to receive(:remotelink).and_return(remotelink) + + sign_in(user) + + visit(merge_request_path(merge_request)) + + build_note + end + + it "creates a link to the referenced issue on the preview" do + find(".js-md-preview-button").click + + wait_for_requests + + page.within(".md-preview-holder") do + links_expectations + end + end + + it "creates a link to the referenced issue after submit" do + click_button("Comment") + + wait_for_requests + + page.within("#diff-notes-app") do + links_expectations + end + end + + it "creates a note on the referenced issues" do + click_button("Comment") + + wait_for_requests + + if referenced_issues.include?(issue_actual_project) + visit(issue_path(issue_actual_project)) + + page.within("#notes") do + expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference}") + end + end + + if referenced_issues.include?(issue_other_project) + visit(issue_path(issue_other_project)) + + page.within("#notes") do + expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference(other_project)}") + end + end + end + end + + context "when internal issues tracker is enabled for the other project" do + context "when only internal issues tracker is enabled for the actual project" do + include_examples "correct references" do + let(:referenced_issues) { [issue_actual_project, issue_other_project] } + let(:jira_referenced) { false } + end + end + + context "when both external and internal issues trackers are enabled for the actual project" do + before do + create(:jira_service, project: actual_project) + end + + include_examples "correct references" do + let(:referenced_issues) { [issue_actual_project, issue_other_project] } + let(:jira_referenced) { true } + end + end + + context "when only external issues tracker is enabled for the actual project" do + let(:actual_project) { create(:project, :public, :repository, :issues_disabled) } + + before do + create(:jira_service, project: actual_project) + end + + include_examples "correct references" do + let(:referenced_issues) { [issue_other_project] } + let(:jira_referenced) { true } + end + end + + context "when no tracker is enabled for the actual project" do + let(:actual_project) { create(:project, :public, :repository, :issues_disabled) } + + include_examples 'correct references' do + let(:referenced_issues) { [issue_other_project] } + let(:jira_referenced) { false } + end + end + end + + context "when internal issues tracker is disabled for the other project" do + let(:other_project) { create(:project, :public, :repository, :issues_disabled) } + + context "when only internal issues tracker is enabled for the actual project" do + include_examples "correct references" do + let(:referenced_issues) { [issue_actual_project] } + let(:jira_referenced) { false } + end + end + + context "when both external and internal issues trackers are enabled for the actual project" do + before do + create(:jira_service, project: actual_project) + end + + include_examples "correct references" do + let(:referenced_issues) { [issue_actual_project] } + let(:jira_referenced) { true } + end + end + + context "when only external issues tracker is enabled for the actual project" do + let(:actual_project) { create(:project, :public, :repository, :issues_disabled) } + + before do + create(:jira_service, project: actual_project) + end + + include_examples "correct references" do + let(:referenced_issues) { [] } + let(:jira_referenced) { true } + end + end + + context "when no issues tracker is enabled for the actual project" do + let(:actual_project) { create(:project, :public, :repository, :issues_disabled) } + + include_examples "correct references" do + let(:referenced_issues) { [] } + let(:jira_referenced) { false } + end + end + end + + private + + def build_note + markdown = <<~HEREDOC + Referencing internal issue #{issue_actual_project.to_reference}, + cross-project #{issue_other_project.to_reference(actual_project)} external JIRA-5 + and non existing #999 + HEREDOC + + page.within("#diff-notes-app") do + fill_in("note_note", with: markdown) + end + end + + def links_expectations + issues.each do |issue| + if referenced_issues.include?(issue) + expect(page).to have_link(issue.to_reference, href: issue_path(issue)) + else + expect(page).not_to have_link(issue.to_reference, href: issue_path(issue)) + end + end + + if jira_referenced + expect(page).to have_link("JIRA-5", href: "https://jira.example.com/browse/JIRA-5") + else + expect(page).not_to have_link("JIRA-5", href: "https://jira.example.com/browse/JIRA-5") + end + + expect(page).not_to have_link("#999") + end +end |