#!perl
use Cassandane::Tiny;

sub test_emailsubmission_onsuccessdestroy
    :min_version_3_9
{
    my ($self) = @_;
    my $jmap = $self->{jmap};

    my $res = $jmap->CallMethods( [ [ 'Identity/get', {}, "R1" ] ] );
    my $identityid = $res->[0][1]->{list}[0]->{id};
    $self->assert_not_null($identityid);

    xlog $self, "Generate an email via IMAP";
    $self->make_message("foo", body => "an email") or die;

    xlog $self, "get email id";
    $res = $jmap->CallMethods( [ [ 'Email/query', {}, "R1" ] ] );
    my $emailid = $res->[0][1]->{ids}[0];

    xlog $self, "create email submission with bad onSuccess";
    $res = $jmap->CallMethods( [ [ 'EmailSubmission/set', {
        create => {
            '1' => {
                identityId => $identityid,
                emailId  => $emailid,
            }
       },
        onSuccessDestroyEmail => {}
    }, "R1" ] ] );
    $self->assert_str_equals("error", $res->[0][0]);
    $self->assert_str_equals("invalidArguments", $res->[0][1]{type});
    $self->assert_str_equals("onSuccessDestroyEmail",
                             $res->[0][1]{arguments}[0]);

    xlog $self, "create email submission with bad onSuccess";
    $res = $jmap->CallMethods( [ [ 'EmailSubmission/set', {
        create => {
            '1' => {
                identityId => $identityid,
                emailId  => $emailid,
            }
       },
        onSuccessDestroyEmail => "foo"
    }, "R1" ] ] );
    $self->assert_str_equals("error", $res->[0][0]);
    $self->assert_str_equals("invalidArguments", $res->[0][1]{type});
    $self->assert_str_equals("onSuccessDestroyEmail",
                             $res->[0][1]{arguments}[0]);

    xlog $self, "create email submission with bad onSuccess";
    $res = $jmap->CallMethods( [ [ 'EmailSubmission/set', {
        create => {
            '1' => {
                identityId => $identityid,
                emailId  => $emailid,
            }
       },
        onSuccessDestroyEmail => [ 1 ]
    }, "R1" ] ] );
    $self->assert_str_equals("error", $res->[0][0]);
    $self->assert_str_equals("invalidArguments", $res->[0][1]{type});
    $self->assert_str_equals("onSuccessDestroyEmail[0]",
                             $res->[0][1]{arguments}[0]);

    xlog $self, "create email submission with no onSuccess";
    $res = $jmap->CallMethods( [ [ 'EmailSubmission/set', {
        create => {
            '1' => {
                identityId => $identityid,
                emailId  => $emailid,
            }
       },
    }, "R1" ] ] );
    my $msgsubid = $res->[0][1]->{created}{1}{id};
    $self->assert_not_null($msgsubid);

    xlog $self, "create email submission with NULL onSuccess";
    $res = $jmap->CallMethods( [ [ 'EmailSubmission/set', {
        create => {
            '2' => {
                identityId => $identityid,
                emailId  => $emailid,
            }
       },
       onSuccessDestroyEmail => JSON::null
    }, "R1" ] ] );
    $msgsubid = $res->[0][1]->{created}{2}{id};
    $self->assert_not_null($msgsubid);
}
