}
require_ok 'PublicInbox::IMAP';
-my $first_range = '1-'.PublicInbox::IMAP::UID_BLOCK();
+my $first_range = '0';
my $level = '-Lbasic';
SKIP: {
\(MESSAGES\x20\d+\x20UIDNEXT\x20\d+\x20UIDVALIDITY\x20\d+\)\r\n/sx);
like($raw[1], qr/\A\S+ OK /, 'finished status response');
-@raw = $mic->list;
-like($raw[0], qr/^\* LIST \(.*?\) "\." inbox/,
+my @orig_list = @raw = $mic->list;
+like($raw[0], qr/^\* LIST \(.*?\) "\." INBOX/,
'got an inbox');
like($raw[-1], qr/^\S+ OK /, 'response ended with OK');
is(scalar(@raw), scalar(@V) + 4, 'default LIST response');
@raw = $mic->list('', 'inbox.i1');
is(scalar(@raw), 2, 'limited LIST response');
-like($raw[0], qr/^\* LIST \(.*?\) "\." inbox/,
+like($raw[0], qr/^\* LIST \(.*?\) "\." INBOX/,
'got an inbox.i1');
like($raw[-1], qr/^\S+ OK /, 'response ended with OK');
Content-Disposition: attachment; filename="embed2x\.eml"\r
\r
EOF
+
+ my @hits = $mic->search('SENTON' => '18-Apr-2020');
+ is_deeply(\@hits, [ $uidnext ], 'search with date condition works');
+ ok($mic->examine($ng), 'EXAMINE on dummy');
+ @hits = $mic->search('SENTSINCE' => '18-Apr-2020');
+ is_deeply(\@hits, [], 'search on dummy with condition works');
}); # each_inbox
# message sequence numbers :<
run_script(\@cmd, $env, $rdr) or BAIL_OUT('-learn rm');
}
my $r2 = $mic->fetch_hash('1:*', 'BODY.PEEK[]') or BAIL_OUT "FETCH $@";
-is(scalar keys %$r2, 3, 'still got all 3 messages');
-like($r2->{1}->{'BODY[]'}, qr/dummy message #1/, 'got dummy message 1');
-is($r2->{2}->{'BODY[]'}, $ret->{2}->{RFC822}, 'message 2 unchanged');
-is($r2->{3}->{'BODY[]'}, $ret->{3}->{RFC822}, 'message 3 unchanged');
+is(scalar keys %$r2, 2, 'did not get all 3 messages');
+is($r2->{1}->{'BODY[]'}, $ret->{2}->{RFC822}, 'message 2 unchanged');
+is($r2->{2}->{'BODY[]'}, $ret->{3}->{RFC822}, 'message 3 unchanged');
$r2 = $mic->fetch_hash(2, 'BODY.PEEK[HEADER.FIELDS (message-id)]')
or BAIL_OUT "FETCH $@";
is($r2->{2}->{'BODY[HEADER.FIELDS (MESSAGE-ID)]'},
'Message-ID: <20200418222508.GA13918@dcvr>'."\r\n\r\n",
'BODY.PEEK[HEADER.FIELDS ...] drops .PEEK');
+
+{
+ my @new_list = $mic->list;
+ # tag differs in [-1]
+ like($orig_list[-1], qr/\A\S+ OK List done\r\n/, 'orig LIST');
+ like($new_list[-1], qr/\A\S+ OK List done\r\n/, 'new LIST');
+ pop @new_list;
+ pop @orig_list;
+ # TODO: not sure if sort order matters, imapd_refresh_finalize
+ # sorts, for now, but maybe clients don't care...
+ is_deeply(\@new_list, \@orig_list, 'LIST identical');
+}
ok($mic->close, 'CLOSE works');
ok(!$mic->close, 'CLOSE not idempotent');
ok($mic->logout, 'logged out');
+{
+ my $c = tcp_connect($sock);
+ $c->autoflush(1);
+ like(<$c>, qr/\* OK/, 'got a greeting');
+ print $c "\r\n";
+ like(<$c>, qr/\A\* BAD Error in IMAP command/, 'empty line');
+ print $c "tagonly\r\n";
+ like(<$c>, qr/\Atagonly BAD Error in IMAP command/, 'tag-only line');
+}
+
$td->kill;
$td->join;
is($?, 0, 'no error in exited process');
open my $fh, '<', $err or BAIL_OUT("open $err failed: $!");
my $eout = do { local $/; <$fh> };
unlike($eout, qr/wide/i, 'no Wide character warnings');
+unlike($eout, qr/uninitialized/i, 'no uninitialized warnings');
done_testing;