#!perl
use Cassandane::Tiny;

sub test_vacation_set
    :min_version_3_9
    ($self)
{
    my $jmap = $self->{jmap};

    xlog "attempt to create a new vacation response";
    my $res = $jmap->CallMethods([
        ['VacationResponse/set', {
            create => {
                "1" => {
                    textBody => "Gone fishing"
                }
            }
    }, "R1"]]);
    $self->assert_not_null($res);
    $self->assert_str_equals('VacationResponse/set', $res->[0][0]);
    $self->assert_str_equals('R1', $res->[0][2]);
    $self->assert_str_equals('singleton', $res->[0][1]{notCreated}{1}{type});

    xlog "enable the vacation response";
    $res = $jmap->CallMethods([
        ['VacationResponse/set', {
            update => {
                "singleton" => {
                    isEnabled=> JSON::true,
                    textBody => "Gone fishing"
                }
            }
         }, "R1"],
        ['VacationResponse/get', {
    }, "R2"]
    ]);
    $self->assert_not_null($res);
    $self->assert_str_equals('VacationResponse/set', $res->[0][0]);
    $self->assert_str_equals('R1', $res->[0][2]);
    $self->assert(exists $res->[0][1]{updated}{singleton});
    $self->assert_str_equals('VacationResponse/get', $res->[1][0]);
    $self->assert_str_equals('R2', $res->[1][2]);
    $self->assert_num_equals(1, scalar @{$res->[1][1]{list}});
    $self->assert_str_equals('singleton', $res->[1][1]{list}[0]{id});
    $self->assert_equals(JSON::true, $res->[1][1]{list}[0]{isEnabled});
    $self->assert_str_equals('Gone fishing', $res->[1][1]{list}[0]{textBody});

    xlog "disable the vacation response";
    $res = $jmap->CallMethods([
        ['VacationResponse/set', {
            update => {
                "singleton" => {
                    isEnabled=> JSON::false
                }
            }
         }, "R1"],
        ['VacationResponse/get', {
    }, "R2"]
    ]);
    $self->assert_not_null($res);
    $self->assert_str_equals('VacationResponse/set', $res->[0][0]);
    $self->assert_str_equals('R1', $res->[0][2]);
    $self->assert(exists $res->[0][1]{updated}{singleton});
    $self->assert_str_equals('VacationResponse/get', $res->[1][0]);
    $self->assert_str_equals('R2', $res->[1][2]);
    $self->assert_num_equals(1, scalar @{$res->[1][1]{list}});
    $self->assert_str_equals('singleton', $res->[1][1]{list}[0]{id});
    $self->assert_equals(JSON::false, $res->[1][1]{list}[0]{isEnabled});
    $self->assert_str_equals('Gone fishing', $res->[1][1]{list}[0]{textBody});

    xlog "attempt to destroy the vacation response";
    $res = $jmap->CallMethods([
        ['VacationResponse/set', {
            destroy => ["singleton"]
         }, "R1"]]);
    $self->assert_not_null($res);
    $self->assert_str_equals('VacationResponse/set', $res->[0][0]);
    $self->assert_str_equals('R1', $res->[0][2]);
    $self->assert_str_equals('singleton',
                             $res->[0][1]{notDestroyed}{singleton}{type});
}
