diff options
-rw-r--r-- | lib/Sietima/Message.pm | 20 | ||||
-rw-r--r-- | t/tests/sietima/message.t | 41 |
2 files changed, 58 insertions, 3 deletions
diff --git a/lib/Sietima/Message.pm b/lib/Sietima/Message.pm index 7202269..a864c02 100644 --- a/lib/Sietima/Message.pm +++ b/lib/Sietima/Message.pm @@ -15,6 +15,7 @@ has mail => ( has from => ( is => 'ro', isa => Address, + coerce => AddressFromStr, required => 1, ); @@ -26,13 +27,26 @@ has to => ( required => 1, ); +sub _clone_address { + Email::Address->new( + $_[0]->phrase, + $_[0]->address, + $_[0]->comment, + $_[0]->original, + ); +} + +sub _clone_mail { + Email::MIME->new($_[0]->as_string); +} + sub clone { my ($self,$args) = @_; return ref($self)->new({ - map { - $_ => $args->{$_} // $self->$_, - } qw(mail from to), + from => $args->{from} || _clone_address($self->from), + to => $args->{to} || [ map { _clone_address($_) } @{$self->to} ], + mail => $args->{mail} || _clone_mail($self->mail), }); } diff --git a/t/tests/sietima/message.t b/t/tests/sietima/message.t new file mode 100644 index 0000000..8b42ff8 --- /dev/null +++ b/t/tests/sietima/message.t @@ -0,0 +1,41 @@ +#!perl +use strict; +use warnings; +use 5.020; +use lib 't/lib'; +use Test2::Bundle::Extended; +use Test2::Tools::MoreCompare qw(bag); +use Test2::Plugin::DieOnFail; +use Email::Stuffer; +use Data::Printer; +use Sietima::Message; + +my $mail = Email::Stuffer + ->from('one@example.com') + ->to('two@example, three@example.com') + ->text_body('test message')->email; + +my $message = Sietima::Message->new({ + mail => $mail, + from => 'one@envelope.example.com', + to => [ + 'two@envelope.example.com', + 'three@envelope.example.com', + ], +}); + +is( + $message->envelope, + { + from => 'one@envelope.example.com', + to => bag { + item 'two@envelope.example.com'; + item 'three@envelope.example.com'; + }, + }, + 'the envelope should be built from the attributes', +); + +# I'm not sure I'll need 'clone', so I won't test it for the moment + +done_testing; |