#!perl
use Cassandane::Tiny;

sub test_contact_set_avatar_singlecommand
    :min_version_3_3 :JMAPExtensions
{
    my ($self) = @_;

    my $jmap = $self->{jmap};

    my $contact = {
        firstName => "first",
        lastName => "last",
        avatar => {
            blobId => "#img",
            size => 10,
            type => "image/jpeg",
            name => JSON::null
        }
    };

    my $using = [
        'urn:ietf:params:jmap:core',
        'https://cyrusimap.org/ns/jmap/contacts',
        'https://cyrusimap.org/ns/jmap/blob',
    ];

    my $res = $jmap->CallMethods([
        ['Blob/upload', { create => {
            "img" => { data => [{'data:asText' => 'some photo'}],
                       type => 'image/jpeg' } } }, 'R0'],
        ['Contact/set', {create => {"1" => $contact }}, "R1"],
        ['Contact/get', {}, "R2"]],
        $using);
    $self->assert_not_null($res);
    $self->assert_str_equals('Blob/upload', $res->[0][0]);
    $self->assert_str_equals('R0', $res->[0][2]);

    $contact->{avatar}{blobId} = $res->[0][1]{created}{"img"}{blobId};

    $self->assert_str_equals('Contact/set', $res->[1][0]);
    $self->assert_str_equals('R1', $res->[1][2]);
    my $id = $res->[1][1]{created}{"1"}{id};

    if ($res->[1][1]{created}{"1"}{avatar}{blobId}) {
        $contact->{avatar}{blobId} = $res->[1][1]{created}{"1"}{avatar}{blobId};
    }

    $self->assert_str_equals('Contact/get', $res->[2][0]);
    $self->assert_str_equals('R2', $res->[2][2]);
    $self->assert_str_equals($id, $res->[2][1]{list}[0]{id});
    $self->assert_deep_equals($contact->{avatar}, $res->[2][1]{list}[0]{avatar});
    $self->assert_equals(JSON::true, $res->[2][1]{list}[0]{"x-hasPhoto"});

    xlog $self, "remove avatar";
    $res = $jmap->CallMethods([
        ['Contact/set', {update => {$id => {avatar => JSON::null} }}, "R1"],
        ['Contact/get', {}, "R2"]]);
    $self->assert_not_null($res);
    $self->assert_str_equals('Contact/set', $res->[0][0]);
    $self->assert_str_equals('R1', $res->[0][2]);
    $self->assert(exists $res->[0][1]{updated}{$id});

    $self->assert_str_equals('Contact/get', $res->[1][0]);
    $self->assert_str_equals('R2', $res->[1][2]);
    $self->assert_str_equals($id, $res->[1][1]{list}[0]{id});
    $self->assert_null($res->[1][1]{list}[0]{avatar});
    $self->assert_equals(JSON::false, $res->[1][1]{list}[0]{"x-hasPhoto"});
}
