The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-

# t/05_attachment.t - check module for attachment handling

use Test::Most tests => 34 + 1;
use Test::NoWarnings;

use Mail::Builder;
use Path::Class::File;

my $pc_file = Path::Class::File->new('t/testfile.txt');

my $attachment1 = Mail::Builder::Attachment->new('t/testfile.txt');
my $attachment2 = Mail::Builder::Attachment->new({ file => $pc_file });
my $attachment3 = Mail::Builder::Attachment->new({ file => $pc_file->openr });
my $attachment4 = Mail::Builder::Attachment->new(\'File content');
my $attachment5 = Mail::Builder::Attachment->new('t/testfile.pdf','document.pdf');

isa_ok ($attachment1, 'Mail::Builder::Attachment');
isa_ok ($attachment2, 'Mail::Builder::Attachment');
isa_ok ($attachment3, 'Mail::Builder::Attachment');
isa_ok ($attachment4, 'Mail::Builder::Attachment');
isa_ok ($attachment5, 'Mail::Builder::Attachment');

is($attachment1->filecontent,'This is a test file for the attachment test!','Content ok');
is($attachment2->filecontent,'This is a test file for the attachment test!','Content ok');
is($attachment3->filecontent,'This is a test file for the attachment test!','Content ok');
is($attachment4->filecontent,'File content','Content ok');

like($attachment1->filename,qr't[\\\/]testfile\.txt$','Filename ok');
like($attachment2->filename,qr't[\\\/]testfile\.txt$','Filename ok');
is($attachment3->filename,undef,'Filename missing ok');
is($attachment4->filename,undef,'Filename missing ok');
like($attachment5->filename,qr't[\\\/]testfile\.pdf$','Filename ok');

isa_ok($attachment1->filename,'Path::Class::File');
isa_ok($attachment2->filename,'Path::Class::File');
isa_ok($attachment5->filename,'Path::Class::File');

is($attachment1->mimetype,'text/plain','MIME type ok');
is($attachment2->mimetype,'text/plain','MIME type ok');
is($attachment3->mimetype,'application/octet-stream','Fallback MIME type ok');
is($attachment4->mimetype,'application/octet-stream','Fallback MIME type ok');
is($attachment5->mimetype,'application/pdf','MIME type ok');

$attachment3->mimetype('text/plain');
is($attachment3->mimetype,'text/plain','MIME type ok');
is($attachment3->has_cache,'','Has no cache set');
throws_ok { $attachment4->mimetype('brokenmime') } qr/pass the type constraint because: 'brokenmime' is not a valid MIME-type/, 'Broken mimetype not accepted';

throws_ok { $attachment3->serialize } qr/Could not determine the attachment name automatically/,'Name check works';
$attachment3->name('testattachment.txt');
my $serialized_attachment3 = $attachment3->serialize;
isa_ok($serialized_attachment3,'MIME::Entity');
is($serialized_attachment3->mime_type,'text/plain','MIME type set');
is($serialized_attachment3->head->get('Content-Disposition'),qq[attachment; filename="testattachment.txt"\n],'Content-Disposition set');
is($serialized_attachment3->head->get('Content-Transfer-Encoding'),qq[base64\n],'Encoding set');
like($serialized_attachment3->stringify,qr/VGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgdGhlIGF0dGFjaG1lbnQgdGVzdCE=/,'Content encoded');

is($attachment3->has_cache,1,'Has cache set');
isa_ok($attachment3->cache,'MIME::Entity');

$attachment3->name('test.txt');
is($attachment3->has_cache,'','Has no cache set');