diff options
author | Kyle Meyer <kyle@kyleam.com> | 2020-04-19 20:13:32 -0400 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-04-20 00:59:08 +0000 |
commit | b3a04ae18a42ed960c89cc81c209633da6976380 (patch) | |
tree | 2589568b9b7a4003d6a3a19c8c27dddb658fc554 /t | |
parent | b3f81ce0c71d5d4eca347f259b5ae69660a2cb13 (diff) | |
download | public-inbox-b3a04ae18a42ed960c89cc81c209633da6976380.tar.gz |
The watchheader key supports only a single value. Supporting multiple watchheader values was mentioned in discussion [1] of 8d3e3bd8 (doc: explain publicinbox.<name>.watchheader, 2019-10-09), and it wasn't clear if there was a need. One scenario in which matching multiple headers would be convenient is when someone wants to set up public-inbox archives for some small projects but does _not_ want to run mailing lists for them, instead allowing others to follow the project by any of the pull mechanisms. Using a common underlying address, an address alias for each project is configured via a third-party email provider, with messages for each alias being exposed as a separate public-inbox archive. In this setup, messages for an inbox cannot be selected by a List-ID header but can be identified by the inbox's address in either the To or Cc header. To support such a use case, update the watchheader handling to consider multiple values, accepting a message if it matches any value. While selecting a message based on matching _any_ rather than _all_ values is motivated by the above scenario, it's worth noting that the "any" behavior is consistent with how multiple listid config values are handled. [1] https://public-inbox.org/meta/20191010085118.r3amey4cayazfycb@dcvr/
Diffstat (limited to 't')
-rw-r--r-- | t/watch_multiple_headers.t | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/t/watch_multiple_headers.t b/t/watch_multiple_headers.t new file mode 100644 index 00000000..3a39eba9 --- /dev/null +++ b/t/watch_multiple_headers.t @@ -0,0 +1,76 @@ +# Copyright (C) 2020 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +use strict; +use Test::More; +use PublicInbox::Config; +use PublicInbox::TestCommon; +require_git(2.6); +require_mods(qw(Search::Xapian DBD::SQLite Filesys::Notify::Simple)); +my ($tmpdir, $for_destroy) = tmpdir(); +my $inboxdir = "$tmpdir/v2"; +my $maildir = "$tmpdir/md"; +use_ok 'PublicInbox::WatchMaildir'; +use_ok 'PublicInbox::Emergency'; +my $cfgpfx = "publicinbox.test"; +my $addr = 'test-public@example.com'; +my @cmd = ('-init', '-V2', 'test', $inboxdir, + 'http://example.com/list', $addr); +local $ENV{PI_CONFIG} = "$tmpdir/pi_config"; +ok(run_script(\@cmd), 'public-inbox init OK'); + +my $msg_to = <<EOF; +From: user\@a.com +To: $addr +Subject: address is in to +Message-Id: <to\@a.com> +Date: Sat, 18 Apr 2020 00:00:00 +0000 + +content1 +EOF + +my $msg_cc = <<EOF; +From: user1\@a.com +To: user2\@a.com +Cc: $addr +Subject: address is in cc +Message-Id: <cc\@a.com> +Date: Sat, 18 Apr 2020 00:01:00 +0000 + +content2 +EOF + +my $msg_none = <<EOF; +From: user1\@a.com +To: user2\@a.com +Cc: user3\@a.com +Subject: address is not in to or cc +Message-Id: <none\@a.com> +Date: Sat, 18 Apr 2020 00:02:00 +0000 + +content3 +EOF + +PublicInbox::Emergency->new($maildir)->prepare(\$msg_to); +PublicInbox::Emergency->new($maildir)->prepare(\$msg_cc); +PublicInbox::Emergency->new($maildir)->prepare(\$msg_none); + +my $cfg = <<EOF; +$cfgpfx.address=$addr +$cfgpfx.inboxdir=$inboxdir +$cfgpfx.watch=maildir:$maildir +$cfgpfx.watchheader=To:$addr +$cfgpfx.watchheader=Cc:$addr +EOF +my $config = PublicInbox::Config->new(\$cfg); +PublicInbox::WatchMaildir->new($config)->scan('full'); +my $ibx = $config->lookup_name('test'); +ok($ibx, 'found inbox by name'); + +my $num = $ibx->mm->num_for('to@a.com'); +ok(defined $num, 'Matched for address in To:'); +$num = $ibx->mm->num_for('cc@a.com'); +ok(defined $num, 'Matched for address in Cc:'); +$num = $ibx->mm->num_for('none@a.com'); +is($num, undef, 'No match without address in To: or Cc:'); + +done_testing; |