#!perl
use Cassandane::Tiny;

sub test_annotator_callout_disabled
    :min_version_3_1
    ($self)
{
    $self->{instance}->{config}->set(annotation_callout_disable_append => 'yes');

    $self->start_my_instances();

    my $flag = '$X-ME-Annot-2';
    my $imaptalk = $self->{store}->get_client();
    my $modseq;
    my %msg;

    $imaptalk->select("INBOX");

    xlog $self, "Create Message A";
    $msg{A} = $self->{gen}->generate(subject => "Message A");
    $msg{A}->set_attributes(id => 1,
                            uid => 1,
                            flags => []);
    $msg{A}->set_body("set_flag $flag\r\n");
    $self->{instance}->deliver($msg{A});

    $msg{A}->set_attributes(flags => ['\\Recent', $flag]);

    $self->{store}->set_fetch_attributes('uid', 'flags', 'modseq');

    xlog $self, "Fetch message A";
    my %handlers1;
    {
        $handlers1{fetch} = sub {
            $self->assert_num_equals(scalar @{$_[1]{flags}}, 2);
            $self->assert_str_equals($_[1]{flags}[0], "\\Recent");
            $self->assert_str_equals($_[1]{flags}[1], "\$X-ME-Annot-2");
        };
    }
    $imaptalk->_imap_cmd("uid fetch", 1, \%handlers1, '1', '(flags modseq)');
    $self->assert_str_equals('ok', $imaptalk->get_last_completion_response());

    xlog $self, "Clear the $flag from the message A.";
    my %handlers2;
    {
        $handlers2{fetch} = sub {
            $modseq = $_[1]{modseq}[0];
            $self->assert_num_equals(scalar @{$_[1]{flags}}, 1);
            $self->assert_str_equals($_[1]{flags}[0], "\\Recent");
        };
    }
    $imaptalk->store('1', '-flags', "($flag)");
    $imaptalk->_imap_cmd("uid fetch", 1, \%handlers2, '1', '(flags modseq)');
    $self->assert_str_equals('ok', $imaptalk->get_last_completion_response());

    xlog $self, "Run xrunannotator";
    my %handlers3;
    {
        $handlers3{fetch} = sub {
            $self->assert($_[1]{modseq}[0] == $modseq);
            $self->assert_num_equals(scalar @{$_[1]{flags}}, 1);
            $self->assert_str_equals($_[1]{flags}[0], "\\Recent");
        };
    }
    $imaptalk->_imap_cmd("uid xrunannotator", 0, {}, '1');
    $self->assert_str_equals('ok', $imaptalk->get_last_completion_response());

    xlog $self, "Nothing should have changed from the previous run of uid fetch.";
    $imaptalk->_imap_cmd("uid fetch", 1, \%handlers3, '1', '(flags modseq)');
    $self->assert_str_equals('ok', $imaptalk->get_last_completion_response());
}
