diff --git a/Changelog.md b/Changelog.md
index 4a22adf2c..bbb791573 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -78,6 +78,7 @@ With the port to Bootstrap 3, app/views/terms/default.haml has a new structure.
## Features
* Show spinner on initial stream load [#6384](https://github.com/diaspora/diaspora/pull/6384)
+* Add new moderator role. Moderators can view and act on reported posts [#6351](https://github.com/diaspora/diaspora/pull/6351)
# 0.5.3.0
diff --git a/app/assets/templates/header_tpl.jst.hbs b/app/assets/templates/header_tpl.jst.hbs
index 0fde655e1..c885522d0 100644
--- a/app/assets/templates/header_tpl.jst.hbs
+++ b/app/assets/templates/header_tpl.jst.hbs
@@ -100,6 +100,8 @@
{{t "header.help"}}
{{#if current_user.admin}}
{{t "header.admin"}}
+ {{else if current_user.moderator}}
+ {{t "header.moderator"}}
{{/if}}
{{t "header.log_out"}}
@@ -114,6 +116,7 @@
+
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 57aa4de7d..eb06e2f9e 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -5,7 +5,7 @@
class ApplicationController < ActionController::Base
before_action :force_tablet_html
has_mobile_fu
- protect_from_forgery :except => :receive
+ protect_from_forgery except: :receive
before_action :ensure_http_referer_is_set
before_action :set_locale
@@ -16,7 +16,7 @@ class ApplicationController < ActionController::Base
before_action :gon_set_appconfig
before_action :gon_set_preloads
- inflection_method :grammatical_gender => :gender
+ inflection_method grammatical_gender: :gender
helper_method :all_aspects,
:all_contacts_count,
@@ -35,7 +35,7 @@ class ApplicationController < ActionController::Base
end
def ensure_http_referer_is_set
- request.env['HTTP_REFERER'] ||= '/'
+ request.env["HTTP_REFERER"] ||= "/"
end
# Overwriting the sign_out redirect path method
@@ -68,11 +68,11 @@ class ApplicationController < ActionController::Base
end
def set_diaspora_header
- headers['X-Diaspora-Version'] = AppConfig.version_string
+ headers["X-Diaspora-Version"] = AppConfig.version_string
if AppConfig.git_available?
- headers['X-Git-Update'] = AppConfig.git_update if AppConfig.git_update.present?
- headers['X-Git-Revision'] = AppConfig.git_revision if AppConfig.git_revision.present?
+ headers["X-Git-Update"] = AppConfig.git_update if AppConfig.git_update.present?
+ headers["X-Git-Revision"] = AppConfig.git_revision if AppConfig.git_revision.present?
end
end
@@ -87,10 +87,13 @@ class ApplicationController < ActionController::Base
end
def redirect_unless_admin
- unless current_user.admin?
- redirect_to stream_url, :notice => 'you need to be an admin to do that'
- return
- end
+ return if current_user.admin?
+ redirect_to stream_url, notice: "you need to be an admin to do that"
+ end
+
+ def redirect_unless_moderator
+ return if current_user.moderator?
+ redirect_to stream_url, notice: "you need to be an admin or moderator to do that"
end
def set_grammatical_gender
@@ -98,7 +101,7 @@ class ApplicationController < ActionController::Base
gender = current_user.gender.to_s.tr('!()[]"\'`*=|/\#.,-:', '').downcase
unless gender.empty?
i_langs = I18n.inflector.inflected_locales(:gender)
- i_langs.delete I18n.locale
+ i_langs.delete I18n.locale
i_langs.unshift I18n.locale
i_langs.each do |lang|
token = I18n.inflector.true_token(gender, :gender, lang)
@@ -150,7 +153,7 @@ class ApplicationController < ActionController::Base
return unless user_signed_in?
a_ids = session[:a_ids] || []
user = UserPresenter.new(current_user, a_ids)
- gon.push({:user => user})
+ gon.push(user: user)
end
def gon_set_preloads
diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb
index 5d8d7c338..8e0826c1f 100644
--- a/app/controllers/report_controller.rb
+++ b/app/controllers/report_controller.rb
@@ -3,8 +3,8 @@
# the COPYRIGHT file.
class ReportController < ApplicationController
- before_filter :authenticate_user!
- before_filter :redirect_unless_admin, :except => [:create]
+ before_action :authenticate_user!
+ before_action :redirect_unless_moderator, except: [:create]
def index
@reports = Report.where(reviewed: false)
@@ -19,19 +19,19 @@ class ReportController < ApplicationController
def destroy
if (report = Report.where(id: params[:id]).first) && report.destroy_reported_item
- flash[:notice] = I18n.t 'report.status.destroyed'
+ flash[:notice] = I18n.t "report.status.destroyed"
else
- flash[:error] = I18n.t 'report.status.failed'
+ flash[:error] = I18n.t "report.status.failed"
end
- redirect_to :action => :index
+ redirect_to action: :index
end
def create
report = current_user.reports.new(report_params)
if report.save
- render :json => true, :status => 200
+ render json: true, status: 200
else
- render :nothing => true, :status => 409
+ render nothing: true, status: 409
end
end
diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb
index b3479cc74..35aafcf3e 100644
--- a/app/mailers/report_mailer.rb
+++ b/app/mailers/report_mailer.rb
@@ -1,30 +1,32 @@
class ReportMailer < ActionMailer::Base
- default :from => AppConfig.mail.sender_address
+ default from: AppConfig.mail.sender_address
- def new_report(type, id)
+ def self.new_report(type, id)
+ Role.moderators.map {|role| super(type, id, role) }
+ end
+
+ def new_report(type, id, role)
resource = {
- :url => report_index_url,
- :type => I18n.t('notifier.report_email.type.' + type),
- :id => id
+ url: report_index_url,
+ type: I18n.t("notifier.report_email.type." + type),
+ id: id
}
-
- Role.admins.each do |role|
- person = Person.find(role.person_id)
- if person.local?
- user = User.find_by_id(person.owner_id)
- unless user.user_preferences.exists?(:email_type => :someone_reported)
- resource[:email] = user.email
- format(resource)
- end
- end
+ person = Person.find(role.person_id)
+ return unless person.local?
+ user = User.find_by_id(person.owner_id)
+ return if user.user_preferences.exists?(email_type: :someone_reported)
+ I18n.with_locale(user.language) do
+ resource[:email] = user.email
+ format(resource)
end
end
private
- def format(resource)
- mail(to: resource[:email], subject: I18n.t('notifier.report_email.subject', :type => resource[:type])) do |format|
- format.html { render 'report/report_email', :locals => { :resource => resource } }
- format.text { render 'report/report_email', :locals => { :resource => resource } }
- end
+
+ def format(resource)
+ mail(to: resource[:email], subject: I18n.t("notifier.report_email.subject", type: resource[:type])) do |format|
+ format.html { render "report/report_email", locals: {resource: resource} }
+ format.text { render "report/report_email", locals: {resource: resource} }
end
+ end
end
diff --git a/app/models/role.rb b/app/models/role.rb
index dafc33f37..cbe5644ef 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -1,13 +1,14 @@
-#NOTE add the person object you want to attach role to...
+# NOTE add the person object you want to attach role to...
class Role < ActiveRecord::Base
belongs_to :person
validates :person, presence: true
validates :name, uniqueness: {scope: :person_id}
- validates :name, inclusion: {in: %w(admin spotlight)}
+ validates :name, inclusion: {in: %w(admin moderator spotlight)}
scope :admins, -> { where(name: "admin") }
+ scope :moderators, -> { where(name: %w(moderator admin)) }
def self.is_admin?(person)
exists?(person_id: person.id, name: "admin")
@@ -17,6 +18,14 @@ class Role < ActiveRecord::Base
find_or_create_by(person_id: person.id, name: "admin")
end
+ def self.moderator?(person)
+ moderators.exists?(person_id: person.id)
+ end
+
+ def self.add_moderator(person)
+ find_or_create_by(person_id: person.id, name: "moderator")
+ end
+
def self.add_spotlight(person)
find_or_create_by(person_id: person.id, name: "spotlight")
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 2e39dec9d..a7ed430fb 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -489,6 +489,10 @@ class User < ActiveRecord::Base
Role.is_admin?(self.person)
end
+ def moderator?
+ Role.moderator?(person)
+ end
+
def podmin_account?
username == AppConfig.admins.account
end
diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb
index 1874570c4..076734d96 100644
--- a/app/presenters/user_presenter.rb
+++ b/app/presenters/user_presenter.rb
@@ -6,16 +6,16 @@ class UserPresenter
self.aspects_ids = aspects_ids
end
- def to_json(options = {})
- self.user.person.as_api_response(:backbone).update(
- { :notifications_count => notifications_count,
- :unread_messages_count => unread_messages_count,
- :admin => admin,
- :aspects => aspects,
- :services => services,
- :following_count => self.user.contacts.receiving.count,
- :configured_services => self.configured_services,
- }
+ def to_json(options={})
+ user.person.as_api_response(:backbone).update(
+ notifications_count: notifications_count,
+ unread_messages_count: unread_messages_count,
+ admin: admin,
+ moderator: moderator,
+ aspects: aspects,
+ services: services,
+ following_count: user.contacts.receiving.count,
+ configured_services: configured_services
).to_json(options)
end
@@ -24,14 +24,14 @@ class UserPresenter
end
def configured_services
- user.services.map{|service| service.provider }
+ user.services.map(&:provider)
end
def aspects
@aspects ||= begin
aspects = AspectPresenter.as_collection(user.aspects)
- no_aspects = self.aspects_ids.empty?
- aspects.each{ |a| a[:selected] = no_aspects || self.aspects_ids.include?(a[:id].to_s) }
+ no_aspects = aspects_ids.empty?
+ aspects.each {|a| a[:selected] = no_aspects || aspects_ids.include?(a[:id].to_s) }
end
end
@@ -46,4 +46,8 @@ class UserPresenter
def admin
user.admin?
end
+
+ def moderator
+ user.moderator?
+ end
end
diff --git a/app/views/report/index.html.haml b/app/views/report/index.html.haml
index 0b8563729..b13031cd7 100644
--- a/app/views/report/index.html.haml
+++ b/app/views/report/index.html.haml
@@ -1,7 +1,11 @@
+- content_for :head do
+ = stylesheet_link_tag :admin
+
.container
.row
.col-md-3
- = render partial: "admins/admin_bar"
+ - if current_user.admin?
+ = render partial: "admins/admin_bar"
.col-md-9
%h1
= t('report.title')
diff --git a/app/workers/mail/report_worker.rb b/app/workers/mail/report_worker.rb
index 6d272f486..ede0f0867 100644
--- a/app/workers/mail/report_worker.rb
+++ b/app/workers/mail/report_worker.rb
@@ -4,9 +4,8 @@ module Workers
sidekiq_options queue: :mail
def perform(type, id)
- ReportMailer.new_report(type, id).deliver_now
+ ReportMailer.new_report(type, id).each(&:deliver_now)
end
end
end
end
-
diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml
index f28c8eecf..3203c2b73 100644
--- a/config/locales/diaspora/de.yml
+++ b/config/locales/diaspora/de.yml
@@ -1433,4 +1433,4 @@ de:
welcome: "Willkommen!"
will_paginate:
next_label: "nächstes »"
- previous_label: "« voriges"
\ No newline at end of file
+ previous_label: "« voriges"
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index 9095edb24..33a625d02 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -266,6 +266,7 @@ en:
settings: "Settings"
help: "Help"
admin: "Admin"
+ moderator: "Moderator"
log_out: "Log out"
toggle_navigation: "Toggle navigation"
toggle_mobile: "Toggle mobile"
diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb
index 6e63902e2..e5d5a49eb 100644
--- a/spec/controllers/report_controller_spec.rb
+++ b/spec/controllers/report_controller_spec.rb
@@ -1,129 +1,184 @@
+
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
+require "spec_helper"
-describe ReportController, :type => :controller do
+describe ReportController, type: :controller do
before do
sign_in alice
- @message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
+ @message = alice.post(:status_message, text: "hey", to: alice.aspects.first.id)
@comment = alice.comment!(@message, "flying pigs, everywhere")
end
- describe '#index' do
- context 'admin not signed in' do
- it 'is behind redirect_unless_admin' do
+ describe "#index" do
+ context "admin not signed in" do
+ it "is behind redirect_unless_admin" do
get :index
expect(response).to redirect_to stream_path
end
end
-
- context 'admin signed in' do
+
+ context "admin signed in" do
before do
Role.add_admin(alice.person)
end
- it 'succeeds and renders index' do
+ it "succeeds and renders index" do
get :index
- expect(response).to render_template('index')
+ expect(response).to render_template("index")
+ end
+ end
+
+ context "moderator signed in" do
+ before do
+ Role.add_moderator(alice.person)
+ end
+ it "succeeds and renders index" do
+ get :index
+ expect(response).to render_template("index")
end
end
end
- describe '#create' do
+ describe "#create" do
let(:comment_hash) {
- {:text =>"facebook, is that you?",
- :item_id =>"#{@post.id}"}
+ {text: "facebook, is that you?",
+ item_id: "#{@post.id}"}
}
- context 'report offensive post' do
- it 'succeeds' do
- put :create, :report => { :item_id => @message.id, :item_type => 'post', :text => 'offensive content' }
+ context "report offensive post" do
+ it "succeeds" do
+ put :create, report: {item_id: @message.id, item_type: "post", text: "offensive content"}
expect(response.status).to eq(200)
- expect(Report.exists?(:item_id => @message.id, :item_type => 'post')).to be true
+ expect(Report.exists?(item_id: @message.id, item_type: "post")).to be true
end
end
- context 'report offensive comment' do
- it 'succeeds' do
- put :create, :report => { :item_id => @comment.id, :item_type => 'comment', :text => 'offensive content' }
+ context "report offensive comment" do
+ it "succeeds" do
+ put :create, report: {item_id: @comment.id, item_type: "comment", text: "offensive content"}
expect(response.status).to eq(200)
- expect(Report.exists?(:item_id => @comment.id, :item_type => 'comment')).to be true
+ expect(Report.exists?(item_id: @comment.id, item_type: "comment")).to be true
end
end
end
- describe '#update' do
- context 'mark post report as user' do
- it 'is behind redirect_unless_admin' do
- put :update, :id => @message.id, :type => 'post'
+ describe "#update" do
+ context "mark post report as user" do
+ it "is behind redirect_unless_admin_or_moderator" do
+ put :update, id: @message.id, type: "post"
expect(response).to redirect_to stream_path
- expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy
+ expect(Report.where(reviewed: false, item_id: @message.id, item_type: "post")).to be_truthy
end
end
- context 'mark comment report as user' do
- it 'is behind redirect_unless_admin' do
- put :update, :id => @comment.id, :type => 'comment'
+ context "mark comment report as user" do
+ it "is behind redirect_unless_admin_or_moderator" do
+ put :update, id: @comment.id, type: "comment"
expect(response).to redirect_to stream_path
- expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
+ expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy
end
end
- context 'mark post report as admin' do
+ context "mark post report as admin" do
before do
Role.add_admin(alice.person)
end
- it 'succeeds' do
- put :update, :id => @message.id, :type => 'post'
+ it "succeeds" do
+ put :update, id: @message.id, type: "post"
expect(response.status).to eq(302)
- expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy
+ expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy
end
end
- context 'mark comment report as admin' do
+ context "mark comment report as admin" do
before do
Role.add_admin(alice.person)
end
- it 'succeeds' do
- put :update, :id => @comment.id, :type => 'comment'
+ it "succeeds" do
+ put :update, id: @comment.id, type: "comment"
expect(response.status).to eq(302)
- expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
+ expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy
+ end
+ end
+
+ context "mark post report as moderator" do
+ before do
+ Role.add_moderator(alice.person)
+ end
+
+ it "succeeds" do
+ put :update, id: @message.id, type: "post"
+ expect(response.status).to eq(302)
+ expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy
+ end
+ end
+
+ context "mark comment report as moderator" do
+ before do
+ Role.add_moderator(alice.person)
+ end
+ it "succeeds" do
+ put :update, id: @comment.id, type: "comment"
+ expect(response.status).to eq(302)
+ expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy
end
end
end
- describe '#destroy' do
- context 'destroy post as user' do
- it 'is behind redirect_unless_admin' do
- delete :destroy, :id => @message.id, :type => 'post'
+ describe "#destroy" do
+ context "destroy post as user" do
+ it "is behind redirect_unless_admin_or_moderator" do
+ delete :destroy, id: @message.id, type: "post"
expect(response).to redirect_to stream_path
- expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy
+ expect(Report.where(reviewed: false, item_id: @message.id, item_type: "post")).to be_truthy
end
end
- context 'destroy comment as user' do
- it 'is behind redirect_unless_admin' do
- delete :destroy, :id => @comment.id, :type => 'comment'
+ context "destroy comment as user" do
+ it "is behind redirect_unless_admin_or_moderator" do
+ delete :destroy, id: @comment.id, type: "comment"
expect(response).to redirect_to stream_path
- expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
+ expect(Report.where(reviewed: false, item_id: @comment.id, item_type: "comment")).to be_truthy
end
end
- context 'destroy post as admin' do
+ context "destroy post as admin" do
before do
Role.add_admin(alice.person)
end
- it 'succeeds' do
- delete :destroy, :id => @message.id, :type => 'post'
+ it "succeeds" do
+ delete :destroy, id: @message.id, type: "post"
expect(response.status).to eq(302)
- expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy
+ expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy
end
end
- context 'destroy comment as admin' do
+ context "destroy comment as admin" do
before do
Role.add_admin(alice.person)
end
- it 'succeeds' do
- delete :destroy, :id => @comment.id, :type => 'comment'
+ it "succeeds" do
+ delete :destroy, id: @comment.id, type: "comment"
expect(response.status).to eq(302)
- expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
+ expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy
+ end
+ end
+
+ context "destroy post as moderator" do
+ before do
+ Role.add_moderator(alice.person)
+ end
+ it "succeeds" do
+ delete :destroy, id: @message.id, type: "post"
+ expect(response.status).to eq(302)
+ expect(Report.where(reviewed: true, item_id: @message.id, item_type: "post")).to be_truthy
+ end
+ end
+ context "destroy comment as moderator" do
+ before do
+ Role.add_moderator(alice.person)
+ end
+ it "succeeds" do
+ delete :destroy, id: @comment.id, type: "comment"
+ expect(response.status).to eq(302)
+ expect(Report.where(reviewed: true, item_id: @comment.id, item_type: "comment")).to be_truthy
end
end
end
diff --git a/spec/mailers/report_spec.rb b/spec/mailers/report_spec.rb
index b5ec54642..32c2afdb1 100644
--- a/spec/mailers/report_spec.rb
+++ b/spec/mailers/report_spec.rb
@@ -2,31 +2,40 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
+require "spec_helper"
-describe Report, :type => :mailer do
- describe '#make_notification' do
+describe Report, type: :mailer do
+ describe "#make_notification" do
before do
- @remote = FactoryGirl.create(:person, :diaspora_handle => "remote@remote.net")
- @user = FactoryGirl.create(:user_with_aspect, :username => "local")
+ @remote = FactoryGirl.create(:person, diaspora_handle: "remote@remote.net")
+ @user = FactoryGirl.create(:user_with_aspect, username: "local", language: "de")
+ @user2 = FactoryGirl.create(:user_with_aspect, username: "locally")
Role.add_admin(@user.person)
+ Role.add_moderator(@user2.person)
end
-
+
it "should deliver successfully" do
expect {
- ReportMailer.new_report('post', 666).deliver_now
+ ReportMailer.new_report("post", 666).each(&:deliver_now)
}.to_not raise_error
end
-
+
it "should be added to the delivery queue" do
expect {
- ReportMailer.new_report('post', 666).deliver_now
- }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ ReportMailer.new_report("post", 666).each(&:deliver_now)
+ }.to change(ActionMailer::Base.deliveries, :size).by(2)
end
it "should include correct recipient" do
- ReportMailer.new_report('post', 666).deliver_now
+ ReportMailer.new_report("post", 666).each(&:deliver_now)
expect(ActionMailer::Base.deliveries[0].to[0]).to include(@user.email)
+ expect(ActionMailer::Base.deliveries[1].to[0]).to include(@user2.email)
+ end
+
+ it "should send mail in recipent's prefered language" do
+ ReportMailer.new_report("post", 666).each(&:deliver_now)
+ expect(ActionMailer::Base.deliveries[0].subject).to match("Ein neuer post wurde als anstößig markiert")
+ expect(ActionMailer::Base.deliveries[1].subject).to match("A new post was marked as offensive")
end
end
end
diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb
index 82a95a8ff..225cd4ead 100644
--- a/spec/models/role_spec.rb
+++ b/spec/models/role_spec.rb
@@ -1,12 +1,16 @@
require "spec_helper"
describe Role do
- let(:person) { create(:person) }
+ let!(:person) { create(:person) }
+ let!(:admin) { create(:person) }
+ let!(:admin_role) { admin.roles.create(name: "admin") }
+ let!(:moderator) { create(:person) }
+ let!(:moderator_role) { moderator.roles.create(name: "moderator") }
describe "validations" do
it { should validate_presence_of(:person) }
it { should validate_uniqueness_of(:name).scoped_to(:person_id) }
- it { should validate_inclusion_of(:name).in_array(%w(admin spotlight)) }
+ it { should validate_inclusion_of(:name).in_array(%w(admin spotlight moderator)) }
end
describe "associations" do
@@ -14,14 +18,21 @@ describe Role do
end
describe "scopes" do
- let!(:admin_role) { person.roles.create(name: "admin") }
- let!(:spotlight_role) { person.roles.create(name: "spotlight") }
-
describe ".admins" do
it "includes admin roles" do
expect(Role.admins).to match_array([admin_role])
end
end
+
+ describe ".moderators" do
+ it "should include admins" do
+ expect(Role.moderators).to include(admin_role)
+ end
+
+ it "should include moderators" do
+ expect(Role.moderators).to include(moderator_role)
+ end
+ end
end
describe ".is_admin?" do
@@ -30,10 +41,32 @@ describe Role do
end
context "when the person is an admin" do
- before { person.roles.create(name: "admin") }
-
it "is true" do
- expect(Role.is_admin?(person)).to be true
+ expect(Role.is_admin?(admin)).to be true
+ end
+ end
+
+ context "when the person is a moderator" do
+ it "is false" do
+ expect(Role.is_admin?(moderator)).to be false
+ end
+ end
+ end
+
+ describe ".moderator?" do
+ it "defaults to false" do
+ expect(Role.moderator?(person)).to be false
+ end
+
+ context "when the person is a moderator" do
+ it "is true" do
+ expect(Role.moderator?(moderator)).to be true
+ end
+ end
+
+ context "when the person is an admin" do
+ it "is true" do
+ expect(Role.moderator?(admin)).to be true
end
end
end
@@ -45,6 +78,13 @@ describe Role do
end
end
+ describe ".add_moderator" do
+ it "creates the moderator role" do
+ Role.add_moderator(person)
+ expect(person.roles.where(name: "moderator")).to exist
+ end
+ end
+
describe ".add_spotlight" do
it "creates the spotlight role" do
Role.add_spotlight(person)