Use utime to make initial files in trail test come from the past
[ikiwiki] / t / trail.t
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use Test::More 'no_plan';
5 use IkiWiki;
6
7 my $blob;
8
9 ok(! system("rm -rf t/tmp"));
10 ok(! system("mkdir t/tmp"));
11
12 # Write files with a date in the past, so that when we refresh,
13 # the update is detected.
14 sub write_old_file {
15         my $name = shift;
16         my $content = shift;
17
18         writefile($name, "t/tmp/in", $content);
19         ok(utime(333333333, 333333333, "t/tmp/in/$name"));
20 }
21
22 # Use a rather stylized template to override the default rendering, to make
23 # it easy to search for the desired results
24 write_old_file("templates/trails.tmpl", <<EOF
25 <TMPL_LOOP TRAILLOOP>
26 <TMPL_IF __FIRST__><nav></TMPL_IF>
27 <div>
28 trail=<TMPL_VAR TRAILPAGE> n=<TMPL_VAR NEXTPAGE> p=<TMPL_VAR PREVPAGE>
29 </div>
30 <div>
31 <TMPL_IF PREVURL>
32 <a href="<TMPL_VAR PREVURL>">&lt; <TMPL_VAR PREVTITLE></a>
33 </TMPL_IF> |
34 <a href="<TMPL_VAR TRAILURL>">^ <TMPL_VAR TRAILTITLE> ^</a>
35 | <TMPL_IF NEXTURL>
36 <a href="<TMPL_VAR NEXTURL>"><TMPL_VAR NEXTTITLE> &gt;</a>
37 </TMPL_IF>
38 </div>
39 <TMPL_IF __LAST__></nav></TMPL_IF>
40 </TMPL_LOOP>
41 EOF
42 );
43 write_old_file("badger.mdwn", "[[!meta title=\"The Breezy Badger\"]]\ncontent of badger");
44 write_old_file("mushroom.mdwn", "content of mushroom");
45 write_old_file("snake.mdwn", "content of snake");
46 write_old_file("ratty.mdwn", "content of ratty");
47 write_old_file("mr_toad.mdwn", "content of mr toad");
48 write_old_file("add.mdwn", '[[!trailitems pagenames="add/a add/b add/c add/d add/e"]]');
49 write_old_file("add/b.mdwn", "b");
50 write_old_file("add/d.mdwn", "d");
51 write_old_file("del.mdwn", '[[!trailitems pages="del/*" sort=title]]');
52 write_old_file("del/a.mdwn", "a");
53 write_old_file("del/b.mdwn", "b");
54 write_old_file("del/c.mdwn", "c");
55 write_old_file("del/d.mdwn", "d");
56 write_old_file("del/e.mdwn", "e");
57 write_old_file("self_referential.mdwn", '[[!trailitems pagenames="self_referential" circular=yes]]');
58 write_old_file("sorting/linked.mdwn", "linked");
59 write_old_file("sorting/a/b.mdwn", "a/b");
60 write_old_file("sorting/a/c.mdwn", "a/c");
61 write_old_file("sorting/z/a.mdwn", "z/a");
62 write_old_file("sorting/beginning.mdwn", "beginning");
63 write_old_file("sorting/middle.mdwn", "middle");
64 write_old_file("sorting/end.mdwn", "end");
65 write_old_file("sorting/new.mdwn", "new");
66 write_old_file("sorting/old.mdwn", "old");
67 write_old_file("sorting/ancient.mdwn", "ancient");
68 # These three need to be in the appropriate age order
69 ok(utime(333333333, 333333333, "t/tmp/in/sorting/new.mdwn"));
70 ok(utime(222222222, 222222222, "t/tmp/in/sorting/old.mdwn"));
71 ok(utime(111111111, 111111111, "t/tmp/in/sorting/ancient.mdwn"));
72 write_old_file("sorting/linked2.mdwn", "linked2");
73 # This initially uses the default sort order: age for the inline, and path
74 # for trailitems. We change it later.
75 write_old_file("sorting.mdwn",
76         '[[!traillink linked]] ' .
77         '[[!trailitems pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' .
78         '[[!trailitems pagenames="beginning middle end"]] ' .
79         '[[!inline pages="sorting/old or sorting/ancient or sorting/new" trail="yes"]] ' .
80         '[[!traillink linked2]]');
81
82 write_old_file("meme.mdwn", <<EOF
83 [[!trail]]
84 * [[!traillink badger]]
85 * [[!traillink badger text="This is a link to badger, with a title"]]
86 * [[!traillink That_is_the_badger|badger]]
87 * [[!traillink badger]]
88 * [[!traillink mushroom]]
89 * [[!traillink mushroom]]
90 * [[!traillink snake]]
91 * [[!traillink snake]]
92 EOF
93 );
94
95 write_old_file("wind_in_the_willows.mdwn", <<EOF
96 [[!trailoptions circular=yes sort=title]]
97 [[!trailitems pages="ratty or badger or mr_toad"]]
98 [[!trailitem moley]]
99 EOF
100 );
101
102 ok(! system("make -s ikiwiki.out"));
103
104 my $command = "perl -I. ./ikiwiki.out -set usedirs=0 -plugin trail -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tmp/in t/tmp/out -verbose";
105
106 ok(! system($command));
107
108 ok(! system("$command -refresh"));
109
110 $blob = readfile("t/tmp/out/meme.html");
111 ok($blob =~ /<a href="(\.\/)?badger.html">badger<\/a>/m);
112 ok($blob =~ /<a href="(\.\/)?badger.html">This is a link to badger, with a title<\/a>/m);
113 ok($blob =~ /<a href="(\.\/)?badger.html">That is the badger<\/a>/m);
114
115 $blob = readfile("t/tmp/out/badger.html");
116 ok($blob =~ /^trail=meme n=mushroom p=$/m);
117 ok($blob =~ /^trail=wind_in_the_willows n=mr_toad p=ratty$/m);
118
119 ok(! -f "t/tmp/out/moley.html");
120
121 $blob = readfile("t/tmp/out/mr_toad.html");
122 ok($blob !~ /^trail=meme/m);
123 ok($blob =~ /^trail=wind_in_the_willows n=ratty p=badger$/m);
124 # meta title is respected for pages that have one
125 ok($blob =~ /">&lt; The Breezy Badger<\/a>/m);
126 # pagetitle for pages that don't
127 ok($blob =~ /">ratty &gt;<\/a>/m);
128
129 $blob = readfile("t/tmp/out/ratty.html");
130 ok($blob !~ /^trail=meme/m);
131 ok($blob =~ /^trail=wind_in_the_willows n=badger p=mr_toad$/m);
132
133 $blob = readfile("t/tmp/out/mushroom.html");
134 ok($blob =~ /^trail=meme n=snake p=badger$/m);
135 ok($blob !~ /^trail=wind_in_the_willows/m);
136
137 $blob = readfile("t/tmp/out/snake.html");
138 ok($blob =~ /^trail=meme n= p=mushroom$/m);
139 ok($blob !~ /^trail=wind_in_the_willows/m);
140
141 $blob = readfile("t/tmp/out/self_referential.html");
142 ok($blob =~ /^trail=self_referential n= p=$/m);
143
144 $blob = readfile("t/tmp/out/add/b.html");
145 ok($blob =~ /^trail=add n=add\/d p=$/m);
146 $blob = readfile("t/tmp/out/add/d.html");
147 ok($blob =~ /^trail=add n= p=add\/b$/m);
148 ok(! -f "t/tmp/out/add/a.html");
149 ok(! -f "t/tmp/out/add/c.html");
150 ok(! -f "t/tmp/out/add/e.html");
151
152 $blob = readfile("t/tmp/out/del/a.html");
153 ok($blob =~ /^trail=del n=del\/b p=$/m);
154 $blob = readfile("t/tmp/out/del/b.html");
155 ok($blob =~ /^trail=del n=del\/c p=del\/a$/m);
156 $blob = readfile("t/tmp/out/del/c.html");
157 ok($blob =~ /^trail=del n=del\/d p=del\/b$/m);
158 $blob = readfile("t/tmp/out/del/d.html");
159 ok($blob =~ /^trail=del n=del\/e p=del\/c$/m);
160 $blob = readfile("t/tmp/out/del/e.html");
161 ok($blob =~ /^trail=del n= p=del\/d$/m);
162
163 $blob = readfile("t/tmp/out/sorting/linked.html");
164 ok($blob =~ m{^trail=sorting n=sorting/a/b p=$}m);
165 $blob = readfile("t/tmp/out/sorting/a/b.html");
166 ok($blob =~ m{^trail=sorting n=sorting/a/c p=sorting/linked$}m);
167 $blob = readfile("t/tmp/out/sorting/a/c.html");
168 ok($blob =~ m{^trail=sorting n=sorting/z/a p=sorting/a/b$}m);
169 $blob = readfile("t/tmp/out/sorting/z/a.html");
170 ok($blob =~ m{^trail=sorting n=sorting/beginning p=sorting/a/c$}m);
171 $blob = readfile("t/tmp/out/sorting/beginning.html");
172 ok($blob =~ m{^trail=sorting n=sorting/middle p=sorting/z/a$}m);
173 $blob = readfile("t/tmp/out/sorting/middle.html");
174 ok($blob =~ m{^trail=sorting n=sorting/end p=sorting/beginning$}m);
175 $blob = readfile("t/tmp/out/sorting/end.html");
176 ok($blob =~ m{^trail=sorting n=sorting/new p=sorting/middle$}m);
177 $blob = readfile("t/tmp/out/sorting/new.html");
178 ok($blob =~ m{^trail=sorting n=sorting/old p=sorting/end$}m);
179 $blob = readfile("t/tmp/out/sorting/old.html");
180 ok($blob =~ m{^trail=sorting n=sorting/ancient p=sorting/new$}m);
181 $blob = readfile("t/tmp/out/sorting/ancient.html");
182 ok($blob =~ m{^trail=sorting n=sorting/linked2 p=sorting/old$}m);
183 $blob = readfile("t/tmp/out/sorting/linked2.html");
184 ok($blob =~ m{^trail=sorting n= p=sorting/ancient$}m);
185
186 # Make some changes and refresh. These writefile calls don't set an
187 # old mtime, so they're strictly newer than the "old" files.
188
189 writefile("add/a.mdwn", "t/tmp/in", "a");
190 writefile("add/c.mdwn", "t/tmp/in", "c");
191 writefile("add/e.mdwn", "t/tmp/in", "e");
192 ok(unlink("t/tmp/in/del/a.mdwn"));
193 ok(unlink("t/tmp/in/del/c.mdwn"));
194 ok(unlink("t/tmp/in/del/e.mdwn"));
195
196 writefile("sorting.mdwn", "t/tmp/in",
197         readfile("t/tmp/in/sorting.mdwn") .
198         '[[!trailoptions sort="title" reverse="yes"]]'); 
199
200 ok(! system("$command -refresh"));
201
202 $blob = readfile("t/tmp/out/add/a.html");
203 ok($blob =~ /^trail=add n=add\/b p=$/m);
204 $blob = readfile("t/tmp/out/add/b.html");
205 ok($blob =~ /^trail=add n=add\/c p=add\/a$/m);
206 $blob = readfile("t/tmp/out/add/c.html");
207 ok($blob =~ /^trail=add n=add\/d p=add\/b$/m);
208 $blob = readfile("t/tmp/out/add/d.html");
209 ok($blob =~ /^trail=add n=add\/e p=add\/c$/m);
210 $blob = readfile("t/tmp/out/add/e.html");
211 ok($blob =~ /^trail=add n= p=add\/d$/m);
212
213 $blob = readfile("t/tmp/out/del/b.html");
214 ok($blob =~ /^trail=del n=del\/d p=$/m);
215 $blob = readfile("t/tmp/out/del/d.html");
216 ok($blob =~ /^trail=del n= p=del\/b$/m);
217 ok(! -f "t/tmp/out/del/a.html");
218 ok(! -f "t/tmp/out/del/c.html");
219 ok(! -f "t/tmp/out/del/e.html");
220
221 $blob = readfile("t/tmp/out/sorting/old.html");
222 ok($blob =~ m{^trail=sorting n=sorting/new p=$}m);
223 $blob = readfile("t/tmp/out/sorting/new.html");
224 ok($blob =~ m{^trail=sorting n=sorting/middle p=sorting/old$}m);
225 $blob = readfile("t/tmp/out/sorting/middle.html");
226 ok($blob =~ m{^trail=sorting n=sorting/linked2 p=sorting/new$}m);
227 $blob = readfile("t/tmp/out/sorting/linked2.html");
228 ok($blob =~ m{^trail=sorting n=sorting/linked p=sorting/middle$}m);
229 $blob = readfile("t/tmp/out/sorting/linked.html");
230 ok($blob =~ m{^trail=sorting n=sorting/end p=sorting/linked2$}m);
231 $blob = readfile("t/tmp/out/sorting/end.html");
232 ok($blob =~ m{^trail=sorting n=sorting/a/c p=sorting/linked$}m);
233 $blob = readfile("t/tmp/out/sorting/a/c.html");
234 ok($blob =~ m{^trail=sorting n=sorting/beginning p=sorting/end$}m);
235 $blob = readfile("t/tmp/out/sorting/beginning.html");
236 ok($blob =~ m{^trail=sorting n=sorting/a/b p=sorting/a/c$}m);
237 $blob = readfile("t/tmp/out/sorting/a/b.html");
238 ok($blob =~ m{^trail=sorting n=sorting/ancient p=sorting/beginning$}m);
239 $blob = readfile("t/tmp/out/sorting/ancient.html");
240 ok($blob =~ m{^trail=sorting n=sorting/z/a p=sorting/a/b$}m);
241 $blob = readfile("t/tmp/out/sorting/z/a.html");
242 ok($blob =~ m{^trail=sorting n= p=sorting/ancient$}m);
243
244 ok(! system("rm -rf t/tmp"));