# frozen_string_literal: true RSpec.describe Onebox::Engine::GithubPullRequestOnebox do let(:gh_link) { "https://github.com/discourse/discourse/pull/1253/" } let(:api_uri) { "https://api.github.com/repos/discourse/discourse/pulls/1253" } let(:response) { onebox_response(described_class.onebox_name) } before { stub_request(:get, api_uri).to_return(status: 200, body: response) } include_context "with engines" do let(:link) { gh_link } end it_behaves_like "an engine" describe "#to_html" do it "includes pull request author" do expect(html).to include("jamesaanderson") end it "includes repository name" do expect(html).to include("discourse") end it "includes commit author gravatar" do expect(html).to include("b3e9977094ce189bbb493cf7f9adea21") end it "includes commit time and date" do expect(html).to include("02:05AM - 26 Jul 13") end it "includes number of commits" do expect(html).to include("1") end it "includes number of files changed" do expect(html).to include("4") end it "includes number of additions" do expect(html).to include("19") end it "includes number of deletions" do expect(html).to include("5") end it "includes the body without comments" do expect(html).to include("http://meta.discourse.org/t/audio-html5-tag/8168") expect(html).not_to include("test comment") end it "sets the data-github-private-repo attr to false" do expect(html).to include("data-github-private-repo=\"false\"") end context "when the PR is in a private repo" do let(:response) do resp = MultiJson.load(onebox_response(described_class.onebox_name)) resp["base"]["repo"]["private"] = true MultiJson.dump(resp) end it "sets the data-github-private-repo attr to true" do expect(html).to include("data-github-private-repo=\"true\"") end end end context "with commit links" do let(:gh_link) do "https://github.com/discourse/discourse/pull/1253/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6" end let(:pr_commit_url) do "https://api.github.com/repos/discourse/discourse/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6" end before do stub_request(:get, pr_commit_url).to_return( status: 200, body: onebox_response(described_class.onebox_name + "_commit"), ) end it "includes commit name" do doc = Nokogiri.HTML5(html) expect(doc.css("h4").text.strip).to eq("Add audio onebox") expect(doc.css(".github-body-container").text).to include( "http://meta.discourse.org/t/audio-html5-tag/8168", ) end context "when github_onebox_access_token is configured" do before { SiteSetting.github_onebox_access_tokens = "discourse|github_pat_1234" } it "sends it as part of the request" do html expect(WebMock).to have_requested(:get, pr_commit_url).with( headers: { "Authorization" => "Bearer github_pat_1234", }, ) end end end context "with comment links" do let(:gh_link) { "https://github.com/discourse/discourse/pull/1253/#issuecomment-21597425" } let(:comment_api_url) do "https://api.github.com/repos/discourse/discourse/issues/comments/21597425" end before do stub_request(:get, comment_api_url).to_return( status: 200, body: onebox_response(described_class.onebox_name + "_comment"), ) end it "includes comment" do expect(html).to include("You've signed the CLA") end context "when github_onebox_access_token is configured" do before { SiteSetting.github_onebox_access_tokens = "discourse|github_pat_1234" } it "sends it as part of the request" do html expect(WebMock).to have_requested(:get, api_uri).with( headers: { "Authorization" => "Bearer github_pat_1234", }, ) end end end context "when github_onebox_access_token is configured" do before { SiteSetting.github_onebox_access_tokens = "discourse|github_pat_1234" } it "sends it as part of the request" do html expect(WebMock).to have_requested(:get, api_uri).with( headers: { "Authorization" => "Bearer github_pat_1234", }, ) end end end