require 'rails_helper'

RSpec.describe MailManager::Message do
  def message
    @message
  end
  before(:each) do 
    @message = FactoryGirl.create(:message)
  end
  describe "concerning statuses" do
    it "starts in :pending" do
      expect(message.status).to eq('pending')
    end
    it "goes to 'sent' on a deliver" do
      message.save
      message.deliver
      expect(message.status).to eq('sent')
    end
    it "goes to 'failed_address' on a message bounce" do
      pending "need to get a failed worthy bounce!"
      raise "not tested"
    end
    it "stays 'sent' on a temporary message bounce" do
      pending "need to get a temporary bounce!"
      raise "not tested"
    end
    it "goes to 'processing' while it is being sent" do
      pending "figure this out... its in the middle of a deliver"
      raise "not tested"
    end
    describe "and can't be delivered unless it is currently pending or ready" do
      it "when pending can be delivered" do
        expect(message.can_deliver?).to be true
      end
      it "when ready can be delivered" do
        message.change_status('ready')
        expect(message.can_deliver?).to be true
      end
      it "when processing cannot be delivered" do
        message.change_status('processing')
        expect(message.can_deliver?).to be false
      end
      it "when sent cannot be delivered" do
        message.change_status('sent')
        expect(message.can_deliver?).to be false
      end
      it "when failed cannot be delivered" do
        message.change_status('failed')
        expect(message.can_deliver?).to be false
      end
    end
  end

  it "has a email_address_with_name when a name is present on the contact" do
    contact = message.contact
    expect(message.email_address_with_name).to eq(%Q|"#{contact.full_name}" <#{contact.email_address}>|)
    and_it "only has email when the contact has no name" do
      message.contact.update_attributes(first_name: nil, last_name: nil)
      expect(message.email_address_with_name).to eq(contact.email_address)
    end
  end

  it "knows its mailing's subject" do
    expect(message.subject).to eq(message.mailing.subject)
  end

  it "knows its contact's full name" do
    expect(message.full_name).to eq(message.contact.full_name)
  end

  context "concerning a deleted contact" do
    before(:each) do
      @contact = MailManager::Contact.find(message.contact_id)
      @contact.delete
      @message = MailManager::Message.find(message.id)
    end
    it "doesn't blow up when asking for full_name" do
      expect(message.full_name).to eq @contact.full_name
    end
    it "doesn't blow up when asking for email_address" do
      expect(message.email_address).to eq @contact.email_address
    end
  end

  context "concerning a nil contact" do
    before(:each) do
      MailManager::Contact.where(id: message.contact_id).delete_all
      @message = MailManager::Message.find(message.id)
    end
    it "doesn't blow up when asking for full_name" do
      expect(message.full_name).to eq nil
    end
    it "doesn't blow up when asking for email_address" do
      expect(message.email_address).to eq nil
    end
  end

  describe "concerning a contact's data" do 
    it "will substitute values into messages" do
      pending "not tested" 
      raise "not tested"
    end
  end

  describe "concerning a registerd contactable's data" do 
    it "will substitute values into messages" do
      pending "not tested" 
      raise "not tested"
    end
  end

end