diff --git a/app/controllers/internal/badges_controller.rb b/app/controllers/internal/badges_controller.rb index c9e2d2880..06c14c256 100644 --- a/app/controllers/internal/badges_controller.rb +++ b/app/controllers/internal/badges_controller.rb @@ -6,12 +6,16 @@ class Internal::BadgesController < Internal::ApplicationController end def award_badges + raise ArgumentError, "Please choose a badge to award" if permitted_params[:badge].blank? + usernames = permitted_params[:usernames].split(/\s*,\s*/) - badge_slug = permitted_params[:badge] message = permitted_params[:message_markdown].presence || "Congrats!" - BadgeRewarder.award_badges(usernames, badge_slug, message) + BadgeRewarder.award_badges(usernames, permitted_params[:badge], message) flash[:success] = "BadgeRewarder task ran!" redirect_to internal_badges_url + rescue ArgumentError => e + flash[:danger] = e.message + redirect_to "/internal/badges" end private diff --git a/app/controllers/internal/tools_controller.rb b/app/controllers/internal/tools_controller.rb index 7dec2b5df..98d11c65f 100644 --- a/app/controllers/internal/tools_controller.rb +++ b/app/controllers/internal/tools_controller.rb @@ -16,7 +16,7 @@ class Internal::ToolsController < Internal::ApplicationController end redirect_to "/internal/tools" rescue StandardError => e - flash[:danger] = e + flash[:danger] = e.message redirect_to "/internal/tools" end diff --git a/app/views/internal/badges/index.html.erb b/app/views/internal/badges/index.html.erb index c8c4b9bbc..737b357ea 100644 --- a/app/views/internal/badges/index.html.erb +++ b/app/views/internal/badges/index.html.erb @@ -3,7 +3,7 @@ <%= form_with(url: internal_badges_award_badges_path, local: true) do |f| %>
<%= f.label :badge, "Badge" %> - <%= f.select("badge", @badges.map { |b| [b.title, b.slug] }, class: "form-control") %> + <%= f.select("badge", @badges.map { |b| [b.title, b.slug] }, include_blank: true, class: "form-control") %>
<%= f.label :usernames, "Usernames (Comma Delimited)*" %> diff --git a/spec/requests/internal/badges_spec.rb b/spec/requests/internal/badges_spec.rb index 6ff7086d0..a14aac1a2 100644 --- a/spec/requests/internal/badges_spec.rb +++ b/spec/requests/internal/badges_spec.rb @@ -30,5 +30,14 @@ RSpec.describe "/internal/badges", type: :request do } end.to change { user.badges.count }.by(1).and change { user2.badges.count }.by(1) end + + it "does not award a badge and raises an error if a badge is not specified" do + expect do + post internal_badges_award_badges_path, params: { + usernames: "#{user.username}, #{user2.username}", + message_markdown: "" + } + end.to change { user.badges.count }.by(0) + end end end diff --git a/spec/system/internal/admin_awards_badges_spec.rb b/spec/system/internal/admin_awards_badges_spec.rb index 1c3201d25..268758390 100644 --- a/spec/system/internal/admin_awards_badges_spec.rb +++ b/spec/system/internal/admin_awards_badges_spec.rb @@ -13,6 +13,12 @@ RSpec.describe "Admin awards badges", type: :system do click_on "Award Badges" end + def award_no_badges + fill_in "usernames", with: "#{user.username}, #{user2.username}" + fill_in "message_markdown", with: "He who controls the spice controls the universe." + click_on "Award Badges" + end + before do create_list :badge, 5 sign_in admin @@ -46,4 +52,9 @@ RSpec.describe "Admin awards badges", type: :system do end end end + + it "does not award badges if no badge is selected" do + expect { award_no_badges }.to change { user.badges.count }.by(0) + expect(page).to have_content("Please choose a badge to award") + end end