# rubocop:disable all require 'test_helper' class EmailParserTest < ActiveSupport::TestCase =begin to write new .yml files for emails you can use the following code: File.write('test/data/mail/mailXXX.yml', Channel::EmailParser.new.parse(File.read('test/data/mail/mailXXX.box')).slice(:from, :from_email, :from_display_name, :to, :cc, :subject, :body, :content_type, :'reply-to', :attachments).to_yaml) =end test 'parse' do msg_files = Dir.glob(Rails.root.join('test', 'data', 'mail', 'mail*.box')).sort messages = [] msg_files.each do |f| next if !File.exists?(f.ext('yml')) item = { source: File.basename(f), content: YAML.load(File.read(f.ext('yml'))), parsed: Channel::EmailParser.new.parse(File.read(f)), } messages.push item end messages.each do |m| # assert: raw content hash is a subset of parsed message hash expected_msg = m[:content].except(:attachments) parsed_msg = m[:parsed].slice(*expected_msg.keys) expected_msg.each do |key, value| assert_equal(value, parsed_msg[key], "parsed message data does not match test/data/mail/#{m[:source]}: #{key}") end # assert: attachments in parsed message hash match metadata in raw hash next if m[:content][:attachments].blank? attachments_found = [] m[:content][:attachments].each do |expected_attachment| expected_attachment_md5 = Digest::MD5.hexdigest(expected_attachment[:data]) m[:parsed][:attachments].each do |parsed_attachment| parsed_attachment_md5 = Digest::MD5.hexdigest(parsed_attachment[:data]) next if attachments_found.include?(parsed_attachment_md5) next if expected_attachment_md5 != parsed_attachment_md5 attachments_found.push parsed_attachment_md5 expected_attachment.each do |key, value| assert_equal(value, parsed_attachment[key], "#{key} is different") end next end end next if attachments_found.count == m[:content][:attachments].count m[:content][:attachments].each do |expected_attachment| next if attachments_found.include?(Digest::MD5.hexdigest(expected_attachment[:data])) assert(false, "Attachment not found test/data/mail/#{m[:source]}: #{expected_attachment.inspect}") end end end end