151 lines
4.6 KiB
Ruby
151 lines
4.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe DiscourseAi::Summarization::SummaryController do
|
|
describe "#summary" do
|
|
fab!(:topic) { Fabricate(:topic, highest_post_number: 2) }
|
|
fab!(:post_1) { Fabricate(:post, topic: topic, post_number: 1) }
|
|
fab!(:post_2) { Fabricate(:post, topic: topic, post_number: 2) }
|
|
|
|
before do
|
|
assign_fake_provider_to(:ai_summarization_model)
|
|
SiteSetting.ai_summarization_enabled = true
|
|
end
|
|
|
|
context "when streaming" do
|
|
it "return a cached summary with json payload and does not trigger job if it exists" do
|
|
section =
|
|
AiSummary.create!(
|
|
target: topic,
|
|
summarized_text: "test",
|
|
algorithm: "test",
|
|
original_content_sha: "test",
|
|
summary_type: AiSummary.summary_types[:complete],
|
|
)
|
|
|
|
sign_in(Fabricate(:admin))
|
|
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json?stream=true"
|
|
|
|
expect(response.status).to eq(200)
|
|
expect(Jobs::StreamTopicAiSummary.jobs.size).to eq(0)
|
|
|
|
summary = response.parsed_body
|
|
expect(summary.dig("ai_topic_summary", "summarized_text")).to eq(section.summarized_text)
|
|
end
|
|
end
|
|
|
|
context "for anons" do
|
|
it "returns a 404 if there is no cached summary" do
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
it "returns a cached summary" do
|
|
section =
|
|
AiSummary.create!(
|
|
target: topic,
|
|
summarized_text: "test",
|
|
algorithm: "test",
|
|
original_content_sha: "test",
|
|
summary_type: AiSummary.summary_types[:complete],
|
|
)
|
|
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
summary = response.parsed_body
|
|
expect(summary.dig("ai_topic_summary", "summarized_text")).to eq(section.summarized_text)
|
|
end
|
|
end
|
|
|
|
context "when the user is a member of an allowlisted group" do
|
|
fab!(:user) { Fabricate(:leader) }
|
|
|
|
before do
|
|
sign_in(user)
|
|
Group.find(Group::AUTO_GROUPS[:trust_level_3]).add(user)
|
|
end
|
|
|
|
it "returns a 404 if there is no topic" do
|
|
invalid_topic_id = 999
|
|
|
|
get "/discourse-ai/summarization/t/#{invalid_topic_id}.json"
|
|
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
it "returns a 403 if not allowed to see the topic" do
|
|
pm = Fabricate(:private_message_topic)
|
|
|
|
get "/discourse-ai/summarization/t/#{pm.id}.json"
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it "returns a summary" do
|
|
summary_text = "This is a summary"
|
|
DiscourseAi::Completions::Llm.with_prepared_responses([summary_text]) do
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
expect(response.status).to eq(200)
|
|
summary = response.parsed_body["ai_topic_summary"]
|
|
section = AiSummary.last
|
|
|
|
expect(section.summarized_text).to eq(summary_text)
|
|
expect(summary["summarized_text"]).to eq(section.summarized_text)
|
|
expect(summary["algorithm"]).to eq("fake")
|
|
expect(summary["outdated"]).to eq(false)
|
|
expect(summary["can_regenerate"]).to eq(true)
|
|
expect(summary["new_posts_since_summary"]).to be_zero
|
|
end
|
|
end
|
|
|
|
it "signals the summary is outdated" do
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
Fabricate(:post, topic: topic, post_number: 3)
|
|
topic.update!(highest_post_number: 3)
|
|
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
expect(response.status).to eq(200)
|
|
summary = response.parsed_body["ai_topic_summary"]
|
|
|
|
expect(summary["outdated"]).to eq(true)
|
|
expect(summary["new_posts_since_summary"]).to eq(1)
|
|
end
|
|
end
|
|
|
|
context "when the user is not a member of an allowlisted group" do
|
|
fab!(:user)
|
|
|
|
before { sign_in(user) }
|
|
|
|
it "return a 404 if there is no cached summary" do
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
it "returns a cached summary" do
|
|
section =
|
|
AiSummary.create!(
|
|
target: topic,
|
|
summarized_text: "test",
|
|
algorithm: "test",
|
|
original_content_sha: "test",
|
|
summary_type: AiSummary.summary_types[:complete],
|
|
)
|
|
|
|
get "/discourse-ai/summarization/t/#{topic.id}.json"
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
summary = response.parsed_body
|
|
expect(summary.dig("ai_topic_summary", "summarized_text")).to eq(section.summarized_text)
|
|
end
|
|
end
|
|
end
|
|
end
|