Add and update unit test for the new system (Bookmark + Service)

See #1307
This commit is contained in:
ArthurHoaro 2020-01-17 21:34:12 +01:00
parent cf92b4dd15
commit e26e2060f5
46 changed files with 4704 additions and 1734 deletions

View file

@ -80,7 +80,8 @@ locale_test_%:
--testsuite language-$(firstword $(subst _, ,$*))
all_tests: test locale_test_de_DE locale_test_en_US locale_test_fr_FR
@$(BIN)/phpcov merge --html coverage coverage
@# --The current version is not compatible with PHP 7.2
@#$(BIN)/phpcov merge --html coverage coverage
@# --text doesn't work with phpunit 4.* (v5 requires PHP 5.6)
@#$(BIN)/phpcov merge --text coverage/txt coverage

View file

@ -65,8 +65,8 @@ public function fromArray($data)
$this->url = $data['url'];
$this->title = $data['title'];
$this->description = $data['description'];
$this->thumbnail = ! empty($data['thumbnail']) ? $data['thumbnail'] : null;
$this->sticky = ! empty($data['sticky']) ? $data['sticky'] : false;
$this->thumbnail = isset($data['thumbnail']) ? $data['thumbnail'] : null;
$this->sticky = isset($data['sticky']) ? $data['sticky'] : false;
$this->created = $data['created'];
if (is_array($data['tags'])) {
$this->tags = $data['tags'];

20
composer.lock generated
View file

@ -8,16 +8,16 @@
"packages": [
{
"name": "arthurhoaro/web-thumbnailer",
"version": "v2.0.0",
"version": "v2.0.1",
"source": {
"type": "git",
"url": "https://github.com/ArthurHoaro/web-thumbnailer.git",
"reference": "609a495277ad3e478738d4b8dd522f9cc50c9faa"
"reference": "4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/609a495277ad3e478738d4b8dd522f9cc50c9faa",
"reference": "609a495277ad3e478738d4b8dd522f9cc50c9faa",
"url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a",
"reference": "4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a",
"shasum": ""
},
"require": {
@ -49,7 +49,7 @@
}
],
"description": "PHP library which will retrieve a thumbnail for any given URL",
"time": "2019-08-10T11:33:13+00:00"
"time": "2020-01-17T19:42:49+00:00"
},
{
"name": "erusev/parsedown",
@ -786,16 +786,16 @@
},
{
"name": "myclabs/deep-copy",
"version": "1.9.4",
"version": "1.9.5",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7"
"reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/579bb7356d91f9456ccd505f24ca8b667966a0a7",
"reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
"reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
"shasum": ""
},
"require": {
@ -830,7 +830,7 @@
"object",
"object graph"
],
"time": "2019-12-15T19:12:40+00:00"
"time": "2020-01-17T21:11:47+00:00"
},
{
"name": "phar-io/manifest",

View file

@ -757,7 +757,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
// Generate data.
$feedGenerator = new FeedBuilder(
$bookmarkService,
$factory->getFormatter('raw'),
$factory->getFormatter(),
$feedType,
$_SERVER,
$_GET,

View file

@ -4,6 +4,7 @@
use DateTime;
use Exception;
use Shaarli\Bookmark\Bookmark;
class HistoryTest extends \PHPUnit\Framework\TestCase
{
@ -15,9 +16,11 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
/**
* Delete history file.
*/
public function tearDown()
public function setUp()
{
@unlink(self::$historyFilePath);
if (file_exists(self::$historyFilePath)) {
unlink(self::$historyFilePath);
}
}
/**
@ -73,137 +76,140 @@ public function testConstructNotParsable()
public function testAddLink()
{
$history = new History(self::$historyFilePath);
$history->addLink(['id' => 0]);
$bookmark = (new Bookmark())->setId(0);
$history->addLink($bookmark);
$actual = $history->getHistory()[0];
$this->assertEquals(History::CREATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(0, $actual['id']);
$history = new History(self::$historyFilePath);
$history->addLink(['id' => 1]);
$bookmark = (new Bookmark())->setId(1);
$history->addLink($bookmark);
$actual = $history->getHistory()[0];
$this->assertEquals(History::CREATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
$history = new History(self::$historyFilePath);
$history->addLink(['id' => 'str']);
$bookmark = (new Bookmark())->setId('str');
$history->addLink($bookmark);
$actual = $history->getHistory()[0];
$this->assertEquals(History::CREATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals('str', $actual['id']);
}
/**
* Test updated link event
*/
public function testUpdateLink()
{
$history = new History(self::$historyFilePath);
$history->updateLink(['id' => 1]);
$actual = $history->getHistory()[0];
$this->assertEquals(History::UPDATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
}
/**
* Test delete link event
*/
public function testDeleteLink()
{
$history = new History(self::$historyFilePath);
$history->deleteLink(['id' => 1]);
$actual = $history->getHistory()[0];
$this->assertEquals(History::DELETED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
}
/**
* Test updated settings event
*/
public function testUpdateSettings()
{
$history = new History(self::$historyFilePath);
$history->updateSettings();
$actual = $history->getHistory()[0];
$this->assertEquals(History::SETTINGS, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEmpty($actual['id']);
}
/**
* Make sure that new items are stored at the beginning
*/
public function testHistoryOrder()
{
$history = new History(self::$historyFilePath);
$history->updateLink(['id' => 1]);
$actual = $history->getHistory()[0];
$this->assertEquals(History::UPDATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
$history->addLink(['id' => 1]);
$actual = $history->getHistory()[0];
$this->assertEquals(History::CREATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
}
/**
* Re-read history from file after writing an event
*/
public function testHistoryRead()
{
$history = new History(self::$historyFilePath);
$history->updateLink(['id' => 1]);
$history = new History(self::$historyFilePath);
$actual = $history->getHistory()[0];
$this->assertEquals(History::UPDATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
}
/**
* Re-read history from file after writing an event and make sure that the order is correct
*/
public function testHistoryOrderRead()
{
$history = new History(self::$historyFilePath);
$history->updateLink(['id' => 1]);
$history->addLink(['id' => 1]);
$history = new History(self::$historyFilePath);
$actual = $history->getHistory()[0];
$this->assertEquals(History::CREATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
$actual = $history->getHistory()[1];
$this->assertEquals(History::UPDATED, $actual['event']);
$this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
$this->assertEquals(1, $actual['id']);
}
/**
* Test retention time: delete old entries.
*/
public function testHistoryRententionTime()
{
$history = new History(self::$historyFilePath, 5);
$history->updateLink(['id' => 1]);
$this->assertEquals(1, count($history->getHistory()));
$arr = $history->getHistory();
$arr[0]['datetime'] = new DateTime('-1 hour');
FileUtils::writeFlatDB(self::$historyFilePath, $arr);
$history = new History(self::$historyFilePath, 60);
$this->assertEquals(1, count($history->getHistory()));
$this->assertEquals(1, $history->getHistory()[0]['id']);
$history->updateLink(['id' => 2]);
$this->assertEquals(1, count($history->getHistory()));
$this->assertEquals(2, $history->getHistory()[0]['id']);
}
// /**
// * Test updated link event
// */
// public function testUpdateLink()
// {
// $history = new History(self::$historyFilePath);
// $history->updateLink(['id' => 1]);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::UPDATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
// }
//
// /**
// * Test delete link event
// */
// public function testDeleteLink()
// {
// $history = new History(self::$historyFilePath);
// $history->deleteLink(['id' => 1]);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::DELETED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
// }
//
// /**
// * Test updated settings event
// */
// public function testUpdateSettings()
// {
// $history = new History(self::$historyFilePath);
// $history->updateSettings();
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::SETTINGS, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEmpty($actual['id']);
// }
//
// /**
// * Make sure that new items are stored at the beginning
// */
// public function testHistoryOrder()
// {
// $history = new History(self::$historyFilePath);
// $history->updateLink(['id' => 1]);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::UPDATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
//
// $history->addLink(['id' => 1]);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::CREATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
// }
//
// /**
// * Re-read history from file after writing an event
// */
// public function testHistoryRead()
// {
// $history = new History(self::$historyFilePath);
// $history->updateLink(['id' => 1]);
// $history = new History(self::$historyFilePath);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::UPDATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
// }
//
// /**
// * Re-read history from file after writing an event and make sure that the order is correct
// */
// public function testHistoryOrderRead()
// {
// $history = new History(self::$historyFilePath);
// $history->updateLink(['id' => 1]);
// $history->addLink(['id' => 1]);
//
// $history = new History(self::$historyFilePath);
// $actual = $history->getHistory()[0];
// $this->assertEquals(History::CREATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
//
// $actual = $history->getHistory()[1];
// $this->assertEquals(History::UPDATED, $actual['event']);
// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
// $this->assertEquals(1, $actual['id']);
// }
//
// /**
// * Test retention time: delete old entries.
// */
// public function testHistoryRententionTime()
// {
// $history = new History(self::$historyFilePath, 5);
// $history->updateLink(['id' => 1]);
// $this->assertEquals(1, count($history->getHistory()));
// $arr = $history->getHistory();
// $arr[0]['datetime'] = new DateTime('-1 hour');
// FileUtils::writeFlatDB(self::$historyFilePath, $arr);
//
// $history = new History(self::$historyFilePath, 60);
// $this->assertEquals(1, count($history->getHistory()));
// $this->assertEquals(1, $history->getHistory()[0]['id']);
// $history->updateLink(['id' => 2]);
// $this->assertEquals(1, count($history->getHistory()));
// $this->assertEquals(2, $history->getHistory()[0]['id']);
// }
}

View file

@ -2,6 +2,7 @@
namespace Shaarli\Api;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -40,18 +41,21 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
protected $container;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('api.secret', 'NapoleonWasALizard');
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['history'] = $history;
}
/**

View file

@ -2,6 +2,7 @@
namespace Shaarli\Api;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Http\Base64Url;
/**
@ -212,7 +213,7 @@ public function testValidateJwtTokenInvalidTimeFuture()
public function testFormatLinkComplete()
{
$indexUrl = 'https://domain.tld/sub/';
$link = [
$data = [
'id' => 12,
'url' => 'http://lol.lol',
'shorturl' => 'abc',
@ -223,6 +224,8 @@ public function testFormatLinkComplete()
'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'),
'updated' => \DateTime::createFromFormat('Ymd_His', '20170107_160612'),
];
$bookmark = new Bookmark();
$bookmark->fromArray($data);
$expected = [
'id' => 12,
@ -236,7 +239,7 @@ public function testFormatLinkComplete()
'updated' => '2017-01-07T16:06:12+00:00',
];
$this->assertEquals($expected, ApiUtils::formatLink($link, $indexUrl));
$this->assertEquals($expected, ApiUtils::formatLink($bookmark, $indexUrl));
}
/**
@ -245,7 +248,7 @@ public function testFormatLinkComplete()
public function testFormatLinkMinimalNote()
{
$indexUrl = 'https://domain.tld/sub/';
$link = [
$data = [
'id' => 12,
'url' => '?abc',
'shorturl' => 'abc',
@ -255,6 +258,8 @@ public function testFormatLinkMinimalNote()
'private' => '',
'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'),
];
$bookmark = new Bookmark();
$bookmark->fromArray($data);
$expected = [
'id' => 12,
@ -268,7 +273,7 @@ public function testFormatLinkMinimalNote()
'updated' => '',
];
$this->assertEquals($expected, ApiUtils::formatLink($link, $indexUrl));
$this->assertEquals($expected, ApiUtils::formatLink($bookmark, $indexUrl));
}
/**
@ -277,7 +282,7 @@ public function testFormatLinkMinimalNote()
public function testUpdateLink()
{
$created = \DateTime::createFromFormat('Ymd_His', '20170107_160102');
$old = [
$data = [
'id' => 12,
'url' => '?abc',
'shorturl' => 'abc',
@ -287,8 +292,10 @@ public function testUpdateLink()
'private' => '',
'created' => $created,
];
$old = new Bookmark();
$old->fromArray($data);
$new = [
$data = [
'id' => 13,
'shorturl' => 'nope',
'url' => 'http://somewhere.else',
@ -299,17 +306,18 @@ public function testUpdateLink()
'created' => 'creation',
'updated' => 'updation',
];
$new = new Bookmark();
$new->fromArray($data);
$result = ApiUtils::updateLink($old, $new);
$this->assertEquals(12, $result['id']);
$this->assertEquals('http://somewhere.else', $result['url']);
$this->assertEquals('abc', $result['shorturl']);
$this->assertEquals('Le Cid', $result['title']);
$this->assertEquals('Percé jusques au fond du cœur [...]', $result['description']);
$this->assertEquals('corneille rodrigue', $result['tags']);
$this->assertEquals(true, $result['private']);
$this->assertEquals($created, $result['created']);
$this->assertTrue(new \DateTime('5 seconds ago') < $result['updated']);
$this->assertEquals(12, $result->getId());
$this->assertEquals('http://somewhere.else', $result->getUrl());
$this->assertEquals('abc', $result->getShortUrl());
$this->assertEquals('Le Cid', $result->getTitle());
$this->assertEquals('Percé jusques au fond du cœur [...]', $result->getDescription());
$this->assertEquals('corneille rodrigue', $result->getTagsString());
$this->assertEquals(true, $result->isPrivate());
$this->assertEquals($created, $result->getCreated());
}
/**
@ -318,7 +326,7 @@ public function testUpdateLink()
public function testUpdateLinkMinimal()
{
$created = \DateTime::createFromFormat('Ymd_His', '20170107_160102');
$old = [
$data = [
'id' => 12,
'url' => '?abc',
'shorturl' => 'abc',
@ -328,24 +336,19 @@ public function testUpdateLinkMinimal()
'private' => true,
'created' => $created,
];
$old = new Bookmark();
$old->fromArray($data);
$new = [
'url' => '',
'title' => '',
'description' => '',
'tags' => '',
'private' => false,
];
$new = new Bookmark();
$result = ApiUtils::updateLink($old, $new);
$this->assertEquals(12, $result['id']);
$this->assertEquals('?abc', $result['url']);
$this->assertEquals('abc', $result['shorturl']);
$this->assertEquals('?abc', $result['title']);
$this->assertEquals('', $result['description']);
$this->assertEquals('', $result['tags']);
$this->assertEquals(false, $result['private']);
$this->assertEquals($created, $result['created']);
$this->assertTrue(new \DateTime('5 seconds ago') < $result['updated']);
$this->assertEquals(12, $result->getId());
$this->assertEquals('', $result->getUrl());
$this->assertEquals('abc', $result->getShortUrl());
$this->assertEquals('', $result->getTitle());
$this->assertEquals('', $result->getDescription());
$this->assertEquals('', $result->getTagsString());
$this->assertEquals(false, $result->isPrivate());
$this->assertEquals($created, $result->getCreated());
}
}

View file

@ -39,11 +39,11 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
protected $controller;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->refHistory = new \ReferenceHistory();
$this->refHistory->write(self::$testHistory);
$this->container = new Container();

View file

@ -1,7 +1,10 @@
<?php
namespace Shaarli\Api\Controllers;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -14,7 +17,7 @@
*
* @package Api\Controllers
*/
class InfoTest extends \PHPUnit\Framework\TestCase
class InfoTest extends TestCase
{
/**
* @var string datastore to test write operations
@ -42,17 +45,20 @@ class InfoTest extends \PHPUnit\Framework\TestCase
protected $controller;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['db'] = new BookmarkFileService($this->conf, $history, true);
$this->container['history'] = null;
$this->controller = new Info($this->container);
@ -84,11 +90,11 @@ public function testGetInfo()
$this->assertEquals(2, $data['private_counter']);
$this->assertEquals('Shaarli', $data['settings']['title']);
$this->assertEquals('?', $data['settings']['header_link']);
$this->assertEquals('UTC', $data['settings']['timezone']);
$this->assertEquals('Europe/Paris', $data['settings']['timezone']);
$this->assertEquals(ConfigManager::$DEFAULT_PLUGINS, $data['settings']['enabled_plugins']);
$this->assertEquals(false, $data['settings']['default_private_links']);
$this->assertEquals(true, $data['settings']['default_private_links']);
$title = 'My links';
$title = 'My bookmarks';
$headerLink = 'http://shaarli.tld';
$timezone = 'Europe/Paris';
$enabledPlugins = array('foo', 'bar');

View file

@ -3,7 +3,7 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
@ -34,9 +34,9 @@ class DeleteLinkTest extends \PHPUnit\Framework\TestCase
protected $refDB = null;
/**
* @var LinkDB instance.
* @var BookmarkFileService instance.
*/
protected $linkDB;
protected $bookmarkService;
/**
* @var HistoryController instance.
@ -54,20 +54,22 @@ class DeleteLinkTest extends \PHPUnit\Framework\TestCase
protected $controller;
/**
* Before each test, instantiate a new Api with its config, plugins and links.
* Before each test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = $this->linkDB;
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = $this->history;
$this->controller = new Links($this->container);
@ -88,7 +90,7 @@ public function tearDown()
public function testDeleteLinkValid()
{
$id = '41';
$this->assertTrue(isset($this->linkDB[$id]));
$this->assertTrue($this->bookmarkService->exists($id));
$env = Environment::mock([
'REQUEST_METHOD' => 'DELETE',
]);
@ -98,8 +100,8 @@ public function testDeleteLinkValid()
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->assertFalse(isset($this->linkDB[$id]));
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->assertFalse($this->bookmarkService->exists($id));
$historyEntry = $this->history->getHistory()[0];
$this->assertEquals(History::DELETED, $historyEntry['event']);
@ -117,7 +119,7 @@ public function testDeleteLinkValid()
public function testDeleteLink404()
{
$id = -1;
$this->assertFalse(isset($this->linkDB[$id]));
$this->assertFalse($this->bookmarkService->exists($id));
$env = Environment::mock([
'REQUEST_METHOD' => 'DELETE',
]);

View file

@ -2,7 +2,10 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -50,17 +53,19 @@ class GetLinkIdTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_LINK = 9;
/**
* Before each test, instantiate a new Api with its config, plugins and links.
* Before each test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['db'] = new BookmarkFileService($this->conf, $history, true);
$this->container['history'] = null;
$this->controller = new Links($this->container);
@ -107,7 +112,7 @@ public function testGetLinkId()
$this->assertEquals('sTuff', $data['tags'][0]);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
\DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
$data['created']
);
$this->assertEmpty($data['updated']);

View file

@ -1,8 +1,11 @@
<?php
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -50,17 +53,19 @@ class GetLinksTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_LINK = 9;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = new BookmarkFileService($this->conf, $history, true);
$this->container['history'] = null;
$this->controller = new Links($this->container);
@ -75,7 +80,7 @@ public function tearDown()
}
/**
* Test basic getLinks service: returns all links.
* Test basic getLinks service: returns all bookmarks.
*/
public function testGetLinks()
{
@ -114,7 +119,7 @@ public function testGetLinks()
$this->assertEquals('sTuff', $first['tags'][0]);
$this->assertEquals(false, $first['private']);
$this->assertEquals(
\DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
$first['created']
);
$this->assertEmpty($first['updated']);
@ -125,7 +130,7 @@ public function testGetLinks()
// Update date
$this->assertEquals(
\DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM),
$link['updated']
);
}

View file

@ -3,6 +3,8 @@
namespace Shaarli\Api\Controllers;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
@ -40,6 +42,11 @@ class PostLinkTest extends TestCase
*/
protected $refDB = null;
/**
* @var BookmarkFileService instance.
*/
protected $bookmarkService;
/**
* @var HistoryController instance.
*/
@ -61,29 +68,30 @@ class PostLinkTest extends TestCase
const NB_FIELDS_LINK = 9;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['history'] = new History(self::$testHistory);
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = $this->history;
$this->controller = new Links($this->container);
$mock = $this->createMock(Router::class);
$mock->expects($this->any())
->method('relativePathFor')
->willReturn('api/v1/links/1');
->willReturn('api/v1/bookmarks/1');
// affect @property-read... seems to work
$this->controller->getCi()->router = $mock;
@ -118,7 +126,7 @@ public function testPostLinkMinimal()
$response = $this->controller->postLink($request, new Response());
$this->assertEquals(201, $response->getStatusCode());
$this->assertEquals('api/v1/links/1', $response->getHeader('Location')[0]);
$this->assertEquals('api/v1/bookmarks/1', $response->getHeader('Location')[0]);
$data = json_decode((string) $response->getBody(), true);
$this->assertEquals(self::NB_FIELDS_LINK, count($data));
$this->assertEquals(43, $data['id']);
@ -127,7 +135,7 @@ public function testPostLinkMinimal()
$this->assertEquals('?' . $data['shorturl'], $data['title']);
$this->assertEquals('', $data['description']);
$this->assertEquals([], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(true, $data['private']);
$this->assertTrue(
new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
);
@ -163,7 +171,7 @@ public function testPostLinkFull()
$response = $this->controller->postLink($request, new Response());
$this->assertEquals(201, $response->getStatusCode());
$this->assertEquals('api/v1/links/1', $response->getHeader('Location')[0]);
$this->assertEquals('api/v1/bookmarks/1', $response->getHeader('Location')[0]);
$data = json_decode((string) $response->getBody(), true);
$this->assertEquals(self::NB_FIELDS_LINK, count($data));
$this->assertEquals(43, $data['id']);
@ -211,11 +219,11 @@ public function testPostLinkDuplicate()
$this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
\DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
);
$this->assertEquals(
\DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
);
}

View file

@ -3,6 +3,8 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
@ -32,6 +34,11 @@ class PutLinkTest extends \PHPUnit\Framework\TestCase
*/
protected $refDB = null;
/**
* @var BookmarkFileService instance.
*/
protected $bookmarkService;
/**
* @var HistoryController instance.
*/
@ -53,22 +60,23 @@ class PutLinkTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_LINK = 9;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['history'] = new History(self::$testHistory);
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = $this->history;
$this->controller = new Links($this->container);
@ -110,7 +118,7 @@ public function testPutLinkMinimal()
$this->assertEquals('?WDWyig', $data['title']);
$this->assertEquals('', $data['description']);
$this->assertEquals([], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(true, $data['private']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20150310_114651'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
@ -199,11 +207,11 @@ public function testPutLinkDuplicate()
$this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
\DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
);
$this->assertEquals(
\DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
);
}

View file

@ -3,6 +3,7 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
@ -34,9 +35,9 @@ class DeleteTagTest extends \PHPUnit\Framework\TestCase
protected $refDB = null;
/**
* @var LinkDB instance.
* @var BookmarkFileService instance.
*/
protected $linkDB;
protected $bookmarkService;
/**
* @var HistoryController instance.
@ -54,20 +55,22 @@ class DeleteTagTest extends \PHPUnit\Framework\TestCase
protected $controller;
/**
* Before each test, instantiate a new Api with its config, plugins and links.
* Before each test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = $this->linkDB;
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = $this->history;
$this->controller = new Tags($this->container);
@ -88,7 +91,7 @@ public function tearDown()
public function testDeleteTagValid()
{
$tagName = 'gnu';
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertTrue($tags[$tagName] > 0);
$env = Environment::mock([
'REQUEST_METHOD' => 'DELETE',
@ -99,11 +102,11 @@ public function testDeleteTagValid()
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$tags = $this->linkDB->linksCountPerTag();
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertFalse(isset($tags[$tagName]));
// 2 links affected
// 2 bookmarks affected
$historyEntry = $this->history->getHistory()[0];
$this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
@ -122,7 +125,7 @@ public function testDeleteTagValid()
public function testDeleteTagCaseSensitivity()
{
$tagName = 'sTuff';
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertTrue($tags[$tagName] > 0);
$env = Environment::mock([
'REQUEST_METHOD' => 'DELETE',
@ -133,8 +136,8 @@ public function testDeleteTagCaseSensitivity()
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$tags = $this->linkDB->linksCountPerTag();
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertFalse(isset($tags[$tagName]));
$this->assertTrue($tags[strtolower($tagName)] > 0);
@ -154,7 +157,7 @@ public function testDeleteTagCaseSensitivity()
public function testDeleteLink404()
{
$tagName = 'nopenope';
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertFalse(isset($tags[$tagName]));
$env = Environment::mock([
'REQUEST_METHOD' => 'DELETE',

View file

@ -2,8 +2,10 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -49,17 +51,19 @@ class GetTagNameTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_TAG = 2;
/**
* Before each test, instantiate a new Api with its config, plugins and links.
* Before each test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = new BookmarkFileService($this->conf, $history, true);
$this->container['history'] = null;
$this->controller = new Tags($this->container);

View file

@ -1,8 +1,10 @@
<?php
namespace Shaarli\Api\Controllers;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
@ -38,9 +40,9 @@ class GetTagsTest extends \PHPUnit\Framework\TestCase
protected $container;
/**
* @var LinkDB instance.
* @var BookmarkFileService instance.
*/
protected $linkDB;
protected $bookmarkService;
/**
* @var Tags controller instance.
@ -53,18 +55,21 @@ class GetTagsTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_TAG = 2;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
$this->bookmarkService = new BookmarkFileService($this->conf, $history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = $this->linkDB;
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = null;
$this->controller = new Tags($this->container);
@ -83,7 +88,7 @@ public function tearDown()
*/
public function testGetTagsAll()
{
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$env = Environment::mock([
'REQUEST_METHOD' => 'GET',
]);
@ -136,7 +141,7 @@ public function testGetTagsOffsetLimit()
*/
public function testGetTagsLimitAll()
{
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$env = Environment::mock([
'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => 'limit=all'
@ -170,7 +175,7 @@ public function testGetTagsOffsetTooHigh()
*/
public function testGetTagsVisibilityPrivate()
{
$tags = $this->linkDB->linksCountPerTag([], 'private');
$tags = $this->bookmarkService->bookmarksCountPerTag([], 'private');
$env = Environment::mock([
'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => 'visibility=private'
@ -190,7 +195,7 @@ public function testGetTagsVisibilityPrivate()
*/
public function testGetTagsVisibilityPublic()
{
$tags = $this->linkDB->linksCountPerTag([], 'public');
$tags = $this->bookmarkService->bookmarksCountPerTag([], 'public');
$env = Environment::mock(
[
'REQUEST_METHOD' => 'GET',

View file

@ -3,6 +3,7 @@
namespace Shaarli\Api\Controllers;
use Shaarli\Api\Exceptions\ApiBadParametersException;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
@ -44,9 +45,9 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
protected $container;
/**
* @var LinkDB instance.
* @var BookmarkFileService instance.
*/
protected $linkDB;
protected $bookmarkService;
/**
* @var Tags controller instance.
@ -59,22 +60,22 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
const NB_FIELDS_TAG = 2;
/**
* Before every test, instantiate a new Api with its config, plugins and links.
* Before every test, instantiate a new Api with its config, plugins and bookmarks.
*/
public function setUp()
{
$this->conf = new ConfigManager('tests/utils/config/configJson.json.php');
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = $this->linkDB;
$this->container['db'] = $this->bookmarkService;
$this->container['history'] = $this->history;
$this->controller = new Tags($this->container);
@ -109,7 +110,7 @@ public function testPutLinkValid()
$this->assertEquals($newName, $data['name']);
$this->assertEquals(2, $data['occurrences']);
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertNotTrue(isset($tags[$tagName]));
$this->assertEquals(2, $tags[$newName]);
@ -133,7 +134,7 @@ public function testPutTagMerge()
$tagName = 'gnu';
$newName = 'w3c';
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertEquals(1, $tags[$newName]);
$this->assertEquals(2, $tags[$tagName]);
@ -151,7 +152,7 @@ public function testPutTagMerge()
$this->assertEquals($newName, $data['name']);
$this->assertEquals(3, $data['occurrences']);
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertNotTrue(isset($tags[$tagName]));
$this->assertEquals(3, $tags[$newName]);
}
@ -167,7 +168,7 @@ public function testPutTagEmpty()
$tagName = 'gnu';
$newName = '';
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertEquals(2, $tags[$tagName]);
$env = Environment::mock([
@ -185,7 +186,7 @@ public function testPutTagEmpty()
try {
$this->controller->putTag($request, new Response(), ['tagName' => $tagName]);
} catch (ApiBadParametersException $e) {
$tags = $this->linkDB->linksCountPerTag();
$tags = $this->bookmarkService->bookmarksCountPerTag();
$this->assertEquals(2, $tags[$tagName]);
throw $e;
}

View file

@ -0,0 +1,239 @@
<?php
namespace Shaarli\Bookmark;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Exception\InvalidBookmarkException;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
/**
* Class BookmarkArrayTest
*/
class BookmarkArrayTest extends TestCase
{
/**
* Test the constructor and make sure that the instance is properly initialized
*/
public function testArrayConstructorEmpty()
{
$array = new BookmarkArray();
$this->assertTrue(is_iterable($array));
$this->assertEmpty($array);
}
/**
* Test adding entries to the array, specifying the key offset or not.
*/
public function testArrayAccessAddEntries()
{
$array = new BookmarkArray();
$bookmark = new Bookmark();
$bookmark->setId(11)->validate();
$array[] = $bookmark;
$this->assertCount(1, $array);
$this->assertTrue(isset($array[11]));
$this->assertNull($array[0]);
$this->assertEquals($bookmark, $array[11]);
$bookmark = new Bookmark();
$bookmark->setId(14)->validate();
$array[14] = $bookmark;
$this->assertCount(2, $array);
$this->assertTrue(isset($array[14]));
$this->assertNull($array[0]);
$this->assertEquals($bookmark, $array[14]);
}
/**
* Test adding a bad entry: wrong type
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryInstance()
{
$array = new BookmarkArray();
$array[] = 'nope';
}
/**
* Test adding a bad entry: no id
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryNoId()
{
$array = new BookmarkArray();
$bookmark = new Bookmark();
$array[] = $bookmark;
}
/**
* Test adding a bad entry: no url
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryNoUrl()
{
$array = new BookmarkArray();
$bookmark = (new Bookmark())->setId(11);
$array[] = $bookmark;
}
/**
* Test adding a bad entry: invalid offset
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryOffset()
{
$array = new BookmarkArray();
$bookmark = (new Bookmark())->setId(11);
$bookmark->validate();
$array['nope'] = $bookmark;
}
/**
* Test adding a bad entry: invalid ID type
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryIdType()
{
$array = new BookmarkArray();
$bookmark = (new Bookmark())->setId('nope');
$bookmark->validate();
$array[] = $bookmark;
}
/**
* Test adding a bad entry: ID/offset not consistent
*
* @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
*/
public function testArrayAccessAddBadEntryIdOffset()
{
$array = new BookmarkArray();
$bookmark = (new Bookmark())->setId(11);
$bookmark->validate();
$array[14] = $bookmark;
}
/**
* Test update entries through array access.
*/
public function testArrayAccessUpdateEntries()
{
$array = new BookmarkArray();
$bookmark = new Bookmark();
$bookmark->setId(11)->validate();
$bookmark->setTitle('old');
$array[] = $bookmark;
$bookmark = new Bookmark();
$bookmark->setId(11)->validate();
$bookmark->setTitle('test');
$array[] = $bookmark;
$this->assertCount(1, $array);
$this->assertEquals('test', $array[11]->getTitle());
$bookmark = new Bookmark();
$bookmark->setId(11)->validate();
$bookmark->setTitle('test2');
$array[11] = $bookmark;
$this->assertCount(1, $array);
$this->assertEquals('test2', $array[11]->getTitle());
}
/**
* Test delete entries through array access.
*/
public function testArrayAccessDeleteEntries()
{
$array = new BookmarkArray();
$bookmark11 = new Bookmark();
$bookmark11->setId(11)->validate();
$array[] = $bookmark11;
$bookmark14 = new Bookmark();
$bookmark14->setId(14)->validate();
$array[] = $bookmark14;
$bookmark23 = new Bookmark();
$bookmark23->setId(23)->validate();
$array[] = $bookmark23;
$bookmark0 = new Bookmark();
$bookmark0->setId(0)->validate();
$array[] = $bookmark0;
$this->assertCount(4, $array);
unset($array[14]);
$this->assertCount(3, $array);
$this->assertEquals($bookmark11, $array[11]);
$this->assertEquals($bookmark23, $array[23]);
$this->assertEquals($bookmark0, $array[0]);
unset($array[23]);
$this->assertCount(2, $array);
$this->assertEquals($bookmark11, $array[11]);
$this->assertEquals($bookmark0, $array[0]);
unset($array[11]);
$this->assertCount(1, $array);
$this->assertEquals($bookmark0, $array[0]);
unset($array[0]);
$this->assertCount(0, $array);
}
/**
* Test iterating through array access.
*/
public function testArrayAccessIterate()
{
$array = new BookmarkArray();
$bookmark11 = new Bookmark();
$bookmark11->setId(11)->validate();
$array[] = $bookmark11;
$bookmark14 = new Bookmark();
$bookmark14->setId(14)->validate();
$array[] = $bookmark14;
$bookmark23 = new Bookmark();
$bookmark23->setId(23)->validate();
$array[] = $bookmark23;
$this->assertCount(3, $array);
foreach ($array as $id => $bookmark) {
$this->assertEquals(${'bookmark'. $id}, $bookmark);
}
}
/**
* Test reordering the array.
*/
public function testReorder()
{
$refDB = new \ReferenceLinkDB();
$refDB->write('sandbox/datastore.php');
$bookmarks = $refDB->getLinks();
$bookmarks->reorder('ASC');
$this->assertInstanceOf(BookmarkArray::class, $bookmarks);
$stickyIds = [11, 10];
$standardIds = [42, 4, 9, 1, 0, 7, 6, 8, 41];
$linkIds = array_merge($stickyIds, $standardIds);
$cpt = 0;
foreach ($bookmarks as $key => $value) {
$this->assertEquals($linkIds[$cpt++], $key);
}
$bookmarks = $refDB->getLinks();
$bookmarks->reorder('DESC');
$this->assertInstanceOf(BookmarkArray::class, $bookmarks);
$linkIds = array_merge(array_reverse($stickyIds), array_reverse($standardIds));
$cpt = 0;
foreach ($bookmarks as $key => $value) {
$this->assertEquals($linkIds[$cpt++], $key);
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,514 @@
<?php
namespace Shaarli\Bookmark;
use Exception;
use PHPUnit\Framework\TestCase;
use ReferenceLinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\History;
/**
* Class BookmarkFilterTest.
*/
class BookmarkFilterTest extends TestCase
{
/**
* @var string Test datastore path.
*/
protected static $testDatastore = 'sandbox/datastore.php';
/**
* @var BookmarkFilter instance.
*/
protected static $linkFilter;
/**
* @var ReferenceLinkDB instance
*/
protected static $refDB;
/**
* @var BookmarkFileService instance
*/
protected static $bookmarkService;
/**
* Instantiate linkFilter with ReferenceLinkDB data.
*/
public static function setUpBeforeClass()
{
$conf = new ConfigManager('tests/utils/config/configJson');
$conf->set('resource.datastore', self::$testDatastore);
self::$refDB = new \ReferenceLinkDB();
self::$refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php');
self::$bookmarkService = new \FakeBookmarkService($conf, $history, true);
self::$linkFilter = new BookmarkFilter(self::$bookmarkService->getBookmarks());
}
/**
* Blank filter.
*/
public function testFilter()
{
$this->assertEquals(
self::$refDB->countLinks(),
count(self::$linkFilter->filter('', ''))
);
$this->assertEquals(
self::$refDB->countLinks(),
count(self::$linkFilter->filter('', '', 'all'))
);
$this->assertEquals(
self::$refDB->countLinks(),
count(self::$linkFilter->filter('', '', 'randomstr'))
);
// Private only.
$this->assertEquals(
self::$refDB->countPrivateLinks(),
count(self::$linkFilter->filter('', '', false, 'private'))
);
// Public only.
$this->assertEquals(
self::$refDB->countPublicLinks(),
count(self::$linkFilter->filter('', '', false, 'public'))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, ''))
);
$this->assertEquals(
self::$refDB->countUntaggedLinks(),
count(
self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG,
/*$request=*/
'',
/*$casesensitive=*/
false,
/*$visibility=*/
'all',
/*$untaggedonly=*/
true
)
)
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, ''))
);
}
/**
* Filter bookmarks using a tag
*/
public function testFilterOneTag()
{
$this->assertEquals(
4,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false))
);
$this->assertEquals(
4,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'all'))
);
$this->assertEquals(
4,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'default-blabla'))
);
// Private only.
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'private'))
);
// Public only.
$this->assertEquals(
3,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'public'))
);
}
/**
* Filter bookmarks using a tag - case-sensitive
*/
public function testFilterCaseSensitiveTag()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'mercurial', true))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'Mercurial', true))
);
}
/**
* Filter bookmarks using a tag combination
*/
public function testFilterMultipleTags()
{
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'dev cartoon', false))
);
}
/**
* Filter bookmarks using a non-existent tag
*/
public function testFilterUnknownTag()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'null', false))
);
}
/**
* Return bookmarks for a given day
*/
public function testFilterDay()
{
$this->assertEquals(
4,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '20121206'))
);
}
/**
* 404 - day not found
*/
public function testFilterUnknownDay()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '19700101'))
);
}
/**
* Use an invalid date format
* @expectedException Exception
* @expectedExceptionMessageRegExp /Invalid date format/
*/
public function testFilterInvalidDayWithChars()
{
self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, 'Rainy day, dream away');
}
/**
* Use an invalid date format
* @expectedException Exception
* @expectedExceptionMessageRegExp /Invalid date format/
*/
public function testFilterInvalidDayDigits()
{
self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '20');
}
/**
* Retrieve a link entry with its hash
*/
public function testFilterSmallHash()
{
$links = self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'IuWvgA');
$this->assertEquals(
1,
count($links)
);
$this->assertEquals(
'MediaGoblin',
$links[7]->getTitle()
);
}
/**
* No link for this hash
*
* @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
*/
public function testFilterUnknownSmallHash()
{
self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'Iblaah');
}
/**
* Full-text search - no result found.
*/
public function testFilterFullTextNoResult()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'azertyuiop'))
);
}
/**
* Full-text search - result from a link's URL
*/
public function testFilterFullTextURL()
{
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'ars org'))
);
}
/**
* Full-text search - result from a link's title only
*/
public function testFilterFullTextTitle()
{
// use miscellaneous cases
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'userfriendly -'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'UserFriendly -'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
);
// use miscellaneous case and offset
$this->assertEquals(
2,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'RFrIendL'))
);
}
/**
* Full-text search - result from the link's description only
*/
public function testFilterFullTextDescription()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'publishing media'))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'mercurial w3c'))
);
$this->assertEquals(
3,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, '"free software"'))
);
}
/**
* Full-text search - result from the link's tags only
*/
public function testFilterFullTextTags()
{
$this->assertEquals(
6,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web'))
);
$this->assertEquals(
6,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', 'all'))
);
$this->assertEquals(
6,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', 'bla'))
);
// Private only.
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', false, 'private'))
);
// Public only.
$this->assertEquals(
5,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', false, 'public'))
);
}
/**
* Full-text search - result set from mixed sources
*/
public function testFilterFullTextMixed()
{
$this->assertEquals(
3,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'free software'))
);
}
/**
* Full-text search - test exclusion with '-'.
*/
public function testExcludeSearch()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'free -gnu'))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, '-revolution'))
);
}
/**
* Full-text search - test AND, exact terms and exclusion combined, across fields.
*/
public function testMultiSearch()
{
$this->assertEquals(
2,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TEXT,
'"Free Software " stallman "read this" @website stuff'
))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TEXT,
'"free software " stallman "read this" -beard @website stuff'
))
);
}
/**
* Full-text search - make sure that exact search won't work across fields.
*/
public function testSearchExactTermMultiFieldsKo()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TEXT,
'"designer naming"'
))
);
$this->assertEquals(
0,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TEXT,
'"designernaming"'
))
);
}
/**
* Tag search with exclusion.
*/
public function testTagFilterWithExclusion()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'gnu -free'))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '-free'))
);
}
/**
* Test crossed search (terms + tags).
*/
public function testFilterCrossedSearch()
{
$terms = '"Free Software " stallman "read this" @website stuff';
$tags = 'free';
$this->assertEquals(
1,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array($tags, $terms)
))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array('', $terms)
))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array(false, 'PSR-2')
))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array($tags, '')
))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
''
))
);
}
/**
* Filter bookmarks by #hashtag.
*/
public function testFilterByHashtag()
{
$hashtag = 'hashtag';
$this->assertEquals(
3,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG,
$hashtag
))
);
$hashtag = 'private';
$this->assertEquals(
1,
count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG,
$hashtag,
false,
'private'
))
);
}
}

