#!perl
use Cassandane::Tiny;

sub test_eventsource
    :min_version_3_5 :JMAPExtensions :NoAltNameSpace
    ($self)
{
    my $jmap = $self->{jmap};

    my $session = $jmap->get_client_session->client_session;
    $self->assert_not_null($session);
    my $event_relative = $session->{eventSourceUrl};
    $self->assert_not_null($event_relative);

    $self->assert_num_equals(1, $event_relative =~ s/\{types\}/Mailbox,Email,Calendar,CalendarEvent,AddressBook,ContactCard/g);
    $self->assert_num_equals(1, $event_relative =~ s/\{closeafter\}/state/g);
    $self->assert_num_equals(1, $event_relative =~ s/\{ping\}/0/g);

    my $event_uri = URI->new_abs($event_relative, $jmap->api_uri);

    my $es_request = HTTP::Request->new(
        GET => "$event_uri",
        [
            $jmap->_maybe_auth_header,
            'Last-Event-Id' => '0',
        ],
    );

    my $http_res = $jmap->http_request($es_request);
    $self->assert_str_equals('200', $http_res->code);
    $self->assert_str_equals('text/event-stream',
                             $http_res->header('content-type'));
    $self->assert_null($http_res->header('content-length'));

    my %event = $http_res->decoded_content(charset => undef) =~ /^(\w+): ?(.*)$/mg;
    $self->assert_not_null($event{id});
    $self->assert_str_equals('state', $event{event});

    my $data = eval { decode_json($event{data}) };
    $self->assert_not_null($data);
    $self->assert_str_equals('StateChange', $data->{'@type'});
    $self->assert_not_null($data->{changed});
    $self->assert_not_null($data->{changed}->{cassandane});
    $self->assert_not_null($data->{changed}->{cassandane}->{Mailbox});
    $self->assert_not_null($data->{changed}->{cassandane}->{Email});
    $self->assert_not_null($data->{changed}->{cassandane}->{Calendar});
    $self->assert_not_null($data->{changed}->{cassandane}->{CalendarEvent});
    $self->assert_not_null($data->{changed}->{cassandane}->{AddressBook});
    $self->assert_not_null($data->{changed}->{cassandane}->{ContactCard});
}
