From 94e55558f13b4847b5040c38e4c0a4a7947251e9 Mon Sep 17 00:00:00 2001 From: Jess Lee Date: Wed, 7 Nov 2018 13:29:05 -0500 Subject: [PATCH] Add slack message for warned user activity (#1077) * add slack messsages for warned user activity * make slack messages async * add spec for warned user article creation * refactor observers * add specs * fix specs * enable and create observer specs --- app/observers/application_observer.rb | 10 ++++++++++ app/observers/article_observer.rb | 3 ++- app/observers/comment_observer.rb | 8 ++++++++ config/application.rb | 2 +- spec/observers/article_observer_spec.rb | 17 +++++++++++++++++ spec/observers/comment_observer_spec.rb | 18 ++++++++++++++++++ spec/requests/articles_create_spec.rb | 2 +- 7 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 app/observers/application_observer.rb create mode 100644 app/observers/comment_observer.rb create mode 100644 spec/observers/article_observer_spec.rb create mode 100644 spec/observers/comment_observer_spec.rb diff --git a/app/observers/application_observer.rb b/app/observers/application_observer.rb new file mode 100644 index 000000000..3bde5d679 --- /dev/null +++ b/app/observers/application_observer.rb @@ -0,0 +1,10 @@ +class ApplicationObserver < ActiveRecord::Observer + def warned_user_ping(activity) + if activity.user.warned == true + SlackBot.ping "@#{activity.user.username} just posted.\nThey've been warned since #{activity.user.roles.where(name: 'warned')[0].updated_at.strftime('%d %B %Y')}\nhttps://dev.to#{activity.path}", + channel: "warned-user-activity", + username: "sloan_watch_bot", + icon_emoji: ":sloan:" + end + end +end diff --git a/app/observers/article_observer.rb b/app/observers/article_observer.rb index 72c2752b5..4a83e7a94 100644 --- a/app/observers/article_observer.rb +++ b/app/observers/article_observer.rb @@ -1,4 +1,4 @@ -class ArticleObserver < ActiveRecord::Observer +class ArticleObserver < ApplicationObserver def after_save(article) return if Rails.env.development? if article.published && article.published_at > 30.seconds.ago @@ -8,6 +8,7 @@ class ArticleObserver < ActiveRecord::Observer icon_emoji: ":writing_hand:" end + warned_user_ping(article) rescue StandardError puts "error" end diff --git a/app/observers/comment_observer.rb b/app/observers/comment_observer.rb new file mode 100644 index 000000000..c9bc3e08c --- /dev/null +++ b/app/observers/comment_observer.rb @@ -0,0 +1,8 @@ +class CommentObserver < ApplicationObserver + def after_save(comment) + return if Rails.env.development? + warned_user_ping(comment) + rescue StandardError + puts "error" + end +end diff --git a/config/application.rb b/config/application.rb index b9ad2188b..68161ca04 100644 --- a/config/application.rb +++ b/config/application.rb @@ -31,7 +31,7 @@ module PracticalDeveloper config.autoload_paths += Dir["#{config.root}/app/sanitizers"] config.autoload_paths += Dir["#{config.root}/lib/"] - config.active_record.observers = :article_observer, :reaction_observer + config.active_record.observers = :article_observer, :reaction_observer, :comment_observer config.active_job.queue_adapter = :delayed_job config.middleware.use Rack::Deflater diff --git a/spec/observers/article_observer_spec.rb b/spec/observers/article_observer_spec.rb new file mode 100644 index 000000000..3694daa59 --- /dev/null +++ b/spec/observers/article_observer_spec.rb @@ -0,0 +1,17 @@ +require "rails_helper" + +RSpec.describe ArticleObserver, type: :observer do + let(:user) { create(:user) } + + before do + allow(SlackBot).to receive(:ping).and_return(true) + end + + it "pings slack if user with warned role creates an article" do + user.add_role :warned + Article.observers.enable :article_observer do + create(:article, user_id: user.id) + end + expect(SlackBot).to have_received(:ping).twice + end +end diff --git a/spec/observers/comment_observer_spec.rb b/spec/observers/comment_observer_spec.rb new file mode 100644 index 000000000..375de2e88 --- /dev/null +++ b/spec/observers/comment_observer_spec.rb @@ -0,0 +1,18 @@ +require "rails_helper" + +RSpec.describe CommentObserver, type: :observer do + let(:user) { create(:user) } + let(:article) { create(:article) } + + before do + allow(SlackBot).to receive(:ping).and_return(true) + end + + it "pings slack if user with warned role creates a comment" do + user.add_role :warned + Comment.observers.enable :comment_observer do + create(:comment, user_id: user.id, commentable_id: article.id) + end + expect(SlackBot).to have_received(:ping).twice + end +end diff --git a/spec/requests/articles_create_spec.rb b/spec/requests/articles_create_spec.rb index 8ff304649..d5728210a 100644 --- a/spec/requests/articles_create_spec.rb +++ b/spec/requests/articles_create_spec.rb @@ -56,7 +56,7 @@ RSpec.describe "ArticlesCreate", type: :request do post "/articles", params: { article: { title: new_title, - body_markdown: "---\ntitle: hey hey hahuu\npublished: false\nseries: helloyo\n---\nYo ho ho#{rand(100)}", + body_markdown: "---\ntitle: hey hey hahuu\npublished: false\nseries: helloyo\n---\nYo ho ho#{rand(100)}" } } expect(Collection.last.slug).to eq("helloyo")