require 'spec_helper' describe Notification do before(:each) do UserMailer.deliveries.clear MusicSession.delete_all Recording.delete_all Band.delete_all BandInvitation.delete_all Friendship.delete_all Follow.delete_all User.delete_all @receiver = FactoryGirl.create(:user) @sender = FactoryGirl.create(:user) @recording = FactoryGirl.create(:recording) @session = FactoryGirl.create(:music_session) @band = FactoryGirl.create(:band) @slot1 = FactoryGirl.build(:rsvp_slot, :music_session => @session, :instrument => JamRuby::Instrument.find('electric guitar')) @slot1.save @slot2 = FactoryGirl.build(:rsvp_slot, :music_session => @session, :instrument => JamRuby::Instrument.find('drums')) @slot2.save @friend_request = FactoryGirl.create(:friend_request, user: @sender, friend: @receiver) end def count_publish_to_user_calls result = {count: 0} MQRouter.any_instance.stub(:publish_to_user) do |receiver_id, msg| result[:count] += 1 result[:msg] = msg end result end describe "send friend request" do it "sends email when user is offline and subscribes to emails" do calls = count_publish_to_user_calls notification = Notification.send_friend_request(@friend_request.id, @sender.id, @receiver.id) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls notification = Notification.send_friend_request(@friend_request.id, @sender.id, @receiver.id) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "success when online" do receiver_connection = FactoryGirl.create(:connection, user: @receiver) calls = count_publish_to_user_calls notification = Notification.send_friend_request(@friend_request.id, @sender.id, @receiver.id) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 0 calls[:count].should == 1 end end describe "send friend request accepted" do it "sends email when user is offline and subscribes to emails" do calls = count_publish_to_user_calls Notification.send_friend_request_accepted(@receiver.id, @sender.id) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_friend_request_accepted(@receiver.id, @sender.id) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send new user follower" do it "sends email when user is offline and subscribes to emails" do calls = count_publish_to_user_calls Notification.send_new_user_follower(@sender, @receiver) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_new_user_follower(@sender, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send new band follower" do it "sends email when user is offline and subscribes to emails" do @band.users << @receiver calls = count_publish_to_user_calls Notification.send_new_band_follower(@sender, @band) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @band.users << @receiver @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_new_band_follower(@sender, @band) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send session invitation" do it "sends email when user is offline and subscribes to emails" do calls = count_publish_to_user_calls Notification.send_session_invitation(@receiver, @sender, @session.id) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_session_invitation(@receiver, @sender, @session.id) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send musician session join" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! FactoryGirl.create(:friendship, :user => @receiver, :friend => @sender) FactoryGirl.create(:friendship, :user => @sender, :friend => @receiver) calls = count_publish_to_user_calls Notification.send_musician_session_join(@session, @sender) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do FactoryGirl.create(:friendship, :user => @receiver, :friend => @sender) FactoryGirl.create(:friendship, :user => @sender, :friend => @receiver) @session.creator = @sender @session.save! @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_musician_session_join(@session, @sender) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send musician recording saved" do it "sends email when user is offline and subscribes to emails" do FactoryGirl.create(:friendship, :user => @receiver, :friend => @recording.owner) FactoryGirl.create(:friendship, :user => @recording.owner, :friend => @receiver) calls = count_publish_to_user_calls Notification.send_musician_recording_saved(@recording) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do FactoryGirl.create(:friendship, :user => @receiver, :friend => @recording.owner) FactoryGirl.create(:friendship, :user => @recording.owner, :friend => @receiver) @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls Notification.send_musician_recording_saved(@recording) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send band session join" do let(:follower) {FactoryGirl.create(:user)} it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! f = Follow.new f.user_id = follower.id f.followable_id = @band.id f.followable_type = "JamRuby::Band" f.save! calls = count_publish_to_user_calls Notification.send_band_session_join(@session, @band) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! follower.subscribe_email = false follower.save! f = Follow.new f.user_id = follower.id f.followable_id = @band.id f.followable_type = "JamRuby::Band" f.save! calls = count_publish_to_user_calls Notification.send_band_session_join(@session, @band) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send band recording saved" do let(:follower) {FactoryGirl.create(:user)} it "sends email when user is offline and subscribes to emails" do f = Follow.new f.user_id = follower.id f.followable_id = @band.id f.followable_type = "JamRuby::Band" f.save! @recording.band = @band @recording.save! calls = count_publish_to_user_calls Notification.send_band_recording_saved(@recording) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do follower.subscribe_email = false follower.save! f = Follow.new f.user_id = follower.id f.followable_id = @band.id f.followable_type = "JamRuby::Band" f.save! @recording.band = @band @recording.save! follower.subscribe_email = false follower.save! calls = count_publish_to_user_calls Notification.send_band_recording_saved(@recording) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send band invitation" do it "sends email when user is offline and subscribes to emails" do band_invitation = BandInvitation.new band_invitation.receiver = @receiver band_invitation.sender = @sender band_invitation.band = @band band_invitation.save! @band.users << @sender calls = count_publish_to_user_calls notification = Notification.send_band_invitation(@band, band_invitation, @sender, @receiver) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do band_invitation = BandInvitation.new band_invitation.receiver = @receiver band_invitation.sender = @sender band_invitation.band = @band band_invitation.save! @band.users << @sender @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls notification = Notification.send_band_invitation(@band, band_invitation, @sender, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send band invitation accepted" do it "sends email when user is offline and subscribes to emails" do band_invitation = BandInvitation.new band_invitation.receiver = @receiver band_invitation.sender = @sender band_invitation.band = @band band_invitation.save! @band.users << @sender calls = count_publish_to_user_calls notification = Notification.send_band_invitation_accepted(@band, band_invitation, @receiver, @sender) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do band_invitation = BandInvitation.new band_invitation.receiver = @receiver band_invitation.sender = @sender band_invitation.band = @band band_invitation.save! @band.users << @sender @sender.subscribe_email = false @sender.save! calls = count_publish_to_user_calls notification = Notification.send_band_invitation_accepted(@band, band_invitation, @receiver, @sender) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session invitation" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_invitation(@session, @receiver) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_invitation(@session, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_invitation(nil, @sender) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_invitation(@session, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session rsvp" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp(@session, @receiver, nil) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! @session.creator.subscribe_email = false @session.creator.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp(@session, @receiver, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp(nil, @receiver, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp(@session, nil, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session rsvp approved" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_approved(@session, @receiver, nil) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_approved(@session, @receiver, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_approved(nil, @receiver, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_approved(@session, nil, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session rsvp cancellation" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled(@session, @receiver) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! @session.creator.subscribe_email = false @session.creator.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled(@session, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled(nil, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled(@session, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session rsvp cancellation by organizer" do it "sends email when user is offline and subscribes to emails" do @session.creator = @sender @session.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled_org(@session, @receiver) UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "does not send email when user is offline and opts out of emails" do @session.creator = @sender @session.save! @receiver.subscribe_email = false @receiver.save! calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled_org(@session, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled_org(nil, @receiver) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rsvp_cancelled_org(@session, nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session cancellation" do # it "sends email when user is offline and subscribes to emails" do # session.creator = sender # session.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 1 # calls[:count].should == 1 # end # it "does not send email when user is offline and opts out of emails" do # session.creator = sender # session.save! # receiver.subscribe_email = false # receiver.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 0 # calls[:count].should == 1 # end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_cancelled(nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if there are no rsvp requests" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_cancelled(@session) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send scheduled session rescheduled" do # it "sends email when user is offline and subscribes to emails" do # session.creator = sender # session.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 1 # calls[:count].should == 1 # end # it "does not send email when user is offline and opts out of emails" do # session.creator = sender # session.save! # receiver.subscribe_email = false # receiver.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 0 # calls[:count].should == 1 # end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rescheduled(nil) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if there are no rsvp requests" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_rescheduled(@session) UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "reminders" do let(:mail) { UserMailer.deliveries[0] } before :each do UserMailer.deliveries.clear end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_session_reminders() UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if there are no rsvp requests" do calls = count_publish_to_user_calls notification = Notification.send_session_reminders() UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends email 24 hours before" do @session.creator = @sender @session.scheduled_start = Time.now + 23.hours @session.save! notification = Notification.send_session_reminders() UserMailer.deliveries.length.should == 1 calls = count_publish_to_user_calls calls[:count].should == 0 mail.html_part.body.include?("is scheduled for tomorrow").should be_true mail.text_part.body.include?("is scheduled for tomorrow").should be_true mail.html_part.body.include?("starts in 1 hour").should be_false mail.text_part.body.include?("starts in 1 hour").should be_false end it "sends email 1 hour before" do @session.creator = @sender @session.scheduled_start = Time.now + 59.minutes @session.save! notification = Notification.send_session_reminders() UserMailer.deliveries.length.should == 1 calls = count_publish_to_user_calls calls[:count].should == 0 mail.html_part.body.include?("is scheduled for tomorrow").should be_false mail.text_part.body.include?("is scheduled for tomorrow").should be_false mail.html_part.body.include?("starts in 1 hour").should be_true mail.text_part.body.include?("starts in 1 hour").should be_true end it "sends notice 5 minutes before" do UserMailer.deliveries.length.should == 0 receiver_connection = FactoryGirl.create(:connection, user: @receiver) @receiver.reload rsvp = RsvpRequest.create({:session_id => @session.id, :rsvp_slots => [@slot1.id, @slot2.id], :message => "We be jammin!"}, @receiver) UserMailer.deliveries.clear calls = count_publish_to_user_calls @session.creator = @sender @session.scheduled_start = Time.now + 4.minutes @session.save! notification = Notification.send_session_reminders() calls[:count].should == 1 UserMailer.deliveries.length.should == 0 end end # reminders describe "send scheduled session comment" do # it "sends email when user is offline and subscribes to emails" do # session.creator = sender # session.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 1 # calls[:count].should == 1 # end # it "does not send email when user is offline and opts out of emails" do # session.creator = sender # session.save! # receiver.subscribe_email = false # receiver.save! # calls = count_publish_to_user_calls # notification = Notification.send_scheduled_session_cancelled(session) # UserMailer.deliveries.length.should == 0 # calls[:count].should == 1 # end it "sends no notification if session is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_comment(nil, @sender, 'when are we playing?') UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if user is nil" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_comment(@session, nil, 'test') UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "sends no notification if comment is empty" do calls = count_publish_to_user_calls notification = Notification.send_scheduled_session_comment(@session, @sender, '') UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end describe "send_text_message" do it "success when offline" do message = "Just a test message!" calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @receiver) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 1 calls[:count].should == 0 end it "success when online" do receiver_connection = FactoryGirl.create(:connection, user: @receiver) @receiver.reload message = "Just a test message!" calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @receiver) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 0 calls[:count].should == 1 calls[:msg].text_message.msg.should == message calls[:msg].text_message.photo_url.should == '' calls[:msg].text_message.sender_name.should == @sender.name calls[:msg].text_message.notification_id.should == notification.id calls[:msg].text_message.created_at = notification.created_date calls[:msg].text_message.clipped_msg.should be_false end it "success when online with long message" do receiver_connection = FactoryGirl.create(:connection, user: @receiver) @receiver.reload message = "0" * 203 # 200 is clip size calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @receiver) notification.errors.any?.should be_false UserMailer.deliveries.length.should == 0 calls[:count].should == 1 calls[:msg].text_message.msg.should == "0" * 200 calls[:msg].text_message.photo_url.should == '' calls[:msg].text_message.sender_name.should == @sender.name calls[:msg].text_message.notification_id.should == notification.id calls[:msg].text_message.created_at = notification.created_date calls[:msg].text_message.clipped_msg.should be_true end it "fails with profanity" do message = "ass" calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @receiver) notification.errors.any?.should be_true notification.errors[:message].should == ['cannot contain profanity'] UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "fails when target is same as receiver" do message = "yo" calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @sender) notification.errors.any?.should be_true notification.errors[:target_user].should == [ValidationMessages::DIFFERENT_SOURCE_TARGET] UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end it "fails when there is no message" do message = '' calls = count_publish_to_user_calls notification = Notification.send_text_message(message, @sender, @receiver) notification.errors.any?.should be_true notification.errors[:message].should == ['is too short (minimum is 1 character)'] UserMailer.deliveries.length.should == 0 calls[:count].should == 0 end end end