View file

@ -0,0 +1,120 @@
<?php
namespace Shaarli\Bookmark;
use PHPUnit\Framework\TestCase;
use ReferenceLinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
/**
* Class BookmarkInitializerTest
* @package Shaarli\Bookmark
*/
class BookmarkInitializerTest extends TestCase
{
/** @var string Path of test data store */
protected static $testDatastore = 'sandbox/datastore.php';
/** @var string Path of test config file */
protected static $testConf = 'sandbox/config';
/**
* @var ConfigManager instance.
*/
protected $conf;
/**
* @var History instance.
*/
protected $history;
/** @var BookmarkServiceInterface instance */
protected $bookmarkService;
/** @var BookmarkInitializer instance */
protected $initializer;
/**
* Initialize an empty BookmarkFileService
*/
public function setUp()
{
if (file_exists(self::$testDatastore)) {
unlink(self::$testDatastore);
}
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
$this->conf = new ConfigManager(self::$testConf);
$this->conf->set('resource.datastore', self::$testDatastore);
$this->history = new History('sandbox/history.php');
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->initializer = new BookmarkInitializer($this->bookmarkService);
}
/**
* Test initialize() with an empty data store.
*/
public function testInitializeEmptyDataStore()
{
$refDB = new \ReferenceLinkDB();
$refDB->write(self::$testDatastore);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->initializer = new BookmarkInitializer($this->bookmarkService);
$this->initializer->initialize();
$this->assertEquals($refDB->countLinks() + 2, $this->bookmarkService->count());
$bookmark = $this->bookmarkService->get(43);
$this->assertEquals(43, $bookmark->getId());
$this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle());
$this->assertTrue($bookmark->isPrivate());
$bookmark = $this->bookmarkService->get(44);
$this->assertEquals(44, $bookmark->getId());
$this->assertEquals(
'The personal, minimalist, super-fast, database free, bookmarking service',
$bookmark->getTitle()
);
$this->assertFalse($bookmark->isPrivate());
// Reload from file
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
$this->assertEquals($refDB->countLinks() + 2, $this->bookmarkService->count());
$bookmark = $this->bookmarkService->get(43);
$this->assertEquals(43, $bookmark->getId());
$this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle());
$this->assertTrue($bookmark->isPrivate());
$bookmark = $this->bookmarkService->get(44);
$this->assertEquals(44, $bookmark->getId());
$this->assertEquals(
'The personal, minimalist, super-fast, database free, bookmarking service',
$bookmark->getTitle()
);
$this->assertFalse($bookmark->isPrivate());
}
/**
* Test initialize() with a data store containing bookmarks.
*/
public function testInitializeNotEmptyDataStore()
{
$this->initializer->initialize();
$this->assertEquals(2, $this->bookmarkService->count());
$bookmark = $this->bookmarkService->get(0);
$this->assertEquals(0, $bookmark->getId());
$this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle());
$this->assertTrue($bookmark->isPrivate());
$bookmark = $this->bookmarkService->get(1);
$this->assertEquals(1, $bookmark->getId());
$this->assertEquals(
'The personal, minimalist, super-fast, database free, bookmarking service',
$bookmark->getTitle()
);
$this->assertFalse($bookmark->isPrivate());
}
}

