Bug 11190: sitemap.pl -- Generate a Catalog sitemap
[koha.git] / t / db_dependent / Sitemapper.t
1 #!/usr/bin/perl
2
3 # Copyright 2015 Tamil s.a.r.l.
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 3 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 use Modern::Perl;
21 use Test::MockModule;
22 use File::Basename;
23 use File::Path;
24 use DateTime;
25 use Test::More tests => 14;
26
27
28 BEGIN {
29     use_ok('Koha::Sitemapper');
30     use_ok('Koha::Sitemapper::Writer');
31 }
32
33
34 sub slurp {
35     my $file = shift;
36     open my $fh, '<', $file or die;
37     local $/ = undef;
38     my $cont = <$fh>;
39     close $fh;
40     return $cont;
41 }
42
43
44 # Create 3 mocked dataset to be used by Koha::Sitemaper in place of DB content
45 my $module_context = new Test::MockModule('C4::Context');
46 $module_context->mock('_new_dbh', sub {
47     my $dbh = DBI->connect( 'DBI:Mock:', '', '' )
48     || die "Cannot create handle: $DBI::errstr\n";
49     return $dbh
50 });
51 my $dbh = C4::Context->dbh();
52 my $two_bibs = [
53         [ qw/ biblionumber timestamp  / ],
54         [ qw/ 1234         2013-11-15 / ],
55         [ qw/ 9875         2015-08-31 / ],
56 ];
57 my $lotof_bibs = [ [ qw/ biblionumber timestamp / ] ];
58 push @$lotof_bibs, [ $_, '2015-08-31' ] for 1..75000;
59 $dbh->{mock_add_resultset} = $two_bibs;
60 $dbh->{mock_add_resultset} = $two_bibs;
61 $dbh->{mock_add_resultset} = $lotof_bibs;
62
63 my $dir = File::Spec->rel2abs( dirname(__FILE__) );
64
65 # Create a sitemap for a catalog containg 2 biblios, with option 'long url'
66 my $sitemaper = Koha::Sitemapper->new(
67     verbose => 0,
68     url     => 'http://www.mylibrary.org',
69     dir     => $dir,
70     short   => 0,
71 );
72 $sitemaper->run();
73
74 my $file = "$dir/sitemapindex.xml";
75 ok( -e "$dir/sitemapindex.xml", "File sitemapindex.xml created");
76 my $file_content = slurp($file);
77 my $now = DateTime->now->ymd;
78 my $expected_content = <<EOS;
79 <?xml version="1.0" encoding="UTF-8"?>
80
81 <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
82   <sitemap>
83     <loc>http://www.mylibrary.org/sitemap0001.xml</loc>
84     <lastmod>$now</lastmod>
85   </sitemap>
86 </sitemapindex>
87 EOS
88 chop $expected_content;
89 ok( $file_content eq $expected_content, "Its content is valid" );
90
91 $file = "$dir/sitemap0001.xml";
92 ok( -e $file, "File sitemap0001.xml created");
93 $file_content = slurp($file);
94 $expected_content = <<EOS;
95 <?xml version="1.0" encoding="UTF-8"?>
96
97 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
98   <url>
99     <loc>http://www.mylibrary.org/cgi-bin/koha/opac-detail.pl?biblionumber=1234</loc>
100     <lastmod>2013-11-15</lastmod>
101   </url>
102   <url>
103     <loc>http://www.mylibrary.org/cgi-bin/koha/opac-detail.pl?biblionumber=9875</loc>
104     <lastmod>2015-08-31</lastmod>
105   </url>
106 </urlset>
107 EOS
108 ok( $file_content eq $expected_content, "Its content is valid" );
109
110
111 # Create a sitemap for a catalog containg 2 biblios, with option 'short url'.
112 # Test that 2 files are created.
113 $sitemaper = Koha::Sitemapper->new(
114     verbose => 0,
115     url     => 'http://www.mylibrary.org',
116     dir     => $dir,
117     short   => 1,
118 );
119 $sitemaper->run();
120
121 $file = "$dir/sitemap0001.xml";
122 ok( -e $file, "File sitemap0001.xml with short URLs created");
123 $file_content = slurp($file);
124 $expected_content = <<EOS;
125 <?xml version="1.0" encoding="UTF-8"?>
126
127 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
128   <url>
129     <loc>http://www.mylibrary.org/bib/1234</loc>
130     <lastmod>2013-11-15</lastmod>
131   </url>
132   <url>
133     <loc>http://www.mylibrary.org/bib/9875</loc>
134     <lastmod>2015-08-31</lastmod>
135   </url>
136 </urlset>
137 EOS
138 ok( $file_content eq $expected_content, "Its content is valid" );
139
140
141 # Create a sitemap for a catalog containing 75000 biblios, with option 'short
142 # url'. Test that 3 files are created: index file + 2 urls file with
143 # respectively 50000 et 25000 urls.
144 $sitemaper = Koha::Sitemapper->new(
145     verbose => 0,
146     url     => 'http://www.mylibrary.org',
147     dir     => $dir,
148     short   => 1,
149 );
150 $sitemaper->run();
151
152 $file = "$dir/sitemapindex.xml";
153 ok( -e "$dir/sitemapindex.xml", "File sitemapindex.xml for 75000 bibs created");
154 $file_content = slurp($file);
155 $expected_content = <<EOS;
156 <?xml version="1.0" encoding="UTF-8"?>
157
158 <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
159   <sitemap>
160     <loc>http://www.mylibrary.org/sitemap0001.xml</loc>
161     <lastmod>$now</lastmod>
162   </sitemap>
163   <sitemap>
164     <loc>http://www.mylibrary.org/sitemap0002.xml</loc>
165     <lastmod>$now</lastmod>
166   </sitemap>
167 </sitemapindex>
168 EOS
169 chop $expected_content;
170 ok( $file_content eq $expected_content, "Its content is valid" );
171
172 $file = "$dir/sitemap0001.xml";
173 ok( -e $file, "File sitemap0001.xml created");
174
175 open my $fh, "<", $file;
176 my $count = 0;
177 while (<$fh>) {
178         $count++ if /<loc>/;
179 }
180 ok ( $count == 50000, "It contains 50000 URLs");
181
182 $file = "$dir/sitemap0002.xml";
183 ok( -e $file, "File sitemap0002.xml created");
184
185 open $fh, "<", $file;
186 $count = 0;
187 while (<$fh>) {
188         $count++ if /<loc>/;
189 }
190 ok ( $count == 25000, "It contains 25000 URLs");
191
192 # Cleanup
193 unlink "$dir/$_" for qw / sitemapindex.xml sitemap0001.xml sitemap0002.xml /;