# frozen_string_literal: true
RSpec.describe LetterOpenerWeb::Letter do
let(:location) { Pathname.new(__dir__).join('..', '..', 'tmp').cleanpath }
def rich_text(mail_id)
<<~MAIL
Rich text for #{mail_id}
MAIL
end
before :each do
LetterOpenerWeb.configure { |config| config.letters_location = location }
%w[1111_1111 2222_2222].each do |folder|
FileUtils.mkdir_p("#{location}/#{folder}")
File.open("#{location}/#{folder}/plain.html", 'w') { |f| f.write("Plain text for #{folder}") }
File.open("#{location}/#{folder}/rich.html", 'w') { |f| f.write(rich_text(folder)) }
FileUtils.mkdir_p("#{Rails.root.join('tmp', 'letter_opener')}/#{folder}")
File.open("#{Rails.root.join('tmp', 'letter_opener')}/#{folder}/rich.html", 'w') do |f|
f.write("Rich text for #{folder}")
end
end
end
after :each do
LetterOpenerWeb.reset!
FileUtils.rm_rf(location)
end
describe 'rich text headers' do
let(:id) { '1111_1111' }
subject { described_class.new(id: id).headers }
before do
FileUtils.rm_rf("#{location}/#{id}/plain.html")
end
it { is_expected.to match(%r{\s*- From:
\s*- noreply@example\.com
}m) }
end
describe 'plain text headers' do
let(:id) { '1111_1111' }
subject { described_class.new(id: id).headers }
before do
FileUtils.rm_rf("#{location}/#{id}/rich.html")
end
it { is_expected.to eq('UNABLE TO PARSE HEADERS') }
end
describe 'rich text version' do
let(:id) { '1111_1111' }
subject { described_class.new(id: id).rich_text }
it { is_expected.to match(/Rich text for 1111_1111/) }
it 'changes links to show up on a new window' do
link_html = [
"",
" ",
' Link text',
''
].join("\n ")
expect(subject).to include(link_html)
end
it 'always rewrites links with a closing tag rather than making them selfclosing' do
expect(subject).to include("")
end
end
describe 'plain text version' do
let(:id) { '2222_2222' }
subject { described_class.new(id: id).plain_text }
it { is_expected.to match(/Plain text for 2222_2222/) }
end
describe 'default style' do
let(:id) { '2222_2222' }
subject { described_class.new(id: id) }
it 'returns rich if rich text version is present' do
expect(subject.default_style).to eq('rich')
end
it 'returns plain if rich text version is not present' do
allow(File).to receive_messages(exist?: false)
expect(subject.default_style).to eq('plain')
end
end
describe 'attachments' do
let(:file) { 'an-image.csv' }
let(:attachments_dir) { "#{location}/#{id}/attachments" }
let(:id) { '1111_1111' }
subject { described_class.new(id: id) }
before do
FileUtils.mkdir_p(attachments_dir)
File.open("#{attachments_dir}/#{file}", 'w') { |f| f.puts 'csv,contents' }
end
it 'builds a hash with file name as key and full path as value' do
expect(subject.attachments).to eq(file => "#{attachments_dir}/#{file}")
end
end
describe '.search' do
let(:search_results) { described_class.search }
let(:first_letter) { search_results.first }
let(:last_letter) { search_results.last }
before do
allow(File).to receive(:mtime).with("#{location}/1111_1111").and_return(Date.today - 1.day)
allow(File).to receive(:mtime).with("#{location}/2222_2222").and_return(Date.today)
end
it 'returns a list of ordered letters' do
expect(first_letter.sent_at).to be > last_letter.sent_at
end
end
describe '.find' do
let(:id) { 'an-id' }
let(:letter) { described_class.find(id) }
it 'returns a letter with id set' do
expect(letter.id).to eq(id)
end
end
describe '.destroy_all' do
it 'removes all letters' do
described_class.destroy_all
expect(Dir["#{location}/**/*"]).to be_empty
end
end
describe '#delete' do
let(:id) { '1111_1111' }
subject { described_class.new(id: id).delete }
it 'removes the letter with given id' do
subject
directories = Dir["#{location}/*"]
expect(directories.count).to eql(1)
expect(directories.first).not_to match(id)
end
context 'when the id is outside of the letters base path' do
let(:id) { '../3333_3333' }
it 'does not remove the letter' do
expect(FileUtils).not_to receive(:rm_rf).with(location.join(id).cleanpath.to_s)
expect(subject).to be_nil
end
end
end
end