]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/config.t
run update-copyrights from gnulib for 2019
[public-inbox.git] / t / config.t
index 353dac69b56e081bc3ee233656ca16911a54ae9b..b7a4ceb62e030d1efbd31c4ad53e7b0eec548cf6 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright (C) 2014-2015 all contributors <meta@public-inbox.org>
-# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2014-2019 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
 use warnings;
 use Test::More;
@@ -114,4 +114,80 @@ my $tmpdir = tempdir('pi-config-XXXXXX', TMPDIR => 1, CLEANUP => 1);
                }, 'known addresses populated');
 }
 
+my @invalid = (
+       # git rejects this because it locks refnames, but we don't have
+       # this problem with inbox names:
+       # 'inbox.lock',
+
+       # git rejects these:
+       '', '..', '.', 'stash@{9}', 'inbox.', '^caret', '~tilde',
+       '*asterisk', 's p a c e s', ' leading-space', 'trailing-space ',
+       'question?', 'colon:', '[square-brace]', "\fformfeed",
+       "\0zero", "\bbackspace",
+
+);
+
+my %X = ("\0" => '\\0', "\b" => '\\b', "\f" => '\\f', "'" => "\\'");
+my $xre = join('|', keys %X);
+
+for my $s (@invalid) {
+       my $d = $s;
+       $d =~ s/($xre)/$X{$1}/g;
+       ok(!PublicInbox::Config::valid_inbox_name($s), "`$d' name rejected");
+}
+
+# obviously-valid examples
+my @valid = qw(a a@example a@example.com);
+
+# Rejecting more was considered, but then it dawned on me that
+# people may intentionally use inbox names which are not URL-friendly
+# to prevent the PSGI interface from displaying them...
+# URL-unfriendly
+# '<', '>', '%', '#', '?', '&', '(', ')',
+
+# maybe these aren't so bad, they're common in Message-IDs, even:
+# '!', '$', '=', '+'
+push @valid, qw[bang! ca$h less< more> 1% (parens) &more eql= +plus], '#hash';
+for my $s (@valid) {
+       ok(PublicInbox::Config::valid_inbox_name($s), "`$s' name accepted");
+}
+
+{
+       my $f = "$tmpdir/ordered";
+       open my $fh, '>', $f or die "open: $!";
+       my @expect;
+       foreach my $i (0..3) {
+               push @expect, "$i";
+               print $fh <<"" or die "print: $!";
+[publicinbox "$i"]
+       mainrepo = /path/to/$i.git
+       address = $i\@example.com
+
+       }
+       close $fh or die "close: $!";
+       my $cfg = PublicInbox::Config->new($f);
+       my @result;
+       $cfg->each_inbox(sub { push @result, $_[0]->{name} });
+       is_deeply(\@result, \@expect);
+}
+
+{
+       my $pfx1 = "publicinbox.test1";
+       my $pfx2 = "publicinbox.test2";
+       my $h = {
+               "$pfx1.address" => 'test@example.com',
+               "$pfx1.mainrepo" => '/path/to/non/existent',
+               "$pfx2.address" => 'foo@example.com',
+               "$pfx2.mainrepo" => '/path/to/foo',
+               "$pfx1.coderepo" => 'project',
+               "$pfx2.coderepo" => 'project',
+               "coderepo.project.dir" => '/path/to/project.git',
+       };
+       my $cfg = PublicInbox::Config->new($h);
+       my $t1 = $cfg->lookup_name('test1');
+       my $t2 = $cfg->lookup_name('test2');
+       is($t1->{-repo_objs}->[0], $t2->{-repo_objs}->[0],
+               'inboxes share ::Git object');
+}
+
 done_testing();