require "spec_helper"

###########################################################
# We test just the mailer templating here.                #
# In other words, make sure there are no glaring oopsies, #
# such as broken templates, or sending to wrong address   #
###########################################################


describe UserMailer do

  let(:user) { FactoryGirl.create(:user) }

  before(:each) do
    stub_const("APP_CONFIG", app_config)
    UserMailer.deliveries.clear
  end

  describe "should send confirm email" do

    let (:mail) { UserMailer.deliveries[0] }
    let (:signup_confirmation_url) { "/confirm" }
    let (:signup_confirmation_url_with_token  ) { "#{signup_confirmation_url}/#{user.signup_token}" }

    before(:each) do
      UserMailer.confirm_email(user, signup_confirmation_url_with_token).deliver_now
    end


    it { UserMailer.deliveries.length.should == 1 }
    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("delighted").should be_true }
    it { mail.html_part.body.include?(signup_confirmation_url_with_token).should be_true }
    it { mail.text_part.body.include?("delighted").should be_true  }
    it { mail.text_part.body.include?(signup_confirmation_url_with_token).should be_true }
  end

  describe "should send welcome email" do

    let (:mail) { UserMailer.deliveries[0] }

    before(:each) do
      UserMailer.welcome_message(user).deliver_now
    end


    it { UserMailer.deliveries.length.should == 1 }
    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("delighted").should be_true }
    it { mail.text_part.body.include?("delighted").should be_true  }
  end

  describe "should send reset password" do

    let(:mail) { UserMailer.deliveries[0] }
    before(:each) do
      UserMailer.password_reset(user, '/reset_password').deliver_now
    end


    it { UserMailer.deliveries.length.should == 1 }

    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("Reset").should be_true }
    it { mail.text_part.body.include?("change your JamKazam password").should be_true }
  end

  describe "should send change password confirmation" do

    let(:mail) { UserMailer.deliveries[0] }

    before(:each) do
      UserMailer.password_changed(user).deliver_now
    end

    it { UserMailer.deliveries.length.should == 1 }

    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("changed your password").should be_true }
    it { mail.text_part.body.include?("changed your password").should be_true }
  end

  describe "should send update email confirmation" do

    let(:mail) { UserMailer.deliveries[0] }

    before(:each) do
      UserMailer.updated_email(user).deliver_now
    end

    it { UserMailer.deliveries.length.should == 1 }

    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("<b>#{user.email}</b> has been confirmed as your new email address.").should be_true }
    it { mail.text_part.body.include?("#{user.email} has been confirmed as your new email address.").should be_true }
  end

  describe "should send updating email" do

    let(:mail) { UserMailer.deliveries[0] }

    before(:each) do
      user.update_email = "my_new_email@jamkazam.com"
      UserMailer.updating_email(user).deliver_now
    end

    it { UserMailer.deliveries.length.should == 1 }

    it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
    it { mail['to'].to_s.should == user.update_email }
    it { mail.multipart?.should == true } # because we send plain + html

    # verify that the messages are correctly configured
    it { mail.html_part.body.include?("to confirm your change in email").should be_true }
    it { mail.text_part.body.include?("to confirm your change in email").should be_true }

    # verify can unsubscribe from bulk emails

    it {mail.html_part.body.include?('here to unsubscribe').should be_true}
    it {mail.html_part.body.include?("https://www.jamkazam.com/unsubscribe/#{user.unsubscribe_token}")}
  end

  describe "notifications" do

    let(:mail) { UserMailer.deliveries[0] }
    let(:music_session) { FactoryGirl.create(:music_session) }

    it "should send upcoming email" do      
      user.update_email = "my_new_email@jamkazam.com"
      UserMailer.scheduled_session_reminder_upcoming(music_session.creator, music_session).deliver_now
      UserMailer.deliveries.length.should == 1

      mail['from'].to_s.should == UserMailer::DEFAULT_SENDER
      mail['to'].to_s.should == music_session.creator.email# rsvp_requests.first.user.email
      mail.multipart?.should == true  # because we send plain + htm

      # verify that the messages are correctly configured
      mail.html_part.body.include?("This is a reminder that your JamKazam session").should be_true
      mail.text_part.body.include?("This is a reminder that your JamKazam session").should be_true
      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 "should send 1-day reminder" do      
      user.update_email = "my_new_email@jamkazam.com"
      UserMailer.scheduled_session_reminder_day(music_session.creator, music_session).deliver_now
      UserMailer.deliveries.length.should == 1

      mail['from'].to_s.should == UserMailer::DEFAULT_SENDER
      mail['to'].to_s.should == music_session.creator.email# rsvp_requests.first.user.email
      mail.multipart?.should == true  # because we send plain + htm

      # verify that the messages are correctly configured
      mail.html_part.body.include?("This is a reminder that your JamKazam session").should be_true
      mail.text_part.body.include?("This is a reminder that your JamKazam session").should be_true
      mail.html_part.body.include?("is scheduled for tomorrow").should be_true
      mail.text_part.body.include?("is scheduled for tomorrow").should be_true
      
    end
  end



  # describe "sends new musicians email" do

  #   let(:mail) { UserMailer.deliveries[0] }

  #   before(:each) do
  #     UserMailer.new_musicians(user, User.musicians).deliver_now
  #   end

  #   it { UserMailer.deliveries.length.should == 1 }

  #   it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER }
  #   it { mail['to'].to_s.should == user.email }
  #   it { mail.multipart?.should == true } # because we send plain + html

  #   # verify that the messages are correctly configured
  #   it { mail.html_part.body.include?("New JamKazam Musicians in your Area").should be_true }
  #   it { mail.text_part.body.include?("New JamKazam Musicians in your Area").should be_true }
  # end

end
