# frozen_string_literal: true # Copyright (c) 2008-16 Peter H. Boling of RailsBling.com # Released under the MIT license # Note: the RspecMatchers are composed matchers: # See: http://www.relishapp.com/rspec/rspec-expectations/v/3-5/docs/composing-matchers require 'sanitize_email/mail_ext' module SanitizeEmail # Provides matchers that can be used in # Rspec tests to assert the behavior of email module RspecMatchers %i[from to cc bcc subject reply_to].each do |attribute| RSpec::Matchers.define "have_#{attribute}" do |matcher| match do |actual| @actual = actual.send(attribute) @actual = @actual.join(', ') if @actual.respond_to?(:join) expect(@actual).to match(matcher) end end end %i[from to cc bcc subject reply_to].each do |attribute| RSpec::Matchers.define "match_#{attribute}" do |matcher| match do |actual| @actual = actual.send(attribute) @actual = @actual.join(', ') if @actual.respond_to?(:join) expect(@actual).to match(matcher) end end end %i[from to cc bcc subject reply_to].each do |attribute| RSpec::Matchers.define "be_#{attribute}" do |matcher| match do |actual| @actual = actual.send(attribute) @actual = @actual.join(', ') if @actual.respond_to?(:join) expect(@actual).to be(matcher) end end end RSpec::Matchers.define 'have_to_username' do |matcher| def get_to_username(email_message) username_header = email_message.header['X-Sanitize-Email-To'] return username_header unless username_header.is_a?(Mail::Field) email_message.header.fields[3].value end match do |actual| @actual = get_to_username(actual) expect(@actual).to match(matcher) end end RSpec::Matchers.define 'have_cc_username' do |matcher| def get_cc_username(email_message) username_header = email_message.header['X-Sanitize-Email-Cc'] return username_header unless username_header.is_a?(Mail::Field) email_message.header.fields[3].value end match do |actual| @actual = get_cc_username(actual) expect(@actual).to match(matcher) end end # Cribbed from email_spec gem RSpec::Matchers.define 'have_body_text' do |matcher| def get_fuzzy_body(email_message) email_message.default_part_body.to_s.gsub(/\s+/, ' ') end def get_fuzzy_matcher(to_fuzz) to_fuzz.gsub(/\s+/, ' ') end match do |actual| @actual = get_fuzzy_body(actual) fuzzy_matcher = get_fuzzy_matcher(matcher) expect(@actual).to match(fuzzy_matcher) end end # Cribbed from email_spec gem RSpec::Matchers.define 'have_header' do |name, matcher| match do |actual| @actual = actual.header[name] @actual = @actual.value unless @actual.nil? expect(@actual).to match(matcher) end end end end