Fix regression: failing to make the temp dir should nix the test plan.
[ikiwiki] / t / cvs.t
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use Test::More;
5 use IkiWiki;
6
7 my %ideal_test_plan = (tests => 8);
8 my $dir;
9
10 sub _determine_test_plan {
11         my $cvs = `which cvs`; chomp $cvs;
12         my $cvsps = `which cvsps`; chomp $cvsps;
13         return (skip_all => 'cvs or cvsps not available')
14                 unless -x $cvs && -x $cvsps;
15
16         foreach my $module (qw(File::ReadBackwards File::MimeInfo)) {
17                 eval qq{use $module};
18                 if ($@) {
19                         return (skip_all => "$module not available");
20                 }
21         }
22
23         $dir = "/tmp/ikiwiki-test-cvs.$$";
24         return (skip_all => "can't create $dir: $!")
25                 unless mkdir($dir);
26
27         return %ideal_test_plan;
28 }
29
30 sub _startup {
31         _generate_minimal_config();
32         _create_test_repo();
33 }
34
35 sub _shutdown {
36         system "rm -rf $dir";
37 }
38
39 sub _generate_minimal_config {
40         %config = IkiWiki::defaultconfig();
41         $config{rcs} = "cvs";
42         $config{srcdir} = "$dir/src";
43         $config{cvsrepo} = "$dir/repo";
44         $config{cvspath} = "ikiwiki";
45         IkiWiki::loadplugins();
46         IkiWiki::checkconfig();
47 }
48
49 sub _create_test_repo {
50         my $cvs = "cvs -d $config{cvsrepo}";
51         my $dn = ">/dev/null";
52         system "$cvs init $dn";
53         system "mkdir $dir/$config{cvspath} $dn";
54         system "cd $dir/$config{cvspath} && "
55                 . "$cvs import -m import $config{cvspath} VENDOR RELEASE $dn";
56         system "rm -rf $dir/$config{cvspath} $dn";
57         system "$cvs co -d $config{srcdir} $config{cvspath} $dn";
58 }
59
60 sub test_web_add_and_commit {
61         my $message = "Added the first page";
62         writefile('test1.mdwn', $config{srcdir}, readfile("t/test1.mdwn"));
63         IkiWiki::rcs_add("test1.mdwn");
64         IkiWiki::rcs_commit(
65                 file => "test1.mdwn",
66                 message => $message,
67                 token => "moo",
68         );
69
70         my @changes = IkiWiki::rcs_recentchanges(3);
71         is(
72                 $#changes,
73                 0,
74                 q{1 total commit},
75         );
76         is(
77                 $changes[0]{message}[0]{"line"},
78                 $message,
79                 q{first line of most recent commit message matches},
80         );
81         is(
82                 $changes[0]{pages}[0]{"page"},
83                 "test1",
84                 q{first pagename from most recent commit matches},
85         );
86 }
87
88 sub test_manual_add_and_commit {
89         my $message = "Added the second page";
90         writefile('test2.mdwn', $config{srcdir}, readfile("t/test2.mdwn"));
91         system "cd $config{srcdir}"
92                 . " && cvs add test2.mdwn >/dev/null 2>&1";
93         system "cd $config{srcdir}"
94                 . " && cvs commit -m \"$message\" test2.mdwn >/dev/null";
95
96         my @changes = IkiWiki::rcs_recentchanges(3);
97         is(
98                 $#changes,
99                 1,
100                 q{2 total commits},
101         );
102         is(
103                 $changes[0]{message}[0]{"line"},
104                 $message,
105                 q{first line of most recent commit message matches},
106         );
107         is(
108                 $changes[0]{pages}[0]{"page"},
109                 "test2",
110                 q{first pagename from most recent commit matches},
111         );
112         is(
113                 $changes[1]{pages}[0]{"page"},
114                 "test1",
115                 q{first pagename from second-most-recent commit matches},
116         );
117 }
118
119 sub test_extra_path_slashes {
120         my $initial_cvspath = $config{cvspath};
121         $config{cvspath} = "/ikiwiki//";
122         IkiWiki::checkconfig();
123         is(
124                 $config{cvspath},
125                 $initial_cvspath,
126                 q{rcs_recentchanges assumes checkconfig sanitizes cvspath},
127         );
128 }
129
130 plan(_determine_test_plan());
131 _startup();
132 test_web_add_and_commit();
133 test_manual_add_and_commit();
134 test_extra_path_slashes();
135 _shutdown();