View file

@ -0,0 +1,388 @@
<?php
namespace Shaarli\Bookmark;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Exception\InvalidBookmarkException;
/**
* Class BookmarkTest
*/
class BookmarkTest extends TestCase
{
/**
* Test fromArray() with a link with full data
*/
public function testFromArrayFull()
{
$data = [
'id' => 1,
'shorturl' => 'abc',
'url' => 'https://domain.tld/oof.html?param=value#anchor',
'title' => 'This is an array link',
'description' => 'HTML desc<br><p>hi!</p>',
'thumbnail' => 'https://domain.tld/pic.png',
'sticky' => true,
'created' => new \DateTime('-1 minute'),
'tags' => ['tag1', 'tag2', 'chair'],
'updated' => new \DateTime(),
'private' => true,
];
$bookmark = (new Bookmark())->fromArray($data);
$this->assertEquals($data['id'], $bookmark->getId());
$this->assertEquals($data['shorturl'], $bookmark->getShortUrl());
$this->assertEquals($data['url'], $bookmark->getUrl());
$this->assertEquals($data['title'], $bookmark->getTitle());
$this->assertEquals($data['description'], $bookmark->getDescription());
$this->assertEquals($data['thumbnail'], $bookmark->getThumbnail());
$this->assertEquals($data['sticky'], $bookmark->isSticky());
$this->assertEquals($data['created'], $bookmark->getCreated());
$this->assertEquals($data['tags'], $bookmark->getTags());
$this->assertEquals('tag1 tag2 chair', $bookmark->getTagsString());
$this->assertEquals($data['updated'], $bookmark->getUpdated());
$this->assertEquals($data['private'], $bookmark->isPrivate());
$this->assertFalse($bookmark->isNote());
}
/**
* Test fromArray() with a link with minimal data.
* Note that I use null values everywhere but this should not happen in the real world.
*/
public function testFromArrayMinimal()
{
$data = [
'id' => null,
'shorturl' => null,
'url' => null,
'title' => null,
'description' => null,
'created' => null,
'tags' => null,
'private' => null,
];
$bookmark = (new Bookmark())->fromArray($data);
$this->assertNull($bookmark->getId());
$this->assertNull($bookmark->getShortUrl());
$this->assertNull($bookmark->getUrl());
$this->assertNull($bookmark->getTitle());
$this->assertEquals('', $bookmark->getDescription());
$this->assertNull($bookmark->getCreated());
$this->assertEquals([], $bookmark->getTags());
$this->assertEquals('', $bookmark->getTagsString());
$this->assertNull($bookmark->getUpdated());
$this->assertFalse($bookmark->getThumbnail());
$this->assertFalse($bookmark->isSticky());
$this->assertFalse($bookmark->isPrivate());
$this->assertTrue($bookmark->isNote());
}
/**
* Test validate() with a valid minimal bookmark
*/
public function testValidateValidFullBookmark()
{
$bookmark = new Bookmark();
$bookmark->setId(2);
$bookmark->setShortUrl('abc');
$bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$bookmark->setUpdated($dateUp = \DateTime::createFromFormat('Ymd_His', '20190514_210203'));
$bookmark->setUrl($url = 'https://domain.tld/oof.html?param=value#anchor');
$bookmark->setTitle($title = 'This is an array link');
$bookmark->setDescription($desc = 'HTML desc<br><p>hi!</p>');
$bookmark->setTags($tags = ['tag1', 'tag2', 'chair']);
$bookmark->setThumbnail($thumb = 'https://domain.tld/pic.png');
$bookmark->setPrivate(true);
$bookmark->validate();
$this->assertEquals(2, $bookmark->getId());
$this->assertEquals('abc', $bookmark->getShortUrl());
$this->assertEquals($date, $bookmark->getCreated());
$this->assertEquals($dateUp, $bookmark->getUpdated());
$this->assertEquals($url, $bookmark->getUrl());
$this->assertEquals($title, $bookmark->getTitle());
$this->assertEquals($desc, $bookmark->getDescription());
$this->assertEquals($tags, $bookmark->getTags());
$this->assertEquals(implode(' ', $tags), $bookmark->getTagsString());
$this->assertEquals($thumb, $bookmark->getThumbnail());
$this->assertTrue($bookmark->isPrivate());
$this->assertFalse($bookmark->isNote());
}
/**
* Test validate() with a valid minimal bookmark
*/
public function testValidateValidMinimalBookmark()
{
$bookmark = new Bookmark();
$bookmark->setId(1);
$bookmark->setShortUrl('abc');
$bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$bookmark->validate();
$this->assertEquals(1, $bookmark->getId());
$this->assertEquals('abc', $bookmark->getShortUrl());
$this->assertEquals($date, $bookmark->getCreated());
$this->assertEquals('?abc', $bookmark->getUrl());
$this->assertEquals('?abc', $bookmark->getTitle());
$this->assertEquals('', $bookmark->getDescription());
$this->assertEquals([], $bookmark->getTags());
$this->assertEquals('', $bookmark->getTagsString());
$this->assertFalse($bookmark->getThumbnail());
$this->assertFalse($bookmark->isPrivate());
$this->assertTrue($bookmark->isNote());
$this->assertNull($bookmark->getUpdated());
}
/**
* Test validate() with a a bookmark without ID.
*/
public function testValidateNotValidNoId()
{
$bookmark = new Bookmark();
$bookmark->setShortUrl('abc');
$bookmark->setCreated(\DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$exception = null;
try {
$bookmark->validate();
} catch (InvalidBookmarkException $e) {
$exception = $e;
}
$this->assertNotNull($exception);
$this->assertContains('- ID: '. PHP_EOL, $exception->getMessage());
}
/**
* Test validate() with a a bookmark with a non integer ID.
*/
public function testValidateNotValidStringId()
{
$bookmark = new Bookmark();
$bookmark->setId('str');
$bookmark->setShortUrl('abc');
$bookmark->setCreated(\DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$exception = null;
try {
$bookmark->validate();
} catch (InvalidBookmarkException $e) {
$exception = $e;
}
$this->assertNotNull($exception);
$this->assertContains('- ID: str'. PHP_EOL, $exception->getMessage());
}
/**
* Test validate() with a a bookmark without short url.
*/
public function testValidateNotValidNoShortUrl()
{
$bookmark = new Bookmark();
$bookmark->setId(1);
$bookmark->setCreated(\DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$bookmark->setShortUrl(null);
$exception = null;
try {
$bookmark->validate();
} catch (InvalidBookmarkException $e) {
$exception = $e;
}
$this->assertNotNull($exception);
$this->assertContains('- ShortUrl: '. PHP_EOL, $exception->getMessage());
}
/**
* Test validate() with a a bookmark without created datetime.
*/
public function testValidateNotValidNoCreated()
{
$bookmark = new Bookmark();
$bookmark->setId(1);
$bookmark->setShortUrl('abc');
$bookmark->setCreated(null);
$exception = null;
try {
$bookmark->validate();
} catch (InvalidBookmarkException $e) {
$exception = $e;
}
$this->assertNotNull($exception);
$this->assertContains('- Created: '. PHP_EOL, $exception->getMessage());
}
/**
* Test validate() with a a bookmark with a bad created datetime.
*/
public function testValidateNotValidBadCreated()
{
$bookmark = new Bookmark();
$bookmark->setId(1);
$bookmark->setShortUrl('abc');
$bookmark->setCreated('hi!');
$exception = null;
try {
$bookmark->validate();
} catch (InvalidBookmarkException $e) {
$exception = $e;
}
$this->assertNotNull($exception);
$this->assertContains('- Created: Not a DateTime object'. PHP_EOL, $exception->getMessage());
}
/**
* Test setId() and make sure that default fields are generated.
*/
public function testSetIdEmptyGeneratedFields()
{
$bookmark = new Bookmark();
$bookmark->setId(2);
$this->assertEquals(2, $bookmark->getId());
$this->assertRegExp('/[\w\-]{6}/', $bookmark->getShortUrl());
$this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getCreated());
}
/**
* Test setId() and with generated fields already set.
*/
public function testSetIdSetGeneratedFields()
{
$bookmark = new Bookmark();
$bookmark->setShortUrl('abc');
$bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
$bookmark->setId(2);
$this->assertEquals(2, $bookmark->getId());
$this->assertEquals('abc', $bookmark->getShortUrl());
$this->assertEquals($date, $bookmark->getCreated());
}
/**
* Test setUrl() and make sure it accepts custom protocols
*/
public function testGetUrlWithValidProtocols()
{
$bookmark = new Bookmark();
$bookmark->setUrl($url = 'myprotocol://helloworld', ['myprotocol']);
$this->assertEquals($url, $bookmark->getUrl());
$bookmark->setUrl($url = 'https://helloworld.tld', ['myprotocol']);
$this->assertEquals($url, $bookmark->getUrl());
}
/**
* Test setUrl() and make sure it accepts custom protocols
*/
public function testGetUrlWithNotValidProtocols()
{
$bookmark = new Bookmark();
$bookmark->setUrl('myprotocol://helloworld', []);
$this->assertEquals('http://helloworld', $bookmark->getUrl());
$bookmark->setUrl($url = 'https://helloworld.tld', []);
$this->assertEquals($url, $bookmark->getUrl());
}
/**
* Test setTagsString() with exotic data
*/
public function testSetTagsString()
{
$bookmark = new Bookmark();
$str = 'tag1 tag2 tag3.tag3-2, tag4 , -tag5 ';
$bookmark->setTagsString($str);
$this->assertEquals(
[
'tag1',
'tag2',
'tag3.tag3-2',
'tag4',
'tag5',
],
$bookmark->getTags()
);
}
/**
* Test setTags() with exotic data
*/
public function testSetTags()
{
$bookmark = new Bookmark();
$array = [
'tag1 ',
' tag2',
'tag3.tag3-2,',
', tag4',
', ',
'-tag5 ',
];
$bookmark->setTags($array);
$this->assertEquals(
[
'tag1',
'tag2',
'tag3.tag3-2',
'tag4',
'tag5',
],
$bookmark->getTags()
);
}
/**
* Test renameTag()
*/
public function testRenameTag()
{
$bookmark = new Bookmark();
$bookmark->setTags(['tag1', 'tag2', 'chair']);
$bookmark->renameTag('chair', 'table');
$this->assertEquals(['tag1', 'tag2', 'table'], $bookmark->getTags());
$bookmark->renameTag('tag1', 'tag42');
$this->assertEquals(['tag42', 'tag2', 'table'], $bookmark->getTags());
$bookmark->renameTag('tag42', 'tag43');
$this->assertEquals(['tag43', 'tag2', 'table'], $bookmark->getTags());
$bookmark->renameTag('table', 'desk');
$this->assertEquals(['tag43', 'tag2', 'desk'], $bookmark->getTags());
}
/**
* Test renameTag() with a tag that is not present in the bookmark
*/
public function testRenameTagNotExists()
{
$bookmark = new Bookmark();
$bookmark->setTags(['tag1', 'tag2', 'chair']);
$bookmark->renameTag('nope', 'table');
$this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
}
/**
* Test deleteTag()
*/
public function testDeleteTag()
{
$bookmark = new Bookmark();
$bookmark->setTags(['tag1', 'tag2', 'chair']);
$bookmark->deleteTag('chair');
$this->assertEquals(['tag1', 'tag2'], $bookmark->getTags());
$bookmark->deleteTag('tag1');
$this->assertEquals(['tag2'], $bookmark->getTags());
$bookmark->deleteTag('tag2');
$this->assertEquals([], $bookmark->getTags());
}
/**
* Test deleteTag() with a tag that is not present in the bookmark
*/
public function testDeleteTagNotExists()
{
$bookmark = new Bookmark();
$bookmark->setTags(['tag1', 'tag2', 'chair']);
$bookmark->deleteTag('nope');
$this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
}
}

View file

@ -388,15 +388,6 @@ public function testCurlDownloadCallbackOkWithDescNotFound()
$this->assertEmpty($keywords);
}
/**
* Test count_private.
*/
public function testCountPrivateLinks()
{
$refDB = new ReferenceLinkDB();
$this->assertEquals($refDB->countPrivateLinks(), count_private($refDB->getLinks()));
}
/**
* Test text2clickable.
*/

View file

@ -4,3 +4,21 @@
$conf = new \Shaarli\Config\ConfigManager('tests/utils/config/configJson');
new \Shaarli\Languages('en', $conf);
// is_iterable is only compatible with PHP 7.1+
if (!function_exists('is_iterable')) {
function is_iterable($var)
{
return is_array($var) || $var instanceof \Traversable;
}
}
// TODO: remove this after fixing UT
require_once 'application/bookmark/LinkUtils.php';
require_once 'application/Utils.php';
require_once 'application/http/UrlUtils.php';
require_once 'application/http/HttpUtils.php';
require_once 'application/feed/Cache.php';
require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'tests/utils/ReferenceHistory.php';
require_once 'tests/utils/FakeBookmarkService.php';

View file

@ -24,7 +24,7 @@ public function testRead()
$conf = $this->configIO->read('tests/utils/config/configJson.json.php');
$this->assertEquals('root', $conf['credentials']['login']);
$this->assertEquals('lala', $conf['redirector']['url']);
$this->assertEquals('tests/utils/config/datastore.php', $conf['resource']['datastore']);
$this->assertEquals('sandbox/datastore.php', $conf['resource']['datastore']);
$this->assertEquals('1', $conf['plugins']['WALLABAG_VERSION']);
}

View file

