]> Sergey Matveev's repositories - public-inbox.git/blob - t/lei_dedupe.t
www: drop --subject from "git send-email" instructions
[public-inbox.git] / t / lei_dedupe.t
1 #!perl -w
2 # Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 use strict;
5 use v5.10.1;
6 use Test::More;
7 use PublicInbox::TestCommon;
8 use PublicInbox::Eml;
9 use PublicInbox::Smsg;
10 require_mods(qw(DBD::SQLite));
11 use_ok 'PublicInbox::LeiDedupe';
12 my $eml = eml_load('t/plack-qp.eml');
13 my $mid = $eml->header_raw('Message-ID');
14 my $different = eml_load('t/msg_iter-order.eml');
15 $different->header_set('Message-ID', $mid);
16 my $smsg = bless { ds => time }, 'PublicInbox::Smsg';
17 $smsg->populate($eml);
18 $smsg->{$_} //= '' for (qw(to cc references)) ;
19
20 my $check_storable = sub {
21         my ($x) = @_;
22         SKIP: {
23                 require_mods('Storable', 1);
24                 my $dup = Storable::thaw(Storable::freeze($x));
25                 is_deeply($dup, $x, "$x->[3] round-trips through storable");
26         }
27 };
28
29 my $lei = { opt => { dedupe => 'none' } };
30 my $dd = PublicInbox::LeiDedupe->new($lei);
31 $check_storable->($dd);
32 $dd->prepare_dedupe;
33 ok(!$dd->is_dup($eml), '1st is_dup w/o dedupe');
34 ok(!$dd->is_dup($eml), '2nd is_dup w/o dedupe');
35 ok(!$dd->is_dup($different), 'different is_dup w/o dedupe');
36 ok(!$dd->is_smsg_dup($smsg), 'smsg dedupe none 1');
37 ok(!$dd->is_smsg_dup($smsg), 'smsg dedupe none 2');
38
39 for my $strat (undef, 'content') {
40         $lei->{opt}->{dedupe} = $strat;
41         $dd = PublicInbox::LeiDedupe->new($lei);
42         $check_storable->($dd);
43         $dd->prepare_dedupe;
44         my $desc = $strat // 'default';
45         ok(!$dd->is_dup($eml), "1st is_dup with $desc dedupe");
46         ok($dd->is_dup($eml), "2nd seen with $desc dedupe");
47         ok(!$dd->is_dup($different), "different is_dup with $desc dedupe");
48         ok(!$dd->is_smsg_dup($smsg), "is_smsg_dup pass w/ $desc dedupe");
49         ok($dd->is_smsg_dup($smsg), "is_smsg_dup reject w/ $desc dedupe");
50 }
51 $lei->{opt}->{dedupe} = 'bogus';
52 eval { PublicInbox::LeiDedupe->new($lei) };
53 like($@, qr/unsupported.*bogus/, 'died on bogus strategy');
54
55 $lei->{opt}->{dedupe} = 'mid';
56 $dd = PublicInbox::LeiDedupe->new($lei);
57 $check_storable->($dd);
58 $dd->prepare_dedupe;
59 ok(!$dd->is_dup($eml), '1st is_dup with mid dedupe');
60 ok($dd->is_dup($eml), '2nd seen with mid dedupe');
61 ok($dd->is_dup($different), 'different seen with mid dedupe');
62 ok(!$dd->is_smsg_dup($smsg), 'smsg mid dedupe pass');
63 ok($dd->is_smsg_dup($smsg), 'smsg mid dedupe reject');
64
65 $lei->{opt}->{dedupe} = 'oid';
66 $dd = PublicInbox::LeiDedupe->new($lei);
67 $check_storable->($dd);
68 $dd->prepare_dedupe;
69
70 # --augment won't have OIDs:
71 ok(!$dd->is_dup($eml), '1st is_dup with oid dedupe (augment)');
72 ok($dd->is_dup($eml), '2nd seen with oid dedupe (augment)');
73 ok(!$dd->is_dup($different), 'different is_dup with mid dedupe (augment)');
74 $different->header_set('Status', 'RO');
75 ok($dd->is_dup($different), 'different seen with oid dedupe Status removed');
76
77 $smsg = { blob => '01d' };
78 ok(!$dd->is_dup($eml, $smsg), '1st is_dup with oid dedupe');
79 ok($dd->is_dup($different, $smsg), 'different content ignored if oid matches');
80 $smsg->{blob} = uc($smsg->{blob});
81 ok($dd->is_dup($eml, $smsg), 'case insensitive oid comparison :P');
82 $smsg->{blob} = '01dbad';
83 ok(!$dd->is_dup($eml, $smsg), 'case insensitive oid comparison :P');
84
85 $smsg->{blob} = 'dead';
86 ok(!$dd->is_smsg_dup($smsg), 'smsg dedupe pass');
87 ok($dd->is_smsg_dup($smsg), 'smsg dedupe reject');
88
89 done_testing;