# 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