docbrown/spec/requests/admin/badge_achievements_spec.rb
Arit Amana aa5f18b234
Admin Save Confirmation - Removing Badge Achievements (#14684)
* schema file undelete description

* update with main

* update with origin

* update

* create controller; hook up to badge_achievements

* almost done with implementation

* push up what I have

* complete implementation; generalize snackbar usage

* start writing tests

* add confirmation text entry step to test

* Fix delete via JS

* implement danger notice for errors

* complete cypress test

* create ErrorAlert CustomEvent and implement

* fix failing badge_achievements spec

* start applying PR review changes

* hook up Preact Modal

* fix cypress tests

* remove old comment

Co-authored-by: Nick Taylor <nick@forem.com>

* consolidate messaging functions

Co-authored-by: Michael Kohl <citizen428@forem.com>
Co-authored-by: Nick Taylor <nick@forem.com>
2021-09-15 21:25:01 -04:00

109 lines
4.3 KiB
Ruby

require "rails_helper"
require "requests/shared_examples/internal_policy_dependant_request"
RSpec.describe "/admin/content_manager/badge_achievements", type: :request do
let(:admin) { create(:user, :super_admin) }
let!(:badge) { create(:badge, title: "Not 'Hello, world!'") }
let(:params) do
{
badge: {
title: "Hello, world!",
slug: "greeting-badge",
description: "Awarded to welcoming users",
badge_image: Rack::Test::UploadedFile.new("spec/support/fixtures/images/image1.jpeg", "image/jpeg")
}
}
end
it_behaves_like "an InternalPolicy dependant request", Badge do
let(:request) { get admin_badges_path }
end
describe "POST /admin/content_manager/badge_achievements/award_badges" do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:usernames_string) { "#{user.username}, #{user2.username}" }
let(:usernames_array) { [user.username, user2.username] }
before do
sign_in admin
allow(BadgeAchievements::BadgeAwardWorker).to receive(:perform_async)
end
context "when the user is a single resource admin" do
it "awards the badge" do
user.add_role(:single_resource_admin, BadgeAchievement)
sign_in user
allow(BadgeAchievements::BadgeAwardWorker).to receive(:perform_async)
post admin_badge_achievements_award_badges_path, params: {
badge: badge.slug,
usernames: usernames_string,
message_markdown: "you got a badge nice one"
}
expect(BadgeAchievements::BadgeAwardWorker).to have_received(:perform_async).with(
usernames_array, badge.slug, "you got a badge nice one"
)
expect(request.flash[:success]).to include("Badges are being rewarded. The task will finish shortly.")
end
end
it "awards badges" do
allow(BadgeAchievements::BadgeAwardWorker).to receive(:perform_async)
post admin_badge_achievements_award_badges_path, params: {
badge: badge.slug,
usernames: usernames_string,
message_markdown: "Hinder me? Thou fool. No living man may hinder me!"
}
expect(BadgeAchievements::BadgeAwardWorker).to have_received(:perform_async).with(
usernames_array, badge.slug, "Hinder me? Thou fool. No living man may hinder me!"
)
expect(request.flash[:success]).to include("Badges are being rewarded. The task will finish shortly.")
end
it "awards badges with default a message" do
allow(BadgeAchievements::BadgeAwardWorker).to receive(:perform_async)
post admin_badge_achievements_award_badges_path, params: {
badge: badge.slug,
usernames: usernames_string,
message_markdown: ""
}
expect(BadgeAchievements::BadgeAwardWorker).to have_received(:perform_async).with(usernames_array, badge.slug,
"Congrats!")
expect(request.flash[:success]).to include("Badges are being rewarded. The task will finish shortly.")
end
it "does not award a badge and raises an error if a badge is not specified" do
post admin_badge_achievements_award_badges_path, params: {
usernames: usernames_string,
message_markdown: ""
}
expect(BadgeAchievements::BadgeAwardWorker).not_to have_received(:perform_async).with(usernames_array,
badge.slug, "")
end
it "does not award a badge if the username provided is not lowercase" do
post admin_badge_achievements_award_badges_path, params: {
badge: badge.slug,
usernames: user.username.upcase,
message_markdown: ""
}
expect(BadgeAchievements::BadgeAwardWorker).not_to have_received(:perform_async).with(user.username.upcase,
badge.slug, "")
end
end
describe "DELETE /admin/content_manager/badge_achievements/:id" do
let!(:badge_achievement) { create(:badge_achievement) }
before do
sign_in admin
end
it "deletes the badge_achievement" do
expect do
delete admin_badge_achievement_path(badge_achievement.id)
end.to change { BadgeAchievement.all.count }.by(-1)
end
end
end