mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-10-31 14:38:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # 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
 |