X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fsearch.t;h=13210ff5a4af56e518490fe282c18bc2e8f08af4;hb=2f8d15b1170b137a0512a4f3163b236a5dcbf0b8;hp=bcfe91f5d468e91867116c640f4966f1e9b1667e;hpb=efae1c2f67220c18f57bd1ebdf7115abd4d6c6e0;p=public-inbox.git diff --git a/t/search.t b/t/search.t index bcfe91f5..13210ff5 100644 --- a/t/search.t +++ b/t/search.t @@ -533,6 +533,21 @@ $ibx->with_umask(sub { is($query->('s:"mail header experiments"')->[0]->{mid}, '20200418222508.GA13918@dcvr', 'Subject search reaches inside message/rfc822'); + + $doc_id = $rw->add_message(eml_load('t/data/binary.patch')); + $rw->commit_txn_lazy; + $ibx->search->reopen; + my $res = $query->('HcmV'); + is_deeply($res, [], 'no results against trailer'); + $res = $query->('IcmZPo000310RR91'); + is_deeply($res, [], 'no results against 1-byte binary patch'); + $res = $query->('"GIT binary patch"'); + is(scalar(@$res), 1, 'got binary result from "GIT binary patch"'); + is($res->[0]->{mid}, 'binary-patch-test@example', 'msgid for binary'); + my $s = $query->('"literal 1"'); + is_deeply($s, $res, 'got binary result from exact literal size'); + $s = $query->('"literal 2"'); + is_deeply($s, [], 'no results for wrong size'); }); SKIP: { @@ -561,9 +576,9 @@ SKIP: { is(strftime('%Y-%m-%d', gmtime($1//0)), '2010-10-02', 'rt: end expand'); $q = $s->query_argv_to_string($g, [qw(something dt:2010-10-02..)]); like($q, qr/\Asomething dt:20101002\d{6}\.\./, 'dt: expansion'); - $q = $s->query_argv_to_string($g, [qw(x d:yesterday.. y)]); - is($q, strftime('x d:%Y%m%d.. y', gmtime(time - 86400)), - '"yesterday" handled'); + $q = $s->query_argv_to_string($g, [qw(x dt:yesterday.. y)]); + my $exp = strftime('%Y%m%d', gmtime(time - 86400)); + like($q, qr/x dt:$exp[0-9]{6}\.\. y/, '"yesterday" handled'); $q = $s->query_argv_to_string($g, [qw(x dt:20101002054123)]); is($q, 'x dt:20101002054123..20101003054123', 'single dt: expanded'); $q = $s->query_argv_to_string($g, [qw(x dt:2010-10-02T05:41:23Z)]); @@ -583,6 +598,58 @@ SKIP: { $q = $s->query_argv_to_string($g, [qw{OR (rt:1993-10-02)}]); like($q, qr/\AOR \(rt:749\d{6}\.\.749\d{6}\)\z/, 'trailing parentheses preserved'); + + my $qs = qq[f:bob rt:1993-10-02..2010-10-02]; + $s->query_approxidate($g, $qs); + like($qs, qr/\Af:bob rt:749\d{6}\.\.128\d{7}\z/, + 'no phrases, no problem'); + + my $orig = $qs = qq[f:bob "d:1993-10-02..2010-10-02"]; + $s->query_approxidate($g, $qs); + is($qs, $orig, 'phrase preserved'); + + $orig = $qs = qq[f:bob "d:1993-10-02..2010-10-02 "] . + qq["dt:1993-10-02..2010-10-02 " \x{201c}]; + $s->query_approxidate($g, $qs); + is($qs, $orig, 'phrase preserved even with escaped ""'); + + $orig = $qs = qq[f:bob "hello world" d:1993-10-02..2010-10-02]; + $s->query_approxidate($g, $qs); + is($qs, qq[f:bob "hello world" d:19931002..20101002], + 'post-phrase date corrected'); + + # Xapian uses "" to escape " inside phrases, we don't explictly + # handle that, but are able to pass the result through unchanged + for my $pair (["\x{201c}", "\x{201d}"], ['"', '"']) { + my ($x, $y) = @$pair; + $orig = $qs = qq[${x}hello d:1993-10-02.."" world$y]; + $s->query_approxidate($g, $qs); + is($qs, $orig, 'phrases unchanged \x'.ord($x).'-\x'.ord($y)); + + $s->query_approxidate($g, my $tmp = "$qs d:..2010-10-02"); + is($tmp, "$orig d:..20101002", + 'two phrases did not throw off date parsing'); + + $orig = $qs = qq[${x}hello d:1993-10-02..$y$x world$y]; + $s->query_approxidate($g, $qs); + is($qs, $orig, 'phrases unchanged \x'.ord($x).'-\x'.ord($y)); + + $s->query_approxidate($g, $tmp = "$qs d:..2010-10-02"); + is($tmp, "$orig d:..20101002", + 'two phrases did not throw off date parsing'); + } + + my $x_days_ago = strftime('%Y%m%d', gmtime(time - (5 * 86400))); + $orig = $qs = qq[broken d:5.days.ago..]; + $s->query_approxidate($g, $qs); + like($qs, qr/\Abroken dt:$x_days_ago[0-9]{6}\.\./, + 'date.phrase.with.dots'); + + $orig = $qs = 'd:20101002..now'; + $s->query_approxidate($g, $qs); + like($qs, qr/\Adt:20101002000000\.\.[0-9]{14}\z/, + 'approxidate on range-end only'); + $ENV{TEST_EXPENSIVE} or skip 'TEST_EXPENSIVE not set for argv overflow check', 1; my @w;