# frozen_string_literal: true require "rails_helper" RSpec.describe DiscourseAi::Personas::Tools::GithubPullRequestDiff do let(:bot_user) { Fabricate(:user) } fab!(:llm_model) let(:llm) { DiscourseAi::Completions::Llm.proxy("custom:#{llm_model.id}") } let(:tool) { described_class.new({ repo: repo, pull_id: pull_id }, bot_user: bot_user, llm: llm) } context "with #sort_and_shorten_diff" do it "sorts and shortens the diff without dropping data" do diff = <<~DIFF diff --git a/src/lib.rs b/src/lib.rs index b466edd..66b068f 100644 --- a/src/lib.rs +++ b/src/lib.rs this is a longer diff this is a longer diff this is a longer diff diff --git a/tests/test_encoding.py b/tests/test_encoding.py index 27b2192..9f31319 100644 --- a/tests/test_encoding.py +++ b/tests/test_encoding.py short diff DIFF sorted_diff = described_class.sort_and_shorten_diff(diff) expect(sorted_diff).to eq(<<~DIFF) diff --git a/tests/test_encoding.py b/tests/test_encoding.py index 27b2192..9f31319 100644 --- a/tests/test_encoding.py +++ b/tests/test_encoding.py short diff diff --git a/src/lib.rs b/src/lib.rs index b466edd..66b068f 100644 --- a/src/lib.rs +++ b/src/lib.rs this is a longer diff this is a longer diff this is a longer diff DIFF end end context "with a valid pull request" do let(:repo) { "discourse/discourse-automation" } let(:pull_id) { 253 } let(:diff) { <<~DIFF } diff --git a/lib/discourse_automation/automation.rb b/lib/discourse_automation/automation.rb index 3e3e3e3..4f4f4f4 100644 --- a/lib/discourse_automation/automation.rb +++ b/lib/discourse_automation/automation.rb @@ -1,3 +1,3 @@ -module DiscourseAutomation DIFF let(:pr_info) do { "title" => "Test PR", "state" => "open", "user" => { "login" => "test-user", }, "created_at" => "2023-01-01T00:00:00Z", "updated_at" => "2023-01-02T00:00:00Z", "head" => { "repo" => { "full_name" => "test/repo", }, "ref" => "feature-branch", "sha" => "abc123", }, "base" => { "repo" => { "full_name" => "main/repo", }, "ref" => "main", }, } end it "retrieves both PR info and diff" do stub_request(:get, "https://api.github.com/repos/#{repo}/pulls/#{pull_id}").with( headers: { "Accept" => "application/json", "User-Agent" => DiscourseAi::AiBot::USER_AGENT, }, ).to_return(status: 200, body: pr_info.to_json) stub_request(:get, "https://api.github.com/repos/#{repo}/pulls/#{pull_id}").with( headers: { "Accept" => "application/vnd.github.v3.diff", "User-Agent" => DiscourseAi::AiBot::USER_AGENT, }, ).to_return(status: 200, body: diff) result = tool.invoke expect(result[:diff]).to eq(diff) expect(result[:pr_info]).to include(title: "Test PR", state: "open", author: "test-user") expect(result[:error]).to be_nil end it "uses the github access token if present" do SiteSetting.ai_bot_github_access_token = "ABC" stub_request(:get, "https://api.github.com/repos/#{repo}/pulls/#{pull_id}").with( headers: { "Accept" => "application/json", "User-Agent" => DiscourseAi::AiBot::USER_AGENT, "Authorization" => "Bearer ABC", }, ).to_return(status: 200, body: pr_info.to_json) stub_request(:get, "https://api.github.com/repos/#{repo}/pulls/#{pull_id}").with( headers: { "Accept" => "application/vnd.github.v3.diff", "User-Agent" => DiscourseAi::AiBot::USER_AGENT, "Authorization" => "Bearer ABC", }, ).to_return(status: 200, body: diff) result = tool.invoke expect(result[:diff]).to eq(diff) expect(result[:error]).to be_nil end end context "with an invalid pull request" do let(:repo) { "invalid/repo" } let(:pull_id) { 999 } it "returns an error message" do stub_request(:get, "https://api.github.com/repos/#{repo}/pulls/#{pull_id}").with( headers: { "Accept" => "application/json", "User-Agent" => DiscourseAi::AiBot::USER_AGENT, }, ).to_return(status: 404) result = tool.invoke expect(result[:diff]).to be_nil expect(result[:error]).to include("Failed to retrieve the PR information") end end end