@ -4,7 +4,12 @@
use DateTime;
use ReferenceLinkDB;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\History;
/**
* FeedBuilderTest class.
@ -30,7 +35,9 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
protected static $testDatastore = 'sandbox/datastore.php';
public static $linkDB;
public static $bookmarkService;
public static $formatter;
public static $serverInfo;
@ -39,9 +46,15 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
*/
public static function setUpBeforeClass()
{
$refLinkDB = new ReferenceLinkDB();
$conf = new ConfigManager('tests/utils/config/configJson');
$conf->set('resource.datastore', self::$testDatastore);
$refLinkDB = new \ReferenceLinkDB();
$refLinkDB->write(self::$testDatastore);
self::$linkDB = new LinkDB(self::$testDatastore, true, false);
$history = new History('sandbox/history.php');
$factory = new FormatterFactory($conf);
self::$formatter = $factory->getFormatter();
self::$bookmarkService = new BookmarkFileService($conf, $history, true);
self::$serverInfo = array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
@ -56,15 +69,15 @@ public static function setUpBeforeClass()
*/
public function testGetTypeLanguage()
{
$feedBuilder = new FeedBuilder(null, FeedBuilder::$FEED_ATOM, null, null, false);
$feedBuilder = new FeedBuilder(null, self::$formatter, FeedBuilder::$FEED_ATOM, null, null, false);
$feedBuilder->setLocale(self::$LOCALE);
$this->assertEquals(self::$ATOM_LANGUAGUE, $feedBuilder->getTypeLanguage());
$feedBuilder = new FeedBuilder(null, FeedBuilder::$FEED_RSS, null, null, false);
$feedBuilder = new FeedBuilder(null, self::$formatter, FeedBuilder::$FEED_RSS, null, null, false);
$feedBuilder->setLocale(self::$LOCALE);
$this->assertEquals(self::$RSS_LANGUAGE, $feedBuilder->getTypeLanguage());
$feedBuilder = new FeedBuilder(null, FeedBuilder::$FEED_ATOM, null, null, false);
$feedBuilder = new FeedBuilder(null, self::$formatter, FeedBuilder::$FEED_ATOM, null, null, false);
$this->assertEquals('en', $feedBuilder->getTypeLanguage());
$feedBuilder = new FeedBuilder(null, FeedBuilder::$FEED_RSS, null, null, false);
$feedBuilder = new FeedBuilder(null, self::$formatter, FeedBuilder::$FEED_RSS, null, null, false);
$this->assertEquals('en-en', $feedBuilder->getTypeLanguage());
}
@ -73,7 +86,14 @@ public function testGetTypeLanguage()
*/
public function testRSSBuildData()
{
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_RSS, self::$serverInfo, null, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_RSS,
self::$serverInfo,
null,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$data = $feedBuilder->buildData();
// Test headers (RSS)
@ -88,7 +108,7 @@ public function testRSSBuildData()
// Test first not pinned link (note link)
$link = $data['links'][array_keys($data['links'])[2]];
$this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
$this->assertEquals('http://host.tld/?WDWyig', $link['url']);
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']);
@ -117,7 +137,14 @@ public function testRSSBuildData()
*/
public function testAtomBuildData()
{
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, null, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
null,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$data = $feedBuilder->buildData();
$this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
@ -136,13 +163,20 @@ public function testBuildDataFiltered()
'searchtags' => 'stuff',
'searchterm' => 'beard',
);
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
$criteria,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$data = $feedBuilder->buildData();
$this->assertEquals(1, count($data['links']));
$link = array_shift($data['links']);
$this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
}
/**
@ -153,13 +187,20 @@ public function testBuildDataCount()
$criteria = array(
'nb' => '3',
);
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
$criteria,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$data = $feedBuilder->buildData();
$this->assertEquals(3, count($data['links']));
$link = $data['links'][array_keys($data['links'])[2]];
$this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
}
/**
@ -167,7 +208,14 @@ public function testBuildDataCount()
*/
public function testBuildDataPermalinks()
{
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, null, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
null,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$feedBuilder->setUsePermalinks(true);
$data = $feedBuilder->buildData();
@ -176,7 +224,7 @@ public function testBuildDataPermalinks()
// First link is a permalink
$link = $data['links'][array_keys($data['links'])[2]];
$this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
$this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
$this->assertEquals('http://host.tld/?WDWyig', $link['url']);
$this->assertContains('Direct link', $link['description']);
@ -184,7 +232,7 @@ public function testBuildDataPermalinks()
// Second link is a direct link
$link = $data['links'][array_keys($data['links'])[3]];
$this->assertEquals(8, $link['id']);
$this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'), $link['created']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'), $link['created']);
$this->assertEquals('http://host.tld/?RttfEw', $link['guid']);
$this->assertEquals('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['url']);
$this->assertContains('Direct link', $link['description']);
@ -196,7 +244,14 @@ public function testBuildDataPermalinks()
*/
public function testBuildDataHideDates()
{
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, null, false);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
null,
false
);
$feedBuilder->setLocale(self::$LOCALE);
$feedBuilder->setHideDates(true);
$data = $feedBuilder->buildData();
@ -204,7 +259,14 @@ public function testBuildDataHideDates()
$this->assertFalse($data['show_dates']);
// Show dates while logged in
$feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, null, true);
$feedBuilder = new FeedBuilder(
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
self::$serverInfo,
null,
true
);
$feedBuilder->setLocale(self::$LOCALE);
$feedBuilder->setHideDates(true);
$data = $feedBuilder->buildData();
@ -225,7 +287,8 @@ public function testBuildDataServerSubdir()
'REQUEST_URI' => '/~user/shaarli/index.php?do=feed',
);
$feedBuilder = new FeedBuilder(
self::$linkDB,
self::$bookmarkService,
self::$formatter,
FeedBuilder::$FEED_ATOM,
$serverInfo,
null,

View file

@ -0,0 +1,156 @@
<?php
namespace Shaarli\Formatter;
use DateTime;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Config\ConfigManager;
/**
* Class BookmarkDefaultFormatterTest
* @package Shaarli\Formatter
*/
class BookmarkDefaultFormatterTest extends TestCase
{
/** @var string Path of test config file */
protected static $testConf = 'sandbox/config';
/** @var BookmarkFormatter */
protected $formatter;
/** @var ConfigManager instance */
protected $conf;
/**
* Initialize formatter instance.
*/
public function setUp()
{
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
$this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkDefaultFormatter($this->conf);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatFull()
{
$bookmark = new Bookmark();
$bookmark->setId($id = 11);
$bookmark->setShortUrl($short = 'abcdef');
$bookmark->setUrl('https://sub.domain.tld?query=here&for=real#hash');
$bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
$bookmark->setDescription($desc = '<h2>Content</h2><p>`Here is some content</p>');
$bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
$bookmark->setThumbnail('http://domain2.tdl2/?type=img&name=file.png');
$bookmark->setSticky(true);
$bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190521_190412'));
$bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190521_191213'));
$bookmark->setPrivate(true);
$link = $this->formatter->format($bookmark);
$this->assertEquals($id, $link['id']);
$this->assertEquals($short, $link['shorturl']);
$this->assertEquals('https://sub.domain.tld?query=here&amp;for=real#hash', $link['url']);
$this->assertEquals(
'https://sub.domain.tld?query=here&amp;for=real#hash',
$link['real_url']
);
$this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']);
$this->assertEquals(
'&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;',
$link['description']
);
$tags[3] = '&lt;script&gt;alert(&quot;xss&quot;);&lt;/script&gt;';
$this->assertEquals($tags, $link['taglist']);
$this->assertEquals(implode(' ', $tags), $link['tags']);
$this->assertEquals(
'http://domain2.tdl2/?type=img&amp;name=file.png',
$link['thumbnail']
);
$this->assertEquals($created, $link['created']);
$this->assertEquals($created->getTimestamp(), $link['timestamp']);
$this->assertEquals($updated, $link['updated']);
$this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
$this->assertTrue($link['private']);
$this->assertTrue($link['sticky']);
$this->assertEquals('private', $link['class']);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatMinimal()
{
$bookmark = new Bookmark();
$link = $this->formatter->format($bookmark);
$this->assertEmpty($link['id']);
$this->assertEmpty($link['shorturl']);
$this->assertEmpty($link['url']);
$this->assertEmpty($link['real_url']);
$this->assertEmpty($link['title']);
$this->assertEmpty($link['description']);
$this->assertEmpty($link['taglist']);
$this->assertEmpty($link['tags']);
$this->assertEmpty($link['thumbnail']);
$this->assertEmpty($link['created']);
$this->assertEmpty($link['timestamp']);
$this->assertEmpty($link['updated']);
$this->assertEmpty($link['updated_timestamp']);
$this->assertFalse($link['private']);
$this->assertFalse($link['sticky']);
$this->assertEmpty($link['class']);
}
/**
* Make sure that the description is properly formatted by the default formatter.
*/
public function testFormatDescription()
{
$description = [];
$description[] = 'This a <strong>description</strong>' . PHP_EOL;
$description[] = 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL;
$description[] = 'Also, there is an #hashtag added'. PHP_EOL;
$description[] = ' A N D KEEP SPACES ! '. PHP_EOL;
$bookmark = new Bookmark();
$bookmark->setDescription(implode('', $description));
$link = $this->formatter->format($bookmark);
$description[0] = 'This a &lt;strong&gt;description&lt;/strong&gt;<br />';
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$description[1] = 'text <a href="'. $url .'">'. $url .'</a> more text<br />';
$description[2] = 'Also, there is an <a href="?addtag=hashtag" '.
'title="Hashtag hashtag">#hashtag</a> added<br />';
$description[3] = '&nbsp; &nbsp; A &nbsp;N &nbsp;D KEEP &nbsp; &nbsp; '.
'SPACES &nbsp; &nbsp;! &nbsp; <br />';
$this->assertEquals(implode(PHP_EOL, $description) . PHP_EOL, $link['description']);
}
/**
* Test formatting URL with an index_url set
* It should prepend relative links.
*/
public function testFormatNoteWithIndexUrl()
{
$bookmark = new Bookmark();
$bookmark->setUrl($short = '?abcdef');
$description = 'Text #hashtag more text';
$bookmark->setDescription($description);
$this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
$link = $this->formatter->format($bookmark);
$this->assertEquals($root . $short, $link['url']);
$this->assertEquals($root . $short, $link['real_url']);
$this->assertEquals(
'Text <a href="'. $root .'?addtag=hashtag" title="Hashtag hashtag">'.
'#hashtag</a> more text',
$link['description']
);
}
}

View file

@ -0,0 +1,160 @@
<?php
namespace Shaarli\Formatter;
use DateTime;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Config\ConfigManager;
/**
* Class BookmarkMarkdownFormatterTest
* @package Shaarli\Formatter
*/
class BookmarkMarkdownFormatterTest extends TestCase
{
/** @var string Path of test config file */
protected static $testConf = 'sandbox/config';
/** @var BookmarkFormatter */
protected $formatter;
/** @var ConfigManager instance */
protected $conf;
/**
* Initialize formatter instance.
*/
public function setUp()
{
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
$this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkMarkdownFormatter($this->conf);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatFull()
{
$bookmark = new Bookmark();
$bookmark->setId($id = 11);
$bookmark->setShortUrl($short = 'abcdef');
$bookmark->setUrl('https://sub.domain.tld?query=here&for=real#hash');
$bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
$bookmark->setDescription('<h2>Content</h2><p>`Here is some content</p>');
$bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
$bookmark->setThumbnail('http://domain2.tdl2/?type=img&name=file.png');
$bookmark->setSticky(true);
$bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190521_190412'));
$bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190521_191213'));
$bookmark->setPrivate(true);
$link = $this->formatter->format($bookmark);
$this->assertEquals($id, $link['id']);
$this->assertEquals($short, $link['shorturl']);
$this->assertEquals('https://sub.domain.tld?query=here&amp;for=real#hash', $link['url']);
$this->assertEquals(
'https://sub.domain.tld?query=here&amp;for=real#hash',
$link['real_url']
);
$this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']);
$this->assertEquals(
'<div class="markdown"><p>'.
'&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;'.
'</p></div>',
$link['description']
);
$tags[3] = '&lt;script&gt;alert(&quot;xss&quot;);&lt;/script&gt;';
$this->assertEquals($tags, $link['taglist']);
$this->assertEquals(implode(' ', $tags), $link['tags']);
$this->assertEquals(
'http://domain2.tdl2/?type=img&amp;name=file.png',
$link['thumbnail']
);
$this->assertEquals($created, $link['created']);
$this->assertEquals($created->getTimestamp(), $link['timestamp']);
$this->assertEquals($updated, $link['updated']);
$this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
$this->assertTrue($link['private']);
$this->assertTrue($link['sticky']);
$this->assertEquals('private', $link['class']);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatMinimal()
{
$bookmark = new Bookmark();
$link = $this->formatter->format($bookmark);
$this->assertEmpty($link['id']);
$this->assertEmpty($link['shorturl']);
$this->assertEmpty($link['url']);
$this->assertEmpty($link['real_url']);
$this->assertEmpty($link['title']);
$this->assertEmpty($link['description']);
$this->assertEmpty($link['taglist']);
$this->assertEmpty($link['tags']);
$this->assertEmpty($link['thumbnail']);
$this->assertEmpty($link['created']);
$this->assertEmpty($link['timestamp']);
$this->assertEmpty($link['updated']);
$this->assertEmpty($link['updated_timestamp']);
$this->assertFalse($link['private']);
$this->assertFalse($link['sticky']);
$this->assertEmpty($link['class']);
}
/**
* Make sure that the description is properly formatted by the default formatter.
*/
public function testFormatDescription()
{
$description = 'This a <strong>description</strong>'. PHP_EOL;
$description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL;
$description .= 'Also, there is an #hashtag added'. PHP_EOL;
$description .= ' A N D KEEP SPACES ! '. PHP_EOL;
$bookmark = new Bookmark();
$bookmark->setDescription($description);
$link = $this->formatter->format($bookmark);
$description = '<div class="markdown"><p>';
$description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />'. PHP_EOL;
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL;
$description .= 'Also, there is an <a href="?addtag=hashtag">#hashtag</a> added<br />'. PHP_EOL;
$description .= 'A N D KEEP SPACES ! ';
$description .= '</p></div>';
$this->assertEquals($description, $link['description']);
}
/**
* Test formatting URL with an index_url set
* It should prepend relative links.
*/
public function testFormatNoteWithIndexUrl()
{
$bookmark = new Bookmark();
$bookmark->setUrl($short = '?abcdef');
$description = 'Text #hashtag more text';
$bookmark->setDescription($description);
$this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
$description = '<div class="markdown"><p>';
$description .= 'Text <a href="'. $root .'?addtag=hashtag">#hashtag</a> more text';
$description .= '</p></div>';
$link = $this->formatter->format($bookmark);
$this->assertEquals($root . $short, $link['url']);
$this->assertEquals($root . $short, $link['real_url']);
$this->assertEquals(
$description,
$link['description']
);
}
}

View file

@ -0,0 +1,97 @@
<?php
namespace Shaarli\Formatter;
use DateTime;
use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Config\ConfigManager;
/**
* Class BookmarkRawFormatterTest
* @package Shaarli\Formatter
*/
class BookmarkRawFormatterTest extends TestCase
{
/** @var string Path of test config file */
protected static $testConf = 'sandbox/config';
/** @var BookmarkFormatter */
protected $formatter;
/** @var ConfigManager instance */
protected $conf;
/**
* Initialize formatter instance.
*/
public function setUp()
{
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
$this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkRawFormatter($this->conf);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatFull()
{
$bookmark = new Bookmark();
$bookmark->setId($id = 11);
$bookmark->setShortUrl($short = 'abcdef');
$bookmark->setUrl($url = 'https://sub.domain.tld?query=here&for=real#hash');
$bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
$bookmark->setDescription($desc = '<h2>Content</h2><p>`Here is some content</p>');
$bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
$bookmark->setThumbnail($thumb = 'http://domain2.tdl2/file.png');
$bookmark->setSticky(true);
$bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190521_190412'));
$bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190521_191213'));
$bookmark->setPrivate(true);
$link = $this->formatter->format($bookmark);
$this->assertEquals($id, $link['id']);
$this->assertEquals($short, $link['shorturl']);
$this->assertEquals($url, $link['url']);
$this->assertEquals($url, $link['real_url']);
$this->assertEquals($title, $link['title']);
$this->assertEquals($desc, $link['description']);
$this->assertEquals($tags, $link['taglist']);
$this->assertEquals(implode(' ', $tags), $link['tags']);
$this->assertEquals($thumb, $link['thumbnail']);
$this->assertEquals($created, $link['created']);
$this->assertEquals($created->getTimestamp(), $link['timestamp']);
$this->assertEquals($updated, $link['updated']);
$this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
$this->assertTrue($link['private']);
$this->assertTrue($link['sticky']);
$this->assertEquals('private', $link['class']);
}
/**
* Test formatting a bookmark with all its attribute filled.
*/
public function testFormatMinimal()
{
$bookmark = new Bookmark();
$link = $this->formatter->format($bookmark);
$this->assertEmpty($link['id']);
$this->assertEmpty($link['shorturl']);
$this->assertEmpty($link['url']);
$this->assertEmpty($link['real_url']);
$this->assertEmpty($link['title']);
$this->assertEmpty($link['description']);
$this->assertEmpty($link['taglist']);
$this->assertEmpty($link['tags']);
$this->assertEmpty($link['thumbnail']);
$this->assertEmpty($link['created']);
$this->assertEmpty($link['timestamp']);
$this->assertEmpty($link['updated']);
$this->assertEmpty($link['updated_timestamp']);
$this->assertFalse($link['private']);
$this->assertFalse($link['sticky']);
$this->assertEmpty($link['class']);
}
}

View file

@ -0,0 +1,101 @@
<?php
namespace Shaarli\Formatter;
use PHPUnit\Framework\TestCase;
use Shaarli\Config\ConfigManager;
/**
* Class FormatterFactoryTest
*
* @package Shaarli\Formatter
*/
class FormatterFactoryTest extends TestCase
{
/** @var string Path of test config file */
protected static $testConf = 'sandbox/config';
/** @var FormatterFactory instance */
protected $factory;
/** @var ConfigManager instance */
protected $conf;
/**
* Initialize FormatterFactory instance
*/
public function setUp()
{
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
$this->conf = new ConfigManager(self::$testConf);
$this->factory = new FormatterFactory($this->conf);
}
/**
* Test creating an instance of BookmarkFormatter without any setting -> default formatter
*/
public function testCreateInstanceDefault()
{
$this->assertInstanceOf(BookmarkDefaultFormatter::class, $this->factory->getFormatter());
}
/**
* Test creating an instance of BookmarkDefaultFormatter from settings
*/
public function testCreateInstanceDefaultSetting()
{
$this->conf->set('formatter', 'default');
$this->assertInstanceOf(BookmarkDefaultFormatter::class, $this->factory->getFormatter());
}
/**
* Test creating an instance of BookmarkDefaultFormatter from parameter
*/
public function testCreateInstanceDefaultParameter()
{
$this->assertInstanceOf(
BookmarkDefaultFormatter::class,
$this->factory->getFormatter('default')
);
}
/**
* Test creating an instance of BookmarkRawFormatter from settings
*/
public function testCreateInstanceRawSetting()
{
$this->conf->set('formatter', 'raw');
$this->assertInstanceOf(BookmarkRawFormatter::class, $this->factory->getFormatter());
}
/**
* Test creating an instance of BookmarkRawFormatter from parameter
*/
public function testCreateInstanceRawParameter()
{
$this->assertInstanceOf(
BookmarkRawFormatter::class,
$this->factory->getFormatter('raw')
);
}
/**
* Test creating an instance of BookmarkMarkdownFormatter from settings
*/
public function testCreateInstanceMarkdownSetting()
{
$this->conf->set('formatter', 'markdown');
$this->assertInstanceOf(BookmarkMarkdownFormatter::class, $this->factory->getFormatter());
}
/**
* Test creating an instance of BookmarkMarkdownFormatter from parameter
*/
public function testCreateInstanceMarkdownParameter()
{
$this->assertInstanceOf(
BookmarkMarkdownFormatter::class,
$this->factory->getFormatter('markdown')
);
}
}

View file

@ -0,0 +1,74 @@
<?php
namespace Shaarli\Updater;
use Exception;
use ReflectionClass;
use ReflectionMethod;
use Shaarli\Config\ConfigManager;
use Shaarli\Legacy\LegacyLinkDB;
use Shaarli\Legacy\LegacyUpdater;
/**
* Class LegacyDummyUpdater.
* Extends updater to add update method designed for unit tests.
*/
class LegacyDummyUpdater extends LegacyUpdater
{
/**
* Object constructor.
*
* @param array $doneUpdates Updates which are already done.
* @param LegacyLinkDB $linkDB LinkDB instance.
* @param ConfigManager $conf Configuration Manager instance.
* @param boolean $isLoggedIn True if the user is logged in.
*/
public function __construct($doneUpdates, $linkDB, $conf, $isLoggedIn)
{
parent::__construct($doneUpdates, $linkDB, $conf, $isLoggedIn);
// Retrieve all update methods.
// For unit test, only retrieve final methods,
$class = new ReflectionClass($this);
$this->methods = $class->getMethods(ReflectionMethod::IS_FINAL);
}
/**
* Update method 1.
*
* @return bool true.
*/
final private function updateMethodDummy1()
{
return true;
}
/**
* Update method 2.
*
* @return bool true.
*/
final private function updateMethodDummy2()
{
return true;
}
/**
* Update method 3.
*
* @return bool true.
*/
final private function updateMethodDummy3()
{
return true;
}
/**
* Update method 4, raise an exception.
*
* @throws Exception error.
*/
final private function updateMethodException()
{
throw new Exception('whatever');
}
}

View file

@ -3,12 +3,13 @@
* Link datastore tests
*/
namespace Shaarli\Bookmark;
namespace Shaarli\Legacy;
use DateTime;
use ReferenceLinkDB;
use ReflectionClass;
use Shaarli;
use Shaarli\Bookmark\Bookmark;
require_once 'application/feed/Cache.php';
require_once 'application/Utils.php';
@ -16,9 +17,9 @@
/**
* Unitary tests for LinkDB
* Unitary tests for LegacyLinkDBTest
*/
class LinkDBTest extends \PHPUnit\Framework\TestCase
class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
{
// datastore to test write operations
protected static $testDatastore = 'sandbox/datastore.php';
@ -29,19 +30,19 @@ class LinkDBTest extends \PHPUnit\Framework\TestCase
protected static $refDB = null;
/**
* @var LinkDB public LinkDB instance.
* @var LegacyLinkDB public LinkDB instance.
*/
protected static $publicLinkDB = null;
/**
* @var LinkDB private LinkDB instance.
* @var LegacyLinkDB private LinkDB instance.
*/
protected static $privateLinkDB = null;
/**
* Instantiates public and private LinkDBs with test data
*
* The reference datastore contains public and private links that
* The reference datastore contains public and private bookmarks that
* will be used to test LinkDB's methods:
* - access filtering (public/private),
* - link searches:
@ -58,11 +59,10 @@ protected function setUp()
unlink(self::$testDatastore);
}
self::$refDB = new ReferenceLinkDB();
self::$refDB = new ReferenceLinkDB(true);
self::$refDB->write(self::$testDatastore);
self::$publicLinkDB = new LinkDB(self::$testDatastore, false, false);
self::$privateLinkDB = new LinkDB(self::$testDatastore, true, false);
self::$publicLinkDB = new LegacyLinkDB(self::$testDatastore, false, false);
self::$privateLinkDB = new LegacyLinkDB(self::$testDatastore, true, false);
}
/**
@ -74,7 +74,7 @@ protected function setUp()
*/
protected static function getMethod($name)
{
$class = new ReflectionClass('Shaarli\Bookmark\LinkDB');
$class = new ReflectionClass('Shaarli\Legacy\LegacyLinkDB');
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method;
@ -85,7 +85,7 @@ protected static function getMethod($name)
*/
public function testConstructLoggedIn()
{
new LinkDB(self::$testDatastore, true, false);
new LegacyLinkDB(self::$testDatastore, true, false);
$this->assertFileExists(self::$testDatastore);
}
@ -94,7 +94,7 @@ public function testConstructLoggedIn()
*/
public function testConstructLoggedOut()
{
new LinkDB(self::$testDatastore, false, false);
new LegacyLinkDB(self::$testDatastore, false, false);
$this->assertFileExists(self::$testDatastore);
}
@ -106,7 +106,7 @@ public function testConstructLoggedOut()
*/
public function testConstructDatastoreNotWriteable()
{
new LinkDB('null/store.db', false, false);
new LegacyLinkDB('null/store.db', false, false);
}
/**
@ -114,7 +114,7 @@ public function testConstructDatastoreNotWriteable()
*/
public function testCheckDBNew()
{
$linkDB = new LinkDB(self::$testDatastore, false, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, false, false);
unlink(self::$testDatastore);
$this->assertFileNotExists(self::$testDatastore);
@ -131,7 +131,7 @@ public function testCheckDBNew()
*/
public function testCheckDBLoad()
{
$linkDB = new LinkDB(self::$testDatastore, false, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, false, false);
$datastoreSize = filesize(self::$testDatastore);
$this->assertGreaterThan(0, $datastoreSize);
@ -151,13 +151,13 @@ public function testCheckDBLoad()
public function testReadEmptyDB()
{
file_put_contents(self::$testDatastore, '<?php /* S7QysKquBQA= */ ?>');
$emptyDB = new LinkDB(self::$testDatastore, false, false);
$emptyDB = new LegacyLinkDB(self::$testDatastore, false, false);
$this->assertEquals(0, sizeof($emptyDB));
$this->assertEquals(0, count($emptyDB));
}
/**
* Load public links from the DB
* Load public bookmarks from the DB
*/
public function testReadPublicDB()
{
@ -168,7 +168,7 @@ public function testReadPublicDB()
}
/**
* Load public and private links from the DB
* Load public and private bookmarks from the DB
*/
public function testReadPrivateDB()
{
@ -179,11 +179,11 @@ public function testReadPrivateDB()
}
/**
* Save the links to the DB
* Save the bookmarks to the DB
*/
public function testSave()
{
$testDB = new LinkDB(self::$testDatastore, true, false);
$testDB = new LegacyLinkDB(self::$testDatastore, true, false);
$dbSize = sizeof($testDB);
$link = array(
@ -192,18 +192,18 @@ public function testSave()
'url' => 'http://dum.my',
'description' => 'One more',
'private' => 0,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150518_190000'),
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150518_190000'),
'tags' => 'unit test'
);
$testDB[$link['id']] = $link;
$testDB->save('tests');
$testDB = new LinkDB(self::$testDatastore, true, false);
$testDB = new LegacyLinkDB(self::$testDatastore, true, false);
$this->assertEquals($dbSize + 1, sizeof($testDB));
}
/**
* Count existing links
* Count existing bookmarks
*/
public function testCount()
{
@ -218,11 +218,11 @@ public function testCount()
}
/**
* Count existing links - public links hidden
* Count existing bookmarks - public bookmarks hidden
*/
public function testCountHiddenPublic()
{
$linkDB = new LinkDB(self::$testDatastore, false, true);
$linkDB = new LegacyLinkDB(self::$testDatastore, false, true);
$this->assertEquals(
0,
@ -235,7 +235,7 @@ public function testCountHiddenPublic()
}
/**
* List the days for which links have been posted
* List the days for which bookmarks have been posted
*/
public function testDays()
{
@ -422,7 +422,7 @@ public function testFilterHashValid()
/**
* Test filterHash() with an invalid smallhash.
*
* @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
* @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
*/
public function testFilterHashInValid1()
{
@ -433,7 +433,7 @@ public function testFilterHashInValid1()
/**
* Test filterHash() with an empty smallhash.
*
* @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
* @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
*/
public function testFilterHashInValid()
{
@ -462,12 +462,12 @@ public function testReorderLinksDesc()
}
/**
* Test rename tag with a valid value present in multiple links
* Test rename tag with a valid value present in multiple bookmarks
*/
public function testRenameTagMultiple()
{
self::$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$res = $linkDB->renameTag('cartoon', 'Taz');
$this->assertEquals(3, count($res));
@ -482,7 +482,7 @@ public function testRenameTagMultiple()
public function testRenameTagCaseSensitive()
{
self::$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$res = $linkDB->renameTag('sTuff', 'Taz');
$this->assertEquals(1, count($res));
@ -494,7 +494,7 @@ public function testRenameTagCaseSensitive()
*/
public function testRenameTagInvalid()
{
$linkDB = new LinkDB(self::$testDatastore, false, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, false, false);
$this->assertFalse($linkDB->renameTag('', 'test'));
$this->assertFalse($linkDB->renameTag('', ''));
@ -509,7 +509,7 @@ public function testRenameTagInvalid()
public function testDeleteTag()
{
self::$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$res = $linkDB->renameTag('cartoon', null);
$this->assertEquals(3, count($res));
@ -624,7 +624,7 @@ public function testConsistentOrder()
{
$nextId = 43;
$creation = DateTime::createFromFormat('Ymd_His', '20190807_130444');
$linkDB = new LinkDB(self::$testDatastore, true, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
for ($i = 0; $i < 4; ++$i) {
$linkDB[$nextId + $i] = [
'id' => $nextId + $i,
@ -639,7 +639,7 @@ public function testConsistentOrder()
// Check 4 new links 4 times
for ($i = 0; $i < 4; ++$i) {
$linkDB->save('tests');
$linkDB = new LinkDB(self::$testDatastore, true, false);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$count = 3;
foreach ($linkDB as $link) {
if ($link['sticky'] === true) {

View file

@ -4,18 +4,20 @@
use Exception;
use ReferenceLinkDB;
use Shaarli\Legacy\LegacyLinkDB;
use Shaarli\Legacy\LegacyLinkFilter;
/**
* Class LinkFilterTest.
* Class LegacyLinkFilterTest.
*/
class LinkFilterTest extends \PHPUnit\Framework\TestCase
class LegacyLinkFilterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Test datastore path.
*/
protected static $testDatastore = 'sandbox/datastore.php';
/**
* @var LinkFilter instance.
* @var BookmarkFilter instance.
*/
protected static $linkFilter;
@ -25,7 +27,7 @@ class LinkFilterTest extends \PHPUnit\Framework\TestCase
protected static $refDB;
/**
* @var LinkDB instance
* @var LegacyLinkDB instance
*/
protected static $linkDB;
@ -34,10 +36,10 @@ class LinkFilterTest extends \PHPUnit\Framework\TestCase
*/
public static function setUpBeforeClass()
{
self::$refDB = new ReferenceLinkDB();
self::$refDB = new ReferenceLinkDB(true);
self::$refDB->write(self::$testDatastore);
self::$linkDB = new LinkDB(self::$testDatastore, true, false);
self::$linkFilter = new LinkFilter(self::$linkDB);
self::$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
self::$linkFilter = new LegacyLinkFilter(self::$linkDB);
}
/**
@ -74,14 +76,14 @@ public function testFilter()
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, ''))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, ''))
);
$this->assertEquals(
self::$refDB->countUntaggedLinks(),
count(
self::$linkFilter->filter(
LinkFilter::$FILTER_TAG,
LegacyLinkFilter::$FILTER_TAG,
/*$request=*/
'',
/*$casesensitive=*/
@ -96,89 +98,89 @@ public function testFilter()
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, ''))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, ''))
);
}
/**
* Filter links using a tag
* Filter bookmarks using a tag
*/
public function testFilterOneTag()
{
$this->assertEquals(
4,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'web', false))
);
$this->assertEquals(
4,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'all'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'web', false, 'all'))
);
$this->assertEquals(
4,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'default-blabla'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'web', false, 'default-blabla'))
);
// Private only.
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'private'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'web', false, 'private'))
);
// Public only.
$this->assertEquals(
3,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'public'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'web', false, 'public'))
);
}
/**
* Filter links using a tag - case-sensitive
* Filter bookmarks using a tag - case-sensitive
*/
public function testFilterCaseSensitiveTag()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'mercurial', true))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'mercurial', true))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'Mercurial', true))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'Mercurial', true))
);
}
/**
* Filter links using a tag combination
* Filter bookmarks using a tag combination
*/
public function testFilterMultipleTags()
{
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'dev cartoon', false))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'dev cartoon', false))
);
}
/**
* Filter links using a non-existent tag
* Filter bookmarks using a non-existent tag
*/
public function testFilterUnknownTag()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'null', false))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'null', false))
);
}
/**
* Return links for a given day
* Return bookmarks for a given day
*/
public function testFilterDay()
{
$this->assertEquals(
4,
count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, '20121206'))
);
}
@ -189,7 +191,7 @@ public function testFilterUnknownDay()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '19700101'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, '19700101'))
);
}
@ -200,7 +202,7 @@ public function testFilterUnknownDay()
*/
public function testFilterInvalidDayWithChars()
{
self::$linkFilter->filter(LinkFilter::$FILTER_DAY, 'Rainy day, dream away');
self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, 'Rainy day, dream away');
}
/**
@ -210,7 +212,7 @@ public function testFilterInvalidDayWithChars()
*/
public function testFilterInvalidDayDigits()
{
self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20');
self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, '20');
}
/**
@ -218,7 +220,7 @@ public function testFilterInvalidDayDigits()
*/
public function testFilterSmallHash()
{
$links = self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'IuWvgA');
$links = self::$linkFilter->filter(LegacyLinkFilter::$FILTER_HASH, 'IuWvgA');
$this->assertEquals(
1,
@ -234,11 +236,11 @@ public function testFilterSmallHash()
/**
* No link for this hash
*
* @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
* @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
*/
public function testFilterUnknownSmallHash()
{
self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'Iblaah');
self::$linkFilter->filter(LegacyLinkFilter::$FILTER_HASH, 'Iblaah');
}
/**
@ -248,7 +250,7 @@ public function testFilterFullTextNoResult()
{
$this->assertEquals(
0,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'azertyuiop'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'azertyuiop'))
);
}
@ -259,12 +261,12 @@ public function testFilterFullTextURL()
{
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars org'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'ars org'))
);
}
@ -276,21 +278,21 @@ public function testFilterFullTextTitle()
// use miscellaneous cases
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'userfriendly -'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'userfriendly -'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'UserFriendly -'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'UserFriendly -'))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
);
// use miscellaneous case and offset
$this->assertEquals(
2,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'RFrIendL'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'RFrIendL'))
);
}
@ -301,17 +303,17 @@ public function testFilterFullTextDescription()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'publishing media'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'publishing media'))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'mercurial w3c'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'mercurial w3c'))
);
$this->assertEquals(
3,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '"free software"'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, '"free software"'))
);
}
@ -322,29 +324,29 @@ public function testFilterFullTextTags()
{
$this->assertEquals(
6,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'web'))
);
$this->assertEquals(
6,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'all'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'web', 'all'))
);
$this->assertEquals(
6,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'bla'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'web', 'bla'))
);
// Private only.
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'private'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'web', false, 'private'))
);
// Public only.
$this->assertEquals(
5,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'public'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'web', false, 'public'))
);
}
@ -355,7 +357,7 @@ public function testFilterFullTextMixed()
{
$this->assertEquals(
3,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free software'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'free software'))
);
}
@ -366,12 +368,12 @@ public function testExcludeSearch()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free -gnu'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, 'free -gnu'))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '-revolution'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TEXT, '-revolution'))
);
}
@ -383,7 +385,7 @@ public function testMultiSearch()
$this->assertEquals(
2,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TEXT,
'"Free Software " stallman "read this" @website stuff'
))
);
@ -391,7 +393,7 @@ public function testMultiSearch()
$this->assertEquals(
1,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TEXT,
'"free software " stallman "read this" -beard @website stuff'
))
);
@ -405,7 +407,7 @@ public function testSearchExactTermMultiFieldsKo()
$this->assertEquals(
0,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TEXT,
'"designer naming"'
))
);
@ -413,7 +415,7 @@ public function testSearchExactTermMultiFieldsKo()
$this->assertEquals(
0,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TEXT,
'"designernaming"'
))
);
@ -426,12 +428,12 @@ public function testTagFilterWithExclusion()
{
$this->assertEquals(
1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'gnu -free'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, 'gnu -free'))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '-free'))
count(self::$linkFilter->filter(LegacyLinkFilter::$FILTER_TAG, '-free'))
);
}
@ -445,42 +447,42 @@ public function testFilterCrossedSearch()
$this->assertEquals(
1,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array($tags, $terms)
))
);
$this->assertEquals(
2,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array('', $terms)
))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array(false, 'PSR-2')
))
);
$this->assertEquals(
1,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array($tags, '')
))
);
$this->assertEquals(
ReferenceLinkDB::$NB_LINKS_TOTAL,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
''
))
);
}
/**
* Filter links by #hashtag.
* Filter bookmarks by #hashtag.
*/
public function testFilterByHashtag()
{
@ -488,7 +490,7 @@ public function testFilterByHashtag()
$this->assertEquals(
3,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG,
LegacyLinkFilter::$FILTER_TAG,
$hashtag
))
);
@ -497,7 +499,7 @@ public function testFilterByHashtag()
$this->assertEquals(
1,
count(self::$linkFilter->filter(
LinkFilter::$FILTER_TAG,
LegacyLinkFilter::$FILTER_TAG,
$hashtag,
false,
'private'

View file

@ -0,0 +1,886 @@
<?php
namespace Shaarli\Updater;
use DateTime;
use Exception;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Config\ConfigJson;
use Shaarli\Config\ConfigManager;
use Shaarli\Config\ConfigPhp;
use Shaarli\Legacy\LegacyLinkDB;
use Shaarli\Legacy\LegacyUpdater;
use Shaarli\Thumbnailer;
require_once 'application/updater/UpdaterUtils.php';
require_once 'tests/updater/DummyUpdater.php';
require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'inc/rain.tpl.class.php';
/**
* Class UpdaterTest.
* Runs unit tests against the updater class.
*/
class LegacyUpdaterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Path to test datastore.
*/
protected static $testDatastore = 'sandbox/datastore.php';
/**
* @var string Config file path (without extension).
*/
protected static $configFile = 'sandbox/config';
/**
* @var ConfigManager
*/
protected $conf;
/**
* Executed before each test.
*/
public function setUp()
{
copy('tests/utils/config/configJson.json.php', self::$configFile .'.json.php');
$this->conf = new ConfigManager(self::$configFile);
}
/**
* Test UpdaterUtils::read_updates_file with an empty/missing file.
*/
public function testReadEmptyUpdatesFile()
{
$this->assertEquals(array(), UpdaterUtils::read_updates_file(''));
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
touch($updatesFile);
$this->assertEquals(array(), UpdaterUtils::read_updates_file($updatesFile));
unlink($updatesFile);
}
/**
* Test read/write updates file.
*/
public function testReadWriteUpdatesFile()
{
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
$updatesMethods = array('m1', 'm2', 'm3');
UpdaterUtils::write_updates_file($updatesFile, $updatesMethods);
$readMethods = UpdaterUtils::read_updates_file($updatesFile);
$this->assertEquals($readMethods, $updatesMethods);
// Update
$updatesMethods[] = 'm4';
UpdaterUtils::write_updates_file($updatesFile, $updatesMethods);
$readMethods = UpdaterUtils::read_updates_file($updatesFile);
$this->assertEquals($readMethods, $updatesMethods);
unlink($updatesFile);
}
/**
* Test errors in UpdaterUtils::write_updates_file(): empty updates file.
*
* @expectedException Exception
* @expectedExceptionMessageRegExp /Updates file path is not set(.*)/
*/
public function testWriteEmptyUpdatesFile()
{
UpdaterUtils::write_updates_file('', array('test'));
}
/**
* Test errors in UpdaterUtils::write_updates_file(): not writable updates file.
*
* @expectedException Exception
* @expectedExceptionMessageRegExp /Unable to write(.*)/
*/
public function testWriteUpdatesFileNotWritable()
{
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
touch($updatesFile);
chmod($updatesFile, 0444);
try {
@UpdaterUtils::write_updates_file($updatesFile, array('test'));
} catch (Exception $e) {
unlink($updatesFile);
throw $e;
}
}
/**
* Test the update() method, with no update to run.
* 1. Everything already run.
* 2. User is logged out.
*/
public function testNoUpdates()
{
$updates = array(
'updateMethodDummy1',
'updateMethodDummy2',
'updateMethodDummy3',
'updateMethodException',
);
$updater = new DummyUpdater($updates, array(), $this->conf, true);
$this->assertEquals(array(), $updater->update());
$updater = new DummyUpdater(array(), array(), $this->conf, false);
$this->assertEquals(array(), $updater->update());
}
/**
* Test the update() method, with all updates to run (except the failing one).
*/
public function testUpdatesFirstTime()
{
$updates = array('updateMethodException',);
$expectedUpdates = array(
'updateMethodDummy1',
'updateMethodDummy2',
'updateMethodDummy3',
);
$updater = new DummyUpdater($updates, array(), $this->conf, true);
$this->assertEquals($expectedUpdates, $updater->update());
}
/**
* Test the update() method, only one update to run.
*/
public function testOneUpdate()
{
$updates = array(
'updateMethodDummy1',
'updateMethodDummy3',
'updateMethodException',
);
$expectedUpdate = array('updateMethodDummy2');
$updater = new DummyUpdater($updates, array(), $this->conf, true);
$this->assertEquals($expectedUpdate, $updater->update());
}
/**
* Test Update failed.
*
* @expectedException \Exception
*/
public function testUpdateFailed()
{
$updates = array(
'updateMethodDummy1',
'updateMethodDummy2',
'updateMethodDummy3',
);
$updater = new DummyUpdater($updates, array(), $this->conf, true);
$updater->update();
}
/**
* Test update mergeDeprecatedConfig:
* 1. init a config file.
* 2. init a options.php file with update value.
* 3. merge.
* 4. check updated value in config file.
*/
public function testUpdateMergeDeprecatedConfig()
{
$this->conf->setConfigFile('tests/utils/config/configPhp');
$this->conf->reset();
$optionsFile = 'tests/updater/options.php';
$options = '<?php
$GLOBALS[\'privateLinkByDefault\'] = true;';
file_put_contents($optionsFile, $options);
// tmp config file.
$this->conf->setConfigFile('tests/updater/config');
// merge configs
$updater = new LegacyUpdater(array(), array(), $this->conf, true);
// This writes a new config file in tests/updater/config.php
$updater->updateMethodMergeDeprecatedConfigFile();
// make sure updated field is changed
$this->conf->reload();
$this->assertTrue($this->conf->get('privacy.default_private_links'));
$this->assertFalse(is_file($optionsFile));
// Delete the generated file.
unlink($this->conf->getConfigFileExt());
}
/**
* Test mergeDeprecatedConfig in without options file.
*/
public function testMergeDeprecatedConfigNoFile()
{
$updater = new LegacyUpdater(array(), array(), $this->conf, true);
$updater->updateMethodMergeDeprecatedConfigFile();
$this->assertEquals('root', $this->conf->get('credentials.login'));
}
/**
* Test renameDashTags update method.
*/
public function testRenameDashTags()
{
$refDB = new \ReferenceLinkDB(true);
$refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$this->assertEmpty($linkDB->filterSearch(array('searchtags' => 'exclude')));
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true);
$updater->updateMethodRenameDashTags();
$this->assertNotEmpty($linkDB->filterSearch(array('searchtags' => 'exclude')));
}
/**
* Convert old PHP config file to JSON config.
*/
public function testConfigToJson()
{
$configFile = 'tests/utils/config/configPhp';
$this->conf->setConfigFile($configFile);
$this->conf->reset();
// The ConfigIO is initialized with ConfigPhp.
$this->assertTrue($this->conf->getConfigIO() instanceof ConfigPhp);
$updater = new LegacyUpdater(array(), array(), $this->conf, false);
$done = $updater->updateMethodConfigToJson();
$this->assertTrue($done);
// The ConfigIO has been updated to ConfigJson.
$this->assertTrue($this->conf->getConfigIO() instanceof ConfigJson);
$this->assertTrue(file_exists($this->conf->getConfigFileExt()));
// Check JSON config data.
$this->conf->reload();
$this->assertEquals('root', $this->conf->get('credentials.login'));
$this->assertEquals('lala', $this->conf->get('redirector.url'));
$this->assertEquals('data/datastore.php', $this->conf->get('resource.datastore'));
$this->assertEquals('1', $this->conf->get('plugins.WALLABAG_VERSION'));
rename($configFile . '.save.php', $configFile . '.php');
unlink($this->conf->getConfigFileExt());
}
/**
* Launch config conversion update with an existing JSON file => nothing to do.
*/
public function testConfigToJsonNothingToDo()
{
$filetime = filemtime($this->conf->getConfigFileExt());
$updater = new LegacyUpdater(array(), array(), $this->conf, false);
$done = $updater->updateMethodConfigToJson();
$this->assertTrue($done);
$expected = filemtime($this->conf->getConfigFileExt());
$this->assertEquals($expected, $filetime);
}
/**
* Test escapeUnescapedConfig with valid data.
*/
public function testEscapeConfig()
{
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
$title = '<script>alert("title");</script>';
$headerLink = '<script>alert("header_link");</script>';
$this->conf->set('general.title', $title);
$this->conf->set('general.header_link', $headerLink);
$updater = new LegacyUpdater(array(), array(), $this->conf, true);
$done = $updater->updateMethodEscapeUnescapedConfig();
$this->assertTrue($done);
$this->conf->reload();
$this->assertEquals(escape($title), $this->conf->get('general.title'));
$this->assertEquals(escape($headerLink), $this->conf->get('general.header_link'));
unlink($sandbox . '.json.php');
}
/**
* Test updateMethodApiSettings(): create default settings for the API (enabled + secret).
*/
public function testUpdateApiSettings()
{
$confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php');
$conf = new ConfigManager($confFile);
$updater = new LegacyUpdater(array(), array(), $conf, true);
$this->assertFalse($conf->exists('api.enabled'));
$this->assertFalse($conf->exists('api.secret'));
$updater->updateMethodApiSettings();
$conf->reload();
$this->assertTrue($conf->get('api.enabled'));
$this->assertTrue($conf->exists('api.secret'));
unlink($confFile .'.json.php');
}
/**
* Test updateMethodApiSettings(): already set, do nothing.
*/
public function testUpdateApiSettingsNothingToDo()
{
$confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php');
$conf = new ConfigManager($confFile);
$conf->set('api.enabled', false);
$conf->set('api.secret', '');
$updater = new LegacyUpdater(array(), array(), $conf, true);
$updater->updateMethodApiSettings();
$this->assertFalse($conf->get('api.enabled'));
$this->assertEmpty($conf->get('api.secret'));
unlink($confFile .'.json.php');
}
/**
* Test updateMethodDatastoreIds().
*/
public function testDatastoreIds()
{
$links = array(
'20121206_182539' => array(
'linkdate' => '20121206_182539',
'title' => 'Geek and Poke',
'url' => 'http://geek-and-poke.com/',
'description' => 'desc',
'tags' => 'dev cartoon tag1 tag2 tag3 tag4 ',
'updated' => '20121206_190301',
'private' => false,
),
'20121206_172539' => array(
'linkdate' => '20121206_172539',
'title' => 'UserFriendly - Samba',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20010306',
'description' => '',
'tags' => 'samba cartoon web',
'private' => false,
),
'20121206_142300' => array(
'linkdate' => '20121206_142300',
'title' => 'UserFriendly - Web Designer',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20121206',
'description' => 'Naming conventions... #private',
'tags' => 'samba cartoon web',
'private' => true,
),
);
$refDB = new \ReferenceLinkDB(true);
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$checksum = hash_file('sha1', self::$testDatastore);
$this->conf->set('resource.data_dir', 'sandbox');
$this->conf->set('resource.datastore', self::$testDatastore);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$backupFiles = glob($this->conf->get('resource.data_dir') . '/datastore.'. date('YmdH') .'*.php');
$backup = null;
foreach ($backupFiles as $backupFile) {
if (strpos($backupFile, '_1') === false) {
$backup = $backupFile;
}
}
$this->assertNotNull($backup);
$this->assertFileExists($backup);
$this->assertEquals($checksum, hash_file('sha1', $backup));
unlink($backup);
$this->assertEquals(3, count($linkDB));
$this->assertTrue(isset($linkDB[0]));
$this->assertFalse(isset($linkDB[0]['linkdate']));
$this->assertEquals(0, $linkDB[0]['id']);
$this->assertEquals('UserFriendly - Web Designer', $linkDB[0]['title']);
$this->assertEquals('http://ars.userfriendly.org/cartoons/?id=20121206', $linkDB[0]['url']);
$this->assertEquals('Naming conventions... #private', $linkDB[0]['description']);
$this->assertEquals('samba cartoon web', $linkDB[0]['tags']);
$this->assertTrue($linkDB[0]['private']);
$this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_142300'),
$linkDB[0]['created']
);
$this->assertTrue(isset($linkDB[1]));
$this->assertFalse(isset($linkDB[1]['linkdate']));
$this->assertEquals(1, $linkDB[1]['id']);
$this->assertEquals('UserFriendly - Samba', $linkDB[1]['title']);
$this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_172539'),
$linkDB[1]['created']
);
$this->assertTrue(isset($linkDB[2]));
$this->assertFalse(isset($linkDB[2]['linkdate']));
$this->assertEquals(2, $linkDB[2]['id']);
$this->assertEquals('Geek and Poke', $linkDB[2]['title']);
$this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_182539'),
$linkDB[2]['created']
);
$this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_190301'),
$linkDB[2]['updated']
);
}
/**
* Test updateMethodDatastoreIds() with the update already applied: nothing to do.
*/
public function testDatastoreIdsNothingToDo()
{
$refDB = new \ReferenceLinkDB(true);
$refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$this->conf->set('resource.data_dir', 'sandbox');
$this->conf->set('resource.datastore', self::$testDatastore);
$checksum = hash_file('sha1', self::$testDatastore);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds());
$this->assertEquals($checksum, hash_file('sha1', self::$testDatastore));
}
/**
* Test defaultTheme update with default settings: nothing to do.
*/
public function testDefaultThemeWithDefaultSettings()
{
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDefaultTheme());
$this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals('default', $this->conf->get('resource.theme'));
$this->conf = new ConfigManager($sandbox);
$this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals('default', $this->conf->get('resource.theme'));
unlink($sandbox . '.json.php');
}
/**
* Test defaultTheme update with a custom theme in a subfolder
*/
public function testDefaultThemeWithCustomTheme()
{
$theme = 'iamanartist';
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
mkdir('sandbox/'. $theme);
touch('sandbox/'. $theme .'/linklist.html');
$this->conf->set('resource.raintpl_tpl', 'sandbox/'. $theme .'/');
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDefaultTheme());
$this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals($theme, $this->conf->get('resource.theme'));
$this->conf = new ConfigManager($sandbox);
$this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals($theme, $this->conf->get('resource.theme'));
unlink($sandbox . '.json.php');
unlink('sandbox/'. $theme .'/linklist.html');
rmdir('sandbox/'. $theme);
}
/**
* Test updateMethodEscapeMarkdown with markdown plugin enabled
* => setting markdown_escape set to false.
*/
public function testEscapeMarkdownSettingToFalse()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.enabled_plugins', ['markdown']);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertFalse($this->conf->get('security.markdown_escape'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertFalse($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with markdown plugin disabled
* => setting markdown_escape set to true.
*/
public function testEscapeMarkdownSettingToTrue()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.enabled_plugins', []);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertTrue($this->conf->get('security.markdown_escape'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertTrue($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with nothing to do (setting already enabled)
*/
public function testEscapeMarkdownSettingNothingToDoEnabled()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('security.markdown_escape', true);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertTrue($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with nothing to do (setting already disabled)
*/
public function testEscapeMarkdownSettingNothingToDoDisabled()
{
$this->conf->set('security.markdown_escape', false);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertFalse($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodPiwikUrl with valid data
*/
public function testUpdatePiwikUrlValid()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$url = 'mypiwik.tld';
$this->conf->set('plugins.PIWIK_URL', $url);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodPiwikUrl without setting
*/
public function testUpdatePiwikUrlEmpty()
{
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEmpty($this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodPiwikUrl: valid URL, nothing to do
*/
public function testUpdatePiwikUrlNothingToDo()
{
$url = 'https://mypiwik.tld';
$this->conf->set('plugins.PIWIK_URL', $url);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEquals($url, $this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodAtomDefault with show_atom set to false
* => update to true.
*/
public function testUpdateMethodAtomDefault()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('feed.show_atom', false);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodAtomDefault with show_atom not set.
* => nothing to do
*/
public function testUpdateMethodAtomDefaultNoExist()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodAtomDefault with show_atom set to true.
* => nothing to do
*/
public function testUpdateMethodAtomDefaultAlreadyTrue()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('feed.show_atom', true);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, it should be set if none is already defined.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConf()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, it shouldn't be set if it is already defined.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfIgnore()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_max_size', 38);
$this->conf->set('general.download_timeout', 70);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(38, $this->conf->get('general.download_max_size'));
$this->assertEquals(70, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, only the maz size should be set here.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfOnlySize()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_max_size', 38);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(38, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, only the time out should be set here.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfOnlyTimeout()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_timeout', 3);
$updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(3, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodWebThumbnailer with thumbnails enabled.
*/
public function testUpdateMethodWebThumbnailerEnabled()
{
$this->conf->remove('thumbnails');
$this->conf->set('thumbnail.enable_thumbnails', true);
$updater = new LegacyUpdater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(\Shaarli\Thumbnailer::MODE_ALL, $this->conf->get('thumbnails.mode'));
$this->assertEquals(125, $this->conf->get('thumbnails.width'));
$this->assertEquals(90, $this->conf->get('thumbnails.height'));
$this->assertContains('You have enabled or changed thumbnails', $_SESSION['warnings'][0]);
}
/**
* Test updateMethodWebThumbnailer with thumbnails disabled.
*/
public function testUpdateMethodWebThumbnailerDisabled()
{
if (isset($_SESSION['warnings'])) {
unset($_SESSION['warnings']);
}
$this->conf->remove('thumbnails');
$this->conf->set('thumbnail.enable_thumbnails', false);
$updater = new LegacyUpdater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(Thumbnailer::MODE_NONE, $this->conf->get('thumbnails.mode'));
$this->assertEquals(125, $this->conf->get('thumbnails.width'));
$this->assertEquals(90, $this->conf->get('thumbnails.height'));
$this->assertTrue(empty($_SESSION['warnings']));
}
/**
* Test updateMethodWebThumbnailer with thumbnails disabled.
*/
public function testUpdateMethodWebThumbnailerNothingToDo()
{
if (isset($_SESSION['warnings'])) {
unset($_SESSION['warnings']);
}
$updater = new LegacyUpdater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(Thumbnailer::MODE_COMMON, $this->conf->get('thumbnails.mode'));
$this->assertEquals(90, $this->conf->get('thumbnails.width'));
$this->assertEquals(53, $this->conf->get('thumbnails.height'));
$this->assertTrue(empty($_SESSION['warnings']));
}
/**
* Test updateMethodSetSticky().
*/
public function testUpdateStickyValid()
{
$blank = [
'id' => 1,
'url' => 'z',
'title' => '',
'description' => '',
'tags' => '',
'created' => new DateTime(),
];
$links = [
1 => ['id' => 1] + $blank,
2 => ['id' => 2] + $blank,
];
$refDB = new \ReferenceLinkDB(true);
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
foreach ($linkDB as $link) {
$this->assertFalse($link['sticky']);
}
}
/**
* Test updateMethodSetSticky().
*/
public function testUpdateStickyNothingToDo()
{
$blank = [
'id' => 1,
'url' => 'z',
'title' => '',
'description' => '',
'tags' => '',
'created' => new DateTime(),
];
$links = [
1 => ['id' => 1, 'sticky' => true] + $blank,
2 => ['id' => 2] + $blank,
];
$refDB = new \ReferenceLinkDB(true);
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$this->assertTrue($linkDB[1]['sticky']);
}
/**
* Test updateMethodRemoveRedirector().
*/
public function testUpdateRemoveRedirector()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new LegacyUpdater([], null, $this->conf, true);
$this->assertTrue($updater->updateMethodRemoveRedirector());
$this->assertFalse($this->conf->exists('redirector'));
$this->conf = new ConfigManager($sandboxConf);
$this->assertFalse($this->conf->exists('redirector'));
}
/**
* Test updateMethodFormatterSetting()
*/
public function testUpdateMethodFormatterSettingDefault()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('formatter', 'default');
$updater = new LegacyUpdater([], null, $this->conf, true);
$enabledPlugins = $this->conf->get('general.enabled_plugins');
$this->assertFalse(in_array('markdown', $enabledPlugins));
$this->assertTrue($updater->updateMethodFormatterSetting());
$this->assertEquals('default', $this->conf->get('formatter'));
$this->assertEquals($enabledPlugins, $this->conf->get('general.enabled_plugins'));
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals('default', $this->conf->get('formatter'));
$this->assertEquals($enabledPlugins, $this->conf->get('general.enabled_plugins'));
}
/**
* Test updateMethodFormatterSetting()
*/
public function testUpdateMethodFormatterSettingMarkdown()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('formatter', 'default');
$updater = new LegacyUpdater([], null, $this->conf, true);
$enabledPlugins = $this->conf->get('general.enabled_plugins');
$enabledPlugins[] = 'markdown';
$this->conf->set('general.enabled_plugins', $enabledPlugins);
$this->assertTrue(in_array('markdown', $this->conf->get('general.enabled_plugins')));
$this->assertTrue($updater->updateMethodFormatterSetting());
$this->assertEquals('markdown', $this->conf->get('formatter'));
$this->assertFalse(in_array('markdown', $this->conf->get('general.enabled_plugins')));
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals('markdown', $this->conf->get('formatter'));
$this->assertFalse(in_array('markdown', $this->conf->get('general.enabled_plugins')));
}
}

View file

@ -1,7 +1,12 @@
<?php
namespace Shaarli\Netscape;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\Formatter\BookmarkFormatter;
use Shaarli\History;
require_once 'tests/utils/ReferenceLinkDB.php';
@ -21,18 +26,28 @@ class BookmarkExportTest extends \PHPUnit\Framework\TestCase
protected static $refDb = null;
/**
* @var LinkDB private LinkDB instance.
* @var BookmarkFileService private instance.
*/
protected static $linkDb = null;
protected static $bookmarkService = null;
/**
* @var BookmarkFormatter instance
*/
protected static $formatter;
/**
* Instantiate reference data
*/
public static function setUpBeforeClass()
{
$conf = new ConfigManager('tests/utils/config/configJson');
$conf->set('resource.datastore', self::$testDatastore);
self::$refDb = new \ReferenceLinkDB();
self::$refDb->write(self::$testDatastore);
self::$linkDb = new LinkDB(self::$testDatastore, true, false);
$history = new History('sandbox/history.php');
self::$bookmarkService = new BookmarkFileService($conf, $history, true);
$factory = new FormatterFactory($conf);
self::$formatter = $factory->getFormatter('raw');
}
/**
@ -42,15 +57,27 @@ public static function setUpBeforeClass()
*/
public function testFilterAndFormatInvalid()
{
NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'derp', false, '');
NetscapeBookmarkUtils::filterAndFormat(
self::$bookmarkService,
self::$formatter,
'derp',
false,
''
);
}
/**
* Prepare all links for export
* Prepare all bookmarks for export
*/
public function testFilterAndFormatAll()
{
$links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'all', false, '');
$links = NetscapeBookmarkUtils::filterAndFormat(
self::$bookmarkService,
self::$formatter,
'all',
false,
''
);
$this->assertEquals(self::$refDb->countLinks(), sizeof($links));
foreach ($links as $link) {
$date = $link['created'];
@ -66,11 +93,17 @@ public function testFilterAndFormatAll()
}
/**
* Prepare private links for export
* Prepare private bookmarks for export
*/
public function testFilterAndFormatPrivate()
{
$links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'private', false, '');
$links = NetscapeBookmarkUtils::filterAndFormat(
self::$bookmarkService,
self::$formatter,
'private',
false,
''
);
$this->assertEquals(self::$refDb->countPrivateLinks(), sizeof($links));
foreach ($links as $link) {
$date = $link['created'];
@ -86,11 +119,17 @@ public function testFilterAndFormatPrivate()
}
/**
* Prepare public links for export
* Prepare public bookmarks for export
*/
public function testFilterAndFormatPublic()
{
$links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, '');
$links = NetscapeBookmarkUtils::filterAndFormat(
self::$bookmarkService,
self::$formatter,
'public',
false,
''
);
$this->assertEquals(self::$refDb->countPublicLinks(), sizeof($links));
foreach ($links as $link) {
$date = $link['created'];
@ -110,7 +149,13 @@ public function testFilterAndFormatPublic()
*/
public function testFilterAndFormatDoNotPrependNoteUrl()
{
$links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, '');
$links = NetscapeBookmarkUtils::filterAndFormat(
self::$bookmarkService,
self::$formatter,
'public',
false,
''
);
$this->assertEquals(
'?WDWyig',
$links[2]['url']
@ -124,7 +169,8 @@ public function testFilterAndFormatPrependNoteUrl()
{
$indexUrl = 'http://localhost:7469/shaarli/';
$links = NetscapeBookmarkUtils::filterAndFormat(
self::$linkDb,
self::$bookmarkService,
self::$formatter,
'public',
true,
$indexUrl

View file

@ -2,6 +2,9 @@
namespace Shaarli\Netscape;
use DateTime;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
@ -41,9 +44,9 @@ class BookmarkImportTest extends \PHPUnit\Framework\TestCase
protected static $historyFilePath = 'sandbox/history.php';
/**
* @var LinkDB private LinkDB instance
* @var BookmarkFileService private LinkDB instance
*/
protected $linkDb = null;
protected $bookmarkService = null;
/**
* @var string Dummy page cache
@ -82,10 +85,12 @@ protected function setUp()
}
// start with an empty datastore
file_put_contents(self::$testDatastore, '<?php /* S7QysKquBQA= */ ?>');
$this->linkDb = new LinkDB(self::$testDatastore, true, false);
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.page_cache', $this->pagecache);
$this->conf->set('resource.datastore', self::$testDatastore);
$this->history = new History(self::$historyFilePath);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
}
/**
@ -112,7 +117,7 @@ public function testImportEmptyData()
.' Nothing was imported.',
NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history)
);
$this->assertEquals(0, count($this->linkDb));
$this->assertEquals(0, $this->bookmarkService->count());
}
/**
@ -125,7 +130,7 @@ public function testImportNoDoctype()
'File no_doctype.htm (350 bytes) has an unknown file format. Nothing was imported.',
NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history)
);
$this->assertEquals(0, count($this->linkDb));
$this->assertEquals(0, $this->bookmarkService->count());
}
/**
@ -136,10 +141,10 @@ public function testImportLowecaseDoctype()
$files = file2array('lowercase_doctype.htm');
$this->assertStringMatchesFormat(
'File lowercase_doctype.htm (386 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import(null, $files, $this->linkDb, $this->conf, $this->history)
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import(null, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
}
@ -151,25 +156,24 @@ public function testImportInternetExplorerEncoding()
$files = file2array('internet_explorer_encoding.htm');
$this->assertStringMatchesFormat(
'File internet_explorer_encoding.htm (356 bytes) was successfully processed in %d seconds:'
.' 1 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history)
.' 1 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(1, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(1, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$bookmark = $this->bookmarkService->findByUrl('http://hginit.com/');
$this->assertEquals(0, $bookmark->getId());
$this->assertEquals(
array(
'id' => 0,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160618_203944'),
'title' => 'Hg Init a Mercurial tutorial by Joel Spolsky',
'url' => 'http://hginit.com/',
'description' => '',
'private' => 0,
'tags' => '',
'shorturl' => 'La37cg',
),
$this->linkDb->getLinkFromUrl('http://hginit.com/')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160618_203944'),
$bookmark->getCreated()
);
$this->assertEquals('Hg Init a Mercurial tutorial by Joel Spolsky', $bookmark->getTitle());
$this->assertEquals('http://hginit.com/', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('', $bookmark->getTagsString());
$this->assertEquals('La37cg', $bookmark->getShortUrl());
}
/**
@ -180,116 +184,115 @@ public function testImportNested()
$files = file2array('netscape_nested.htm');
$this->assertStringMatchesFormat(
'File netscape_nested.htm (1337 bytes) was successfully processed in %d seconds:'
.' 8 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history)
.' 8 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(8, count($this->linkDb));
$this->assertEquals(2, count_private($this->linkDb));
$this->assertEquals(8, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/1');
$this->assertEquals(0, $bookmark->getId());
$this->assertEquals(
array(
'id' => 0,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160225_235541'),
'title' => 'Nested 1',
'url' => 'http://nest.ed/1',
'description' => '',
'private' => 0,
'tags' => 'tag1 tag2',
'shorturl' => 'KyDNKA',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/1')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160225_235541'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 1', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/1', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('tag1 tag2', $bookmark->getTagsString());
$this->assertEquals('KyDNKA', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/1-1');
$this->assertEquals(1, $bookmark->getId());
$this->assertEquals(
array(
'id' => 1,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160225_235542'),
'title' => 'Nested 1-1',
'url' => 'http://nest.ed/1-1',
'description' => '',
'private' => 0,
'tags' => 'folder1 tag1 tag2',
'shorturl' => 'T2LnXg',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/1-1')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160225_235542'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 1-1', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/1-1', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('folder1 tag1 tag2', $bookmark->getTagsString());
$this->assertEquals('T2LnXg', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/1-2');
$this->assertEquals(2, $bookmark->getId());
$this->assertEquals(
array(
'id' => 2,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160225_235547'),
'title' => 'Nested 1-2',
'url' => 'http://nest.ed/1-2',
'description' => '',
'private' => 0,
'tags' => 'folder1 tag3 tag4',
'shorturl' => '46SZxA',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/1-2')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160225_235547'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 1-2', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/1-2', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('folder1 tag3 tag4', $bookmark->getTagsString());
$this->assertEquals('46SZxA', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/2-1');
$this->assertEquals(3, $bookmark->getId());
$this->assertEquals(
array(
'id' => 3,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160202_202222'),
'title' => 'Nested 2-1',
'url' => 'http://nest.ed/2-1',
'description' => 'First link of the second section',
'private' => 1,
'tags' => 'folder2',
'shorturl' => '4UHOSw',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/2-1')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160202_202222'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 2-1', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/2-1', $bookmark->getUrl());
$this->assertEquals('First link of the second section', $bookmark->getDescription());
$this->assertTrue($bookmark->isPrivate());
$this->assertEquals('folder2', $bookmark->getTagsString());
$this->assertEquals('4UHOSw', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/2-2');
$this->assertEquals(4, $bookmark->getId());
$this->assertEquals(
array(
'id' => 4,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160119_230227'),
'title' => 'Nested 2-2',
'url' => 'http://nest.ed/2-2',
'description' => 'Second link of the second section',
'private' => 1,
'tags' => 'folder2',
'shorturl' => 'yfzwbw',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/2-2')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160119_230227'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 2-2', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/2-2', $bookmark->getUrl());
$this->assertEquals('Second link of the second section', $bookmark->getDescription());
$this->assertTrue($bookmark->isPrivate());
$this->assertEquals('folder2', $bookmark->getTagsString());
$this->assertEquals('yfzwbw', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/3-1');
$this->assertEquals(5, $bookmark->getId());
$this->assertEquals(
array(
'id' => 5,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160202_202222'),
'title' => 'Nested 3-1',
'url' => 'http://nest.ed/3-1',
'description' => '',
'private' => 0,
'tags' => 'folder3 folder3-1 tag3',
'shorturl' => 'UwxIUQ',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/3-1')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160202_202222'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 3-1', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/3-1', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('folder3 folder3-1 tag3', $bookmark->getTagsString());
$this->assertEquals('UwxIUQ', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/3-2');
$this->assertEquals(6, $bookmark->getId());
$this->assertEquals(
array(
'id' => 6,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160119_230227'),
'title' => 'Nested 3-2',
'url' => 'http://nest.ed/3-2',
'description' => '',
'private' => 0,
'tags' => 'folder3 folder3-1',
'shorturl' => 'p8dyZg',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/3-2')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160119_230227'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 3-2', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/3-2', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('folder3 folder3-1', $bookmark->getTagsString());
$this->assertEquals('p8dyZg', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://nest.ed/2');
$this->assertEquals(7, $bookmark->getId());
$this->assertEquals(
array(
'id' => 7,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160229_111541'),
'title' => 'Nested 2',
'url' => 'http://nest.ed/2',
'description' => '',
'private' => 0,
'tags' => 'tag4',
'shorturl' => 'Gt3Uug',
),
$this->linkDb->getLinkFromUrl('http://nest.ed/2')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160229_111541'),
$bookmark->getCreated()
);
$this->assertEquals('Nested 2', $bookmark->getTitle());
$this->assertEquals('http://nest.ed/2', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('tag4', $bookmark->getTagsString());
$this->assertEquals('Gt3Uug', $bookmark->getShortUrl());
}
/**
@ -302,40 +305,38 @@ public function testImportDefaultPrivacyNoPost()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import([], $files, $this->linkDb, $this->conf, $this->history)
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(1, count_private($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(1, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$bookmark = $this->bookmarkService->findByUrl('https://private.tld');
$this->assertEquals(0, $bookmark->getId());
$this->assertEquals(
array(
'id' => 0,
// Old link - UTC+4 (note that TZ in the import file is ignored).
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20001010_135536'),
'title' => 'Secret stuff',
'url' => 'https://private.tld',
'description' => "Super-secret stuff you're not supposed to know about",
'private' => 1,
'tags' => 'private secret',
'shorturl' => 'EokDtA',
),
$this->linkDb->getLinkFromUrl('https://private.tld')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20001010_135536'),
$bookmark->getCreated()
);
$this->assertEquals('Secret stuff', $bookmark->getTitle());
$this->assertEquals('https://private.tld', $bookmark->getUrl());
$this->assertEquals('Super-secret stuff you\'re not supposed to know about', $bookmark->getDescription());
$this->assertTrue($bookmark->isPrivate());
$this->assertEquals('private secret', $bookmark->getTagsString());
$this->assertEquals('EokDtA', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://public.tld');
$this->assertEquals(1, $bookmark->getId());
$this->assertEquals(
array(
'id' => 1,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160225_235548'),
'title' => 'Public stuff',
'url' => 'http://public.tld',
'description' => '',
'private' => 0,
'tags' => 'public hello world',
'shorturl' => 'Er9ddA',
),
$this->linkDb->getLinkFromUrl('http://public.tld')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160225_235548'),
$bookmark->getCreated()
);
$this->assertEquals('Public stuff', $bookmark->getTitle());
$this->assertEquals('http://public.tld', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('public hello world', $bookmark->getTagsString());
$this->assertEquals('Er9ddA', $bookmark->getShortUrl());
}
/**
@ -347,43 +348,42 @@ public function testImportKeepPrivacy()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(1, count_private($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(1, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$bookmark = $this->bookmarkService->findByUrl('https://private.tld');
$this->assertEquals(0, $bookmark->getId());
$this->assertEquals(
array(
'id' => 0,
// Note that TZ in the import file is ignored.
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20001010_135536'),
'title' => 'Secret stuff',
'url' => 'https://private.tld',
'description' => "Super-secret stuff you're not supposed to know about",
'private' => 1,
'tags' => 'private secret',
'shorturl' => 'EokDtA',
),
$this->linkDb->getLinkFromUrl('https://private.tld')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20001010_135536'),
$bookmark->getCreated()
);
$this->assertEquals('Secret stuff', $bookmark->getTitle());
$this->assertEquals('https://private.tld', $bookmark->getUrl());
$this->assertEquals('Super-secret stuff you\'re not supposed to know about', $bookmark->getDescription());
$this->assertTrue($bookmark->isPrivate());
$this->assertEquals('private secret', $bookmark->getTagsString());
$this->assertEquals('EokDtA', $bookmark->getShortUrl());
$bookmark = $this->bookmarkService->findByUrl('http://public.tld');
$this->assertEquals(1, $bookmark->getId());
$this->assertEquals(
array(
'id' => 1,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160225_235548'),
'title' => 'Public stuff',
'url' => 'http://public.tld',
'description' => '',
'private' => 0,
'tags' => 'public hello world',
'shorturl' => 'Er9ddA',
),
$this->linkDb->getLinkFromUrl('http://public.tld')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160225_235548'),
$bookmark->getCreated()
);
$this->assertEquals('Public stuff', $bookmark->getTitle());
$this->assertEquals('http://public.tld', $bookmark->getUrl());
$this->assertEquals('', $bookmark->getDescription());
$this->assertFalse($bookmark->isPrivate());
$this->assertEquals('public hello world', $bookmark->getTagsString());
$this->assertEquals('Er9ddA', $bookmark->getShortUrl());
}
/**
* Import links as public
* Import bookmarks as public
*/
public function testImportAsPublic()
{
@ -391,23 +391,17 @@ public function testImportAsPublic()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(
0,
$this->linkDb[0]['private']
);
$this->assertEquals(
0,
$this->linkDb[1]['private']
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertFalse($this->bookmarkService->get(0)->isPrivate());
$this->assertFalse($this->bookmarkService->get(1)->isPrivate());
}
/**
* Import links as private
* Import bookmarks as private
*/
public function testImportAsPrivate()
{
@ -415,45 +409,34 @@ public function testImportAsPrivate()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(2, count_private($this->linkDb));
$this->assertEquals(
1,
$this->linkDb['0']['private']
);
$this->assertEquals(
1,
$this->linkDb['1']['private']
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertTrue($this->bookmarkService->get(0)->isPrivate());
$this->assertTrue($this->bookmarkService->get(1)->isPrivate());
}
/**
* Overwrite private links so they become public
* Overwrite private bookmarks so they become public
*/
public function testOverwriteAsPublic()
{
$files = file2array('netscape_basic.htm');
// import links as private
// import bookmarks as private
$post = array('privacy' => 'private');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(2, count_private($this->linkDb));
$this->assertEquals(
1,
$this->linkDb[0]['private']
);
$this->assertEquals(
1,
$this->linkDb[1]['private']
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertTrue($this->bookmarkService->get(0)->isPrivate());
$this->assertTrue($this->bookmarkService->get(1)->isPrivate());
// re-import as public, enable overwriting
$post = array(
'privacy' => 'public',
@ -461,45 +444,33 @@ public function testOverwriteAsPublic()
);
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 2 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(
0,
$this->linkDb[0]['private']
);
$this->assertEquals(
0,
$this->linkDb[1]['private']
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertFalse($this->bookmarkService->get(0)->isPrivate());
$this->assertFalse($this->bookmarkService->get(1)->isPrivate());
}
/**
* Overwrite public links so they become private
* Overwrite public bookmarks so they become private
*/
public function testOverwriteAsPrivate()
{
$files = file2array('netscape_basic.htm');
// import links as public
// import bookmarks as public
$post = array('privacy' => 'public');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(
0,
$this->linkDb['0']['private']
);
$this->assertEquals(
0,
$this->linkDb['1']['private']
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertFalse($this->bookmarkService->get(0)->isPrivate());
$this->assertFalse($this->bookmarkService->get(1)->isPrivate());
// re-import as private, enable overwriting
$post = array(
@ -508,23 +479,17 @@ public function testOverwriteAsPrivate()
);
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 2 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(2, count_private($this->linkDb));
$this->assertEquals(
1,
$this->linkDb['0']['private']
);
$this->assertEquals(
1,
$this->linkDb['1']['private']
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertTrue($this->bookmarkService->get(0)->isPrivate());
$this->assertTrue($this->bookmarkService->get(1)->isPrivate());
}
/**
* Attept to import the same links twice without enabling overwriting
* Attept to import the same bookmarks twice without enabling overwriting
*/
public function testSkipOverwrite()
{
@ -532,21 +497,21 @@ public function testSkipOverwrite()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
// re-import as private, DO NOT enable overwriting
$post = array('privacy' => 'private');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 0 links imported, 0 links overwritten, 2 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
.' 0 bookmarks imported, 0 bookmarks overwritten, 2 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
}
/**
@ -561,19 +526,13 @@ public function testSetDefaultTags()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(
'tag1 tag2 tag3 private secret',
$this->linkDb['0']['tags']
);
$this->assertEquals(
'tag1 tag2 tag3 public hello world',
$this->linkDb['1']['tags']
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertEquals('tag1 tag2 tag3 private secret', $this->bookmarkService->get(0)->getTagsString());
$this->assertEquals('tag1 tag2 tag3 public hello world', $this->bookmarkService->get(1)->getTagsString());
}
/**
@ -588,18 +547,18 @@ public function testSanitizeDefaultTags()
$files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history)
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(2, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertEquals(
'tag1&amp; tag2 &quot;tag3&quot; private secret',
$this->linkDb['0']['tags']
$this->bookmarkService->get(0)->getTagsString()
);
$this->assertEquals(
'tag1&amp; tag2 &quot;tag3&quot; public hello world',
$this->linkDb['1']['tags']
$this->bookmarkService->get(1)->getTagsString()
);
}
@ -613,23 +572,14 @@ public function testImportSameDate()
$files = file2array('same_date.htm');
$this->assertStringMatchesFormat(
'File same_date.htm (453 bytes) was successfully processed in %d seconds:'
.' 3 links imported, 0 links overwritten, 0 links skipped.',
NetscapeBookmarkUtils::import(array(), $files, $this->linkDb, $this->conf, $this->history)
);
$this->assertEquals(3, count($this->linkDb));
$this->assertEquals(0, count_private($this->linkDb));
$this->assertEquals(
0,
$this->linkDb[0]['id']
);
$this->assertEquals(
1,
$this->linkDb[1]['id']
);
$this->assertEquals(
2,
$this->linkDb[2]['id']
.' 3 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
NetscapeBookmarkUtils::import(array(), $files, $this->bookmarkService, $this->conf, $this->history)
);
$this->assertEquals(3, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertEquals(0, $this->bookmarkService->get(0)->getId());
$this->assertEquals(1, $this->bookmarkService->get(1)->getId());
$this->assertEquals(2, $this->bookmarkService->get(2)->getId());
}
public function testImportCreateUpdateHistory()
@ -639,14 +589,14 @@ public function testImportCreateUpdateHistory()
'overwrite' => 'true',
];
$files = file2array('netscape_basic.htm');
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history);
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history);
$history = $this->history->getHistory();
$this->assertEquals(1, count($history));
$this->assertEquals(History::IMPORT, $history[0]['event']);
$this->assertTrue(new DateTime('-5 seconds') < $history[0]['datetime']);
// re-import as private, enable overwriting
NetscapeBookmarkUtils::import($post, $files, $this->linkDb, $this->conf, $this->history);
NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history);
$history = $this->history->getHistory();
$this->assertEquals(2, count($history));
$this->assertEquals(History::IMPORT, $history[0]['event']);

View file

@ -24,7 +24,7 @@ public function setUp()
}
/**
* Test render_linklist hook on external links.
* Test render_linklist hook on external bookmarks.
*/
public function testArchiveorgLinklistOnExternalLinks()
{
@ -54,7 +54,7 @@ public function testArchiveorgLinklistOnExternalLinks()
}
/**
* Test render_linklist hook on internal links.
* Test render_linklist hook on internal bookmarks.
*/
public function testArchiveorgLinklistOnInternalLinks()
{

View file

@ -2,7 +2,7 @@
namespace Shaarli\Plugin\Isso;
use DateTime;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Config\ConfigManager;
use Shaarli\Plugin\PluginManager;
@ -60,7 +60,7 @@ public function testIssoDisplayed()
array(
'id' => 12,
'url' => $str,
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date),
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $date),
)
)
);
@ -85,7 +85,7 @@ public function testIssoDisplayed()
}
/**
* Test isso plugin when multiple links are displayed (shouldn't be displayed).
* Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed).
*/
public function testIssoMultipleLinks()
{
@ -102,13 +102,13 @@ public function testIssoMultipleLinks()
'id' => 12,
'url' => $str,
'shorturl' => $short1 = 'abcd',
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date1),
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $date1),
),
array(
'id' => 13,
'url' => $str . '2',
'shorturl' => $short2 = 'efgh',
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date2),
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $date2),
),
)
);
@ -136,7 +136,7 @@ public function testIssoNotDisplayedWhenSearch()
'id' => 12,
'url' => $str,
'shorturl' => $short1 = 'abcd',
'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date),
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $date),
)
),
'search_term' => $str

