# frozen_string_literal: true require "rails_helper" describe ModelAccuracy do describe "#calculate_accuracy" do let(:accuracy) { ModelAccuracy.new(model: "test_model", classification_type: "test") } it "returns 0 if we had no feedback" do expect(accuracy.calculate_accuracy).to eq(0.0) end it "returns 50 if we had mixed feedback" do accuracy.flags_agreed = 1 accuracy.flags_disagreed = 1 expect(accuracy.calculate_accuracy).to eq(50) end it "always round the number" do accuracy.flags_agreed = 1 accuracy.flags_disagreed = 2 expect(accuracy.calculate_accuracy).to eq(33) end end describe ".adjust_model_accuracy" do let!(:accuracy) { ModelAccuracy.create!(model: "test_model", classification_type: "test") } def build_reviewable(klass, test_model_verdict) klass.new(payload: { "verdicts" => { "test_model" => test_model_verdict } }) end it "does nothing if the reviewable is not generated by this plugin" do reviewable = build_reviewable(ReviewableFlaggedPost, true) described_class.adjust_model_accuracy(:approved, reviewable) expect(accuracy.reload.flags_agreed).to be_zero expect(accuracy.flags_disagreed).to be_zero end it "updates the agreed flag if reviewable was approved and verdict is true" do reviewable = build_reviewable(ReviewableAiPost, true) described_class.adjust_model_accuracy(:approved, reviewable) expect(accuracy.reload.flags_agreed).to eq(1) expect(accuracy.flags_disagreed).to be_zero end it "updates the disagreed flag if the reviewable was approved and verdict is false" do reviewable = build_reviewable(ReviewableAiPost, false) described_class.adjust_model_accuracy(:approved, reviewable) expect(accuracy.reload.flags_agreed).to be_zero expect(accuracy.flags_disagreed).to eq(1) end it "updates the disagreed flag if reviewable was rejected and verdict is true" do reviewable = build_reviewable(ReviewableAiPost, true) described_class.adjust_model_accuracy(:rejected, reviewable) expect(accuracy.reload.flags_agreed).to be_zero expect(accuracy.flags_disagreed).to eq(1) end it "updates the agreed flag if the reviewable was rejected and verdict is false" do reviewable = build_reviewable(ReviewableAiPost, false) described_class.adjust_model_accuracy(:rejected, reviewable) expect(accuracy.reload.flags_agreed).to eq(1) expect(accuracy.flags_disagreed).to be_zero end end end