<?php
+namespace Shaarli;
+
+use Exception;
+use Shaarli\Config\ConfigManager;
+
/**
* Shaarli (application) utilities
*/
return false;
}
} else {
- if (! is_file($remote)) {
+ if (!is_file($remote)) {
return false;
}
$data = file_get_contents($remote);
// Do not check versions for visitors
// Do not check if the user doesn't want to
// Do not check with dev version
- if (! $isLoggedIn || empty($enableCheck) || $currentVersion === 'dev') {
+ if (!$isLoggedIn || empty($enableCheck) || $currentVersion === 'dev') {
return false;
}
return false;
}
- if (! in_array($branch, self::$GIT_BRANCHES)) {
+ if (!in_array($branch, self::$GIT_BRANCHES)) {
throw new Exception(
'Invalid branch selected for updates: "' . $branch . '"'
);
self::$GIT_URL . '/' . $branch . '/' . self::$VERSION_FILE
);
- if (! $latestVersion) {
+ if (!$latestVersion) {
// Only update the file's modification date
file_put_contents($updateFile, $currentVersion);
return false;
if (version_compare($curVersion, $minVersion) < 0) {
$msg = t(
'Your PHP version is obsolete!'
- . ' Shaarli requires at least PHP %s, and thus cannot run.'
- . ' Your PHP version has known security vulnerabilities and should be'
- . ' updated as soon as possible.'
+ . ' Shaarli requires at least PHP %s, and thus cannot run.'
+ . ' Your PHP version has known security vulnerabilities and should be'
+ . ' updated as soon as possible.'
);
throw new Exception(sprintf($msg, $minVersion));
}
// Check script and template directories are readable
foreach (array(
- 'application',
- 'inc',
- 'plugins',
- $rainTplDir,
- $rainTplDir.'/'.$conf->get('resource.theme'),
- ) as $path) {
- if (! is_readable(realpath($path))) {
- $errors[] = '"'.$path.'" '. t('directory is not readable');
+ 'application',
+ 'inc',
+ 'plugins',
+ $rainTplDir,
+ $rainTplDir . '/' . $conf->get('resource.theme'),
+ ) as $path) {
+ if (!is_readable(realpath($path))) {
+ $errors[] = '"' . $path . '" ' . t('directory is not readable');
}
}
// Check cache and data directories are readable and writable
foreach (array(
- $conf->get('resource.thumbnails_cache'),
- $conf->get('resource.data_dir'),
- $conf->get('resource.page_cache'),
- $conf->get('resource.raintpl_tmp'),
- ) as $path) {
- if (! is_readable(realpath($path))) {
- $errors[] = '"'.$path.'" '. t('directory is not readable');
+ $conf->get('resource.thumbnails_cache'),
+ $conf->get('resource.data_dir'),
+ $conf->get('resource.page_cache'),
+ $conf->get('resource.raintpl_tmp'),
+ ) as $path) {
+ if (!is_readable(realpath($path))) {
+ $errors[] = '"' . $path . '" ' . t('directory is not readable');
}
- if (! is_writable(realpath($path))) {
- $errors[] = '"'.$path.'" '. t('directory is not writable');
+ if (!is_writable(realpath($path))) {
+ $errors[] = '"' . $path . '" ' . t('directory is not writable');
}
}
// Check configuration files are readable and writable
foreach (array(
- $conf->getConfigFileExt(),
- $conf->get('resource.datastore'),
- $conf->get('resource.ban_file'),
- $conf->get('resource.log'),
- $conf->get('resource.update_check'),
- ) as $path) {
- if (! is_file(realpath($path))) {
+ $conf->getConfigFileExt(),
+ $conf->get('resource.datastore'),
+ $conf->get('resource.ban_file'),
+ $conf->get('resource.log'),
+ $conf->get('resource.update_check'),
+ ) as $path) {
+ if (!is_file(realpath($path))) {
# the file may not exist yet
continue;
}
- if (! is_readable(realpath($path))) {
- $errors[] = '"'.$path.'" '. t('file is not readable');
+ if (!is_readable(realpath($path))) {
+ $errors[] = '"' . $path . '" ' . t('file is not readable');
}
- if (! is_writable(realpath($path))) {
- $errors[] = '"'.$path.'" '. t('file is not writable');
+ if (!is_writable(realpath($path))) {
+ $errors[] = '"' . $path . '" ' . t('file is not writable');
}
}
<?php
-require_once 'exceptions/IOException.php';
+namespace Shaarli;
+
+use Shaarli\Exceptions\IOException;
/**
* Class FileUtils
return file_put_contents(
$file,
- self::$phpPrefix.base64_encode(gzdeflate(serialize($content))).self::$phpSuffix
+ self::$phpPrefix . base64_encode(gzdeflate(serialize($content))) . self::$phpSuffix
);
}
{
// Note that gzinflate is faster than gzuncompress.
// See: http://www.php.net/manual/en/function.gzdeflate.php#96439
- if (! is_readable($file)) {
+ if (!is_readable($file)) {
return $default;
}
<?php
+namespace Shaarli;
+
+use DateTime;
+use Exception;
/**
* Class History
* History constructor.
*
* @param string $historyFilePath History file path.
- * @param int $retentionTime History content rentention time in seconds.
+ * @param int $retentionTime History content retention time in seconds.
*
* @throws Exception if something goes wrong.
*/
*/
protected function check()
{
- if (! is_file($this->historyFilePath)) {
+ if (!is_file($this->historyFilePath)) {
FileUtils::writeFlatDB($this->historyFilePath, []);
}
- if (! is_writable($this->historyFilePath)) {
+ if (!is_writable($this->historyFilePath)) {
throw new Exception(t('History file isn\'t readable or writable'));
}
}
*/
protected function write()
{
- $comparaison = new DateTime('-'. $this->retentionTime . ' seconds');
+ $comparaison = new DateTime('-' . $this->retentionTime . ' seconds');
foreach ($this->history as $key => $value) {
if ($value['datetime'] < $comparaison) {
unset($this->history[$key]);
namespace Shaarli;
use Gettext\GettextTranslator;
-use Gettext\Merge;
use Gettext\Translations;
use Gettext\Translator;
use Gettext\TranslatorInterface;
<?php
+namespace Shaarli;
/**
* Class Router
return self::$PAGE_LINKLIST;
}
- if (startsWith($query, 'do='. self::$PAGE_LOGIN) && $loggedIn === false) {
+ if (startsWith($query, 'do=' . self::$PAGE_LOGIN) && $loggedIn === false) {
return self::$PAGE_LOGIN;
}
- if (startsWith($query, 'do='. self::$PAGE_PICWALL)) {
+ if (startsWith($query, 'do=' . self::$PAGE_PICWALL)) {
return self::$PAGE_PICWALL;
}
- if (startsWith($query, 'do='. self::$PAGE_TAGCLOUD)) {
+ if (startsWith($query, 'do=' . self::$PAGE_TAGCLOUD)) {
return self::$PAGE_TAGCLOUD;
}
- if (startsWith($query, 'do='. self::$PAGE_TAGLIST)) {
+ if (startsWith($query, 'do=' . self::$PAGE_TAGLIST)) {
return self::$PAGE_TAGLIST;
}
- if (startsWith($query, 'do='. self::$PAGE_OPENSEARCH)) {
+ if (startsWith($query, 'do=' . self::$PAGE_OPENSEARCH)) {
return self::$PAGE_OPENSEARCH;
}
- if (startsWith($query, 'do='. self::$PAGE_DAILY)) {
+ if (startsWith($query, 'do=' . self::$PAGE_DAILY)) {
return self::$PAGE_DAILY;
}
- if (startsWith($query, 'do='. self::$PAGE_FEED_ATOM)) {
+ if (startsWith($query, 'do=' . self::$PAGE_FEED_ATOM)) {
return self::$PAGE_FEED_ATOM;
}
- if (startsWith($query, 'do='. self::$PAGE_FEED_RSS)) {
+ if (startsWith($query, 'do=' . self::$PAGE_FEED_RSS)) {
return self::$PAGE_FEED_RSS;
}
- if (startsWith($query, 'do='. self::$PAGE_THUMBS_UPDATE)) {
+ if (startsWith($query, 'do=' . self::$PAGE_THUMBS_UPDATE)) {
return self::$PAGE_THUMBS_UPDATE;
}
- if (startsWith($query, 'do='. self::$AJAX_THUMB_UPDATE)) {
+ if (startsWith($query, 'do=' . self::$AJAX_THUMB_UPDATE)) {
return self::$AJAX_THUMB_UPDATE;
}
return self::$PAGE_LINKLIST;
}
- if (startsWith($query, 'do='. self::$PAGE_TOOLS)) {
+ if (startsWith($query, 'do=' . self::$PAGE_TOOLS)) {
return self::$PAGE_TOOLS;
}
- if (startsWith($query, 'do='. self::$PAGE_CHANGEPASSWORD)) {
+ if (startsWith($query, 'do=' . self::$PAGE_CHANGEPASSWORD)) {
return self::$PAGE_CHANGEPASSWORD;
}
- if (startsWith($query, 'do='. self::$PAGE_CONFIGURE)) {
+ if (startsWith($query, 'do=' . self::$PAGE_CONFIGURE)) {
return self::$PAGE_CONFIGURE;
}
- if (startsWith($query, 'do='. self::$PAGE_CHANGETAG)) {
+ if (startsWith($query, 'do=' . self::$PAGE_CHANGETAG)) {
return self::$PAGE_CHANGETAG;
}
- if (startsWith($query, 'do='. self::$PAGE_ADDLINK)) {
+ if (startsWith($query, 'do=' . self::$PAGE_ADDLINK)) {
return self::$PAGE_ADDLINK;
}
return self::$PAGE_DELETELINK;
}
- if (startsWith($query, 'do='. self::$PAGE_PINLINK)) {
+ if (startsWith($query, 'do=' . self::$PAGE_PINLINK)) {
return self::$PAGE_PINLINK;
}
- if (startsWith($query, 'do='. self::$PAGE_EXPORT)) {
+ if (startsWith($query, 'do=' . self::$PAGE_EXPORT)) {
return self::$PAGE_EXPORT;
}
- if (startsWith($query, 'do='. self::$PAGE_IMPORT)) {
+ if (startsWith($query, 'do=' . self::$PAGE_IMPORT)) {
return self::$PAGE_IMPORT;
}
- if (startsWith($query, 'do='. self::$PAGE_PLUGINSADMIN)) {
+ if (startsWith($query, 'do=' . self::$PAGE_PLUGINSADMIN)) {
return self::$PAGE_PLUGINSADMIN;
}
- if (startsWith($query, 'do='. self::$PAGE_SAVE_PLUGINSADMIN)) {
+ if (startsWith($query, 'do=' . self::$PAGE_SAVE_PLUGINSADMIN)) {
return self::$PAGE_SAVE_PLUGINSADMIN;
}
- if (startsWith($query, 'do='. self::$GET_TOKEN)) {
+ if (startsWith($query, 'do=' . self::$GET_TOKEN)) {
return self::$GET_TOKEN;
}
namespace Shaarli;
use Shaarli\Config\ConfigManager;
+use WebThumbnailer\Application\ConfigManager as WTConfigManager;
use WebThumbnailer\Exception\WebThumbnailerException;
use WebThumbnailer\WebThumbnailer;
-use WebThumbnailer\Application\ConfigManager as WTConfigManager;
/**
* Class Thumbnailer
<?php
namespace Shaarli\Api;
-use Shaarli\Api\Exceptions\ApiException;
use Shaarli\Api\Exceptions\ApiAuthorizationException;
-
+use Shaarli\Api\Exceptions\ApiException;
use Shaarli\Config\ConfigManager;
use Slim\Container;
use Slim\Http\Request;
*/
protected function setLinkDb($conf)
{
- $linkDb = new \LinkDB(
+ $linkDb = new \Shaarli\Bookmark\LinkDB(
$conf->get('resource.datastore'),
true,
$conf->get('privacy.hide_public_links'),
<?php
namespace Shaarli\Api;
-use Shaarli\Base64Url;
use Shaarli\Api\Exceptions\ApiAuthorizationException;
+use Shaarli\Http\Base64Url;
/**
* REST API utilities
/**
* Validates a JWT token authenticity.
*
- * @param string $token JWT token extracted from the headers.
+ * @param string $token JWT token extracted from the headers.
* @param string $secret API secret set in the settings.
*
* @throws ApiAuthorizationException the token is not valid.
/**
* Format a Link for the REST API.
*
- * @param array $link Link data read from the datastore.
+ * @param array $link Link data read from the datastore.
* @param string $indexUrl Shaarli's index URL (used for relative URL).
*
* @return array Link data formatted for the REST API.
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
-use \Slim\Container;
+use Slim\Container;
/**
* Abstract Class ApiController
protected $conf;
/**
- * @var \LinkDB
+ * @var LinkDB
*/
protected $linkDb;
/**
- * @var \History
+ * @var HistoryController
*/
protected $history;
*
* @package Shaarli\Api\Controllers
*/
-class History extends ApiController
+class HistoryController extends ApiController
{
/**
* Service providing operation regarding Shaarli datastore and settings.
use Shaarli\Api\ApiUtils;
use Shaarli\Api\Exceptions\ApiBadParametersException;
-use Shaarli\Api\Exceptions\ApiLinkNotFoundException;
use Shaarli\Api\Exceptions\ApiTagNotFoundException;
use Slim\Http\Request;
use Slim\Http\Response;
namespace Shaarli\Api\Exceptions;
-use Slim\Http\Response;
-
/**
* Class ApiLinkNotFoundException
*
namespace Shaarli\Api\Exceptions;
-use Slim\Http\Response;
-
/**
* Class ApiTagNotFoundException
*
<?php
+
+namespace Shaarli\Bookmark;
+
+use ArrayAccess;
+use Countable;
+use DateTime;
+use Iterator;
+use Shaarli\Bookmark\Exception\LinkNotFoundException;
+use Shaarli\Exceptions\IOException;
+use Shaarli\FileUtils;
+
/**
* Data storage for links.
*
$redirector = '',
$redirectorEncode = true
) {
+
$this->datastore = $datastore;
$this->loggedIn = $isLoggedIn;
$this->hidePublicLinks = $hidePublicLinks;
if (!isset($value['id']) || empty($value['url'])) {
die(t('Internal Error: A link should always have an id and URL.'));
}
- if (($offset !== null && ! is_int($offset)) || ! is_int($value['id'])) {
+ if (($offset !== null && !is_int($offset)) || !is_int($value['id'])) {
die(t('You must specify an integer as a key.'));
}
if ($offset !== null && $offset !== $value['id']) {
$this->links = array();
$link = array(
'id' => 1,
- 'title'=> t('The personal, minimalist, super-fast, database free, bookmarking service'),
- 'url'=>'https://shaarli.readthedocs.io',
- 'description'=>t(
+ 'title' => t('The personal, minimalist, super-fast, database free, bookmarking service'),
+ 'url' => 'https://shaarli.readthedocs.io',
+ 'description' => t(
'Welcome to Shaarli! This is your first public bookmark. '
- .'To edit or delete me, you must first login.
+ . 'To edit or delete me, you must first login.
To learn how to use Shaarli, consult the link "Documentation" at the bottom of this page.
You use the community supported version of the original Shaarli project, by Sebastien Sauvage.'
),
- 'private'=>0,
- 'created'=> new DateTime(),
- 'tags'=>'opensource software'
+ 'private' => 0,
+ 'created' => new DateTime(),
+ 'tags' => 'opensource software'
);
$link['shorturl'] = link_small_hash($link['created'], $link['id']);
$this->links[1] = $link;
$link = array(
'id' => 0,
- 'title'=> t('My secret stuff... - Pastebin.com'),
- 'url'=>'http://sebsauvage.net/paste/?8434b27936c09649#bR7XsXhoTiLcqCpQbmOpBi3rq2zzQUC5hBI7ZT1O3x8=',
- 'description'=> t('Shhhh! I\'m a private link only YOU can see. You can delete me too.'),
- 'private'=>1,
- 'created'=> new DateTime('1 minute ago'),
- 'tags'=>'secretstuff',
+ 'title' => t('My secret stuff... - Pastebin.com'),
+ 'url' => 'http://sebsauvage.net/paste/?8434b27936c09649#bR7XsXhoTiLcqCpQbmOpBi3rq2zzQUC5hBI7ZT1O3x8=',
+ 'description' => t('Shhhh! I\'m a private link only YOU can see. You can delete me too.'),
+ 'private' => 1,
+ 'created' => new DateTime('1 minute ago'),
+ 'tags' => 'secretstuff',
);
$link['shorturl'] = link_small_hash($link['created'], $link['id']);
$this->links[0] = $link;
$toremove = array();
foreach ($this->links as $key => &$link) {
- if (! $this->loggedIn && $link['private'] != 0) {
+ if (!$this->loggedIn && $link['private'] != 0) {
// Transition for not upgraded databases.
unset($this->links[$key]);
continue;
sanitizeLink($link);
// Remove private tags if the user is not logged in.
- if (! $this->loggedIn) {
+ if (!$this->loggedIn) {
$link['tags'] = preg_replace('/(^|\s+)\.[^($|\s)]+\s*/', ' ', $link['tags']);
}
}
// To be able to load links before running the update, and prepare the update
- if (! isset($link['created'])) {
+ if (!isset($link['created'])) {
$link['id'] = $link['linkdate'];
$link['created'] = DateTime::createFromFormat(self::LINK_DATE_FORMAT, $link['linkdate']);
- if (! empty($link['updated'])) {
+ if (!empty($link['updated'])) {
$link['updated'] = DateTime::createFromFormat(self::LINK_DATE_FORMAT, $link['updated']);
}
$link['shorturl'] = smallHash($link['linkdate']);
/**
* Filter links according to search parameters.
*
- * @param array $filterRequest Search request content. Supported keys:
+ * @param array $filterRequest Search request content. Supported keys:
* - searchtags: list of tags
* - searchterm: term search
- * @param bool $casesensitive Optional: Perform case sensitive filter
- * @param string $visibility return only all/private/public links
- * @param string $untaggedonly return only untagged links
+ * @param bool $casesensitive Optional: Perform case sensitive filter
+ * @param string $visibility return only all/private/public links
+ * @param bool $untaggedonly return only untagged links
*
* @return array filtered links, all links if no suitable filter was provided.
*/
$visibility = 'all',
$untaggedonly = false
) {
+
// Filter link database according to parameters.
$searchtags = isset($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : '';
$searchterm = isset($filterRequest['searchterm']) ? escape($filterRequest['searchterm']) : '';
/**
* Returns the list tags appearing in the links with the given tags
*
- * @param array $filteringTags tags selecting the links to consider
- * @param string $visibility process only all/private/public links
+ * @param array $filteringTags tags selecting the links to consider
+ * @param string $visibility process only all/private/public links
*
* @return array tag => linksCount
*/
<?php
+namespace Shaarli\Bookmark;
+
+use Exception;
+use Shaarli\Bookmark\Exception\LinkNotFoundException;
+
/**
* Class LinkFilter.
*
/**
* @var string permalinks.
*/
- public static $FILTER_HASH = 'permalink';
+ public static $FILTER_HASH = 'permalink';
/**
* @var string text search.
*/
- public static $FILTER_TEXT = 'fulltext';
+ public static $FILTER_TEXT = 'fulltext';
/**
* @var string tag filter.
*/
- public static $FILTER_TAG = 'tags';
+ public static $FILTER_TAG = 'tags';
/**
* @var string filter by day.
*/
- public static $FILTER_DAY = 'FILTER_DAY';
+ public static $FILTER_DAY = 'FILTER_DAY';
/**
* @var string Allowed characters for hashtags (regex syntax).
*/
public function filter($type, $request, $casesensitive = false, $visibility = 'all', $untaggedonly = false)
{
- if (! in_array($visibility, ['all', 'public', 'private'])) {
+ if (!in_array($visibility, ['all', 'public', 'private'])) {
$visibility = 'all';
}
foreach ($this->links as $key => $value) {
if ($value['private'] && $visibility === 'private') {
$out[$key] = $value;
- } elseif (! $value['private'] && $visibility === 'public') {
+ } elseif (!$value['private'] && $visibility === 'public') {
$out[$key] = $value;
}
}
*
* @return array $filtered array containing permalink data.
*
- * @throws LinkNotFoundException if the smallhash doesn't match any link.
+ * @throws \Shaarli\Bookmark\Exception\LinkNotFoundException if the smallhash doesn't match any link.
*/
private function filterSmallHash($smallHash)
{
* - see https://github.com/shaarli/Shaarli/issues/75 for examples
*
* @param string $searchterms search query.
- * @param string $visibility Optional: return only all/private/public links.
+ * @param string $visibility Optional: return only all/private/public links.
*
* @return array search results.
*/
foreach ($this->links as $id => $link) {
// ignore non private links when 'privatonly' is on.
if ($visibility !== 'all') {
- if (! $link['private'] && $visibility === 'private') {
+ if (!$link['private'] && $visibility === 'private') {
continue;
} elseif ($link['private'] && $visibility === 'public') {
continue;
/**
* generate a regex fragment out of a tag
+ *
* @param string $tag to to generate regexs from. may start with '-' to negate, contain '*' as wildcard
+ *
* @return string generated regex fragment
*/
private static function tag2regex($tag)
// check level of visibility
// ignore non private links when 'privateonly' is on.
if ($visibility !== 'all') {
- if (! $link['private'] && $visibility === 'private') {
+ if (!$link['private'] && $visibility === 'private') {
continue;
} elseif ($link['private'] && $visibility === 'public') {
continue;
$filtered = [];
foreach ($this->links as $key => $link) {
if ($visibility !== 'all') {
- if (! $link['private'] && $visibility === 'private') {
+ if (!$link['private'] && $visibility === 'private') {
continue;
} elseif ($link['private'] && $visibility === 'public') {
continue;
*/
public function filterDay($day)
{
- if (! checkDateFormat('Ymd', $day)) {
+ if (!checkDateFormat('Ymd', $day)) {
throw new Exception('Invalid date format');
}
return preg_split('/\s+/', $tagsOut, -1, PREG_SPLIT_NO_EMPTY);
}
}
-
-class LinkNotFoundException extends Exception
-{
- /**
- * LinkNotFoundException constructor.
- */
- public function __construct()
- {
- $this->message = t('The link you are trying to reach does not exist or has been deleted.');
- }
-}
<?php
+use Shaarli\Bookmark\LinkDB;
+
/**
* Get cURL callback function for CURLOPT_WRITEFUNCTION
*
* @param string $charset to extract from the downloaded page (reference)
* @param string $title to extract from the downloaded page (reference)
- * @param string $curlGetInfo Optionnaly overrides curl_getinfo function
+ * @param string $curlGetInfo Optionally overrides curl_getinfo function
*
* @return Closure
*/
*
* @param string $description shaare's description.
* @param string $redirector if a redirector is set, use it to gerenate links.
- * @param bool $urlEncode Use `urlencode()` on the URL after the redirector or not.
+ * @param bool $urlEncode Use `urlencode()` on the URL after the redirector or not.
* @param string $indexUrl URL to Shaarli's index.
* @return string formatted description.
--- /dev/null
+<?php
+namespace Shaarli\Bookmark\Exception;
+
+use Exception;
+
+class LinkNotFoundException extends Exception
+{
+ /**
+ * LinkNotFoundException constructor.
+ */
+ public function __construct()
+ {
+ $this->message = t('The link you are trying to reach does not exist or has been deleted.');
+ }
+}
$print = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0;
$data = self::getPhpHeaders() . json_encode($conf, $print) . self::getPhpSuffix();
if (!file_put_contents($filepath, $data)) {
- throw new \IOException(
+ throw new \Shaarli\Exceptions\IOException(
$filepath,
t('Shaarli could not create the config file. '.
'Please make sure Shaarli has the right to write in the folder is it installed in.')
*
* @throws MissingFieldConfigException: a mandatory field has not been provided in $conf.
* @throws UnauthorizedConfigException: user is not authorize to change configuration.
- * @throws \IOException: an error occurred while writing the new config file.
+ * @throws \Shaarli\Exceptions\IOException: an error occurred while writing the new config file.
*/
public function write($isLoggedIn)
{
/**
* Map legacy config keys with the new ones.
* If ConfigPhp is used, getting <newkey> will actually look for <legacykey>.
- * The Updater will use this array to transform keys when switching to JSON.
+ * The updater will use this array to transform keys when switching to JSON.
*
* @var array current key => legacy key.
*/
if (!file_put_contents($filepath, $configStr)
|| strcmp(file_get_contents($filepath), $configStr) != 0
) {
- throw new \IOException(
+ throw new \Shaarli\Exceptions\IOException(
$filepath,
t('Shaarli could not create the config file. '.
'Please make sure Shaarli has the right to write in the folder is it installed in.')
<?php
+namespace Shaarli\Exceptions;
+
+use Exception;
/**
* Exception class thrown when a filesystem access failure happens
{
$this->path = $path;
$this->message = empty($message) ? t('Error accessing') : $message;
- $this->message .= ' "' . $this->path .'"';
+ $this->message .= ' "' . $this->path . '"';
}
}
<?php
+
+namespace Shaarli\Feed;
+
/**
* Simple cache system, mainly for the RSS/ATOM feeds
*/
{
// TODO: check write access to the cache directory
$this->cacheDir = $cacheDir;
- $this->filename = $this->cacheDir.'/'.sha1($url).'.cache';
+ $this->filename = $this->cacheDir . '/' . sha1($url) . '.cache';
$this->shouldBeCached = $shouldBeCached;
}
<?php
+namespace Shaarli\Feed;
+
+use DateTime;
/**
* FeedBuilder class.
public static $DEFAULT_NB_LINKS = 50;
/**
- * @var LinkDB instance.
+ * @var \Shaarli\Bookmark\LinkDB instance.
*/
protected $linkDB;
protected $feedType;
/**
- * @var array $_SERVER.
+ * @var array $_SERVER
*/
protected $serverInfo;
/**
- * @var array $_GET.
+ * @var array $_GET
*/
protected $userInput;
/**
* Feed constructor.
*
- * @param LinkDB $linkDB LinkDB instance.
- * @param string $feedType Type of feed.
- * @param array $serverInfo $_SERVER.
- * @param array $userInput $_GET.
- * @param boolean $isLoggedIn True if the user is currently logged in, false otherwise.
+ * @param \Shaarli\Bookmark\LinkDB $linkDB LinkDB instance.
+ * @param string $feedType Type of feed.
+ * @param array $serverInfo $_SERVER.
+ * @param array $userInput $_GET.
+ * @param boolean $isLoggedIn True if the user is currently logged in,
+ * false otherwise.
*/
public function __construct($linkDB, $feedType, $serverInfo, $userInput, $isLoggedIn)
{
$data['show_dates'] = !$this->hideDates || $this->isLoggedIn;
// Remove leading slash from REQUEST_URI.
$data['self_link'] = escape(server_url($this->serverInfo))
- . escape($this->serverInfo['REQUEST_URI']);
+ . escape($this->serverInfo['REQUEST_URI']);
$data['index_url'] = $pageaddr;
$data['usepermalinks'] = $this->usePermalinks === true;
$data['links'] = $linkDisplayed;
*/
protected function buildItem($link, $pageaddr)
{
- $link['guid'] = $pageaddr .'?'. $link['shorturl'];
+ $link['guid'] = $pageaddr . '?' . $link['shorturl'];
// Check for both signs of a note: starting with ? and 7 chars long.
if ($link['url'][0] === '?' && strlen($link['url']) === 7) {
$link['url'] = $pageaddr . $link['url'];
}
if ($this->usePermalinks === true) {
- $permalink = '<a href="'. $link['url'] .'" title="'. t('Direct link') .'">'. t('Direct link') .'</a>';
+ $permalink = '<a href="' . $link['url'] . '" title="' . t('Direct link') . '">' . t('Direct link') . '</a>';
} else {
- $permalink = '<a href="'. $link['guid'] .'" title="'. t('Permalink') .'">'. t('Permalink') .'</a>';
+ $permalink = '<a href="' . $link['guid'] . '" title="' . t('Permalink') . '">' . t('Permalink') . '</a>';
}
- $link['description'] = format_description($link['description'], '', false, $pageaddr);
- $link['description'] .= PHP_EOL .'<br>— '. $permalink;
+ $link['description'] = format_description($link['description'], '', false, $pageaddr);
+ $link['description'] .= PHP_EOL . '<br>— ' . $permalink;
$pubDate = $link['created'];
$link['pub_iso_date'] = $this->getIsoDate($pubDate);
$link['up_iso_date'] = $this->getIsoDate($upDate, DateTime::ATOM);
} else {
$link['up_iso_date'] = $this->getIsoDate($pubDate, DateTime::ATOM);
- ;
}
// Save the more recent item.
public function getTypeLanguage()
{
// Use the locale do define the language, if available.
- if (! empty($this->locale) && preg_match('/^\w{2}[_\-]\w{2}/', $this->locale)) {
- $length = ($this->feedType == self::$FEED_RSS) ? 5 : 2;
+ if (!empty($this->locale) && preg_match('/^\w{2}[_\-]\w{2}/', $this->locale)) {
+ $length = ($this->feedType === self::$FEED_RSS) ? 5 : 2;
return str_replace('_', '-', substr($this->locale, 0, $length));
}
- return ($this->feedType == self::$FEED_RSS) ? 'en-en' : 'en';
+ return ($this->feedType === self::$FEED_RSS) ? 'en-en' : 'en';
}
/**
}
$intNb = intval($this->userInput['nb']);
- if (! is_int($intNb) || $intNb == 0) {
+ if (!is_int($intNb) || $intNb == 0) {
return self::$DEFAULT_NB_LINKS;
}
<?php
-namespace Shaarli;
+namespace Shaarli\Http;
/**
* URL-safe Base64 operations
<?php
+
+use Shaarli\Http\Url;
+
/**
* GET an HTTP URL to retrieve its content
* Uses the cURL library or a fallback method
$cleanUrl = $urlObj->idnToAscii();
if (!filter_var($cleanUrl, FILTER_VALIDATE_URL) || !$urlObj->isHttp()) {
- return array(array(0 => 'Invalid HTTP Url'), false);
+ return array(array(0 => 'Invalid HTTP UrlUtils'), false);
}
$userAgent =
<?php
-/**
- * Converts an array-represented URL to a string
- *
- * Source: http://php.net/manual/en/function.parse-url.php#106731
- *
- * @see http://php.net/manual/en/function.parse-url.php
- *
- * @param array $parsedUrl an array-represented URL
- *
- * @return string the string representation of the URL
- */
-function unparse_url($parsedUrl)
-{
- $scheme = isset($parsedUrl['scheme']) ? $parsedUrl['scheme'].'://' : '';
- $host = isset($parsedUrl['host']) ? $parsedUrl['host'] : '';
- $port = isset($parsedUrl['port']) ? ':'.$parsedUrl['port'] : '';
- $user = isset($parsedUrl['user']) ? $parsedUrl['user'] : '';
- $pass = isset($parsedUrl['pass']) ? ':'.$parsedUrl['pass'] : '';
- $pass = ($user || $pass) ? "$pass@" : '';
- $path = isset($parsedUrl['path']) ? $parsedUrl['path'] : '';
- $query = isset($parsedUrl['query']) ? '?'.$parsedUrl['query'] : '';
- $fragment = isset($parsedUrl['fragment']) ? '#'.$parsedUrl['fragment'] : '';
- return "$scheme$user$pass$host$port$path$query$fragment";
-}
-
-/**
- * Removes undesired query parameters and fragments
- *
- * @param string url Url to be cleaned
- *
- * @return string the string representation of this URL after cleanup
- */
-function cleanup_url($url)
-{
- $obj_url = new Url($url);
- return $obj_url->cleanup();
-}
-
-/**
- * Get URL scheme.
- *
- * @param string url Url for which the scheme is requested
- *
- * @return mixed the URL scheme or false if none is provided.
- */
-function get_url_scheme($url)
-{
- $obj_url = new Url($url);
- return $obj_url->getScheme();
-}
-
-/**
- * Adds a trailing slash at the end of URL if necessary.
- *
- * @param string $url URL to check/edit.
- *
- * @return string $url URL with a end trailing slash.
- */
-function add_trailing_slash($url)
-{
- return $url . (!endsWith($url, '/') ? '/' : '');
-}
-
-/**
- * Replace not whitelisted protocols by 'http://' from given URL.
- *
- * @param string $url URL to clean
- * @param array $protocols List of allowed protocols (aside from http(s)).
- *
- * @return string URL with allowed protocol
- */
-function whitelist_protocols($url, $protocols)
-{
- if (startsWith($url, '?') || startsWith($url, '/')) {
- return $url;
- }
- $protocols = array_merge(['http', 'https'], $protocols);
- $protocol = preg_match('#^(\w+):/?/?#', $url, $match);
- // Protocol not allowed: we remove it and replace it with http
- if ($protocol === 1 && ! in_array($match[1], $protocols)) {
- $url = str_replace($match[0], 'http://', $url);
- } elseif ($protocol !== 1) {
- $url = 'http://' . $url;
- }
- return $url;
-}
+namespace Shaarli\Http;
/**
* URL representation and cleanup utilities
}
return $input;
}
-
+
/**
* Returns a string representation of this URL
*/
*/
protected function cleanupQuery()
{
- if (! isset($this->parts['query'])) {
+ if (!isset($this->parts['query'])) {
return;
}
*/
protected function cleanupFragment()
{
- if (! isset($this->parts['fragment'])) {
+ if (!isset($this->parts['fragment'])) {
return;
}
public function idnToAscii()
{
$out = $this->cleanup();
- if (! function_exists('idn_to_ascii') || ! isset($this->parts['host'])) {
+ if (!function_exists('idn_to_ascii') || !isset($this->parts['host'])) {
return $out;
}
$asciiHost = idn_to_ascii($this->parts['host'], 0, INTL_IDNA_VARIANT_UTS46);
}
/**
- * Test if the Url is an HTTP one.
+ * Test if the UrlUtils is an HTTP one.
*
* @return true is HTTP, false otherwise.
*/
--- /dev/null
+<?php
+/**
+ * Converts an array-represented URL to a string
+ *
+ * Source: http://php.net/manual/en/function.parse-url.php#106731
+ *
+ * @see http://php.net/manual/en/function.parse-url.php
+ *
+ * @param array $parsedUrl an array-represented URL
+ *
+ * @return string the string representation of the URL
+ */
+function unparse_url($parsedUrl)
+{
+ $scheme = isset($parsedUrl['scheme']) ? $parsedUrl['scheme'].'://' : '';
+ $host = isset($parsedUrl['host']) ? $parsedUrl['host'] : '';
+ $port = isset($parsedUrl['port']) ? ':'.$parsedUrl['port'] : '';
+ $user = isset($parsedUrl['user']) ? $parsedUrl['user'] : '';
+ $pass = isset($parsedUrl['pass']) ? ':'.$parsedUrl['pass'] : '';
+ $pass = ($user || $pass) ? "$pass@" : '';
+ $path = isset($parsedUrl['path']) ? $parsedUrl['path'] : '';
+ $query = isset($parsedUrl['query']) ? '?'.$parsedUrl['query'] : '';
+ $fragment = isset($parsedUrl['fragment']) ? '#'.$parsedUrl['fragment'] : '';
+
+ return "$scheme$user$pass$host$port$path$query$fragment";
+}
+
+/**
+ * Removes undesired query parameters and fragments
+ *
+ * @param string url UrlUtils to be cleaned
+ *
+ * @return string the string representation of this URL after cleanup
+ */
+function cleanup_url($url)
+{
+ $obj_url = new \Shaarli\Http\Url($url);
+ return $obj_url->cleanup();
+}
+
+/**
+ * Get URL scheme.
+ *
+ * @param string url UrlUtils for which the scheme is requested
+ *
+ * @return mixed the URL scheme or false if none is provided.
+ */
+function get_url_scheme($url)
+{
+ $obj_url = new \Shaarli\Http\Url($url);
+ return $obj_url->getScheme();
+}
+
+/**
+ * Adds a trailing slash at the end of URL if necessary.
+ *
+ * @param string $url URL to check/edit.
+ *
+ * @return string $url URL with a end trailing slash.
+ */
+function add_trailing_slash($url)
+{
+ return $url . (!endsWith($url, '/') ? '/' : '');
+}
+
+/**
+ * Replace not whitelisted protocols by 'http://' from given URL.
+ *
+ * @param string $url URL to clean
+ * @param array $protocols List of allowed protocols (aside from http(s)).
+ *
+ * @return string URL with allowed protocol
+ */
+function whitelist_protocols($url, $protocols)
+{
+ if (startsWith($url, '?') || startsWith($url, '/')) {
+ return $url;
+ }
+ $protocols = array_merge(['http', 'https'], $protocols);
+ $protocol = preg_match('#^(\w+):/?/?#', $url, $match);
+ // Protocol not allowed: we remove it and replace it with http
+ if ($protocol === 1 && ! in_array($match[1], $protocols)) {
+ $url = str_replace($match[0], 'http://', $url);
+ } elseif ($protocol !== 1) {
+ $url = 'http://' . $url;
+ }
+ return $url;
+}
<?php
+namespace Shaarli\Netscape;
+
+use DateTime;
+use DateTimeZone;
+use Exception;
+use Katzgrau\KLogger\Logger;
use Psr\Log\LogLevel;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Shaarli\NetscapeBookmarkParser\NetscapeBookmarkParser;
-use Katzgrau\KLogger\Logger;
/**
* Utilities to import and export bookmarks using the Netscape format
public static function filterAndFormat($linkDb, $selection, $prependNoteUrl, $indexUrl)
{
// see tpl/export.html for possible values
- if (! in_array($selection, array('all', 'public', 'private'))) {
- throw new Exception(t('Invalid export selection:') .' "'.$selection.'"');
+ if (!in_array($selection, array('all', 'public', 'private'))) {
+ throw new Exception(t('Invalid export selection:') . ' "' . $selection . '"');
}
$bookmarkLinks = array();
$status .= vsprintf(
t(
'was successfully processed in %d seconds: '
- .'%d links imported, %d links overwritten, %d links skipped.'
+ . '%d links imported, %d links overwritten, %d links skipped.'
),
[$duration, $importCount, $overwriteCount, $skipCount]
);
/**
* Imports Web bookmarks from an uploaded Netscape bookmark dump
*
- * @param array $post Server $_POST parameters
- * @param array $files Server $_FILES parameters
- * @param LinkDB $linkDb Loaded LinkDB instance
- * @param ConfigManager $conf instance
- * @param History $history History instance
+ * @param array $post Server $_POST parameters
+ * @param array $files Server $_FILES parameters
+ * @param LinkDB $linkDb Loaded LinkDB instance
+ * @param ConfigManager $conf instance
+ * @param History $history History instance
*
* @return string Summary of the bookmark import status
*/
}
// Overwrite existing links?
- $overwrite = ! empty($post['overwrite']);
+ $overwrite = !empty($post['overwrite']);
// Add tags to all imported links?
if (empty($post['default_tags'])) {
);
$logger = new Logger(
$conf->get('resource.data_dir'),
- ! $conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
+ !$conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
[
'prefix' => 'import.',
'extension' => 'log',
}
// Add a new link - @ used for UNIX timestamps
- $newLinkDate = new DateTime('@'.strval($bkm['time']));
+ $newLinkDate = new DateTime('@' . strval($bkm['time']));
$newLinkDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
$newLink['created'] = $newLinkDate;
$newLink['id'] = $linkDb->getNextId();
<?php
+namespace Shaarli\Plugin;
+
+use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\Exception\PluginFileNotFoundException;
/**
* Class PluginManager
{
/**
* List of authorized plugins from configuration file.
+ *
* @var array $authorizedPlugins
*/
private $authorizedPlugins;
/**
* List of loaded plugins.
+ *
* @var array $loadedPlugins
*/
private $loadedPlugins = array();
/**
* Plugins subdirectory.
+ *
* @var string $PLUGINS_PATH
*/
public static $PLUGINS_PATH = 'plugins';
/**
* Plugins meta files extension.
+ *
* @var string $META_EXT
*/
public static $META_EXT = 'meta';
/**
* Execute all plugins registered hook.
*
- * @param string $hook name of the hook to trigger.
- * @param array $data list of data to manipulate passed by reference.
- * @param array $params additional parameters such as page target.
+ * @param string $hook name of the hook to trigger.
+ * @param array $data list of data to manipulate passed by reference.
+ * @param array $params additional parameters such as page target.
*
* @return void
*/
* @param string $pluginName plugin's name.
*
* @return void
- * @throws PluginFileNotFoundException - plugin files not found.
+ * @throws \Shaarli\Plugin\Exception\PluginFileNotFoundException - plugin files not found.
*/
private function loadPlugin($dir, $pluginName)
{
$metaData[$plugin]['parameters'][$param]['value'] = '';
// Optional parameter description in parameter.PARAM_NAME=
- if (isset($metaData[$plugin]['parameter.'. $param])) {
- $metaData[$plugin]['parameters'][$param]['desc'] = t($metaData[$plugin]['parameter.'. $param]);
+ if (isset($metaData[$plugin]['parameter.' . $param])) {
+ $metaData[$plugin]['parameters'][$param]['desc'] = t($metaData[$plugin]['parameter.' . $param]);
}
}
}
return $this->errors;
}
}
-
-/**
- * Class PluginFileNotFoundException
- *
- * Raise when plugin files can't be found.
- */
-class PluginFileNotFoundException extends Exception
-{
- /**
- * Construct exception with plugin name.
- * Generate message.
- *
- * @param string $pluginName name of the plugin not found
- */
- public function __construct($pluginName)
- {
- $this->message = sprintf(t('Plugin "%s" files not found.'), $pluginName);
- }
-}
--- /dev/null
+<?php
+namespace Shaarli\Plugin\Exception;
+
+use Exception;
+
+/**
+ * Class PluginFileNotFoundException
+ *
+ * Raise when plugin files can't be found.
+ */
+class PluginFileNotFoundException extends Exception
+{
+ /**
+ * Construct exception with plugin name.
+ * Generate message.
+ *
+ * @param string $pluginName name of the plugin not found
+ */
+ public function __construct($pluginName)
+ {
+ $this->message = sprintf(t('Plugin "%s" files not found.'), $pluginName);
+ }
+}
<?php
+namespace Shaarli\Render;
+
+use Exception;
+use RainTPL;
+use Shaarli\ApplicationUtils;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
use Shaarli\Thumbnailer;
*/
protected $token;
- /** @var bool $isLoggedIn Whether the user is logged in **/
+ /**
+ * @var bool $isLoggedIn Whether the user is logged in
+ */
protected $isLoggedIn = false;
/**
ApplicationUtils::getVersionHash(SHAARLI_VERSION, $this->conf->get('credentials.salt'))
);
$this->tpl->assign('index_url', index_url($_SERVER));
- $visibility = ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : '';
+ $visibility = !empty($_SESSION['visibility']) ? $_SESSION['visibility'] : '';
$this->tpl->assign('visibility', $visibility);
$this->tpl->assign('untaggedonly', !empty($_SESSION['untaggedonly']));
$this->tpl->assign('pagetitle', $this->conf->get('general.title', 'Shaarli'));
$this->tpl->assign('thumbnails_width', $this->conf->get('thumbnails.width'));
$this->tpl->assign('thumbnails_height', $this->conf->get('thumbnails.height'));
- if (! empty($_SESSION['warnings'])) {
+ if (!empty($_SESSION['warnings'])) {
$this->tpl->assign('global_warnings', $_SESSION['warnings']);
unset($_SESSION['warnings']);
}
/**
* Render a 404 page (uses the template : tpl/404.tpl)
- * usage : $PAGE->render404('The link was deleted')
+ * usage: $PAGE->render404('The link was deleted')
*
- * @param string $message A messate to display what is not found
+ * @param string $message A message to display what is not found
*/
public function render404($message = '')
{
if (empty($message)) {
$message = t('The page you are trying to reach does not exist or has been deleted.');
}
- header($_SERVER['SERVER_PROTOCOL'] .' '. t('404 Not Found'));
+ header($_SERVER['SERVER_PROTOCOL'] . ' ' . t('404 Not Found'));
$this->tpl->assign('error_message', $message);
$this->renderPage('404');
}
<?php
-namespace Shaarli;
+namespace Shaarli\Render;
/**
* Class ThemeUtils
<?php
+
+namespace Shaarli\Updater;
+
+use Exception;
+use RainTPL;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionMethod;
+use Shaarli\ApplicationUtils;
+use Shaarli\Bookmark\LinkDB;
+use Shaarli\Bookmark\LinkFilter;
use Shaarli\Config\ConfigJson;
-use Shaarli\Config\ConfigPhp;
use Shaarli\Config\ConfigManager;
+use Shaarli\Config\ConfigPhp;
+use Shaarli\Exceptions\IOException;
use Shaarli\Thumbnailer;
+use Shaarli\Updater\Exception\UpdaterException;
/**
- * Class Updater.
+ * Class updater.
* Used to update stuff when a new Shaarli's version is reached.
* Update methods are ran only once, and the stored in a JSON file.
*/
}
if ($this->methods === null) {
- throw new UpdaterException(t('Couldn\'t retrieve Updater class methods.'));
+ throw new UpdaterException(t('Couldn\'t retrieve updater class methods.'));
}
foreach ($this->methods as $method) {
// Not an update method or already done, pass.
- if (! startsWith($method->getName(), 'updateMethod')
+ if (!startsWith($method->getName(), 'updateMethod')
|| in_array($method->getName(), $this->doneUpdates)
) {
continue;
}
}
$this->conf->write($this->isLoggedIn);
- unlink($this->conf->get('resource.data_dir').'/options.php');
+ unlink($this->conf->get('resource.data_dir') . '/options.php');
}
return true;
$subConfig = array('config', 'plugins');
foreach ($subConfig as $sub) {
foreach ($oldConfig[$sub] as $key => $value) {
- if (isset($legacyMap[$sub .'.'. $key])) {
- $configKey = $legacyMap[$sub .'.'. $key];
+ if (isset($legacyMap[$sub . '.' . $key])) {
+ $configKey = $legacyMap[$sub . '.' . $key];
} else {
- $configKey = $sub .'.'. $key;
+ $configKey = $sub . '.' . $key;
}
$this->conf->set($configKey, $value);
}
return true;
}
- $save = $this->conf->get('resource.data_dir') .'/datastore.'. date('YmdHis') .'.php';
+ $save = $this->conf->get('resource.data_dir') . '/datastore.' . date('YmdHis') . '.php';
copy($this->conf->get('resource.datastore'), $save);
$links = array();
// We run the update only if this folder still contains the template files.
$tplDir = $this->conf->get('resource.raintpl_tpl');
$tplFile = $tplDir . '/linklist.html';
- if (! file_exists($tplFile)) {
+ if (!file_exists($tplFile)) {
return true;
}
*/
public function updateMethodMoveUserCss()
{
- if (! is_file('inc/user.css')) {
+ if (!is_file('inc/user.css')) {
return true;
}
*/
public function updateMethodPiwikUrl()
{
- if (! $this->conf->exists('plugins.PIWIK_URL') || startsWith($this->conf->get('plugins.PIWIK_URL'), 'http')) {
+ if (!$this->conf->exists('plugins.PIWIK_URL') || startsWith($this->conf->get('plugins.PIWIK_URL'), 'http')) {
return true;
}
- $this->conf->set('plugins.PIWIK_URL', 'http://'. $this->conf->get('plugins.PIWIK_URL'));
+ $this->conf->set('plugins.PIWIK_URL', 'http://' . $this->conf->get('plugins.PIWIK_URL'));
$this->conf->write($this->isLoggedIn);
return true;
return true;
}
- if (! $this->conf->exists('general.download_max_size')) {
- $this->conf->set('general.download_max_size', 1024*1024*4);
+ if (!$this->conf->exists('general.download_max_size')) {
+ $this->conf->set('general.download_max_size', 1024 * 1024 * 4);
}
- if (! $this->conf->exists('general.download_timeout')) {
+ if (!$this->conf->exists('general.download_timeout')) {
$this->conf->set('general.download_timeout', 30);
}
return true;
}
}
-
-/**
- * Class UpdaterException.
- */
-class UpdaterException extends Exception
-{
- /**
- * @var string Method where the error occurred.
- */
- protected $method;
-
- /**
- * @var Exception The parent exception.
- */
- protected $previous;
-
- /**
- * Constructor.
- *
- * @param string $message Force the error message if set.
- * @param string $method Method where the error occurred.
- * @param Exception|bool $previous Parent exception.
- */
- public function __construct($message = '', $method = '', $previous = false)
- {
- $this->method = $method;
- $this->previous = $previous;
- $this->message = $this->buildMessage($message);
- }
-
- /**
- * Build the exception error message.
- *
- * @param string $message Optional given error message.
- *
- * @return string The built error message.
- */
- private function buildMessage($message)
- {
- $out = '';
- if (! empty($message)) {
- $out .= $message . PHP_EOL;
- }
-
- if (! empty($this->method)) {
- $out .= t('An error occurred while running the update ') . $this->method . PHP_EOL;
- }
-
- if (! empty($this->previous)) {
- $out .= ' '. $this->previous->getMessage();
- }
-
- return $out;
- }
-}
-
-/**
- * Read the updates file, and return already done updates.
- *
- * @param string $updatesFilepath Updates file path.
- *
- * @return array Already done update methods.
- */
-function read_updates_file($updatesFilepath)
-{
- if (! empty($updatesFilepath) && is_file($updatesFilepath)) {
- $content = file_get_contents($updatesFilepath);
- if (! empty($content)) {
- return explode(';', $content);
- }
- }
- return array();
-}
-
-/**
- * Write updates file.
- *
- * @param string $updatesFilepath Updates file path.
- * @param array $updates Updates array to write.
- *
- * @throws Exception Couldn't write version number.
- */
-function write_updates_file($updatesFilepath, $updates)
-{
- if (empty($updatesFilepath)) {
- throw new Exception(t('Updates file path is not set, can\'t write updates.'));
- }
-
- $res = file_put_contents($updatesFilepath, implode(';', $updates));
- if ($res === false) {
- throw new Exception(t('Unable to write updates in '. $updatesFilepath . '.'));
- }
-}
--- /dev/null
+<?php
+
+/**
+ * Read the updates file, and return already done updates.
+ *
+ * @param string $updatesFilepath Updates file path.
+ *
+ * @return array Already done update methods.
+ */
+function read_updates_file($updatesFilepath)
+{
+ if (! empty($updatesFilepath) && is_file($updatesFilepath)) {
+ $content = file_get_contents($updatesFilepath);
+ if (! empty($content)) {
+ return explode(';', $content);
+ }
+ }
+ return array();
+}
+
+/**
+ * Write updates file.
+ *
+ * @param string $updatesFilepath Updates file path.
+ * @param array $updates Updates array to write.
+ *
+ * @throws Exception Couldn't write version number.
+ */
+function write_updates_file($updatesFilepath, $updates)
+{
+ if (empty($updatesFilepath)) {
+ throw new Exception(t('Updates file path is not set, can\'t write updates.'));
+ }
+
+ $res = file_put_contents($updatesFilepath, implode(';', $updates));
+ if ($res === false) {
+ throw new Exception(t('Unable to write updates in '. $updatesFilepath . '.'));
+ }
+}
--- /dev/null
+<?php
+
+namespace Shaarli\Updater\Exception;
+
+use Exception;
+
+/**
+ * Class UpdaterException.
+ */
+class UpdaterException extends Exception
+{
+ /**
+ * @var string Method where the error occurred.
+ */
+ protected $method;
+
+ /**
+ * @var Exception The parent exception.
+ */
+ protected $previous;
+
+ /**
+ * Constructor.
+ *
+ * @param string $message Force the error message if set.
+ * @param string $method Method where the error occurred.
+ * @param Exception|bool $previous Parent exception.
+ */
+ public function __construct($message = '', $method = '', $previous = false)
+ {
+ $this->method = $method;
+ $this->previous = $previous;
+ $this->message = $this->buildMessage($message);
+ }
+
+ /**
+ * Build the exception error message.
+ *
+ * @param string $message Optional given error message.
+ *
+ * @return string The built error message.
+ */
+ private function buildMessage($message)
+ {
+ $out = '';
+ if (!empty($message)) {
+ $out .= $message . PHP_EOL;
+ }
+
+ if (!empty($this->method)) {
+ $out .= t('An error occurred while running the update ') . $this->method . PHP_EOL;
+ }
+
+ if (!empty($this->previous)) {
+ $out .= ' ' . $this->previous->getMessage();
+ }
+
+ return $out;
+ }
+}
},
"require": {
"php": ">=5.6",
+ "ext-json": "*",
+ "ext-zlib": "*",
"shaarli/netscape-bookmark-parser": "^2.1",
"erusev/parsedown": "^1.6",
"slim/slim": "^3.0",
"phpunit/phpunit": "^5.0",
"squizlabs/php_codesniffer": "2.*"
},
+ "suggest": {
+ "ext-curl": "Allows fetching web pages and thumbnails in a more robust way",
+ "ext-gd": "Required for thumbnail generation",
+ "ext-gettext": "Enables faster translation system in gettext mode",
+ "ext-intl": "Provides localized text sorting",
+ "ext-mbstring": "Provides multibyte (Unicode) string support"
+ },
"autoload": {
"psr-4": {
"Shaarli\\": "application",
"Shaarli\\Api\\": "application/api/",
"Shaarli\\Api\\Controllers\\": "application/api/controllers",
"Shaarli\\Api\\Exceptions\\": "application/api/exceptions",
+ "Shaarli\\Bookmark\\": "application/bookmark",
+ "Shaarli\\Bookmark\\Exception\\": "application/bookmark/exception",
"Shaarli\\Config\\": "application/config/",
"Shaarli\\Config\\Exception\\": "application/config/exception",
- "Shaarli\\Security\\": "application/security"
+ "Shaarli\\Exceptions\\": "application/exceptions",
+ "Shaarli\\Feed\\": "application/feed",
+ "Shaarli\\Http\\": "application/http",
+ "Shaarli\\Netscape\\": "application/netscape",
+ "Shaarli\\Plugin\\": "application/plugin",
+ "Shaarli\\Plugin\\Exception\\": "application/plugin/exception",
+ "Shaarli\\Plugin\\Wallabag\\": "plugins/wallabag",
+ "Shaarli\\Render\\": "application/render",
+ "Shaarli\\Security\\": "application/security",
+ "Shaarli\\Updater\\": "application/updater",
+ "Shaarli\\Updater\\Exception\\": "application/updater/exception"
}
}
}
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "3876b34296fedb365517b785af8384de",
+ "content-hash": "f8965821c946c2a1271c3f8c7e8c6eea",
"packages": [
{
"name": "arthurhoaro/web-thumbnailer",
},
{
"name": "gettext/gettext",
- "version": "v4.6.1",
+ "version": "v4.6.2",
"source": {
"type": "git",
"url": "https://github.com/oscarotero/Gettext.git",
- "reference": "854ff5f5aaf92d2af7080ba8fc15718b27b5c89a"
+ "reference": "93176b272d61fb58a9767be71c50d19149cb1e48"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/oscarotero/Gettext/zipball/854ff5f5aaf92d2af7080ba8fc15718b27b5c89a",
- "reference": "854ff5f5aaf92d2af7080ba8fc15718b27b5c89a",
+ "url": "https://api.github.com/repos/oscarotero/Gettext/zipball/93176b272d61fb58a9767be71c50d19149cb1e48",
+ "reference": "93176b272d61fb58a9767be71c50d19149cb1e48",
"shasum": ""
},
"require": {
"po",
"translation"
],
- "time": "2018-08-27T15:40:19+00:00"
+ "time": "2019-01-12T18:40:56+00:00"
},
{
"name": "gettext/languages",
- "version": "2.4.0",
+ "version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/mlocati/cldr-to-gettext-plural-rules.git",
- "reference": "1b74377bd0c4cd87e8d72b948f5d8867e23505a5"
+ "reference": "78db2d17933f0765a102f368a6663f057162ddbd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mlocati/cldr-to-gettext-plural-rules/zipball/1b74377bd0c4cd87e8d72b948f5d8867e23505a5",
- "reference": "1b74377bd0c4cd87e8d72b948f5d8867e23505a5",
+ "url": "https://api.github.com/repos/mlocati/cldr-to-gettext-plural-rules/zipball/78db2d17933f0765a102f368a6663f057162ddbd",
+ "reference": "78db2d17933f0765a102f368a6663f057162ddbd",
"shasum": ""
},
"require": {
"translations",
"unicode"
],
- "time": "2018-06-21T15:58:36+00:00"
+ "time": "2018-11-13T22:06:07+00:00"
},
{
"name": "katzgrau/klogger",
},
{
"name": "psr/log",
- "version": "1.0.2",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
"shasum": ""
},
"require": {
"psr",
"psr-3"
],
- "time": "2016-10-10T12:19:37+00:00"
+ "time": "2018-11-20T15:27:04+00:00"
},
{
"name": "pubsubhubbub/publisher",
},
{
"name": "squizlabs/php_codesniffer",
- "version": "2.9.1",
+ "version": "2.9.2",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62"
+ "reference": "2acf168de78487db620ab4bc524135a13cfe6745"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62",
- "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/2acf168de78487db620ab4bc524135a13cfe6745",
+ "reference": "2acf168de78487db620ab4bc524135a13cfe6745",
"shasum": ""
},
"require": {
"phpcs",
"standards"
],
- "time": "2017-05-22T02:43:20+00:00"
+ "time": "2018-11-07T22:31:41+00:00"
},
{
"name": "symfony/console",
- "version": "v3.4.17",
+ "version": "v3.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b"
+ "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
- "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a",
+ "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a",
"shasum": ""
},
"require": {
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T16:33:53+00:00"
+ "time": "2019-01-04T04:42:43+00:00"
},
{
"name": "symfony/debug",
- "version": "v3.4.17",
+ "version": "v3.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6"
+ "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
- "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186",
+ "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186",
"shasum": ""
},
"require": {
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T16:33:53+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/finder",
- "version": "v3.4.17",
+ "version": "v3.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d"
+ "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d",
- "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e",
+ "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e",
"shasum": ""
},
"require": {
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2018-10-03T08:46:40+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.9.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.9.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
"shasum": ""
},
"require": {
"portable",
"shim"
],
- "time": "2018-08-06T14:22:27+00:00"
+ "time": "2018-09-21T13:07:52+00:00"
},
{
"name": "symfony/yaml",
- "version": "v3.4.17",
+ "version": "v3.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f"
+ "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/640b6c27fed4066d64b64d5903a86043f4a4de7f",
- "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea",
+ "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea",
"shasum": ""
},
"require": {
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T16:33:53+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "theseer/fdomdocument",
},
{
"name": "webmozart/assert",
- "version": "1.3.0",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/webmozart/assert.git",
- "reference": "0df1908962e7a3071564e857d86874dad1ef204a"
+ "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a",
- "reference": "0df1908962e7a3071564e857d86874dad1ef204a",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9",
+ "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": "^5.3.3 || ^7.0",
+ "symfony/polyfill-ctype": "^1.8"
},
"require-dev": {
"phpunit/phpunit": "^4.6",
"check",
"validate"
],
- "time": "2018-01-29T19:49:41+00:00"
+ "time": "2018-12-25T11:19:39+00:00"
}
],
"aliases": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=5.6"
+ "php": ">=5.6",
+ "ext-json": "*",
+ "ext-zlib": "*"
},
"platform-dev": [],
"platform-overrides": {
require_once __DIR__ . '/vendor/autoload.php';
// Shaarli library
-require_once 'application/ApplicationUtils.php';
-require_once 'application/Cache.php';
-require_once 'application/CachedPage.php';
+require_once 'application/bookmark/LinkUtils.php';
require_once 'application/config/ConfigPlugin.php';
-require_once 'application/FeedBuilder.php';
+require_once 'application/feed/Cache.php';
+require_once 'application/http/HttpUtils.php';
+require_once 'application/http/UrlUtils.php';
+require_once 'application/updater/UpdaterUtils.php';
require_once 'application/FileUtils.php';
-require_once 'application/History.php';
-require_once 'application/HttpUtils.php';
-require_once 'application/LinkDB.php';
-require_once 'application/LinkFilter.php';
-require_once 'application/LinkUtils.php';
-require_once 'application/NetscapeBookmarkUtils.php';
-require_once 'application/PageBuilder.php';
require_once 'application/TimeZone.php';
-require_once 'application/Url.php';
require_once 'application/Utils.php';
-require_once 'application/PluginManager.php';
-require_once 'application/Router.php';
-require_once 'application/Updater.php';
+
+use \Shaarli\ApplicationUtils;
+use \Shaarli\Bookmark\Exception\LinkNotFoundException;
+use \Shaarli\Bookmark\LinkDB;
use \Shaarli\Config\ConfigManager;
+use \Shaarli\Feed\CachedPage;
+use \Shaarli\Feed\FeedBuilder;
+use \Shaarli\History;
use \Shaarli\Languages;
+use \Shaarli\Netscape\NetscapeBookmarkUtils;
+use \Shaarli\Plugin\PluginManager;
+use \Shaarli\Render\PageBuilder;
+use \Shaarli\Render\ThemeUtils;
+use \Shaarli\Router;
use \Shaarli\Security\LoginManager;
use \Shaarli\Security\SessionManager;
-use \Shaarli\ThemeUtils;
use \Shaarli\Thumbnailer;
+use \Shaarli\Updater\Updater;
// Ensure the PHP version is supported
try {
* Adds the addlink input on the linklist page.
*/
+use Shaarli\Router;
+
/**
* When linklist is displayed, add play videos to header's toolbar.
*
* Add an icon in the link list for archive.org.
*/
+use Shaarli\Plugin\PluginManager;
+
/**
* Add archive.org icon to link_plugin when rendering linklist.
*
*/
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
/**
* In the footer hook, there is a working example of a translation extension for Shaarli.
*/
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
/**
* Display an error everywhere if the plugin is enabled without configuration.
*/
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
/*
* If this tag is used on a shaare, the description won't be processed by Parsedown.
* Adds tracking code on each page.
*/
+use Shaarli\Plugin\PluginManager;
+
/**
* Initialization function.
* It will be called when the plugin is loaded.
* Note: this plugin adds jQuery.
*/
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
+
/**
* When linklist is displayed, add play videos to header's toolbar.
*
use pubsubhubbub\publisher\Publisher;
use Shaarli\Config\ConfigManager;
+use Shaarli\Feed\FeedBuilder;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
/**
* Plugin init function - set the hub to the default appspot one.
* Display a QRCode icon in link list.
*/
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
+
/**
* Add qrcode icon to link_plugin when rendering linklist.
*
<?php
+namespace Shaarli\Plugin\Wallabag;
/**
* Class WallabagInstance.
<?php
-
/**
- * Plugin Wallabag.
+ * Wallabag plugin
*/
-require_once 'WallabagInstance.php';
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Plugin\Wallabag\WallabagInstance;
/**
* Init function, return an error if the server is not set.
<?php
-use Shaarli\Config\ConfigManager;
-
-/**
- * ApplicationUtils' tests
- */
+namespace Shaarli;
-require_once 'application/ApplicationUtils.php';
-
-/**
- * Fake ApplicationUtils class to avoid HTTP requests
- */
-class FakeApplicationUtils extends ApplicationUtils
-{
- public static $VERSION_CODE = '';
-
- /**
- * Toggle HTTP requests, allow overriding the version code
- */
- public static function getVersion($url, $timeout = 0)
- {
- return self::$VERSION_CODE;
- }
-}
+use Shaarli\Config\ConfigManager;
+require_once 'tests/utils/FakeApplicationUtils.php';
/**
* Unitary tests for Shaarli utilities
*/
-class ApplicationUtilsTest extends PHPUnit_Framework_TestCase
+class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase
{
protected static $testUpdateFile = 'sandbox/update.txt';
protected static $testVersion = '0.5.0';
<?php
-require_once 'application/FileUtils.php';
+namespace Shaarli;
+
+use Exception;
/**
* Class FileUtilsTest
*
* Test file utility class.
*/
-class FileUtilsTest extends PHPUnit_Framework_TestCase
+class FileUtilsTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Test file path.
/**
* File not writable: raise an exception.
*
- * @expectedException IOException
+ * @expectedException Shaarli\Exceptions\IOException
* @expectedExceptionMessage Error accessing "sandbox/flat.db"
*/
public function testWriteWithoutPermission()
/**
* Folder non existent: raise an exception.
*
- * @expectedException IOException
+ * @expectedException Shaarli\Exceptions\IOException
* @expectedExceptionMessage Error accessing "nopefolder"
*/
public function testWriteFolderDoesNotExist()
/**
* Folder non writable: raise an exception.
*
- * @expectedException IOException
+ * @expectedException Shaarli\Exceptions\IOException
* @expectedExceptionMessage Error accessing "sandbox"
*/
public function testWriteFolderPermission()
<?php
-require_once 'application/History.php';
+namespace Shaarli;
+use DateTime;
+use Exception;
-class HistoryTest extends PHPUnit_Framework_TestCase
+class HistoryTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string History file path
/**
* Class LanguagesTest.
*/
-class LanguagesTest extends \PHPUnit_Framework_TestCase
+class LanguagesTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Config file path (without extension).
<?php
-use Shaarli\Config\ConfigManager;
+namespace Shaarli\Plugin;
-/**
- * Plugin Manager tests
- */
-
-require_once 'application/PluginManager.php';
+use Shaarli\Config\ConfigManager;
/**
* Unit tests for Plugins
*/
-class PluginManagerTest extends PHPUnit_Framework_TestCase
+class PluginManagerTest extends \PHPUnit\Framework\TestCase
{
/**
* Path to tests plugin.
<?php
-
-/**
- * Router tests
- */
-
-require_once 'application/Router.php';
+namespace Shaarli;
/**
* Unit tests for Router
*/
-class RouterTest extends PHPUnit_Framework_TestCase
+class RouterTest extends \PHPUnit\Framework\TestCase
{
/**
* Test findPage: login page output.
/**
* Unitary tests for timezone utilities
*/
-class TimeZoneTest extends PHPUnit_Framework_TestCase
+class TimeZoneTest extends PHPUnit\Framework\TestCase
{
/**
* @var array of timezones
/**
* Unitary tests for Shaarli utilities
*/
-class UtilsTest extends PHPUnit_Framework_TestCase
+class UtilsTest extends PHPUnit\Framework\TestCase
{
// Log file
protected static $testLogFile = 'tests.log';
namespace Shaarli\Api;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Api
*/
-class ApiMiddlewareTest extends \PHPUnit_Framework_TestCase
+class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
namespace Shaarli\Api;
-use Shaarli\Base64Url;
+use Shaarli\Http\Base64Url;
/**
* Class ApiUtilsTest
*/
-class ApiUtilsTest extends \PHPUnit_Framework_TestCase
+class ApiUtilsTest extends \PHPUnit\Framework\TestCase
{
/**
* Force the timezone for ISO datetimes.
<?php
-
namespace Shaarli\Api\Controllers;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
require_once 'tests/utils/ReferenceHistory.php';
-class HistoryTest extends \PHPUnit_Framework_TestCase
+class HistoryTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $container;
/**
- * @var History controller instance.
+ * @var HistoryController controller instance.
*/
protected $controller;
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = true;
- $this->container['history'] = new \History(self::$testHistory);
+ $this->container['history'] = new History(self::$testHistory);
- $this->controller = new History($this->container);
+ $this->controller = new HistoryController($this->container);
}
/**
$this->assertEquals($this->refHistory->count(), count($data));
- $this->assertEquals(\History::DELETED, $data[0]['event']);
+ $this->assertEquals(History::DELETED, $data[0]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
$data[0]['datetime']
);
$this->assertEquals(124, $data[0]['id']);
- $this->assertEquals(\History::SETTINGS, $data[1]['event']);
+ $this->assertEquals(History::SETTINGS, $data[1]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM),
$data[1]['datetime']
);
$this->assertNull($data[1]['id']);
- $this->assertEquals(\History::UPDATED, $data[2]['event']);
+ $this->assertEquals(History::UPDATED, $data[2]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170301_121214')->format(\DateTime::ATOM),
$data[2]['datetime']
);
$this->assertEquals(123, $data[2]['id']);
- $this->assertEquals(\History::CREATED, $data[3]['event']);
+ $this->assertEquals(History::CREATED, $data[3]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170201_121214')->format(\DateTime::ATOM),
$data[3]['datetime']
);
$this->assertEquals(124, $data[3]['id']);
- $this->assertEquals(\History::CREATED, $data[4]['event']);
+ $this->assertEquals(History::CREATED, $data[4]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM),
$data[4]['datetime']
$this->assertEquals(1, count($data));
- $this->assertEquals(\History::DELETED, $data[0]['event']);
+ $this->assertEquals(History::DELETED, $data[0]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
$data[0]['datetime']
$this->assertEquals(1, count($data));
- $this->assertEquals(\History::CREATED, $data[0]['event']);
+ $this->assertEquals(History::CREATED, $data[0]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM),
$data[0]['datetime']
$this->assertEquals(1, count($data));
- $this->assertEquals(\History::DELETED, $data[0]['event']);
+ $this->assertEquals(History::DELETED, $data[0]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
$data[0]['datetime']
$this->assertEquals(1, count($data));
- $this->assertEquals(\History::SETTINGS, $data[0]['event']);
+ $this->assertEquals(History::SETTINGS, $data[0]['event']);
$this->assertEquals(
\DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM),
$data[0]['datetime']
namespace Shaarli\Api\Controllers;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Api\Controllers
*/
-class InfoTest extends \PHPUnit_Framework_TestCase
+class InfoTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
+ $this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['history'] = null;
$this->controller = new Info($this->container);
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
use Slim\Http\Response;
-class DeleteLinkTest extends \PHPUnit_Framework_TestCase
+class DeleteLinkTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $refDB = null;
/**
- * @var \LinkDB instance.
+ * @var LinkDB instance.
*/
protected $linkDB;
/**
- * @var \History instance.
+ * @var HistoryController instance.
*/
protected $history;
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
- $this->history = new \History(self::$testHistory);
+ $this->history = new History(self::$testHistory);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = $this->linkDB;
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->assertFalse(isset($this->linkDB[$id]));
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::DELETED, $historyEntry['event']);
+ $this->assertEquals(History::DELETED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
/**
* Test DELETE link endpoint: reach not existing ID.
*
- * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException
+ * @expectedException \Shaarli\Api\Exceptions\ApiLinkNotFoundException
*/
public function testDeleteLink404()
{
namespace Shaarli\Api\Controllers;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Shaarli\Api\Controllers
*/
-class GetLinkIdTest extends \PHPUnit_Framework_TestCase
+class GetLinkIdTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
+ $this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
$this->container['history'] = null;
$this->controller = new Links($this->container);
$this->assertEquals('sTuff', $data['tags'][0]);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
+ \DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
$data['created']
);
$this->assertEmpty($data['updated']);
<?php
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Shaarli\Api\Controllers
*/
-class GetLinksTest extends \PHPUnit_Framework_TestCase
+class GetLinksTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
+ $this->container['db'] = new LinkDB(self::$testDatastore, true, false);
$this->container['history'] = null;
$this->controller = new Links($this->container);
$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(LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
$first['created']
);
$this->assertEmpty($first['updated']);
// Update date
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM),
+ \DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM),
$link['updated']
);
}
use PHPUnit\Framework\TestCase;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
protected $refDB = null;
/**
- * @var \History instance.
+ * @var HistoryController instance.
*/
protected $history;
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
- $this->history = new \History(self::$testHistory);
+ $this->history = new History(self::$testHistory);
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
- $this->container['history'] = new \History(self::$testHistory);
+ $this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
+ $this->container['history'] = new History(self::$testHistory);
$this->controller = new Links($this->container);
$data = json_decode((string) $response->getBody(), true);
$this->assertEquals(self::NB_FIELDS_LINK, count($data));
$this->assertEquals(43, $data['id']);
- $this->assertRegExp('/[\w-_]{6}/', $data['shorturl']);
+ $this->assertRegExp('/[\w_-]{6}/', $data['shorturl']);
$this->assertEquals('http://domain.tld/?' . $data['shorturl'], $data['url']);
$this->assertEquals('?' . $data['shorturl'], $data['title']);
$this->assertEquals('', $data['description']);
$this->assertEquals('', $data['updated']);
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::CREATED, $historyEntry['event']);
+ $this->assertEquals(History::CREATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
$data = json_decode((string) $response->getBody(), true);
$this->assertEquals(self::NB_FIELDS_LINK, count($data));
$this->assertEquals(43, $data['id']);
- $this->assertRegExp('/[\w-_]{6}/', $data['shorturl']);
+ $this->assertRegExp('/[\w_-]{6}/', $data['shorturl']);
$this->assertEquals('http://' . $link['url'], $data['url']);
$this->assertEquals($link['title'], $data['title']);
$this->assertEquals($link['description'], $data['description']);
$this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
+ \DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
);
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
+ \DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
);
}
namespace Shaarli\Api\Controllers;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
use Slim\Http\Response;
-class PutLinkTest extends \PHPUnit_Framework_TestCase
+class PutLinkTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $refDB = null;
/**
- * @var \History instance.
+ * @var HistoryController instance.
*/
protected $history;
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
- $this->history = new \History(self::$testHistory);
+ $this->history = new History(self::$testHistory);
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
- $this->container['history'] = new \History(self::$testHistory);
+ $this->container['db'] = new \Shaarli\Bookmark\LinkDB(self::$testDatastore, true, false);
+ $this->container['history'] = new History(self::$testHistory);
$this->controller = new Links($this->container);
);
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
$this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
$this->assertEquals(false, $data['private']);
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
+ \DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130614_184135'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
);
$this->assertEquals(
- \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
+ \DateTime::createFromFormat(\Shaarli\Bookmark\LinkDB::LINK_DATE_FORMAT, '20130615_184230'),
\DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
);
}
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
use Slim\Http\Response;
-class DeleteTagTest extends \PHPUnit_Framework_TestCase
+class DeleteTagTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $refDB = null;
/**
- * @var \LinkDB instance.
+ * @var LinkDB instance.
*/
protected $linkDB;
/**
- * @var \History instance.
+ * @var HistoryController instance.
*/
protected $history;
$this->conf = new ConfigManager('tests/utils/config/configJson');
$this->refDB = new \ReferenceLinkDB();
$this->refDB->write(self::$testDatastore);
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
- $this->history = new \History(self::$testHistory);
+ $this->history = new History(self::$testHistory);
$this->container = new Container();
$this->container['conf'] = $this->conf;
$this->container['db'] = $this->linkDB;
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$tags = $this->linkDB->linksCountPerTag();
$this->assertFalse(isset($tags[$tagName]));
// 2 links affected
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
$historyEntry = $this->history->getHistory()[1];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
$this->assertEquals(204, $response->getStatusCode());
$this->assertEmpty((string) $response->getBody());
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$tags = $this->linkDB->linksCountPerTag();
$this->assertFalse(isset($tags[$tagName]));
$this->assertTrue($tags[strtolower($tagName)] > 0);
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Shaarli\Api\Controllers
*/
-class GetTagNameTest extends \PHPUnit_Framework_TestCase
+class GetTagNameTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->container['db'] = new \LinkDB(self::$testDatastore, true, false);
+ $this->container['db'] = new LinkDB(self::$testDatastore, true, false);
$this->container['history'] = null;
$this->controller = new Tags($this->container);
<?php
namespace Shaarli\Api\Controllers;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
-
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
*
* @package Shaarli\Api\Controllers
*/
-class GetTagsTest extends \PHPUnit_Framework_TestCase
+class GetTagsTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $container;
/**
- * @var \LinkDB instance.
+ * @var LinkDB instance.
*/
protected $linkDB;
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = $this->linkDB;
$this->container['history'] = null;
<?php
-
namespace Shaarli\Api\Controllers;
use Shaarli\Api\Exceptions\ApiBadParametersException;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
use Slim\Container;
use Slim\Http\Environment;
use Slim\Http\Request;
use Slim\Http\Response;
-class PutTagTest extends \PHPUnit_Framework_TestCase
+class PutTagTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected $refDB = null;
/**
- * @var \History instance.
+ * @var HistoryController instance.
*/
protected $history;
protected $container;
/**
- * @var \LinkDB instance.
+ * @var LinkDB instance.
*/
protected $linkDB;
$refHistory = new \ReferenceHistory();
$refHistory->write(self::$testHistory);
- $this->history = new \History(self::$testHistory);
+ $this->history = new History(self::$testHistory);
$this->container = new Container();
$this->container['conf'] = $this->conf;
- $this->linkDB = new \LinkDB(self::$testDatastore, true, false);
+ $this->linkDB = new LinkDB(self::$testDatastore, true, false);
$this->container['db'] = $this->linkDB;
$this->container['history'] = $this->history;
$this->assertEquals(2, $tags[$newName]);
$historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
$historyEntry = $this->history->getHistory()[1];
- $this->assertEquals(\History::UPDATED, $historyEntry['event']);
+ $this->assertEquals(History::UPDATED, $historyEntry['event']);
$this->assertTrue(
(new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
);
* Link datastore tests
*/
-require_once 'application/Cache.php';
-require_once 'application/FileUtils.php';
-require_once 'application/LinkDB.php';
+namespace Shaarli\Bookmark;
+
+use DateTime;
+use ReferenceLinkDB;
+use ReflectionClass;
+use Shaarli;
+
+require_once 'application/feed/Cache.php';
require_once 'application/Utils.php';
require_once 'tests/utils/ReferenceLinkDB.php';
/**
* Unitary tests for LinkDB
*/
-class LinkDBTest extends PHPUnit_Framework_TestCase
+class LinkDBTest extends \PHPUnit\Framework\TestCase
{
// datastore to test write operations
protected static $testDatastore = 'sandbox/datastore.php';
*/
protected static function getMethod($name)
{
- $class = new ReflectionClass('LinkDB');
+ $class = new ReflectionClass('Shaarli\Bookmark\LinkDB');
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method;
/**
* Attempt to instantiate a LinkDB whereas the datastore is not writable
*
- * @expectedException IOException
+ * @expectedException Shaarli\Exceptions\IOException
* @expectedExceptionMessageRegExp /Error accessing "null"/
*/
public function testConstructDatastoreNotWriteable()
$link = array(
'id' => 42,
- 'title'=>'an additional link',
- 'url'=>'http://dum.my',
- 'description'=>'One more',
- 'private'=>0,
- 'created'=> DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150518_190000'),
- 'tags'=>'unit test'
+ 'title' => 'an additional link',
+ 'url' => 'http://dum.my',
+ 'description' => 'One more',
+ 'private' => 0,
+ 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150518_190000'),
+ 'tags' => 'unit test'
);
$testDB[$link['id']] = $link;
$testDB->save('tests');
/**
* Test filterHash() with an invalid smallhash.
*
- * @expectedException LinkNotFoundException
+ * @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
*/
public function testFilterHashInValid1()
{
/**
* Test filterHash() with an empty smallhash.
*
- * @expectedException LinkNotFoundException
+ * @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
*/
public function testFilterHashInValid()
{
<?php
-require_once 'application/LinkFilter.php';
+namespace Shaarli\Bookmark;
+
+use Exception;
+use ReferenceLinkDB;
/**
* Class LinkFilterTest.
*/
-class LinkFilterTest extends PHPUnit_Framework_TestCase
+class LinkFilterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Test datastore path.
protected static $linkDB;
/**
- * Instanciate linkFilter with ReferenceLinkDB data.
+ * Instantiate linkFilter with ReferenceLinkDB data.
*/
public static function setUpBeforeClass()
{
count(
self::$linkFilter->filter(
LinkFilter::$FILTER_TAG,
- /*$request=*/'',
- /*$casesensitive=*/false,
- /*$visibility=*/'all',
- /*$untaggedonly=*/true
+ /*$request=*/
+ '',
+ /*$casesensitive=*/
+ false,
+ /*$visibility=*/
+ 'all',
+ /*$untaggedonly=*/
+ true
)
)
);
/**
* No link for this hash
*
- * @expectedException LinkNotFoundException
+ * @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
*/
public function testFilterUnknownSmallHash()
{
<?php
-require_once 'application/LinkUtils.php';
+namespace Shaarli\Bookmark;
+
+use ReferenceLinkDB;
+
+require_once 'tests/utils/CurlUtils.php';
/**
-* Class LinkUtilsTest.
-*/
-class LinkUtilsTest extends PHPUnit_Framework_TestCase
+ * Class LinkUtilsTest.
+ */
+class LinkUtilsTest extends \PHPUnit\Framework\TestCase
{
/**
* Test html_extract_title() when the title is found.
public function testHtmlExtractExistentTitle()
{
$title = 'Read me please.';
- $html = '<html><meta>stuff</meta><title>'. $title .'</title></html>';
+ $html = '<html><meta>stuff</meta><title>' . $title . '</title></html>';
$this->assertEquals($title, html_extract_title($html));
- $html = '<html><title>'. $title .'</title>blabla<title>another</title></html>';
+ $html = '<html><title>' . $title . '</title>blabla<title>another</title></html>';
$this->assertEquals($title, html_extract_title($html));
}
public function testHeadersExtractExistentCharset()
{
$charset = 'x-MacCroatian';
- $headers = 'text/html; charset='. $charset;
+ $headers = 'text/html; charset=' . $charset;
$this->assertEquals(strtolower($charset), header_extract_charset($headers));
}
public function testHtmlExtractExistentCharset()
{
$charset = 'x-MacCroatian';
- $html = '<html><meta>stuff2</meta><meta charset="'. $charset .'"/></html>';
+ $html = '<html><meta>stuff2</meta><meta charset="' . $charset . '"/></html>';
$this->assertEquals(strtolower($charset), html_extract_charset($html));
}
'Content-Type: text/html; charset=utf-8',
'Status: 200 OK',
'end' => 'th=device-width">'
- .'<title>Refactoring · GitHub</title>'
- .'<link rel="search" type="application/opensea',
+ . '<title>Refactoring · GitHub</title>'
+ . '<link rel="search" type="application/opensea',
'<title>ignored</title>',
];
foreach ($data as $key => $line) {
$data = [
'HTTP/1.1 200 OK',
'end' => 'th=device-width">'
- .'<title>Refactoring · GitHub</title>'
- .'<link rel="search" type="application/opensea',
+ . '<title>Refactoring · GitHub</title>'
+ . '<link rel="search" type="application/opensea',
'<title>ignored</title>',
];
foreach ($data as $key => $line) {
'HTTP/1.1 200 OK',
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />',
'end' => 'th=device-width">'
- .'<title>Refactoring · GitHub</title>'
- .'<link rel="search" type="application/opensea',
+ . '<title>Refactoring · GitHub</title>'
+ . '<link rel="search" type="application/opensea',
'<title>ignored</title>',
];
foreach ($data as $key => $line) {
{
$text = 'stuff http://hello.there/is=someone#here otherstuff';
$expectedText = 'stuff <a href="http://hello.there/is=someone#here">'
- .'http://hello.there/is=someone#here</a> otherstuff';
+ . 'http://hello.there/is=someone#here</a> otherstuff';
$processedText = text2clickable($text, '');
$this->assertEquals($expectedText, $processedText);
$text = 'stuff http://hello.there/is=someone#here(please) otherstuff';
$expectedText = 'stuff <a href="http://hello.there/is=someone#here(please)">'
- .'http://hello.there/is=someone#here(please)</a> otherstuff';
+ . 'http://hello.there/is=someone#here(please)</a> otherstuff';
$processedText = text2clickable($text, '');
$this->assertEquals($expectedText, $processedText);
$text = 'stuff http://hello.there/is=someone#here(please)&no otherstuff';
$expectedText = 'stuff <a href="http://hello.there/is=someone#here(please)&no">'
- .'http://hello.there/is=someone#here(please)&no</a> otherstuff';
+ . 'http://hello.there/is=someone#here(please)&no</a> otherstuff';
$processedText = text2clickable($text, '');
$this->assertEquals($expectedText, $processedText);
}
{
$text = 'stuff http://hello.there/is=someone#here otherstuff';
$redirector = 'http://redirector.to';
- $expectedText = 'stuff <a href="'.
+ $expectedText = 'stuff <a href="' .
$redirector .
urlencode('http://hello.there/is=someone#here') .
'">http://hello.there/is=someone#here</a> otherstuff';
{
$text = 'stuff http://hello.there/?is=someone&or=something#here otherstuff';
$redirector = 'http://redirector.to';
- $expectedText = 'stuff <a href="'.
+ $expectedText = 'stuff <a href="' .
$redirector .
'http://hello.there/?is=someone&or=something#here' .
'">http://hello.there/?is=someone&or=something#here</a> otherstuff';
*/
public function testSpace2nbsp()
{
- $text = ' Are you thrilled by flags ?'. PHP_EOL .' Really?';
- $expectedText = ' Are you thrilled by flags ?'. PHP_EOL .' Really?';
+ $text = ' Are you thrilled by flags ?' . PHP_EOL . ' Really?';
+ $expectedText = ' Are you thrilled by flags ?' . PHP_EOL . ' Really?';
$processedText = space2nbsp($text);
$this->assertEquals($expectedText, $processedText);
}
* Util function to build an hashtag link.
*
* @param string $hashtag Hashtag name.
- * @param string $index Index URL.
+ * @param string $index Index URL.
*
* @return string HTML hashtag link.
*/
private function getHashtagLink($hashtag, $index = '')
{
- $hashtagLink = '<a href="'. $index .'?addtag=$1" title="Hashtag $1">#$1</a>';
+ $hashtagLink = '<a href="' . $index . '?addtag=$1" title="Hashtag $1">#$1</a>';
return str_replace('$1', $hashtag, $hashtagLink);
}
}
-
-// old style mock: PHPUnit doesn't allow function mock
-
-/**
- * Returns code 200 or html content type.
- *
- * @param resource $ch cURL resource
- * @param int $type cURL info type
- *
- * @return int|string 200 or 'text/html'
- */
-function ut_curl_getinfo_ok($ch, $type)
-{
- switch ($type) {
- case CURLINFO_RESPONSE_CODE:
- return 200;
- case CURLINFO_CONTENT_TYPE:
- return 'text/html; charset=utf-8';
- }
-}
-
-/**
- * Returns code 200 or html content type without charset.
- *
- * @param resource $ch cURL resource
- * @param int $type cURL info type
- *
- * @return int|string 200 or 'text/html'
- */
-function ut_curl_getinfo_no_charset($ch, $type)
-{
- switch ($type) {
- case CURLINFO_RESPONSE_CODE:
- return 200;
- case CURLINFO_CONTENT_TYPE:
- return 'text/html';
- }
-}
-
-/**
- * Invalid response code.
- *
- * @param resource $ch cURL resource
- * @param int $type cURL info type
- *
- * @return int|string 404 or 'text/html'
- */
-function ut_curl_getinfo_rc_ko($ch, $type)
-{
- switch ($type) {
- case CURLINFO_RESPONSE_CODE:
- return 404;
- case CURLINFO_CONTENT_TYPE:
- return 'text/html; charset=utf-8';
- }
-}
-
-/**
- * Invalid content type.
- *
- * @param resource $ch cURL resource
- * @param int $type cURL info type
- *
- * @return int|string 200 or 'text/plain'
- */
-function ut_curl_getinfo_ct_ko($ch, $type)
-{
- switch ($type) {
- case CURLINFO_RESPONSE_CODE:
- return 200;
- case CURLINFO_CONTENT_TYPE:
- return 'text/plain';
- }
-}
-
-/**
- * Invalid response code and content type.
- *
- * @param resource $ch cURL resource
- * @param int $type cURL info type
- *
- * @return int|string 404 or 'text/plain'
- */
-function ut_curl_getinfo_rs_ct_ko($ch, $type)
-{
- switch ($type) {
- case CURLINFO_RESPONSE_CODE:
- return 404;
- case CURLINFO_CONTENT_TYPE:
- return 'text/plain';
- }
-}
/**
* Class ConfigJsonTest
*/
-class ConfigJsonTest extends \PHPUnit_Framework_TestCase
+class ConfigJsonTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ConfigJson
/**
* Write to invalid path.
*
- * @expectedException \IOException
+ * @expectedException \Shaarli\Exceptions\IOException
*/
public function testWriteInvalidArray()
{
/**
* Write to invalid path.
*
- * @expectedException \IOException
+ * @expectedException \Shaarli\Exceptions\IOException
*/
public function testWriteInvalidBlank()
{
* Note: it only test the manager with ConfigJson,
* ConfigPhp is only a workaround to handle the transition to JSON type.
*/
-class ConfigManagerTest extends \PHPUnit_Framework_TestCase
+class ConfigManagerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ConfigManager
/**
* Class ConfigPhpTest
*/
-class ConfigPhpTest extends \PHPUnit_Framework_TestCase
+class ConfigPhpTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ConfigPhp
/**
* Unitary tests for Shaarli config related functions
*/
-class ConfigPluginTest extends \PHPUnit_Framework_TestCase
+class ConfigPluginTest extends \PHPUnit\Framework\TestCase
{
/**
* Test save_plugin_config with valid data.
/**
* Cache tests
*/
+namespace Shaarli\Feed;
// required to access $_SESSION array
session_start();
-require_once 'application/Cache.php';
+require_once 'application/feed/Cache.php';
/**
* Unitary tests for cached pages
*/
-class CacheTest extends PHPUnit_Framework_TestCase
+class CacheTest extends \PHPUnit\Framework\TestCase
{
// test cache directory
protected static $testCacheDir = 'sandbox/dummycache';
*/
public function setUp()
{
- if (! is_dir(self::$testCacheDir)) {
+ if (!is_dir(self::$testCacheDir)) {
mkdir(self::$testCacheDir);
} else {
- array_map('unlink', glob(self::$testCacheDir.'/*'));
+ array_map('unlink', glob(self::$testCacheDir . '/*'));
}
foreach (self::$pages as $page) {
- file_put_contents(self::$testCacheDir.'/'.$page.'.cache', $page);
+ file_put_contents(self::$testCacheDir . '/' . $page . '.cache', $page);
}
- file_put_contents(self::$testCacheDir.'/intru.der', 'ShouldNotBeThere');
+ file_put_contents(self::$testCacheDir . '/intru.der', 'ShouldNotBeThere');
}
/**
*/
public function tearDown()
{
- array_map('unlink', glob(self::$testCacheDir.'/*'));
+ array_map('unlink', glob(self::$testCacheDir . '/*'));
rmdir(self::$testCacheDir);
}
{
purgeCachedPages(self::$testCacheDir);
foreach (self::$pages as $page) {
- $this->assertFileNotExists(self::$testCacheDir.'/'.$page.'.cache');
+ $this->assertFileNotExists(self::$testCacheDir . '/' . $page . '.cache');
}
- $this->assertFileExists(self::$testCacheDir.'/intru.der');
+ $this->assertFileExists(self::$testCacheDir . '/intru.der');
}
/**
ini_set('error_log', '/dev/null');
$this->assertEquals(
'Cannot purge sandbox/dummycache_missing: no directory',
- purgeCachedPages(self::$testCacheDir.'_missing')
+ purgeCachedPages(self::$testCacheDir . '_missing')
);
ini_set('error_log', $oldlog);
}
invalidateCaches(self::$testCacheDir);
foreach (self::$pages as $page) {
- $this->assertFileNotExists(self::$testCacheDir.'/'.$page.'.cache');
+ $this->assertFileNotExists(self::$testCacheDir . '/' . $page . '.cache');
}
$this->assertArrayNotHasKey('tags', $_SESSION);
/**
* PageCache tests
*/
-
-require_once 'application/CachedPage.php';
+namespace Shaarli\Feed;
/**
* Unitary tests for cached pages
*/
-class CachedPageTest extends PHPUnit_Framework_TestCase
+class CachedPageTest extends \PHPUnit\Framework\TestCase
{
// test cache directory
protected static $testCacheDir = 'sandbox/pagecache';
*/
public static function setUpBeforeClass()
{
- if (! is_dir(self::$testCacheDir)) {
+ if (!is_dir(self::$testCacheDir)) {
mkdir(self::$testCacheDir);
}
- self::$filename = self::$testCacheDir.'/'.sha1(self::$url).'.cache';
+ self::$filename = self::$testCacheDir . '/' . sha1(self::$url) . '.cache';
}
/**
<?php
-require_once 'application/FeedBuilder.php';
-require_once 'application/LinkDB.php';
+namespace Shaarli\Feed;
+
+use DateTime;
+use ReferenceLinkDB;
+use Shaarli\Bookmark\LinkDB;
/**
* FeedBuilderTest class.
*
* Unit tests for FeedBuilder.
*/
-class FeedBuilderTest extends PHPUnit_Framework_TestCase
+class FeedBuilderTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string locale Basque (Spain).
$this->assertEquals('http://host.tld/?WDWyig', $link['url']);
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']);
$pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']);
- $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']);
+ $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']);
$this->assertEquals($pub, $up);
$this->assertContains('Stallman has a beard', $link['description']);
$this->assertContains('Permalink', $link['description']);
* HttpUtils' tests
*/
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for client_ip_id()
*/
-class ClientIpIdTest extends PHPUnit_Framework_TestCase
+class ClientIpIdTest extends \PHPUnit\Framework\TestCase
{
/**
* Get a remote client ID based on its IP
* HttpUtils' tests
*/
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for get_http_response()
*/
-class GetHttpUrlTest extends PHPUnit_Framework_TestCase
+class GetHttpUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* Get an invalid local URL
{
// Local
list($headers, $content) = get_http_response('/non/existent', 1);
- $this->assertEquals('Invalid HTTP Url', $headers[0]);
+ $this->assertEquals('Invalid HTTP UrlUtils', $headers[0]);
$this->assertFalse($content);
// Non HTTP
list($headers, $content) = get_http_response('ftp://save.tld/mysave', 1);
- $this->assertEquals('Invalid HTTP Url', $headers[0]);
+ $this->assertEquals('Invalid HTTP UrlUtils', $headers[0]);
$this->assertFalse($content);
}
<?php
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for getIpAddressFromProxy()
*/
-class GetIpAdressFromProxyTest extends PHPUnit_Framework_TestCase
+class GetIpAdressFromProxyTest extends \PHPUnit\Framework\TestCase
{
/**
* HttpUtils' tests
*/
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for index_url()
*/
-class IndexUrlTest extends PHPUnit_Framework_TestCase
+class IndexUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* If on the main page, remove "index.php" from the URL resource
<?php
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Class IsHttpsTest
*
* Test class for is_https() function.
*/
-class IsHttpsTest extends PHPUnit_Framework_TestCase
+class IsHttpsTest extends \PHPUnit\Framework\TestCase
{
/**
* HttpUtils' tests
*/
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for page_url()
*/
-class PageUrlTest extends PHPUnit_Framework_TestCase
+class PageUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* If on the main page, remove "index.php" from the URL resource
* HttpUtils' tests
*/
-require_once 'application/HttpUtils.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
/**
* Unitary tests for server_url()
*/
-class ServerUrlTest extends PHPUnit_Framework_TestCase
+class ServerUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* Detect if the server uses SSL
<?php
/**
- * Url's tests
+ * UrlUtils's tests
*/
-require_once 'application/Url.php';
+namespace Shaarli\Http;
/**
* Unitary tests for URL utilities
*/
-class UrlTest extends PHPUnit_Framework_TestCase
+class UrlTest extends \PHPUnit\Framework\TestCase
{
// base URL for tests
protected static $baseUrl = 'http://domain.tld:3000';
*/
private function assertUrlIsCleaned($query = '', $fragment = '')
{
- $url = new Url(self::$baseUrl.$query.$fragment);
+ $url = new Url(self::$baseUrl . $query . $fragment);
$url->cleanup();
$this->assertEquals(self::$baseUrl, $url->toString());
}
public function testConstruct()
{
$ref = 'http://username:password@hostname:9090/path'
- .'?arg1=value1&arg2=value2#anchor';
+ . '?arg1=value1&arg2=value2#anchor';
$url = new Url($ref);
$this->assertEquals($ref, $url->toString());
}
$this->assertUrlIsCleaned();
// URL with no annoying elements
- $ref = self::$baseUrl.'?p1=val1&p2=1234#edit';
+ $ref = self::$baseUrl . '?p1=val1&p2=1234#edit';
$url = new Url($ref);
$this->assertEquals($ref, $url->cleanup());
}
// ditch annoying query params and fragment, keep useful params
$url = new Url(
self::$baseUrl
- .'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
+ . '?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
);
- $this->assertEquals(self::$baseUrl.'?my=stuff&is=kept', $url->cleanup());
+ $this->assertEquals(self::$baseUrl . '?my=stuff&is=kept', $url->cleanup());
// ditch annoying query params, keep useful params and fragment
$url = new Url(
self::$baseUrl
- .'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
+ . '?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
);
$this->assertEquals(
- self::$baseUrl.'?my=stuff&is=kept#again',
+ self::$baseUrl . '?my=stuff&is=kept#again',
$url->cleanup()
);
// test firefox reader url
$url = new Url(
- 'about://reader?url=' . urlencode(self::$baseUrl .'?my=stuff&is=kept')
+ 'about://reader?url=' . urlencode(self::$baseUrl . '?my=stuff&is=kept')
);
- $this->assertEquals(self::$baseUrl.'?my=stuff&is=kept', $url->cleanup());
+ $this->assertEquals(self::$baseUrl . '?my=stuff&is=kept', $url->cleanup());
}
/**
* Unitary tests for cleanup_url()
*/
-require_once 'application/Url.php';
+namespace Shaarli\Http;
-class CleanupUrlTest extends PHPUnit_Framework_TestCase
+require_once 'application/http/UrlUtils.php';
+
+class CleanupUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string reference URL
* Unitary tests for get_url_scheme()
*/
-require_once 'application/Url.php';
+namespace Shaarli\Http;
-class GetUrlSchemeTest extends PHPUnit_Framework_TestCase
+require_once 'application/http/UrlUtils.php';
+
+class GetUrlSchemeTest extends \PHPUnit\Framework\TestCase
{
/**
- * Get empty scheme string for empty Url
+ * Get empty scheme string for empty UrlUtils
*/
public function testGetUrlSchemeEmpty()
{
}
/**
- * Get normal scheme of Url
+ * Get normal scheme of UrlUtils
*/
public function testGetUrlScheme()
{
<?php
/**
- * Unpares Url's tests
+ * Unpares UrlUtils's tests
*/
-require_once 'application/Url.php';
+namespace Shaarli\Http;
+
+require_once 'application/http/UrlUtils.php';
/**
* Unitary tests for unparse_url()
*/
-class UnparseUrlTest extends PHPUnit_Framework_TestCase
+class UnparseUrlTest extends \PHPUnit\Framework\TestCase
{
/**
* Thanks for building nothing
<?php
-require_once 'application/Url.php';
+namespace Shaarli\Http;
-use Shaarli\Config\ConfigManager;
+require_once 'application/http/UrlUtils.php';
/**
* Class WhitelistProtocolsTest
*
- * Test whitelist_protocols() function of Url.
+ * Test whitelist_protocols() function of UrlUtils.
*/
-class WhitelistProtocolsTest extends PHPUnit_Framework_TestCase
+class WhitelistProtocolsTest extends \PHPUnit\Framework\TestCase
{
/**
* Test whitelist_protocols() on a note (relative URL).
*
* @package Shaarli
*/
-class LanguagesFrTest extends \PHPUnit_Framework_TestCase
+class LanguagesFrTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Config file path (without extension).
<?php
+namespace Shaarli\Netscape;
-require_once 'application/NetscapeBookmarkUtils.php';
+use Shaarli\Bookmark\LinkDB;
+
+require_once 'tests/utils/ReferenceLinkDB.php';
/**
* Netscape bookmark export
*/
-class BookmarkExportTest extends PHPUnit_Framework_TestCase
+class BookmarkExportTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
protected static $testDatastore = 'sandbox/datastore.php';
/**
- * @var ReferenceLinkDB instance.
+ * @var \ReferenceLinkDB instance.
*/
protected static $refDb = null;
*/
public static function setUpBeforeClass()
{
- self::$refDb = new ReferenceLinkDB();
+ self::$refDb = new \ReferenceLinkDB();
self::$refDb->write(self::$testDatastore);
self::$linkDb = new LinkDB(self::$testDatastore, true, false);
}
<?php
+namespace Shaarli\Netscape;
-require_once 'application/NetscapeBookmarkUtils.php';
-
+use DateTime;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\History;
/**
* Utility function to load a file's metadata in a $_FILES-like array
/**
* Netscape bookmark import
*/
-class BookmarkImportTest extends PHPUnit_Framework_TestCase
+class BookmarkImportTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string datastore to test write operations
<?php
+namespace Shaarli\Plugin\Addlink;
-/**
- * PluginPlayvideosTest.php
- */
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
require_once 'plugins/addlink_toolbar/addlink_toolbar.php';
-require_once 'application/Router.php';
/**
- * Class PluginAddlinkTest
* Unit test for the Addlink toolbar plugin
*/
-class PluginAddlinkTest extends PHPUnit_Framework_TestCase
+class PluginAddlinkTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path.
<?php
+namespace Shaarli\Plugin\Archiveorg;
/**
* PluginArchiveorgTest.php
*/
+use Shaarli\Plugin\PluginManager;
+
require_once 'plugins/archiveorg/archiveorg.php';
/**
* Class PluginArchiveorgTest
* Unit test for the archiveorg plugin
*/
-class PluginArchiveorgTest extends PHPUnit_Framework_TestCase
+class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path
<?php
+namespace Shaarli\Plugin\Isso;
+
+use DateTime;
+use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
require_once 'plugins/isso/isso.php';
*
* Test the Isso plugin (comment system).
*/
-class PluginIssoTest extends PHPUnit_Framework_TestCase
+class PluginIssoTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path
<?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
+class PluginMarkdownTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ConfigManager instance.
<?php
+namespace Shaarli\Plugin\Playvideos;
/**
* PluginPlayvideosTest.php
*/
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
+
require_once 'plugins/playvideos/playvideos.php';
-require_once 'application/Router.php';
/**
* Class PluginPlayvideosTest
* Unit test for the PlayVideos plugin
*/
-class PluginPlayvideosTest extends PHPUnit_Framework_TestCase
+class PluginPlayvideosTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path
<?php
+namespace Shaarli\Plugin\Pubsubhubbub;
+
use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
require_once 'plugins/pubsubhubbub/pubsubhubbub.php';
-require_once 'application/Router.php';
/**
* Class PluginPubsubhubbubTest
* Unit test for the pubsubhubbub plugin
*/
-class PluginPubsubhubbubTest extends PHPUnit_Framework_TestCase
+class PluginPubsubhubbubTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Config file path (without extension).
<?php
+namespace Shaarli\Plugin\Qrcode;
+
/**
* PluginQrcodeTest.php
*/
+use Shaarli\Plugin\PluginManager;
+use Shaarli\Router;
+
require_once 'plugins/qrcode/qrcode.php';
-require_once 'application/Router.php';
/**
* Class PluginQrcodeTest
* Unit test for the QR-Code plugin
*/
-class PluginQrcodeTest extends PHPUnit_Framework_TestCase
+class PluginQrcodeTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path
<?php
-use Shaarli\Config\ConfigManager;
+namespace Shaarli\Plugin\Wallabag;
-/**
- * PluginWallabagTest.php.php
- */
+use Shaarli\Config\ConfigManager;
+use Shaarli\Plugin\PluginManager;
require_once 'plugins/wallabag/wallabag.php';
* Class PluginWallabagTest
* Unit test for the Wallabag plugin
*/
-class PluginWallabagTest extends PHPUnit_Framework_TestCase
+class PluginWallabagTest extends \PHPUnit\Framework\TestCase
{
/**
* Reset plugin path
<?php
-
-require_once 'plugins/wallabag/WallabagInstance.php';
+namespace Shaarli\Plugin\Wallabag;
/**
* Class WallabagInstanceTest
*/
-class WallabagInstanceTest extends PHPUnit_Framework_TestCase
+class WallabagInstanceTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string wallabag url.
<?php
-namespace Shaarli;
+namespace Shaarli\Render;
/**
* Class ThemeUtilsTest
*
* @package Shaarli
*/
-class ThemeUtilsTest extends \PHPUnit_Framework_TestCase
+class ThemeUtilsTest extends \PHPUnit\Framework\TestCase
{
/**
* Test getThemes() with existing theme directories.
namespace Shaarli\Security;
require_once 'tests/utils/FakeConfigManager.php';
-use \PHPUnit\Framework\TestCase;
+
+use PHPUnit\Framework\TestCase;
/**
* Test coverage for LoginManager
require_once 'tests/utils/ReferenceSessionIdHashes.php';
ReferenceSessionIdHashes::genAllHashes();
-use \Shaarli\Security\SessionManager;
-use \PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\TestCase;
+use Shaarli\Security\SessionManager;
/**
* Test coverage for SessionManager
<?php
+namespace Shaarli\Updater;
-require_once 'application/Updater.php';
+use Exception;
+use ReflectionClass;
+use ReflectionMethod;
+use Shaarli\Bookmark\LinkDB;
+use Shaarli\Config\ConfigManager;
/**
* Class DummyUpdater.
- * Extends Updater to add update method designed for unit tests.
+ * Extends updater to add update method designed for unit tests.
*/
class DummyUpdater extends Updater
{
<?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 'tests/Updater/DummyUpdater.php';
+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.
+ * Runs unit tests against the updater class.
*/
-class UpdaterTest extends PHPUnit_Framework_TestCase
+class UpdaterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var string Path to test datastore.
/**
* Test Update failed.
*
- * @expectedException UpdaterException
+ * @expectedException \Exception
*/
public function testUpdateFailed()
{
$this->conf->setConfigFile('tests/utils/config/configPhp');
$this->conf->reset();
- $optionsFile = 'tests/Updater/options.php';
+ $optionsFile = 'tests/updater/options.php';
$options = '<?php
$GLOBALS[\'privateLinkByDefault\'] = true;';
file_put_contents($optionsFile, $options);
// tmp config file.
- $this->conf->setConfigFile('tests/Updater/config');
+ $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
+ // This writes a new config file in tests/updater/config.php
$updater->updateMethodMergeDeprecatedConfigFile();
// make sure updated field is changed
*/
public function testRenameDashTags()
{
- $refDB = new ReferenceLinkDB();
+ $refDB = new \ReferenceLinkDB();
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
'private' => true,
),
);
- $refDB = new ReferenceLinkDB();
+ $refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
*/
public function testDatastoreIdsNothingToDo()
{
- $refDB = new ReferenceLinkDB();
+ $refDB = new \ReferenceLinkDB();
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
1 => ['id' => 1] + $blank,
2 => ['id' => 2] + $blank,
];
- $refDB = new ReferenceLinkDB();
+ $refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
1 => ['id' => 1, 'sticky' => true] + $blank,
2 => ['id' => 2] + $blank,
];
- $refDB = new ReferenceLinkDB();
+ $refDB = new \ReferenceLinkDB();
$refDB->setLinks($links);
$refDB->write(self::$testDatastore);
$linkDB = new LinkDB(self::$testDatastore, true, false);
--- /dev/null
+<?php
+/**
+ * Old-style mock for cURL, as PHPUnit doesn't allow to mock global functions
+ */
+
+/**
+ * Returns code 200 or html content type.
+ *
+ * @param resource $ch cURL resource
+ * @param int $type cURL info type
+ *
+ * @return int|string 200 or 'text/html'
+ */
+function ut_curl_getinfo_ok($ch, $type)
+{
+ switch ($type) {
+ case CURLINFO_RESPONSE_CODE:
+ return 200;
+ case CURLINFO_CONTENT_TYPE:
+ return 'text/html; charset=utf-8';
+ }
+}
+
+/**
+ * Returns code 200 or html content type without charset.
+ *
+ * @param resource $ch cURL resource
+ * @param int $type cURL info type
+ *
+ * @return int|string 200 or 'text/html'
+ */
+function ut_curl_getinfo_no_charset($ch, $type)
+{
+ switch ($type) {
+ case CURLINFO_RESPONSE_CODE:
+ return 200;
+ case CURLINFO_CONTENT_TYPE:
+ return 'text/html';
+ }
+}
+
+/**
+ * Invalid response code.
+ *
+ * @param resource $ch cURL resource
+ * @param int $type cURL info type
+ *
+ * @return int|string 404 or 'text/html'
+ */
+function ut_curl_getinfo_rc_ko($ch, $type)
+{
+ switch ($type) {
+ case CURLINFO_RESPONSE_CODE:
+ return 404;
+ case CURLINFO_CONTENT_TYPE:
+ return 'text/html; charset=utf-8';
+ }
+}
+
+/**
+ * Invalid content type.
+ *
+ * @param resource $ch cURL resource
+ * @param int $type cURL info type
+ *
+ * @return int|string 200 or 'text/plain'
+ */
+function ut_curl_getinfo_ct_ko($ch, $type)
+{
+ switch ($type) {
+ case CURLINFO_RESPONSE_CODE:
+ return 200;
+ case CURLINFO_CONTENT_TYPE:
+ return 'text/plain';
+ }
+}
+
+/**
+ * Invalid response code and content type.
+ *
+ * @param resource $ch cURL resource
+ * @param int $type cURL info type
+ *
+ * @return int|string 404 or 'text/plain'
+ */
+function ut_curl_getinfo_rs_ct_ko($ch, $type)
+{
+ switch ($type) {
+ case CURLINFO_RESPONSE_CODE:
+ return 404;
+ case CURLINFO_CONTENT_TYPE:
+ return 'text/plain';
+ }
+}
--- /dev/null
+<?php
+
+namespace Shaarli;
+
+/**
+ * Fake ApplicationUtils class to avoid HTTP requests
+ */
+class FakeApplicationUtils extends ApplicationUtils
+{
+ public static $VERSION_CODE = '';
+
+ /**
+ * Toggle HTTP requests, allow overriding the version code
+ */
+ public static function getVersion($url, $timeout = 0)
+ {
+ return self::$VERSION_CODE;
+ }
+}
<?php
+use Shaarli\FileUtils;
+use Shaarli\History;
+
/**
* Populates a reference history
*/
<?php
+
+use Shaarli\Bookmark\LinkDB;
+
/**
* Populates a reference datastore to test LinkDB
*/
$GLOBALS['redirector'] = 'lala';
$GLOBALS['disablesessionprotection'] = false;
$GLOBALS['privateLinkByDefault'] = false;
-$GLOBALS['config']['DATADIR'] = 'tests/Updater';
+$GLOBALS['config']['DATADIR'] = 'tests/updater';
$GLOBALS['config']['PAGECACHE'] = 'sandbox/pagecache';
$GLOBALS['config']['DATASTORE'] = 'data/datastore.php';
$GLOBALS['plugins']['WALLABAG_VERSION'] = '1';