Create AdminNotification model, spec and factory
This commit is contained in:
44
app/models/admin_notification.rb
Normal file
44
app/models/admin_notification.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
class AdminNotification < ActiveRecord::Base
|
||||
include Notifiable
|
||||
|
||||
validates :title, presence: true
|
||||
validates :body, presence: true
|
||||
validates :segment_recipient, presence: true
|
||||
validate :validate_segment_recipient
|
||||
|
||||
before_validation :complete_link_url
|
||||
|
||||
def list_of_recipients
|
||||
UserSegments.send(segment_recipient) if valid_segment_recipient?
|
||||
end
|
||||
|
||||
def valid_segment_recipient?
|
||||
segment_recipient && UserSegments.respond_to?(segment_recipient)
|
||||
end
|
||||
|
||||
def draft?
|
||||
sent_at.nil?
|
||||
end
|
||||
|
||||
def list_of_recipients_count
|
||||
list_of_recipients.try(:count) || 0
|
||||
end
|
||||
|
||||
def deliver
|
||||
list_of_recipients.each { |user| Notification.add(user, self) }
|
||||
self.update(sent_at: Time.current, recipients_count: list_of_recipients.count)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_segment_recipient
|
||||
errors.add(:segment_recipient, :invalid) unless valid_segment_recipient?
|
||||
end
|
||||
|
||||
def complete_link_url
|
||||
return unless link.present?
|
||||
unless self.link[/\Ahttp:\/\//] || self.link[/\Ahttps:\/\//]
|
||||
self.link = "http://#{self.link}"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1003,6 +1003,20 @@ LOREM_IPSUM
|
||||
sequence(:body) { |n| "Body #{n}" }
|
||||
end
|
||||
|
||||
factory :admin_notification do
|
||||
title { |n| "Admin Notification title #{n}" }
|
||||
body { |n| "Admin Notification body #{n}" }
|
||||
link nil
|
||||
segment_recipient UserSegments::SEGMENTS.sample
|
||||
recipients_count nil
|
||||
sent_at nil
|
||||
|
||||
trait :sent do
|
||||
recipients_count 1
|
||||
sent_at Time.current
|
||||
end
|
||||
end
|
||||
|
||||
factory :widget_card, class: 'Widget::Card' do
|
||||
sequence(:title) { |n| "Title #{n}" }
|
||||
sequence(:description) { |n| "Description #{n}" }
|
||||
|
||||
91
spec/models/admin_notification_spec.rb
Normal file
91
spec/models/admin_notification_spec.rb
Normal file
@@ -0,0 +1,91 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe AdminNotification do
|
||||
let(:admin_notification) { build(:admin_notification) }
|
||||
|
||||
it "is valid" do
|
||||
expect(admin_notification).to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid without a title' do
|
||||
admin_notification.title = nil
|
||||
expect(admin_notification).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid without a body' do
|
||||
admin_notification.body = nil
|
||||
expect(admin_notification).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid without a segment_recipient' do
|
||||
admin_notification.segment_recipient = nil
|
||||
expect(admin_notification).not_to be_valid
|
||||
end
|
||||
|
||||
describe '#complete_link_url' do
|
||||
it 'does not change link if there is no value' do
|
||||
expect(admin_notification.link).to be_nil
|
||||
end
|
||||
|
||||
it 'fixes a link without http://' do
|
||||
admin_notification.link = 'lol.consul.dev'
|
||||
|
||||
expect(admin_notification).to be_valid
|
||||
expect(admin_notification.link).to eq('http://lol.consul.dev')
|
||||
end
|
||||
|
||||
it 'fixes a link with wwww. but without http://' do
|
||||
admin_notification.link = 'www.lol.consul.dev'
|
||||
|
||||
expect(admin_notification).to be_valid
|
||||
expect(admin_notification.link).to eq('http://www.lol.consul.dev')
|
||||
end
|
||||
|
||||
it 'does not modify a link with http://' do
|
||||
admin_notification.link = 'http://lol.consul.dev'
|
||||
|
||||
expect(admin_notification).to be_valid
|
||||
expect(admin_notification.link).to eq('http://lol.consul.dev')
|
||||
end
|
||||
|
||||
it 'does not modify a link with https://' do
|
||||
admin_notification.link = 'https://lol.consul.dev'
|
||||
|
||||
expect(admin_notification).to be_valid
|
||||
expect(admin_notification.link).to eq('https://lol.consul.dev')
|
||||
end
|
||||
|
||||
it 'does not modify a link with http://wwww.' do
|
||||
admin_notification.link = 'http://www.lol.consul.dev'
|
||||
|
||||
expect(admin_notification).to be_valid
|
||||
expect(admin_notification.link).to eq('http://www.lol.consul.dev')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#valid_segment_recipient?' do
|
||||
it 'is false when segment_recipient value is invalid' do
|
||||
admin_notification.update(segment_recipient: 'invalid_segment_name')
|
||||
error = 'The user recipients segment is invalid'
|
||||
|
||||
expect(admin_notification).not_to be_valid
|
||||
expect(admin_notification.errors.messages[:segment_recipient]).to include(error)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#list_of_recipients' do
|
||||
let(:erased_user) { create(:user, username: 'erased_user') }
|
||||
|
||||
before do
|
||||
2.times { create(:user) }
|
||||
erased_user.erase
|
||||
admin_notification.update(segment_recipient: 'all_users')
|
||||
end
|
||||
|
||||
it 'returns list of all active users' do
|
||||
expect(admin_notification.list_of_recipients.count).to eq(2)
|
||||
expect(admin_notification.list_of_recipients).not_to include(erased_user)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user