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