Sitemap.php
<?php
namespace Phad\Test\Unit;
class Sitemap extends \Phad\Tester {
// - build a sitemap:
// - take in a pattern, sql, and other sitemap attributes
// - add custom handlers to modify sitemap data on a row-by-row basis
// - generate sitemap xml
// - write xml to disk
public function testQueryToXml(){
$ldb = \Tlf\LilDb::sqlite();
$ldb->create('blog', ['slug'=>'varchar(50)']);
$ldb->insert('blog', ['slug'=>'cat']);
$ldb->insert('blog', ['slug'=>'dog']);
$ldb->insert('blog', ['slug'=>'bear']);
$sitemap_data =
[
'sql' => 'SELECT slug FROM blog',
'priority' => '0.8',
'last_mod' => '1354',
'changefreq' => 'daily',
'pattern' => '/blog/{slug}',
];
$dir = $this->file('test/input/sitemap');
$this->empty_dir($dir);
$sb = new \Phad\SitemapBuilder($dir);
$lia = new \Lia();
$server = \Lia\Package\Server::main($lia);
$sb->router = $lia->addon('lia:server.router');
$sb->pdo = $ldb->pdo();
$entries = $sb->build_entries($sitemap_data);
foreach($entries as $e){
$sb->addEntry('query-to-xml', $e);
}
$sb->close('query-to-xml');
$saved_entries = $sb->get_stored_entries('query-to-xml');
$base = ['priority'=>'0.8', 'lastmod'=>'1354', 'changefreq'=>'daily'];
$cat = array_merge($base, ['loc'=>'/blog/cat']);
$dog = array_merge($base, ['loc'=>'/blog/dog']);
$bear = array_merge($base, ['loc'=>'/blog/bear']);
$this->compare_arrays(
[$cat, $dog, $bear],
$saved_entries
);
}
public function testFillPattern(){
$dir = $this->file('/test/input/sitemap/');
$sb = new \Phad\SitemapBuilder($dir);
$lia = new \Lia();
$server = \Lia\Package\Server::main($lia);
$sb->router = $lia->addon('lia:server.router');
$pattern = '/blog/{slug}/{title}/';
$parsed = $sb->parse_pattern($pattern);
$filled = $sb->fill_pattern($parsed, ['slug'=>'cat','title'=>'all-about-my-cat']);
$this->compare(
'/blog/cat/all-about-my-cat/',
$filled,
);
}
/**
* @test that results from the query will override default sitemap-params like priority, changefreq, and last_mod,
*/
public function testQueryForSitemapParams(){
$ldb = \Tlf\LilDb::sqlite();
$ldb->create('blog', ['slug'=>'varchar(50)', 'lastmod'=>'varchar(2)', 'priority'=>'varchar(15)', 'changefreq'=>'varchar(15)']);
$ldb->insert('blog', ['slug'=>'cat', 'lastmod'=>'2', 'priority'=>'0.5']);
$ldb->insert('blog', ['slug'=>'dog', 'lastmod'=>'2', 'changefreq'=>'weekly']);
$ldb->insert('blog', ['slug'=>'bear', 'lastmod'=>'3']);
$dir = $this->file('test/input/sitemap');
$sitemap_data =
[
'sql' => 'SELECT slug, lastmod as last_mod, priority, changefreq FROM blog',
'priority' => '0.8',
'last_mod' => '1354',
'changefreq' => 'daily',
'pattern' => '/blog/{slug}',
];
$sb = new \Phad\SitemapBuilder($dir);
$lia = new \Lia();
$server = \Lia\Package\Server::main($lia);
$sb->router = $lia->addon('lia:server.router');
$sb->pdo = $ldb->pdo();
$entries = $sb->build_entries($sitemap_data);
$base = ['priority'=>'0.8', 'last_mod'=>'2', 'changefreq'=>'daily'];
$cat = array_merge($base, ['loc'=>'/blog/cat', 'priority'=>'0.5']);
$dog = array_merge($base, ['loc'=>'/blog/dog', 'changefreq'=>'weekly']);
$bear = array_merge($base, ['loc'=>'/blog/bear', 'last_mod'=>'3']);
$this->compare_arrays(
[$cat, $dog, $bear],
$entries
);
}
public function testNoQuery(){
$sitemap_data =
[
'priority' => '0.8',
'last_mod' => '1354',
'changefreq' => 'daily',
'pattern' => '/blog/', //such as an index page
];
$dir = $this->file('test/input/sitemap');
$sb = new \Phad\SitemapBuilder($dir);
$lia = new \Lia();
$server = \Lia\Package\Server::main($lia);
$sb->router = $server->addons['router'];
$entries = $sb->build_entries($sitemap_data);
$target =
[
'priority'=>'0.8',
'last_mod'=>'1354',
'changefreq'=>'daily',
'loc'=>'/blog/',
];
$this->compare_arrays(
[$target],
$entries
);
}
public function testGetEntries(){
$ldb = \Tlf\LilDb::sqlite();
$ldb->create('blog', ['slug'=>'varchar(50)']);
$ldb->insert('blog', ['slug'=>'cat']);
$ldb->insert('blog', ['slug'=>'dog']);
$ldb->insert('blog', ['slug'=>'bear']);
$dir = $this->file('test/input/sitemap');
$sitemap_data =
[
'sql' => 'SELECT slug FROM blog',
'priority' => '0.8',
'last_mod' => '1354',
'changefreq' => 'daily',
'pattern' => '/blog/{slug}',
];
$sb = new \Phad\SitemapBuilder($dir);
$lia = new \Lia();
$server = \Lia\Package\Server::main($lia);
$sb->router = $lia->addon('lia:server.router');
$sb->pdo = $ldb->pdo();
$entries = $sb->build_entries($sitemap_data);
$base = ['priority'=>'0.8', 'last_mod'=>'1354', 'changefreq'=>'daily'];
$cat = array_merge($base, ['loc'=>'/blog/cat']);
$dog = array_merge($base, ['loc'=>'/blog/dog']);
$bear = array_merge($base, ['loc'=>'/blog/bear']);
$this->compare_arrays(
[$cat, $dog, $bear],
$entries
);
}
/**
* @test that `</urlset>` gets written during __destruct()
*/
public function testSimpleWriting2(){
$dir = $this->file('test/input/sitemap');
$this->empty_dir($dir);
$sb = new \Phad\SitemapBuilder($dir);
$sb->addEntry('main2',
$entry=['priority'=>'0.8', 'lastmod'=>''.microtime(true), 'changefreq'=>'daily']
);
// unset($sb);
$sb2 = new \Phad\SitemapBuilder($dir);
$data = $sb2->get_stored_entries('main2');
$this->compare_arrays(
$entry,
$data[0]
);
$this->test('sitemap not yet closed');
$sm_file = file_get_contents($this->file('test/input/sitemap/main2.xml'));
$this->str_not_contains($sm_file,
'</urlset>'
);
$this->test('sitemap closed after destroying SitemapBuilder');
unset($sb);
$sm_file = file_get_contents($this->file('test/input/sitemap/main2.xml'));
$this->str_contains($sm_file,
'</urlset>'
);
}
/**
* @test that writing entries works
*/
public function testSimpleWriting(){
$dir = $this->file('test/input/sitemap');
$this->empty_dir($dir);
$sb = new \Phad\SitemapBuilder($dir);
$sb->addEntry('main',
$entry=['priority'=>'0.8', 'lastmod'=>''.microtime(true), 'changefreq'=>'daily']
);
$sb->close('main');
$data = $sb->get_stored_entries('main');
// ksort($entry);
// ksort($data[0]);
$this->compare_arrays(
$entry,
$data[0]
);
}
/**
* @test running query
*/
public function testGetResults(){
$ldb = \Tlf\LilDb::sqlite();
$ldb->create('blog', ['slug'=>'varchar(50)']);
$ldb->insert('blog', ['slug'=>'cat']);
$ldb->insert('blog', ['slug'=>'dog']);
$ldb->insert('blog', ['slug'=>'bear']);
$dir = $this->file('test/input/sitemap');
$sb = new \Phad\SitemapBuilder($dir);
$sb->pdo = $ldb->pdo();
$results = $sb->get_results('SELECT slug FROM blog');
$this->compare(
[['slug'=>'cat'],['slug'=>'dog'],['slug'=>'bear']],
$results
);
}
}