#!perl
use Cassandane::Tiny;

sub test_created_ids
    :min_version_3_1
    ($self)
{
    my $jmap = $self->{jmap};

    xlog $self, "send bogus creation ids map";
    my $err = $jmap->request({
        using => ['urn:ietf:params:jmap:mail'],
        methodCalls => [['Identity/get', {}, 'R1']],
        createdIds => 'bogus',
    });

    $self->assert_str_equals('400', $err->http_response->code);

    xlog $self, "create a mailbox without any client-supplied creation ids";
    my $res = $jmap->request({
        methodCalls => [['Mailbox/set', {
            create => {
                "1" => {
                    name => "foo",
                    parentId => undef,
                    role => undef
                }
            }
        }, "R1"]],
        using => ['urn:ietf:params:jmap:mail'],
    });
    my $mboxid1 = $res->sentence_named("Mailbox/set")->arguments->{created}{1}{id};
    $self->assert_not_null($mboxid1);
    $self->assert_null($res->wrapper_properties->{createdIds});

    xlog $self, "get mailbox using client-supplied creation id";
    $res = $jmap->request({
        using => ['urn:ietf:params:jmap:mail'],
        methodCalls => [['Mailbox/get', { ids => ['#1'] }, 'R1']],
        createdIds => { 1 => $mboxid1 },
    });
    $self->assert_str_equals($mboxid1, $res->sentence_named('Mailbox/get')->arguments->{list}[0]{id});
    $self->assert_not_null($res->wrapper_properties->{createdIds});
    $self->assert_str_equals($mboxid1, $res->wrapper_properties->{createdIds}{1});

    xlog $self, "create a mailbox with empty client-supplied creation ids";
    $res = $jmap->request({
        using => ['urn:ietf:params:jmap:mail'],
        methodCalls => [['Mailbox/set', {
            create => {
                "2" => {
                    name => "bar",
                    parentId => undef,
                    role => undef
                }
            }
        }, "R1"]],
        createdIds => {},
    });
    my $mboxid2 = $res->sentence_named('Mailbox/set')->arguments->{created}{2}{id};
    $self->assert_str_equals($mboxid2, $res->wrapper_properties->{createdIds}{2});

    xlog $self, "create a mailbox with client-supplied creation ids";
    $res = $jmap->request({
        using => ['urn:ietf:params:jmap:mail'],
        methodCalls => [['Mailbox/set', {
            create => {
                "3" => {
                    name => "baz",
                    parentId => "#2",
                    role => undef
                }
            }
        }, "R1"]],
        createdIds => {
            1 => $mboxid1,
            2 => $mboxid2,
        },
    });
    my $mboxid3 = $res->sentence_named('Mailbox/set')->arguments->{created}{3}{id};
    $self->assert_str_equals($mboxid1, $res->wrapper_properties->{createdIds}{1});
    $self->assert_str_equals($mboxid2, $res->wrapper_properties->{createdIds}{2});
    $self->assert_str_equals($mboxid3, $res->wrapper_properties->{createdIds}{3});

    xlog $self, "get mailbox and check parentid";
    $res = $jmap->request({
        using => ['urn:ietf:params:jmap:mail'],
        methodCalls => [['Mailbox/get', { ids => [$mboxid3], properties => ['parentId'] }, 'R1']],
    });

    $self->assert_str_equals($mboxid3, $res->sentence_named('Mailbox/get')->arguments->{list}[0]{id});
    $self->assert_str_equals($mboxid2, $res->sentence_named('Mailbox/get')->arguments->{list}[0]{parentId});
    $self->assert_null($res->wrapper_properties->{createdIds});
}
