Skip to content

Instantly share code, notes, and snippets.

@koleksiuk
Created May 3, 2014 15:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koleksiuk/ac261f78727c6ce32e4a to your computer and use it in GitHub Desktop.
Save koleksiuk/ac261f78727c6ce32e4a to your computer and use it in GitHub Desktop.
class Message
class Starred
attr_accessor :user, :message
InvalidUserError = Class.new(StandardError)
def initialize(user, message)
self.user = user
self.message = message
raise ArgumentError.new('User & message must be present') unless args_present?
end
def save
raise InvalidUserError.new("User can't star own message") if user_owns_message?
message.starred_by_users << user
end
def user_owns_message?
message.user_id == user.id
end
private
def args_present?
!user.nil? && !message.nil?
end
end
end
require 'spec_helper'
describe Message::Starred do
let(:user_with_message) { double(:user, id: 1) }
let(:user) { double(:user, id: 2) }
let(:starred_by_users) { double(:collection) }
let(:message) { double(:message, user_id: 1, starred_by_users: starred_by_users) }
context 'when args are missing' do
it 'raises argument error for no user' do
expect {
described_class.new(nil, message)
}.to raise_error(ArgumentError)
end
it 'raises argument error for no message' do
expect {
described_class.new(user_with_message, nil)
}.to raise_error(ArgumentError)
end
end
describe '#save' do
let(:object) { described_class.new(user_context, message) }
context 'when user is an owner of message' do
let(:user_context) { user_with_message }
it 'raises error' do
expect {
object.save
}.to raise_error(described_class::InvalidUserError)
end
end
context 'when user is not an owner of message' do
let(:user_context) { user }
it 'stars the message by user' do
expect(starred_by_users).to receive(:<<).with(user)
object.save
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment