]> Sergey Matveev's repositories - public-inbox.git/blob - t/search-thr-index.t
wwwstream: show relative coderepo URLs correctly
[public-inbox.git] / t / search-thr-index.t
1 # Copyright (C) 2017-2020 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 use strict;
4 use warnings;
5 use bytes (); # only for bytes::length
6 use Test::More;
7 use PublicInbox::TestCommon;
8 use PublicInbox::MID qw(mids);
9 use PublicInbox::Eml;
10 require_mods(qw(DBD::SQLite Search::Xapian));
11 require PublicInbox::SearchIdx;
12 require PublicInbox::Smsg;
13 require PublicInbox::Inbox;
14 use PublicInbox::Import;
15 my ($tmpdir, $for_destroy) = tmpdir();
16 my $git_dir = "$tmpdir/a.git";
17
18 PublicInbox::Import::init_bare($git_dir);
19 my $ibx = PublicInbox::Inbox->new({inboxdir => $git_dir});
20 my $rw = PublicInbox::SearchIdx->new($ibx, 1);
21 ok($rw, "search indexer created");
22 my $data = <<'EOF';
23 Subject: [RFC 00/14]
24 Message-Id: <1-bw@g>
25
26 Subject: [RFC 09/14]
27 Message-Id: <10-bw@g>
28 In-Reply-To: <1-bw@g>
29 References: <1-bw@g>
30
31 Subject: [RFC 03/14]
32 Message-Id: <4-bw@g>
33 In-Reply-To: <1-bw@g>
34 References: <1-bw@g>
35
36 EOF
37
38 my $num = 0;
39 # nb. using internal API, fragile!
40 my $xdb = $rw->begin_txn_lazy;
41 my @mids;
42
43 foreach (reverse split(/\n\n/, $data)) {
44         $_ .= "\n";
45         my $mime = PublicInbox::Eml->new(\$_);
46         $mime->header_set('From' => 'bw@g');
47         $mime->header_set('To' => 'git@vger.kernel.org');
48         my $bytes = bytes::length($mime->as_string);
49         my $mid = mids($mime->header_obj)->[0];
50         my $smsg = bless {
51                 bytes => $bytes,
52                 num => ++$num,
53                 mid => $mid,
54                 blob => '',
55         }, 'PublicInbox::Smsg';
56         my $doc_id = $rw->add_message($mime, $smsg);
57         push @mids, $mid;
58         ok($doc_id, 'message added: '. $mid);
59 }
60
61 my $prev;
62 my %tids;
63 my $dbh = $rw->{oidx}->dbh;
64 foreach my $mid (@mids) {
65         my $msgs = $rw->{oidx}->get_thread($mid);
66         is(3, scalar(@$msgs), "got all messages from $mid");
67         foreach my $m (@$msgs) {
68                 my $tid = $dbh->selectrow_array(<<'', undef, $m->{num});
69 SELECT tid FROM over WHERE num = ? LIMIT 1
70
71                 $tids{$tid}++;
72         }
73 }
74
75 is(scalar keys %tids, 1, 'all messages have the same tid');
76
77 $rw->commit_txn_lazy;
78
79 $xdb = $rw->begin_txn_lazy;
80 {
81         my $mime = PublicInbox::Eml->new(<<'');
82 Subject: [RFC 00/14]
83 Message-Id: <1-bw@g>
84 From: bw@g
85 To: git@vger.kernel.org
86
87         my $dbh = $rw->{oidx}->dbh;
88         my ($id, $prev);
89         my $reidx = $rw->{oidx}->next_by_mid('1-bw@g', \$id, \$prev);
90         ok(defined $reidx);
91         my $num = $reidx->{num};
92         my $tid0 = $dbh->selectrow_array(<<'', undef, $num);
93 SELECT tid FROM over WHERE num = ? LIMIT 1
94
95         my $bytes = bytes::length($mime->as_string);
96         my $mid = mids($mime->header_obj)->[0];
97         my $smsg = bless {
98                 bytes => $bytes,
99                 num => $num,
100                 mid => $mid,
101                 blob => '',
102         }, 'PublicInbox::Smsg';
103         my $doc_id = $rw->add_message($mime, $smsg);
104         ok($doc_id, 'message reindexed'. $mid);
105         is($doc_id, $num, "article number unchanged: $num");
106
107         my $tid1 = $dbh->selectrow_array(<<'', undef, $num);
108 SELECT tid FROM over WHERE num = ? LIMIT 1
109
110         is($tid1, $tid0, 'tid unchanged on reindex');
111 }
112
113 $rw->commit_txn_lazy;
114
115 done_testing();
116
117 1;