View file

@ -1,316 +0,0 @@
<?php
namespace Shaarli\Plugin\Markdown;
use Shaarli\Config\ConfigManager;
use Shaarli\Plugin\PluginManager;
/**
* PluginMarkdownTest.php
*/
require_once 'application/bookmark/LinkUtils.php';
require_once 'application/Utils.php';
require_once 'plugins/markdown/markdown.php';
/**
* Class PluginMarkdownTest
* Unit test for the Markdown plugin
*/
class PluginMarkdownTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ConfigManager instance.
*/
protected $conf;
/**
* Reset plugin path
*/
public function setUp()
{
PluginManager::$PLUGINS_PATH = 'plugins';
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('security.allowed_protocols', ['ftp', 'magnet']);
}
/**
* Test render_linklist hook.
* Only check that there is basic markdown rendering.
*/
public function testMarkdownLinklist()
{
$markdown = '# My title' . PHP_EOL . 'Very interesting content.';
$data = array(
'links' => array(
0 => array(
'description' => $markdown,
),
),
);
$data = hook_markdown_render_linklist($data, $this->conf);
$this->assertNotFalse(strpos($data['links'][0]['description'], '<h1>'));
$this->assertNotFalse(strpos($data['links'][0]['description'], '<p>'));
$this->assertEquals($markdown, $data['links'][0]['description_src']);
}
/**
* Test render_feed hook.
*/
public function testMarkdownFeed()
{
$markdown = '# My title' . PHP_EOL . 'Very interesting content.';
$markdown .= '&#8212; <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>';
$data = array(
'links' => array(
0 => array(
'description' => $markdown,
),
),
);
$data = hook_markdown_render_feed($data, $this->conf);
$this->assertNotFalse(strpos($data['links'][0]['description'], '<h1>'));
$this->assertNotFalse(strpos($data['links'][0]['description'], '<p>'));
$this->assertStringEndsWith(
'&#8212; <a href="http://domain.tld/?0oc_VQ">Permalien</a></p></div>',
$data['links'][0]['description']
);
}
/**
* Test render_daily hook.
* Only check that there is basic markdown rendering.
*/
public function testMarkdownDaily()
{
$markdown = '# My title' . PHP_EOL . 'Very interesting content.';
$data = array(
// Columns data
'linksToDisplay' => array(
// nth link
0 => array(
'formatedDescription' => $markdown,
),
),
);
$data = hook_markdown_render_daily($data, $this->conf);
$this->assertNotFalse(strpos($data['linksToDisplay'][0]['formatedDescription'], '<h1>'));
$this->assertNotFalse(strpos($data['linksToDisplay'][0]['formatedDescription'], '<p>'));
}
/**
* Test reverse_text2clickable().
*/
public function testReverseText2clickable()
{
$text = 'stuff http://hello.there/is=someone#here otherstuff';
$clickableText = text2clickable($text);
$reversedText = reverse_text2clickable($clickableText);
$this->assertEquals($text, $reversedText);
}
/**
* Test reverse_text2clickable().
*/
public function testReverseText2clickableHashtags()
{
$text = file_get_contents('tests/plugins/resources/hashtags.raw');
$md = file_get_contents('tests/plugins/resources/hashtags.md');
$clickableText = hashtag_autolink($text);
$reversedText = reverse_text2clickable($clickableText);
$this->assertEquals($md, $reversedText);
}
/**
* Test reverse_nl2br().
*/
public function testReverseNl2br()
{
$text = 'stuff' . PHP_EOL . 'otherstuff';
$processedText = nl2br($text);
$reversedText = reverse_nl2br($processedText);
$this->assertEquals($text, $reversedText);
}
/**
* Test reverse_space2nbsp().
*/
public function testReverseSpace2nbsp()
{
$text = ' stuff' . PHP_EOL . ' otherstuff and another';
$processedText = space2nbsp($text);
$reversedText = reverse_space2nbsp($processedText);
$this->assertEquals($text, $reversedText);
}
public function testReverseFeedPermalink()
{
$text = 'Description... ';
$text .= '&#8212; <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>';
$expected = 'Description... &#8212; [Permalien](http://domain.tld/?0oc_VQ)';
$processedText = reverse_feed_permalink($text);
$this->assertEquals($expected, $processedText);
}
public function testReverseFeedDirectLink()
{
$text = 'Description... ';
$text .= '&#8212; <a href="http://domain.tld/?0oc_VQ" title="Direct link">Direct link</a>';
$expected = 'Description... &#8212; [Direct link](http://domain.tld/?0oc_VQ)';
$processedText = reverse_feed_permalink($text);
$this->assertEquals($expected, $processedText);
}
public function testReverseLastFeedPermalink()
{
$text = 'Description... ';
$text .= '<br>&#8212; <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>';
$expected = $text;
$text .= '<br>&#8212; <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>';
$expected .= '<br>&#8212; [Permalien](http://domain.tld/?0oc_VQ)';
$processedText = reverse_feed_permalink($text);
$this->assertEquals($expected, $processedText);
}
public function testReverseNoFeedPermalink()
{
$text = 'Hello! Where are you from?';
$expected = $text;
$processedText = reverse_feed_permalink($text);
$this->assertEquals($expected, $processedText);
}
/**
* Test sanitize_html().
*/
public function testSanitizeHtml()
{
$input = '< script src="js.js"/>';
$input .= '< script attr>alert(\'xss\');</script>';
$input .= '<style> * { display: none }</style>';
$output = escape($input);
$input .= '<a href="#" onmouseHover="alert(\'xss\');" attr="tt">link</a>';
$output .= '<a href="#" attr="tt">link</a>';
$input .= '<a href="#" onmouseHover=alert(\'xss\'); attr="tt">link</a>';
$output .= '<a href="#" attr="tt">link</a>';
$this->assertEquals($output, sanitize_html($input));
// Do not touch escaped HTML.
$input = escape($input);
$this->assertEquals($input, sanitize_html($input));
}
/**
* Test the no markdown tag.
*/
public function testNoMarkdownTag()
{
$str = 'All _work_ and `no play` makes Jack a *dull* boy.';
$data = array(
'links' => array(array(
'description' => $str,
'tags' => NO_MD_TAG,
'taglist' => array(NO_MD_TAG),
))
);
$processed = hook_markdown_render_linklist($data, $this->conf);
$this->assertEquals($str, $processed['links'][0]['description']);
$processed = hook_markdown_render_feed($data, $this->conf);
$this->assertEquals($str, $processed['links'][0]['description']);
$data = array(
// Columns data
'linksToDisplay' => array(
// nth link
0 => array(
'formatedDescription' => $str,
'tags' => NO_MD_TAG,
'taglist' => array(),
),
),
);
$data = hook_markdown_render_daily($data, $this->conf);
$this->assertEquals($str, $data['linksToDisplay'][0]['formatedDescription']);
}
/**
* Test that a close value to nomarkdown is not understand as nomarkdown (previous value `.nomarkdown`).
*/
public function testNoMarkdownNotExcactlyMatching()
{
$str = 'All _work_ and `no play` makes Jack a *dull* boy.';
$data = array(
'links' => array(array(
'description' => $str,
'tags' => '.' . NO_MD_TAG,
'taglist' => array('.'. NO_MD_TAG),
))
);
$data = hook_markdown_render_feed($data, $this->conf);
$this->assertContains('<em>', $data['links'][0]['description']);
}
/**
* Make sure that the generated HTML match the reference HTML file.
*/
public function testMarkdownGlobalProcessDescription()
{
$md = file_get_contents('tests/plugins/resources/markdown.md');
$md = format_description($md);
$html = file_get_contents('tests/plugins/resources/markdown.html');
$data = process_markdown(
$md,
$this->conf->get('security.markdown_escape', true),
$this->conf->get('security.allowed_protocols')
);
$this->assertEquals($html, $data . PHP_EOL);
}
/**
* Make sure that the HTML tags are escaped.
*/
public function testMarkdownWithHtmlEscape()
{
$md = '**strong** <strong>strong</strong>';
$html = '<div class="markdown"><p><strong>strong</strong> &lt;strong&gt;strong&lt;/strong&gt;</p></div>';
$data = array(
'links' => array(
0 => array(
'description' => $md,
),
),
);
$data = hook_markdown_render_linklist($data, $this->conf);
$this->assertEquals($html, $data['links'][0]['description']);
}
/**
* Make sure that the HTML tags aren't escaped with the setting set to false.
*/
public function testMarkdownWithHtmlNoEscape()
{
$this->conf->set('security.markdown_escape', false);
$md = '**strong** <strong>strong</strong>';
$html = '<div class="markdown"><p><strong>strong</strong> <strong>strong</strong></p></div>';
$data = array(
'links' => array(
0 => array(
'description' => $md,
),
),
);
$data = hook_markdown_render_linklist($data, $this->conf);
$this->assertEquals($html, $data['links'][0]['description']);
}
}

