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