discourse-ai/spec/requests/discord/bot_controller_spec.rb

64 lines
1.9 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
RSpec.describe "DiscourseAi::Discord::BotController", type: :request do
let(:public_key) { "your_public_key_here" }
let(:signature) { "valid_signature" }
let(:timestamp) { Time.now.to_i.to_s }
let(:body) { { type: 1 }.to_json }
let(:headers) { { "X-Signature-Ed25519" => signature, "X-Signature-Timestamp" => timestamp } }
before do
SiteSetting.ai_discord_app_public_key = public_key
allow_any_instance_of(DiscourseAi::Discord::BotController).to receive(
:verify_request!,
).and_return(true)
end
describe "POST /discourse-ai/discord/interactions" do
context "when interaction type is 1 (PING)" do
it "responds with type 1" do
post "/discourse-ai/discord/interactions", params: body, headers: headers
expect(response).to have_http_status(:ok)
expect(JSON.parse(response.body)).to eq("type" => 1)
end
end
context "when interaction type is not 1" do
let(:guild_id) { "1234567890" }
let(:interaction_body) do
{
type: 2,
guild_id: guild_id,
data: {
options: [{ value: "test query" }],
},
token: "interaction_token",
}.to_json
end
before do
allow(SiteSetting).to receive(:ai_discord_allowed_guilds_map).and_return([guild_id])
end
xit "enqueues a job to handle the interaction" do
expect {
post "/discourse-ai/discord/interactions", params: interaction_body, headers: headers
}.to have_enqueued_job(Jobs::StreamDiscordReply)
end
it "responds with a deferred message" do
post "/discourse-ai/discord/interactions", params: interaction_body, headers: headers
expect(response).to have_http_status(:ok)
expect(JSON.parse(response.body)).to eq(
"type" => 5,
"data" => {
"content" => "Searching...",
},
)
end
end
end
end