View file

@ -4,6 +4,7 @@
use Exception;
use ReflectionClass;
use ReflectionMethod;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
@ -17,13 +18,13 @@ class DummyUpdater extends Updater
* Object constructor.
*
* @param array $doneUpdates Updates which are already done.
* @param LinkDB $linkDB LinkDB instance.
* @param BookmarkFileService $bookmarkService LinkDB instance.
* @param ConfigManager $conf Configuration Manager instance.
* @param boolean $isLoggedIn True if the user is logged in.
*/
public function __construct($doneUpdates, $linkDB, $conf, $isLoggedIn)
public function __construct($doneUpdates, $bookmarkService, $conf, $isLoggedIn)
{
parent::__construct($doneUpdates, $linkDB, $conf, $isLoggedIn);
parent::__construct($doneUpdates, $bookmarkService, $conf, $isLoggedIn);
// Retrieve all update methods.
// For unit test, only retrieve final methods,

View file

@ -1,15 +1,9 @@
<?php
namespace Shaarli\Updater;
use DateTime;
use Exception;
use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigJson;
use Shaarli\Config\ConfigManager;
use Shaarli\Config\ConfigPhp;
use Shaarli\Thumbnailer;
require_once 'application/updater/UpdaterUtils.php';
require_once 'tests/updater/DummyUpdater.php';
require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'inc/rain.tpl.class.php';
@ -45,14 +39,14 @@ public function setUp()
}
/**
* Test read_updates_file with an empty/missing file.
* Test UpdaterUtils::read_updates_file with an empty/missing file.
*/
public function testReadEmptyUpdatesFile()
{
$this->assertEquals(array(), read_updates_file(''));
$this->assertEquals(array(), UpdaterUtils::read_updates_file(''));
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
touch($updatesFile);
$this->assertEquals(array(), read_updates_file($updatesFile));
$this->assertEquals(array(), UpdaterUtils::read_updates_file($updatesFile));
unlink($updatesFile);
}
@ -64,31 +58,31 @@ public function testReadWriteUpdatesFile()
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
$updatesMethods = array('m1', 'm2', 'm3');
write_updates_file($updatesFile, $updatesMethods);
$readMethods = read_updates_file($updatesFile);
UpdaterUtils::write_updates_file($updatesFile, $updatesMethods);
$readMethods = UpdaterUtils::read_updates_file($updatesFile);
$this->assertEquals($readMethods, $updatesMethods);
// Update
$updatesMethods[] = 'm4';
write_updates_file($updatesFile, $updatesMethods);
$readMethods = read_updates_file($updatesFile);
UpdaterUtils::write_updates_file($updatesFile, $updatesMethods);
$readMethods = UpdaterUtils::read_updates_file($updatesFile);
$this->assertEquals($readMethods, $updatesMethods);
unlink($updatesFile);
}
/**
* Test errors in write_updates_file(): empty updates file.
* Test errors in UpdaterUtils::write_updates_file(): empty updates file.
*
* @expectedException Exception
* @expectedExceptionMessageRegExp /Updates file path is not set(.*)/
*/
public function testWriteEmptyUpdatesFile()
{
write_updates_file('', array('test'));
UpdaterUtils::write_updates_file('', array('test'));
}
/**
* Test errors in write_updates_file(): not writable updates file.
* Test errors in UpdaterUtils::write_updates_file(): not writable updates file.
*
* @expectedException Exception
* @expectedExceptionMessageRegExp /Unable to write(.*)/
@ -99,7 +93,7 @@ public function testWriteUpdatesFileNotWritable()
touch($updatesFile);
chmod($updatesFile, 0444);
try {
@write_updates_file($updatesFile, array('test'));
@UpdaterUtils::write_updates_file($updatesFile, array('test'));
} catch (Exception $e) {
unlink($updatesFile);
throw $e;
@ -173,660 +167,4 @@ public function testUpdateFailed()
$updater = new DummyUpdater($updates, array(), $this->conf, true);
$updater->update();
}
/**
* Test update mergeDeprecatedConfig:
* 1. init a config file.
* 2. init a options.php file with update value.
* 3. merge.
* 4. check updated value in config file.
*/
public function testUpdateMergeDeprecatedConfig()
{
$this->conf->setConfigFile('tests/utils/config/configPhp');
$this->conf->reset();
$optionsFile = 'tests/updater/options.php';
$options = '<?php
$GLOBALS[\'privateLinkByDefault\'] = true;';
file_put_contents($optionsFile, $options);
// tmp config file.
$this->conf->setConfigFile('tests/updater/config');
// merge configs
$updater = new Updater(array(), array(), $this->conf, true);
// This writes a new config file in tests/updater/config.php
$updater->updateMethodMergeDeprecatedConfigFile();
// make sure updated field is changed
$this->conf->reload();
$this->assertTrue($this->conf->get('privacy.default_private_links'));
$this->assertFalse(is_file($optionsFile));
// Delete the generated file.
unlink($this->conf->getConfigFileExt());
}
/**
* Test mergeDeprecatedConfig in without options file.
*/
public function testMergeDeprecatedConfigNoFile()
{
$updater = new Updater(array(), array(), $this->conf, true);
$updater->updateMethodMergeDeprecatedConfigFile();
$this->assertEquals('root', $this->conf->get('credentials.login'));
}
/**
* Test renameDashTags update method.
*/
public function testRenameDashTags()
{
$refDB = new \ReferenceLinkDB();
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$this->assertEmpty($linkDB->filterSearch(array('searchtags' => 'exclude')));
$updater = new Updater(array(), $linkDB, $this->conf, true);
$updater->updateMethodRenameDashTags();
$this->assertNotEmpty($linkDB->filterSearch(array('searchtags' => 'exclude')));
}
/**
* Convert old PHP config file to JSON config.
*/
public function testConfigToJson()
{
$configFile = 'tests/utils/config/configPhp';
$this->conf->setConfigFile($configFile);
$this->conf->reset();
// The ConfigIO is initialized with ConfigPhp.
$this->assertTrue($this->conf->getConfigIO() instanceof ConfigPhp);
$updater = new Updater(array(), array(), $this->conf, false);
$done = $updater->updateMethodConfigToJson();
$this->assertTrue($done);
// The ConfigIO has been updated to ConfigJson.
$this->assertTrue($this->conf->getConfigIO() instanceof ConfigJson);
$this->assertTrue(file_exists($this->conf->getConfigFileExt()));
// Check JSON config data.
$this->conf->reload();
$this->assertEquals('root', $this->conf->get('credentials.login'));
$this->assertEquals('lala', $this->conf->get('redirector.url'));
$this->assertEquals('data/datastore.php', $this->conf->get('resource.datastore'));
$this->assertEquals('1', $this->conf->get('plugins.WALLABAG_VERSION'));
rename($configFile . '.save.php', $configFile . '.php');
unlink($this->conf->getConfigFileExt());
}
/**
* Launch config conversion update with an existing JSON file => nothing to do.
*/
public function testConfigToJsonNothingToDo()
{
$filetime = filemtime($this->conf->getConfigFileExt());
$updater = new Updater(array(), array(), $this->conf, false);
$done = $updater->updateMethodConfigToJson();
$this->assertTrue($done);
$expected = filemtime($this->conf->getConfigFileExt());
$this->assertEquals($expected, $filetime);
}
/**
* Test escapeUnescapedConfig with valid data.
*/
public function testEscapeConfig()
{
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
$title = '<script>alert("title");</script>';
$headerLink = '<script>alert("header_link");</script>';
$this->conf->set('general.title', $title);
$this->conf->set('general.header_link', $headerLink);
$updater = new Updater(array(), array(), $this->conf, true);
$done = $updater->updateMethodEscapeUnescapedConfig();
$this->assertTrue($done);
$this->conf->reload();
$this->assertEquals(escape($title), $this->conf->get('general.title'));
$this->assertEquals(escape($headerLink), $this->conf->get('general.header_link'));
unlink($sandbox . '.json.php');
}
/**
* Test updateMethodApiSettings(): create default settings for the API (enabled + secret).
*/
public function testUpdateApiSettings()
{
$confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php');
$conf = new ConfigManager($confFile);
$updater = new Updater(array(), array(), $conf, true);
$this->assertFalse($conf->exists('api.enabled'));
$this->assertFalse($conf->exists('api.secret'));
$updater->updateMethodApiSettings();
$conf->reload();
$this->assertTrue($conf->get('api.enabled'));
$this->assertTrue($conf->exists('api.secret'));
unlink($confFile .'.json.php');
}
/**
* Test updateMethodApiSettings(): already set, do nothing.
*/
public function testUpdateApiSettingsNothingToDo()
{
$confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php');
$conf = new ConfigManager($confFile);
$conf->set('api.enabled', false);
$conf->set('api.secret', '');
$updater = new Updater(array(), array(), $conf, true);
$updater->updateMethodApiSettings();
$this->assertFalse($conf->get('api.enabled'));
$this->assertEmpty($conf->get('api.secret'));
unlink($confFile .'.json.php');
}
/**
* Test updateMethodDatastoreIds().
*/
public function testDatastoreIds()
{
$links = array(
'20121206_182539' => array(
'linkdate' => '20121206_182539',
'title' => 'Geek and Poke',
'url' => 'http://geek-and-poke.com/',
'description' => 'desc',
'tags' => 'dev cartoon tag1 tag2 tag3 tag4 ',
'updated' => '20121206_190301',
'private' => false,
),
'20121206_172539' => array(
'linkdate' => '20121206_172539',
'title' => 'UserFriendly - Samba',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20010306',
'description' => '',
'tags' => 'samba cartoon web',
'private' => false,
),
'20121206_142300' => array(
'linkdate' => '20121206_142300',
'title' => 'UserFriendly - Web Designer',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20121206',
'description' => 'Naming conventions... #private',
'tags' => 'samba cartoon web',
'private' => true,
),
);
$refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$checksum = hash_file('sha1', self::$testDatastore);
$this->conf->set('resource.data_dir', 'sandbox');
$this->conf->set('resource.datastore', self::$testDatastore);
$updater = new Updater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds());
$linkDB = new LinkDB(self::$testDatastore, true, false);
$backup = glob($this->conf->get('resource.data_dir') . '/datastore.'. date('YmdH') .'*.php');
$backup = $backup[0];
$this->assertFileExists($backup);
$this->assertEquals($checksum, hash_file('sha1', $backup));
unlink($backup);
$this->assertEquals(3, count($linkDB));
$this->assertTrue(isset($linkDB[0]));
$this->assertFalse(isset($linkDB[0]['linkdate']));
$this->assertEquals(0, $linkDB[0]['id']);
$this->assertEquals('UserFriendly - Web Designer', $linkDB[0]['title']);
$this->assertEquals('http://ars.userfriendly.org/cartoons/?id=20121206', $linkDB[0]['url']);
$this->assertEquals('Naming conventions... #private', $linkDB[0]['description']);
$this->assertEquals('samba cartoon web', $linkDB[0]['tags']);
$this->assertTrue($linkDB[0]['private']);
$this->assertEquals(
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_142300'),
$linkDB[0]['created']
);
$this->assertTrue(isset($linkDB[1]));
$this->assertFalse(isset($linkDB[1]['linkdate']));
$this->assertEquals(1, $linkDB[1]['id']);
$this->assertEquals('UserFriendly - Samba', $linkDB[1]['title']);
$this->assertEquals(
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_172539'),
$linkDB[1]['created']
);
$this->assertTrue(isset($linkDB[2]));
$this->assertFalse(isset($linkDB[2]['linkdate']));
$this->assertEquals(2, $linkDB[2]['id']);
$this->assertEquals('Geek and Poke', $linkDB[2]['title']);
$this->assertEquals(
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_182539'),
$linkDB[2]['created']
);
$this->assertEquals(
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_190301'),
$linkDB[2]['updated']
);
}
/**
* Test updateMethodDatastoreIds() with the update already applied: nothing to do.
*/
public function testDatastoreIdsNothingToDo()
{
$refDB = new \ReferenceLinkDB();
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$this->conf->set('resource.data_dir', 'sandbox');
$this->conf->set('resource.datastore', self::$testDatastore);
$checksum = hash_file('sha1', self::$testDatastore);
$updater = new Updater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds());
$this->assertEquals($checksum, hash_file('sha1', self::$testDatastore));
}
/**
* Test defaultTheme update with default settings: nothing to do.
*/
public function testDefaultThemeWithDefaultSettings()
{
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDefaultTheme());
$this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals('default', $this->conf->get('resource.theme'));
$this->conf = new ConfigManager($sandbox);
$this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals('default', $this->conf->get('resource.theme'));
unlink($sandbox . '.json.php');
}
/**
* Test defaultTheme update with a custom theme in a subfolder
*/
public function testDefaultThemeWithCustomTheme()
{
$theme = 'iamanartist';
$sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox);
mkdir('sandbox/'. $theme);
touch('sandbox/'. $theme .'/linklist.html');
$this->conf->set('resource.raintpl_tpl', 'sandbox/'. $theme .'/');
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDefaultTheme());
$this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals($theme, $this->conf->get('resource.theme'));
$this->conf = new ConfigManager($sandbox);
$this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals($theme, $this->conf->get('resource.theme'));
unlink($sandbox . '.json.php');
unlink('sandbox/'. $theme .'/linklist.html');
rmdir('sandbox/'. $theme);
}
/**
* Test updateMethodEscapeMarkdown with markdown plugin enabled
* => setting markdown_escape set to false.
*/
public function testEscapeMarkdownSettingToFalse()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.enabled_plugins', ['markdown']);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertFalse($this->conf->get('security.markdown_escape'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertFalse($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with markdown plugin disabled
* => setting markdown_escape set to true.
*/
public function testEscapeMarkdownSettingToTrue()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.enabled_plugins', []);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertTrue($this->conf->get('security.markdown_escape'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertTrue($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with nothing to do (setting already enabled)
*/
public function testEscapeMarkdownSettingNothingToDoEnabled()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('security.markdown_escape', true);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertTrue($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodEscapeMarkdown with nothing to do (setting already disabled)
*/
public function testEscapeMarkdownSettingNothingToDoDisabled()
{
$this->conf->set('security.markdown_escape', false);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodEscapeMarkdown());
$this->assertFalse($this->conf->get('security.markdown_escape'));
}
/**
* Test updateMethodPiwikUrl with valid data
*/
public function testUpdatePiwikUrlValid()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$url = 'mypiwik.tld';
$this->conf->set('plugins.PIWIK_URL', $url);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodPiwikUrl without setting
*/
public function testUpdatePiwikUrlEmpty()
{
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEmpty($this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodPiwikUrl: valid URL, nothing to do
*/
public function testUpdatePiwikUrlNothingToDo()
{
$url = 'https://mypiwik.tld';
$this->conf->set('plugins.PIWIK_URL', $url);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEquals($url, $this->conf->get('plugins.PIWIK_URL'));
}
/**
* Test updateMethodAtomDefault with show_atom set to false
* => update to true.
*/
public function testUpdateMethodAtomDefault()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('feed.show_atom', false);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
// reload from file
$this->conf = new ConfigManager($sandboxConf);
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodAtomDefault with show_atom not set.
* => nothing to do
*/
public function testUpdateMethodAtomDefaultNoExist()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodAtomDefault with show_atom set to true.
* => nothing to do
*/
public function testUpdateMethodAtomDefaultAlreadyTrue()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('feed.show_atom', true);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodAtomDefault());
$this->assertTrue($this->conf->get('feed.show_atom'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, it should be set if none is already defined.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConf()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
$this->conf = new ConfigManager($sandboxConf);
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, it shouldn't be set if it is already defined.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfIgnore()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_max_size', 38);
$this->conf->set('general.download_timeout', 70);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(38, $this->conf->get('general.download_max_size'));
$this->assertEquals(70, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, only the maz size should be set here.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfOnlySize()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_max_size', 38);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(38, $this->conf->get('general.download_max_size'));
$this->assertEquals(30, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodDownloadSizeAndTimeoutConf, only the time out should be set here.
*/
public function testUpdateMethodDownloadSizeAndTimeoutConfOnlyTimeout()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$this->conf->set('general.download_timeout', 3);
$updater = new Updater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDownloadSizeAndTimeoutConf());
$this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
$this->assertEquals(3, $this->conf->get('general.download_timeout'));
}
/**
* Test updateMethodWebThumbnailer with thumbnails enabled.
*/
public function testUpdateMethodWebThumbnailerEnabled()
{
$this->conf->remove('thumbnails');
$this->conf->set('thumbnail.enable_thumbnails', true);
$updater = new Updater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(\Shaarli\Thumbnailer::MODE_ALL, $this->conf->get('thumbnails.mode'));
$this->assertEquals(125, $this->conf->get('thumbnails.width'));
$this->assertEquals(90, $this->conf->get('thumbnails.height'));
$this->assertContains('You have enabled or changed thumbnails', $_SESSION['warnings'][0]);
}
/**
* Test updateMethodWebThumbnailer with thumbnails disabled.
*/
public function testUpdateMethodWebThumbnailerDisabled()
{
if (isset($_SESSION['warnings'])) {
unset($_SESSION['warnings']);
}
$this->conf->remove('thumbnails');
$this->conf->set('thumbnail.enable_thumbnails', false);
$updater = new Updater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(Thumbnailer::MODE_NONE, $this->conf->get('thumbnails.mode'));
$this->assertEquals(125, $this->conf->get('thumbnails.width'));
$this->assertEquals(90, $this->conf->get('thumbnails.height'));
$this->assertTrue(empty($_SESSION['warnings']));
}
/**
* Test updateMethodWebThumbnailer with thumbnails disabled.
*/
public function testUpdateMethodWebThumbnailerNothingToDo()
{
if (isset($_SESSION['warnings'])) {
unset($_SESSION['warnings']);
}
$updater = new Updater([], [], $this->conf, true, $_SESSION);
$this->assertTrue($updater->updateMethodWebThumbnailer());
$this->assertFalse($this->conf->exists('thumbnail'));
$this->assertEquals(Thumbnailer::MODE_COMMON, $this->conf->get('thumbnails.mode'));
$this->assertEquals(90, $this->conf->get('thumbnails.width'));
$this->assertEquals(53, $this->conf->get('thumbnails.height'));
$this->assertTrue(empty($_SESSION['warnings']));
}
/**
* Test updateMethodSetSticky().
*/
public function testUpdateStickyValid()
{
$blank = [
'id' => 1,
'url' => 'z',
'title' => '',
'description' => '',
'tags' => '',
'created' => new DateTime(),
];
$links = [
1 => ['id' => 1] + $blank,
2 => ['id' => 2] + $blank,
];
$refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$updater = new Updater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LinkDB(self::$testDatastore, true, false);
foreach ($linkDB as $link) {
$this->assertFalse($link['sticky']);
}
}
/**
* Test updateMethodSetSticky().
*/
public function testUpdateStickyNothingToDo()
{
$blank = [
'id' => 1,
'url' => 'z',
'title' => '',
'description' => '',
'tags' => '',
'created' => new DateTime(),
];
$links = [
1 => ['id' => 1, 'sticky' => true] + $blank,
2 => ['id' => 2] + $blank,
];
$refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
$updater = new Updater(array(), $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LinkDB(self::$testDatastore, true, false);
$this->assertTrue($linkDB[1]['sticky']);
}
/**
* Test updateMethodRemoveRedirector().
*/
public function testUpdateRemoveRedirector()
{
$sandboxConf = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandboxConf . '.json.php');
$this->conf = new ConfigManager($sandboxConf);
$updater = new Updater([], null, $this->conf, true);
$this->assertTrue($updater->updateMethodRemoveRedirector());
$this->assertFalse($this->conf->exists('redirector'));
$this->conf = new ConfigManager($sandboxConf);
$this->assertFalse($this->conf->exists('redirector'));
}
}

View file

@ -0,0 +1,18 @@
<?php
use Shaarli\Bookmark\BookmarkArray;
use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Bookmark\BookmarkIO;
use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\Exception\EmptyDataStoreException;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
class FakeBookmarkService extends BookmarkFileService
{
public function getBookmarks()
{
return $this->bookmarks;
}
}

View file

@ -76,7 +76,7 @@ public function write($filename)
}
/**
* Returns the number of links in the reference data
* Returns the number of bookmarks in the reference data
*/
public function count()
{

View file

@ -1,30 +1,39 @@
<?php
use Shaarli\Bookmark\LinkDB;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkArray;
/**
* Populates a reference datastore to test LinkDB
* Populates a reference datastore to test Bookmark
*/
class ReferenceLinkDB
{
public static $NB_LINKS_TOTAL = 11;
private $_links = array();
private $bookmarks = array();
private $_publicCount = 0;
private $_privateCount = 0;
private $isLegacy;
/**
* Populates the test DB with reference data
*
* @param bool $isLegacy Use links as array instead of Bookmark object
*/
public function __construct()
public function __construct($isLegacy = false)
{
$this->isLegacy = $isLegacy;
if (! $this->isLegacy) {
$this->bookmarks = new BookmarkArray();
}
$this->addLink(
11,
'Pined older',
'?PCRizQ',
'This is an older pinned link',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20100309_101010'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20100309_101010'),
'',
null,
'PCRizQ',
@ -37,7 +46,7 @@ public function __construct()
'?0gCTjQ',
'This is a pinned link',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121207_152312'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121207_152312'),
'',
null,
'0gCTjQ',
@ -50,7 +59,7 @@ public function __construct()
'?WDWyig',
'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'),
'sTuff',
null,
'WDWyig'
@ -60,9 +69,9 @@ public function __construct()
42,
'Note: I have a big ID but an old date',
'?WDWyig',
'Used to test links reordering.',
'Used to test bookmarks reordering.',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20100310_101010'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20100310_101010'),
'ut'
);
@ -72,7 +81,7 @@ public function __construct()
'http://www.php-fig.org/psr/psr-2/',
'This guide extends and expands on PSR-1, the basic coding standard.',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_152312'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_152312'),
''
);
@ -82,9 +91,9 @@ public function __construct()
'https://static.fsf.org/nosvn/faif-2.0.pdf',
'Richard Stallman and the Free Software Revolution. Read this. #hashtag',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'),
'free gnu software stallman -exclude stuff hashtag',
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160803_093033')
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160803_093033')
);
$this->addLink(
@ -93,9 +102,9 @@ public function __construct()
'http://mediagoblin.org/',
'A free software media publishing platform #hashtagOther',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130614_184135'),
'gnu media web .hidden hashtag',
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130615_184230'),
'IuWvgA'
);
@ -105,7 +114,7 @@ public function __construct()
'https://dvcs.w3.org/hg/markup-validator/summary',
'Mercurial repository for the W3C Validator #private',
1,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20141125_084734'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20141125_084734'),
'css html w3c web Mercurial'
);
@ -115,7 +124,7 @@ public function __construct()
'http://ars.userfriendly.org/cartoons/?id=20121206',
'Naming conventions... #private',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_142300'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_142300'),
'dev cartoon web'
);
@ -125,7 +134,7 @@ public function __construct()
'http://ars.userfriendly.org/cartoons/?id=20010306',
'Tropical printing',
0,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_172539'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_172539'),
'samba cartoon web'
);
@ -135,7 +144,7 @@ public function __construct()
'http://geek-and-poke.com/',
'',
1,
DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_182539'),
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_182539'),
'dev cartoon tag1 tag2 tag3 tag4 '
);
}
@ -164,10 +173,15 @@ protected function addLink(
'tags' => $tags,
'created' => $date,
'updated' => $updated,
'shorturl' => $shorturl ? $shorturl : smallHash($date->format(LinkDB::LINK_DATE_FORMAT) . $id),
'shorturl' => $shorturl ? $shorturl : smallHash($date->format(Bookmark::LINK_DATE_FORMAT) . $id),
'sticky' => $pinned
);
$this->_links[$id] = $link;
if (! $this->isLegacy) {
$bookmark = new Bookmark();
$this->bookmarks[$id] = $bookmark->fromArray($link);
} else {
$this->bookmarks[$id] = $link;
}
if ($private) {
$this->_privateCount++;
@ -184,27 +198,27 @@ public function write($filename)
$this->reorder();
file_put_contents(
$filename,
'<?php /* '.base64_encode(gzdeflate(serialize($this->_links))).' */ ?>'
'<?php /* '.base64_encode(gzdeflate(serialize($this->bookmarks))).' */ ?>'
);
}
/**
* Reorder links by creation date (newest first).
*
* Also update the urls and ids mapping arrays.
*
* @param string $order ASC|DESC
*/
public function reorder($order = 'DESC')
{
if (! $this->isLegacy) {
$this->bookmarks->reorder($order);
} else {
$order = $order === 'ASC' ? -1 : 1;
// backward compatibility: ignore reorder if the the `created` field doesn't exist
if (! isset(array_values($this->_links)[0]['created'])) {
if (! isset(array_values($this->bookmarks)[0]['created'])) {
return;
}
$order = $order === 'ASC' ? -1 : 1;
// Reorder array by dates.
usort($this->_links, function ($a, $b) use ($order) {
usort($this->bookmarks, function ($a, $b) use ($order) {
if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) {
return $a['sticky'] ? -1 : 1;
}
@ -212,9 +226,10 @@ public function reorder($order = 'DESC')
return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
});
}
}
/**
* Returns the number of links in the reference data
* Returns the number of bookmarks in the reference data
*/
public function countLinks()
{
@ -222,7 +237,7 @@ public function countLinks()
}
/**
* Returns the number of public links in the reference data
* Returns the number of public bookmarks in the reference data
*/
public function countPublicLinks()
{
@ -230,7 +245,7 @@ public function countPublicLinks()
}
/**
* Returns the number of private links in the reference data
* Returns the number of private bookmarks in the reference data
*/
public function countPrivateLinks()
{
@ -238,32 +253,38 @@ public function countPrivateLinks()
}
/**
* Returns the number of links without tag
* Returns the number of bookmarks without tag
*/
public function countUntaggedLinks()
{
$cpt = 0;
foreach ($this->_links as $link) {
foreach ($this->bookmarks as $link) {
if (! $this->isLegacy) {
if (empty($link->getTags())) {
++$cpt;
}
} else {
if (empty($link['tags'])) {
++$cpt;
}
}
}
return $cpt;
}
public function getLinks()
{
$this->reorder();
return $this->_links;
return $this->bookmarks;
}
/**
* Setter to override link creation.
*
* @param array $links List of links.
* @param array $links List of bookmarks.
*/
public function setLinks($links)
{
$this->_links = $links;
$this->bookmarks = $links;
}
}

View file

@ -41,12 +41,12 @@
"foo": "bar"
},
"resource": {
"datastore": "tests\/utils\/config\/datastore.php",
"datastore": "sandbox/datastore.php",
"data_dir": "sandbox\/",
"raintpl_tpl": "tpl\/",
"config": "data\/config.php",
"ban_file": "data\/ipbans.php",
"updates": "data\/updates.txt",
"updates": "sandbox/updates.txt",
"log": "data\/log.txt",
"update_check": "data\/lastupdatecheck.txt",
"history": "data\/history.php",
@ -59,7 +59,7 @@
"WALLABAG_VERSION": 1
},
"dev": {
"debug": true
"debug": false
},
"updates": {
"check_updates": false,