From 40b989ca6200083b31f1b311fd4206fecea09cd9 Mon Sep 17 00:00:00 2001 From: Anna Buianova Date: Tue, 30 Mar 2021 10:58:48 +0300 Subject: [PATCH] Configure badge credits by admins (#13145) * Added credits_awarded to /admin/badges forms * Award credits only if badge has them * Removed information about credits and listings in the new badge email when not needed * Specs for number of credits awarded for badges * Added missing newline * Fix typo Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com> * Improve new_badge_email.text.erb Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com> * Fixed number of credits in notification * Added specs for number of credits in notifications Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com> --- app/controllers/admin/badges_controller.rb | 2 +- app/models/badge_achievement.rb | 4 +- .../new_badge_achievement/send.rb | 3 +- app/views/admin/badges/edit.html.erb | 5 ++ app/views/admin/badges/new.html.erb | 5 ++ .../notify_mailer/new_badge_email.html.erb | 19 +++--- .../notify_mailer/new_badge_email.text.erb | 8 ++- .../notifications/_badgeachievement.html.erb | 8 ++- spec/mailers/notify_mailer_spec.rb | 62 ++++++++++++++++--- spec/models/badge_achievement_spec.rb | 13 +++- spec/requests/admin/badges_spec.rb | 7 +++ spec/requests/notifications_spec.rb | 24 ++++++- .../new_badge_achievement/send_spec.rb | 6 +- 13 files changed, 133 insertions(+), 33 deletions(-) diff --git a/app/controllers/admin/badges_controller.rb b/app/controllers/admin/badges_controller.rb index 4a253697f..a24d82565 100644 --- a/app/controllers/admin/badges_controller.rb +++ b/app/controllers/admin/badges_controller.rb @@ -41,7 +41,7 @@ module Admin private def badge_params - params.require(:badge).permit(:title, :slug, :description, :badge_image) + params.require(:badge).permit(:title, :slug, :description, :badge_image, :credits_awarded) end end end diff --git a/app/models/badge_achievement.rb b/app/models/badge_achievement.rb index 32d981f0a..759f81c87 100644 --- a/app/models/badge_achievement.rb +++ b/app/models/badge_achievement.rb @@ -48,6 +48,8 @@ class BadgeAchievement < ApplicationRecord end def award_credits - Credit.add_to(user, 5) + return if badge.credits_awarded.zero? + + Credit.add_to(user, badge.credits_awarded) end end diff --git a/app/services/notifications/new_badge_achievement/send.rb b/app/services/notifications/new_badge_achievement/send.rb index cb294eabd..db387104a 100644 --- a/app/services/notifications/new_badge_achievement/send.rb +++ b/app/services/notifications/new_badge_achievement/send.rb @@ -35,7 +35,8 @@ module Notifications badge: { title: badge_achievement.badge.title, description: badge_achievement.badge.description, - badge_image_url: badge_achievement.badge.badge_image_url + badge_image_url: badge_achievement.badge.badge_image_url, + credits_awarded: badge_achievement.badge.credits_awarded } } } diff --git a/app/views/admin/badges/edit.html.erb b/app/views/admin/badges/edit.html.erb index 01d5bd7a0..4454eb84e 100644 --- a/app/views/admin/badges/edit.html.erb +++ b/app/views/admin/badges/edit.html.erb @@ -30,6 +30,11 @@ <% end %> <%= form.file_field :badge_image, class: "form-control" %> + +
+ <%= form.label :credits_awarded, "Credits awarded:" %> + <%= form.text_field :credits_awarded, class: "form-control" %> +
<%= submit_tag "Update Badge", class: "btn btn-primary" %> <% end %> diff --git a/app/views/admin/badges/new.html.erb b/app/views/admin/badges/new.html.erb index bc7ad940d..106d905c2 100644 --- a/app/views/admin/badges/new.html.erb +++ b/app/views/admin/badges/new.html.erb @@ -21,6 +21,11 @@ <%= form.label :badge_image, "Badge Image:" %> <%= form.file_field :badge_image, class: "form-control" %> + +
+ <%= form.label :credits_awarded, "Credits awarded:" %> + <%= form.text_field :credits_awarded, class: "form-control" %> +
<%= submit_tag "Create Badge", class: "btn btn-primary" %> <% end %> diff --git a/app/views/mailers/notify_mailer/new_badge_email.html.erb b/app/views/mailers/notify_mailer/new_badge_email.html.erb index 1e44eec7a..b9ce9e6ac 100644 --- a/app/views/mailers/notify_mailer/new_badge_email.html.erb +++ b/app/views/mailers/notify_mailer/new_badge_email.html.erb @@ -25,12 +25,15 @@ Check out your profile

-
-

- You also get 5 new credits to use for community listings
- if you have anything you'd like to promote. 🎉 -

-

- More information about listings -

+ + <% unless @badge.credits_awarded.zero? %> +
+

+ You also get <%= @badge.credits_awarded %> new credits to use for community listings
+ if you have anything you'd like to promote. 🎉 +

+

+ More information about listings +

+ <% end %> diff --git a/app/views/mailers/notify_mailer/new_badge_email.text.erb b/app/views/mailers/notify_mailer/new_badge_email.text.erb index 998281ffb..2909df791 100644 --- a/app/views/mailers/notify_mailer/new_badge_email.text.erb +++ b/app/views/mailers/notify_mailer/new_badge_email.text.erb @@ -6,8 +6,10 @@ Congratulations, <%= @user.name %>! You got the <%= @badge.title %> badge! Be su <%= user_url(@user) %> -You also get 5 new credits to use for community listings if you have anything you'd like to promote: <%= listings_url %> +<% unless @badge.credits_awarded.zero? %> + You also get <%= @badge.credits_awarded %> new credits to use for community listings if you have anything you'd like to promote: <%= listings_url %> -To manage your credits: visit: <%= credits_url %> + To manage your credits visit: <%= credits_url %> -For more information about listings, visit: <%= app_url(about_listings_url) %> + For more information about listings, visit: <%= app_url(about_listings_url) %> +<% end %> diff --git a/app/views/notifications/_badgeachievement.html.erb b/app/views/notifications/_badgeachievement.html.erb index 153277ab3..5c7ccc080 100644 --- a/app/views/notifications/_badgeachievement.html.erb +++ b/app/views/notifications/_badgeachievement.html.erb @@ -9,10 +9,12 @@
" alt="<%= json_data["badge_achievement"]["badge"]["title"] %>"> -

<%= json_data["badge_achievement"]["rewarding_context_message"].html_safe %>

+

<%= json_data["badge_achievement"]["rewarding_context_message"].to_s.html_safe %>

" class="crayons-btn w-100 m:w-50">Visit your profile

-

You also get 5 new credits to use for community listings if you have anything you'd like to promote. 🎉

-

More information about listings

+ <% unless json_data["badge_achievement"]["badge"]["credits_awarded"].zero? %> +

You also get <%= json_data["badge_achievement"]["badge"]["credits_awarded"] %> new credits to use for community listings if you have anything you'd like to promote. 🎉

+

More information about listings

+ <% end %> diff --git a/spec/mailers/notify_mailer_spec.rb b/spec/mailers/notify_mailer_spec.rb index 273a05c49..7bfc62624 100644 --- a/spec/mailers/notify_mailer_spec.rb +++ b/spec/mailers/notify_mailer_spec.rb @@ -155,6 +155,10 @@ RSpec.describe NotifyMailer, type: :mailer do let(:badge_achievement) { create_badge_achievement(user, badge, user2) } let(:email) { described_class.with(badge_achievement: badge_achievement).new_badge_email } + let(:badge_with_credits) { create(:badge, credits_awarded: 7) } + let(:badge_achievement_with_credits) { create_badge_achievement(user, badge_with_credits, user2) } + let(:email_with_credits) { described_class.with(badge_achievement: badge_achievement_with_credits).new_badge_email } + def create_badge_achievement(user, badge, rewarder) BadgeAchievement.create( user: user, @@ -178,7 +182,47 @@ RSpec.describe NotifyMailer, type: :mailer do expect(email.to).to eq([user.email]) end - context "when rendering the HTML email" do + context "when rendering the HTML email for badge with credits" do + it "includes the listings URL" do + expect(email_with_credits.html_part.body).to include( + CGI.escape( + Rails.application.routes.url_helpers.listings_url(host: SiteConfig.app_domain), + ), + ) + end + + it "includes the about listings URL" do + expect(email_with_credits.html_part.body).to include( + CGI.escape(Rails.application.routes.url_helpers.about_listings_url(host: SiteConfig.app_domain)), + ) + end + + it "includes number of credits" do + expect(email_with_credits.html_part.body).to include("7 new credits") + end + end + + context "when rendering the text email for badge with credits" do + it "includes the listings URL" do + expect(email_with_credits.text_part.body).not_to include( + CGI.escape( + Rails.application.routes.url_helpers.listings_url(host: SiteConfig.app_domain), + ), + ) + end + + it "includes the about listings URL" do + expect(email_with_credits.text_part.body).not_to include( + CGI.escape(Rails.application.routes.url_helpers.about_listings_url(host: SiteConfig.app_domain)), + ) + end + + it "includes number of credits" do + expect(email_with_credits.text_part.body).to include("7 new credits") + end + end + + context "when rendering the HTML email for badge w/o credits" do it "includes the tracking pixel" do expect(email.html_part.body).to include("open.gif") end @@ -193,16 +237,16 @@ RSpec.describe NotifyMailer, type: :mailer do expect(email.html_part.body).to include(CGI.escape(URL.user(user))) end - it "includes the listings URL" do - expect(email.html_part.body).to include( + it "doesn't include the listings URL" do + expect(email.html_part.body).not_to include( CGI.escape( Rails.application.routes.url_helpers.listings_url(host: SiteConfig.app_domain), ), ) end - it "includes the about listings URL" do - expect(email.html_part.body).to include( + it "doesn't include the about listings URL" do + expect(email.html_part.body).not_to include( CGI.escape(Rails.application.routes.url_helpers.about_listings_url(host: SiteConfig.app_domain)), ) end @@ -232,14 +276,14 @@ RSpec.describe NotifyMailer, type: :mailer do expect(email.text_part.body).to include(URL.user(user)) end - it "includes the listings URL" do - expect(email.text_part.body).to include( + it "doesn't include the listings URL" do + expect(email.text_part.body).not_to include( Rails.application.routes.url_helpers.listings_url(host: SiteConfig.app_domain), ) end - it "includes the about listings URL" do - expect(email.text_part.body).to include( + it "doesn't include the about listings URL" do + expect(email.text_part.body).not_to include( Rails.application.routes.url_helpers.about_listings_url(host: SiteConfig.app_domain), ) end diff --git a/spec/models/badge_achievement_spec.rb b/spec/models/badge_achievement_spec.rb index b34130c85..9abbb886d 100644 --- a/spec/models/badge_achievement_spec.rb +++ b/spec/models/badge_achievement_spec.rb @@ -1,7 +1,10 @@ require "rails_helper" RSpec.describe BadgeAchievement, type: :model do - let(:achievement) { create(:badge_achievement) } + let(:badge_with_credits) { create(:badge, credits_awarded: 10) } + let(:badge) { create(:badge, credits_awarded: 0) } + let(:achievement) { create(:badge_achievement, badge: badge) } + let(:credits_achievement) { create(:badge_achievement, badge: badge_with_credits) } describe "validations" do describe "builtin validations" do @@ -18,8 +21,12 @@ RSpec.describe BadgeAchievement, type: :model do expect(achievement.rewarding_context_message).to include("") end - it "awards credits after create" do - expect(achievement.user.credits.size).to eq(5) + it "doesn't award credits if credits_awarded is zero" do + expect(achievement.user.credits.size).to eq(0) + end + + it "awards credits after create if credits_awarded exist" do + expect(credits_achievement.user.credits.size).to eq(10) end it "notifies recipients after commit" do diff --git a/spec/requests/admin/badges_spec.rb b/spec/requests/admin/badges_spec.rb index 30099187e..31688d386 100644 --- a/spec/requests/admin/badges_spec.rb +++ b/spec/requests/admin/badges_spec.rb @@ -10,6 +10,7 @@ RSpec.describe "/admin/badges", type: :request do title: "Hello, world!", slug: "greeting-badge", description: "Awarded to welcoming users", + credits_awarded: 10, badge_image: Rack::Test::UploadedFile.new("spec/support/fixtures/images/image1.jpeg", "image/jpeg") } } @@ -39,5 +40,11 @@ RSpec.describe "/admin/badges", type: :request do patch "/admin/badges/#{badge.id}", params: params end.to change { badge.reload.title }.to("Hello, world!") end + + it "successfully updates badge's credits_awarded" do + expect do + patch "/admin/badges/#{badge.id}", params: params + end.to change { badge.reload.credits_awarded }.to(10) + end end end diff --git a/spec/requests/notifications_spec.rb b/spec/requests/notifications_spec.rb index 617708f43..f2ae0ee78 100644 --- a/spec/requests/notifications_spec.rb +++ b/spec/requests/notifications_spec.rb @@ -590,10 +590,10 @@ RSpec.describe "NotificationsIndex", type: :request do end end - context "when a user has a new badge notification" do + context "when a user has a new badge notification w/o credits" do before do sign_in user - badge = create(:badge) + badge = create(:badge, credits_awarded: 0) badge_achievement = create(:badge_achievement, user: user, badge: badge) sidekiq_perform_enqueued_jobs do Notification.send_new_badge_achievement_notification(badge_achievement) @@ -623,6 +623,26 @@ RSpec.describe "NotificationsIndex", type: :request do def renders_visit_profile_button expect(response.body).to include "Visit your profile" end + + it "has no information about credits" do + expect(response.body).not_to include "new credits" + end + end + + context "when a user has a new badge notification with credits" do + before do + sign_in user + badge = create(:badge, credits_awarded: 11) + badge_achievement = create(:badge_achievement, user: user, badge: badge) + sidekiq_perform_enqueued_jobs do + Notification.send_new_badge_achievement_notification(badge_achievement) + end + get "/notifications" + end + + it "renders information about credits" do + expect(response.body).to include "11 new credits" + end end context "when a user has a new mention notification" do diff --git a/spec/services/notifications/new_badge_achievement/send_spec.rb b/spec/services/notifications/new_badge_achievement/send_spec.rb index 38071e404..3a80acc06 100644 --- a/spec/services/notifications/new_badge_achievement/send_spec.rb +++ b/spec/services/notifications/new_badge_achievement/send_spec.rb @@ -1,7 +1,8 @@ require "rails_helper" RSpec.describe Notifications::NewBadgeAchievement::Send, type: :service do - let(:badge_achievement) { create(:badge_achievement) } + let(:badge) { create(:badge, credits_awarded: 7) } + let(:badge_achievement) { create(:badge_achievement, badge: badge) } let(:blank_badge_achievement) { create(:badge_achievement, rewarding_context_message: nil) } def expected_json_data(badge_achievement) @@ -13,7 +14,8 @@ RSpec.describe Notifications::NewBadgeAchievement::Send, type: :service do badge: { title: badge_achievement.badge.title, description: badge_achievement.badge.description, - badge_image_url: badge_achievement.badge.badge_image_url + badge_image_url: badge_achievement.badge.badge_image_url, + credits_awarded: badge_achievement.badge.credits_awarded } } }.to_json