]> git.vpit.fr Git - perl/modules/rgit.git/blob - t/20-each.t
Move policies to a new App::Rgit::Policy class layout
[perl/modules/rgit.git] / t / 20-each.t
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use Cwd qw/cwd abs_path/;
7 use File::Spec::Functions qw/catdir catfile/;
8 use File::Temp qw/tempfile tempdir/;
9
10 use Test::More tests => 2 + 2 * 4 + 12 * (3 + 1 + 3 + 6);
11
12 use App::Rgit::Utils qw/:codes/;
13 use App::Rgit;
14
15 use lib 't/lib';
16
17 use App::Rgit::Policy::Callback;
18
19 sub build {
20  my ($tree, $prefix) = @_;
21  my @ret;
22  my $r = delete $tree->{_};
23  while (my ($d, $v) = each %$tree) {
24   if (ref $v) {
25    my $dir = catdir $prefix, $d;
26    mkdir $dir or die "mkdir($dir): $!";
27    my @r = build($v, $dir);
28    push @ret, map [
29                $_->[0],
30                ref eq 'main' ? @{$_}[1 .. 3]
31                              : map { catdir($d, $_) } @{$_}[1 .. 3]
32               ], @r unless $r;
33   } else {
34    my $file = catfile($prefix, $d);
35    open my $fh, '>', $file or die "open($file): $!";
36    print $fh $v;
37    close $fh;
38   }
39  }
40  return $r ? bless $r, 'main' : @ret;
41 }
42
43 my $repogit = {
44  HEAD    => 1,
45  refs    => { dummy => 1 },
46  objects => { dummy => 1 },
47 };
48
49 sub repo {
50  my ($n, $bare) = @_;
51  return $bare ? [ $n, "$n.git",           "$n.git", "$n.git" ]
52               : [ $n, catdir($n, '.git'), $n,       "$n.git" ]
53 }
54
55 my $tmpdir = tempdir(CLEANUP => 1);
56 my $cwd = cwd;
57 chdir $tmpdir or die "chdir($tmpdir): $!";
58 my @expected = sort { $a->[1] cmp $b->[1] } build({
59  x => {
60   a => {
61    _ => repo('a', 0),
62    '.git' => $repogit
63   },
64   z => {
65    '.git' => {
66     refs => { dummy => 1 },
67    }
68   }
69  },
70  y => {
71   'b.git' => {
72    _ => repo('b', 1),
73    %$repogit
74   },
75   't' => {
76    't.git' => {
77     refs => { dummy => 1 },
78     objects => { dummy => 1 },
79    }
80   }
81  },
82  c => {
83   _ => repo('c', 0),
84   '.git' => $repogit
85  }
86 }, '.');
87 chdir $cwd or die "chdir($cwd): $!";
88
89 is(@expected, 3, 'only three valid git repos');
90 is(grep({ ref eq 'ARRAY' } @expected), 3, 'all of them are array references');
91
92 @expected = map [
93              @$_,
94              map({ catdir($tmpdir, $_) } @{$_}[1 .. 3]),
95              $tmpdir,
96              '%n', '%x'
97             ], @expected;
98
99 sub try {
100  my ($cmd, $exp) = @_;
101  my ($fh, $filename) = tempfile(UNLINK => 1);
102  my $policy = App::Rgit::Policy->new(
103   @_ > 2 ? (name => 'Callback', callback => $_[2])
104          : (name => 'Default')
105  );
106  my $ar = App::Rgit->new(
107   git    => abs_path('t/bin/git'),
108   root   => $tmpdir,
109   cmd    => $cmd,
110   args   => [ abs_path($filename), $cmd, qw/%n %g %w %b %G %W %B %R %%n %x/ ],
111   policy => $policy,
112  );
113  isnt($ar, undef, "each $cmd has a defined object");
114  my $exit;
115  my $fail = $cmd eq 'FAIL' ? 1 : 0;
116  if ($fail) {
117   ($exit, undef) = $ar->run;
118  } else {
119   $exit = $ar->run;
120  }
121  is($exit, $fail, "each $cmd returned $fail");
122  my @lines = split /\n/, do { local $/; <$fh> };
123  my $res = [ map [ split /\|/, $_ ], @lines ];
124  $exp = [ map [ $cmd, @$_ ], @$exp ];
125  for my $i (0 .. $#$exp) {
126   my $e = $exp->[$i];
127   my $r = shift @$res;
128   isnt($r, undef, "each $cmd visited repository $i");
129 SKIP:
130   {
131    skip 'didn\'t visited that repo' => 10 unless defined $r;
132    s/[\r\n]*$// for @$r;
133    is($r->[$_], $e->[$_], "each $cmd argument $_ for repository $i is ok")
134     for 0 .. 10;
135   }
136  }
137 }
138
139 try 'commit', [ @expected ];
140 try 'FAIL',   [ $expected[0] ];
141 try 'FAIL',   [ @expected ],
142               sub { NEXT | SAVE };
143 my $c = 0;
144 try 'FAIL',   [ map { ($expected[$_]) x 2 } 0 .. $#expected ],
145               sub { my $ret = $c ? undef : REDO; $c = 1 - $c; $ret };