spec/custom/models/newsletter_spec.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'rails_helper'

describe Newsletter do
  let(:newsletter) { build(:newsletter) }

  it "is valid" do
    expect(newsletter).to be_valid
  end

  it 'is not valid without a subject' do
    newsletter.subject = nil
    expect(newsletter).not_to be_valid
  end

  it 'is not valid without a segment_recipient' do
    newsletter.segment_recipient = nil
    expect(newsletter).not_to be_valid
  end

  it 'is not valid with an inexistent user segment for segment_recipient' do
    newsletter.segment_recipient = 'invalid_user_segment_name'
    expect(newsletter).not_to be_valid
  end

  it 'is not valid without a from' do
    newsletter.from = nil
    expect(newsletter).not_to be_valid
  end

  it 'is not valid without a body' do
    newsletter.body = nil
    expect(newsletter).not_to be_valid
  end

  it 'validates from attribute email format' do
    newsletter.from = "this_is_not_an_email"
    expect(newsletter).not_to be_valid
  end

  describe '#valid_segment_recipient?' do
    # TODO i18n : broken because of test locale change
    xit 'is false when segment_recipient value is invalid' do
      newsletter.update(segment_recipient: 'invalid_segment_name')
      error = 'The user recipients segment is invalid'

      expect(newsletter).not_to be_valid
      expect(newsletter.errors.messages[:segment_recipient]).to include(error)
    end
  end

  describe '#list_of_recipient_emails' do

    before do
      create(:user, newsletter: true, email: 'newsletter_user@consul.dev')
      create(:user, newsletter: false, email: 'no_news_user@consul.dev')
      create(:user, email: 'erased_user@consul.dev').erase
      newsletter.update(segment_recipient: 'all_users')
    end

    it 'returns list of recipients excluding users with disabled newsletter' do
      expect(newsletter.list_of_recipient_emails.count).to eq(1)
      expect(newsletter.list_of_recipient_emails).to include('newsletter_user@consul.dev')
      expect(newsletter.list_of_recipient_emails).not_to include('no_news_user@consul.dev')
      expect(newsletter.list_of_recipient_emails).not_to include('erased_user@consul.dev')
    end
  end
end