From 593d95e7a821d3798216602dc175484a06376b85 Mon Sep 17 00:00:00 2001 From: Gabriel Quaresma Date: Wed, 1 Nov 2023 11:48:25 -0300 Subject: [PATCH] Feat Make tag score minimum configurable by admins (#20233) * feat: add Settings::UserExperience.award_tag_minimum_score * test: write new specs * test: write a new test case --- app/models/settings/user_experience.rb | 1 + app/services/badges/award_tag.rb | 2 +- spec/requests/admin/configs_spec.rb | 11 +++++++++++ spec/services/badges/award_tag_spec.rb | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/models/settings/user_experience.rb b/app/models/settings/user_experience.rb index 11f311f52..50612582c 100644 --- a/app/models/settings/user_experience.rb +++ b/app/models/settings/user_experience.rb @@ -40,5 +40,6 @@ module Settings setting :tag_feed_minimum_score, type: :integer, default: 0 setting :default_locale, type: :string, default: "en" setting :display_in_directory, type: :boolean, default: true + setting :award_tag_minimum_score, type: :integer, default: 100 end end diff --git a/app/services/badges/award_tag.rb b/app/services/badges/award_tag.rb index b992f0e0d..976b72527 100644 --- a/app/services/badges/award_tag.rb +++ b/app/services/badges/award_tag.rb @@ -13,7 +13,7 @@ module Badges def call Tag.where.not(badge_id: nil).find_each do |tag| past_winner_user_ids = BadgeAchievement.where(badge_id: tag.badge_id).pluck(:user_id) - winning_article = Article.where("score > 100") + winning_article = Article.where("score > ?", Settings::UserExperience.award_tag_minimum_score) .published .not_authored_by(past_winner_user_ids) .order(score: :desc) diff --git a/spec/requests/admin/configs_spec.rb b/spec/requests/admin/configs_spec.rb index 8b709699f..7bc60e038 100644 --- a/spec/requests/admin/configs_spec.rb +++ b/spec/requests/admin/configs_spec.rb @@ -728,6 +728,17 @@ RSpec.describe "/admin/customization/config" do } end.to change(Settings::UserExperience, :display_in_directory).from(default_value).to(false) end + + it "updates the award_tag_minimum_score" do + default_value = Settings::UserExperience.get_default(:award_tag_minimum_score) + new_award_tag_minimum_score = 200 + expect do + post admin_settings_user_experiences_path, params: { + settings_user_experience: { award_tag_minimum_score: new_award_tag_minimum_score } + } + end.to change(Settings::UserExperience, + :award_tag_minimum_score).from(default_value).to(new_award_tag_minimum_score) + end end describe "Credits" do diff --git a/spec/services/badges/award_tag_spec.rb b/spec/services/badges/award_tag_spec.rb index 28db363d3..f4d9078d5 100644 --- a/spec/services/badges/award_tag_spec.rb +++ b/spec/services/badges/award_tag_spec.rb @@ -61,4 +61,24 @@ RSpec.describe Badges::AwardTag, type: :service do expect(second_user.reload.badge_achievements.size).to eq(1) expect(third_user.reload.badge_achievements.size).to eq(1) end + + context "when award_tag_minimum_score setting is different than default" do + it "awards badge if qualifying article by score and tagged appropriately" do + allow(Settings::UserExperience).to receive(:award_tag_minimum_score).and_return(200) + article.update_columns(cached_tag_list: tag.name, score: 201) + described_class.call + expect(user.badge_achievements.size).to eq(1) + expect(user.badge_achievements.last.badge_id).to eq(badge.id) + end + end + + context "when award_tag_minimum_score is 100 and the article score is greater than it" do + it "awards badge if qualifying article by score and tagged appropriately" do + allow(Settings::UserExperience).to receive(:award_tag_minimum_score).and_return(100) + article.update_columns(cached_tag_list: tag.name, score: 201) + described_class.call + expect(user.badge_achievements.size).to eq(1) + expect(user.badge_achievements.last.badge_id).to eq(badge.id) + end + end end