discourse-ai/spec/requests/admin/ai_llm_quotas_controller_sp...

109 lines
2.8 KiB
Ruby

# frozen_string_literal: true
RSpec.describe DiscourseAi::Admin::AiLlmQuotasController do
fab!(:admin)
fab!(:group)
fab!(:llm_model)
before do
sign_in(admin)
SiteSetting.ai_bot_enabled = true
SiteSetting.discourse_ai_enabled = true
end
describe "#index" do
fab!(:quota) { Fabricate(:llm_quota, llm_model: llm_model, group: group) }
fab!(:quota2) { Fabricate(:llm_quota, llm_model: llm_model) }
it "lists all quotas for a given LLM" do
get "/admin/plugins/discourse-ai/quotas.json"
expect(response.status).to eq(200)
quotas = response.parsed_body["quotas"]
expect(quotas.length).to eq(2)
expect(quotas.map { |q| q["id"] }).to contain_exactly(quota.id, quota2.id)
end
end
describe "#create" do
let(:valid_params) do
{
quota: {
group_id: group.id,
llm_model_id: llm_model.id,
max_tokens: 1000,
max_usages: 100,
duration_seconds: 1.day.to_i,
},
}
end
it "creates a new quota with valid params" do
expect {
post "/admin/plugins/discourse-ai/quotas.json", params: valid_params
expect(response.status).to eq(201)
}.to change(LlmQuota, :count).by(1)
quota = LlmQuota.last
expect(quota.group_id).to eq(group.id)
expect(quota.max_tokens).to eq(1000)
end
it "fails with invalid params" do
post "/admin/plugins/discourse-ai/quotas.json",
params: {
quota: valid_params[:quota].except(:group_id),
}
expect(response.status).to eq(422)
expect(LlmQuota.count).to eq(0)
end
end
describe "#update" do
fab!(:quota) { Fabricate(:llm_quota, llm_model: llm_model, group: group) }
it "updates quota with valid params" do
put "/admin/plugins/discourse-ai/quotas/#{quota.id}.json",
params: {
quota: {
max_tokens: 2000,
},
}
expect(response.status).to eq(200)
expect(quota.reload.max_tokens).to eq(2000)
end
it "fails with invalid params" do
put "/admin/plugins/discourse-ai/quotas/#{quota.id}.json",
params: {
quota: {
duration_seconds: 0,
},
}
expect(response.status).to eq(422)
expect(quota.reload.duration_seconds).not_to eq(0)
end
end
describe "#destroy" do
fab!(:quota) { Fabricate(:llm_quota, llm_model: llm_model, group: group) }
it "deletes the quota" do
delete "/admin/plugins/discourse-ai/quotas/#{quota.id}.json"
expect(response.status).to eq(204)
expect { quota.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
it "returns 404 for non-existent quota" do
delete "/admin/plugins/discourse-ai/quotas/9999.json"
expect(response.status).to eq(404)
end
end
end