/**
* Utilities to import and export bookmarks using the Netscape format
- * TODO: Not static, use a container.
*/
class NetscapeBookmarkUtils
{
+ /** @var BookmarkServiceInterface */
+ protected $bookmarkService;
+
+ /** @var ConfigManager */
+ protected $conf;
+
+ /** @var History */
+ protected $history;
+
+ public function __construct(BookmarkServiceInterface $bookmarkService, ConfigManager $conf, History $history)
+ {
+ $this->bookmarkService = $bookmarkService;
+ $this->conf = $conf;
+ $this->history = $history;
+ }
/**
* Filters bookmarks and adds Netscape-formatted fields
* - timestamp link addition date, using the Unix epoch format
* - taglist comma-separated tag list
*
- * @param BookmarkServiceInterface $bookmarkService Link datastore
* @param BookmarkFormatter $formatter instance
* @param string $selection Which bookmarks to export: (all|private|public)
* @param bool $prependNoteUrl Prepend note permalinks with the server's URL
* @param string $indexUrl Absolute URL of the Shaarli index page
*
* @return array The bookmarks to be exported, with additional fields
- *@throws Exception Invalid export selection
*
+ * @throws Exception Invalid export selection
*/
- public static function filterAndFormat(
- $bookmarkService,
+ public function filterAndFormat(
$formatter,
$selection,
$prependNoteUrl,
}
$bookmarkLinks = array();
- foreach ($bookmarkService->search([], $selection) as $bookmark) {
+ foreach ($this->bookmarkService->search([], $selection) as $bookmark) {
$link = $formatter->format($bookmark);
$link['taglist'] = implode(',', $bookmark->getTags());
if ($bookmark->isNote() && $prependNoteUrl) {
return $bookmarkLinks;
}
- /**
- * Generates an import status summary
- *
- * @param string $filename name of the file to import
- * @param int $filesize size of the file to import
- * @param int $importCount how many bookmarks were imported
- * @param int $overwriteCount how many bookmarks were overwritten
- * @param int $skipCount how many bookmarks were skipped
- * @param int $duration how many seconds did the import take
- *
- * @return string Summary of the bookmark import status
- */
- private static function importStatus(
- $filename,
- $filesize,
- $importCount = 0,
- $overwriteCount = 0,
- $skipCount = 0,
- $duration = 0
- ) {
- $status = sprintf(t('File %s (%d bytes) '), $filename, $filesize);
- if ($importCount == 0 && $overwriteCount == 0 && $skipCount == 0) {
- $status .= t('has an unknown file format. Nothing was imported.');
- } else {
- $status .= vsprintf(
- t(
- 'was successfully processed in %d seconds: '
- . '%d bookmarks imported, %d bookmarks overwritten, %d bookmarks skipped.'
- ),
- [$duration, $importCount, $overwriteCount, $skipCount]
- );
- }
- return $status;
- }
-
/**
* Imports Web bookmarks from an uploaded Netscape bookmark dump
*
* @param array $post Server $_POST parameters
* @param array $files Server $_FILES parameters
- * @param BookmarkServiceInterface $bookmarkService Loaded LinkDB instance
- * @param ConfigManager $conf instance
- * @param History $history History instance
*
* @return string Summary of the bookmark import status
*/
- public static function import($post, $files, $bookmarkService, $conf, $history)
+ public function import($post, $files)
{
$start = time();
$filename = $files['filetoupload']['name'];
true, // nested tag support
$defaultTags, // additional user-specified tags
strval(1 - $defaultPrivacy), // defaultPub = 1 - defaultPrivacy
- $conf->get('resource.data_dir') // log path, will be overridden
+ $this->conf->get('resource.data_dir') // log path, will be overridden
);
$logger = new Logger(
- $conf->get('resource.data_dir'),
- !$conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
+ $this->conf->get('resource.data_dir'),
+ !$this->conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
[
'prefix' => 'import.',
'extension' => 'log',
$private = 0;
}
- $link = $bookmarkService->findByUrl($bkm['uri']);
+ $link = $this->bookmarkService->findByUrl($bkm['uri']);
$existingLink = $link !== null;
if (! $existingLink) {
$link = new Bookmark();
}
$link->setTitle($bkm['title']);
- $link->setUrl($bkm['uri'], $conf->get('security.allowed_protocols'));
+ $link->setUrl($bkm['uri'], $this->conf->get('security.allowed_protocols'));
$link->setDescription($bkm['note']);
$link->setPrivate($private);
$link->setTagsString($bkm['tags']);
- $bookmarkService->addOrSet($link, false);
+ $this->bookmarkService->addOrSet($link, false);
$importCount++;
}
- $bookmarkService->save();
- $history->importLinks();
+ $this->bookmarkService->save();
+ $this->history->importLinks();
$duration = time() - $start;
- return self::importStatus(
+
+ return $this->importStatus(
$filename,
$filesize,
$importCount,
$duration
);
}
+
+ /**
+ * Generates an import status summary
+ *
+ * @param string $filename name of the file to import
+ * @param int $filesize size of the file to import
+ * @param int $importCount how many bookmarks were imported
+ * @param int $overwriteCount how many bookmarks were overwritten
+ * @param int $skipCount how many bookmarks were skipped
+ * @param int $duration how many seconds did the import take
+ *
+ * @return string Summary of the bookmark import status
+ */
+ protected function importStatus(
+ $filename,
+ $filesize,
+ $importCount = 0,
+ $overwriteCount = 0,
+ $skipCount = 0,
+ $duration = 0
+ ) {
+ $status = sprintf(t('File %s (%d bytes) '), $filename, $filesize);
+ if ($importCount == 0 && $overwriteCount == 0 && $skipCount == 0) {
+ $status .= t('has an unknown file format. Nothing was imported.');
+ } else {
+ $status .= vsprintf(
+ t(
+ 'was successfully processed in %d seconds: '
+ . '%d bookmarks imported, %d bookmarks overwritten, %d bookmarks skipped.'
+ ),
+ [$duration, $importCount, $overwriteCount, $skipCount]
+ );
+ }
+ return $status;
+ }
}
<?php
+
namespace Shaarli\Netscape;
+use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkFileService;
-use Shaarli\Bookmark\LinkDB;
use Shaarli\Config\ConfigManager;
-use Shaarli\Formatter\FormatterFactory;
use Shaarli\Formatter\BookmarkFormatter;
+use Shaarli\Formatter\FormatterFactory;
use Shaarli\History;
require_once 'tests/utils/ReferenceLinkDB.php';
/**
* Netscape bookmark export
*/
-class BookmarkExportTest extends \PHPUnit\Framework\TestCase
+class BookmarkExportTest extends TestCase
{
/**
* @var string datastore to test write operations
*/
protected static $testDatastore = 'sandbox/datastore.php';
+ /**
+ * @var ConfigManager instance.
+ */
+ protected static $conf;
+
/**
* @var \ReferenceLinkDB instance.
*/
*/
protected static $formatter;
+ /**
+ * @var History instance
+ */
+ protected static $history;
+
+ /**
+ * @var NetscapeBookmarkUtils
+ */
+ protected $netscapeBookmarkUtils;
+
/**
* Instantiate reference data
*/
public static function setUpBeforeClass()
{
- $conf = new ConfigManager('tests/utils/config/configJson');
- $conf->set('resource.datastore', self::$testDatastore);
- self::$refDb = new \ReferenceLinkDB();
- self::$refDb->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
- self::$bookmarkService = new BookmarkFileService($conf, $history, true);
- $factory = new FormatterFactory($conf, true);
- self::$formatter = $factory->getFormatter('raw');
+ static::$conf = new ConfigManager('tests/utils/config/configJson');
+ static::$conf->set('resource.datastore', static::$testDatastore);
+ static::$refDb = new \ReferenceLinkDB();
+ static::$refDb->write(static::$testDatastore);
+ static::$history = new History('sandbox/history.php');
+ static::$bookmarkService = new BookmarkFileService(static::$conf, static::$history, true);
+ $factory = new FormatterFactory(static::$conf, true);
+ static::$formatter = $factory->getFormatter('raw');
+ }
+
+ public function setUp(): void
+ {
+ $this->netscapeBookmarkUtils = new NetscapeBookmarkUtils(
+ static::$bookmarkService,
+ static::$conf,
+ static::$history
+ );
}
/**
*/
public function testFilterAndFormatInvalid()
{
- NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'derp',
false,
*/
public function testFilterAndFormatAll()
{
- $links = NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $links = $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'all',
false,
*/
public function testFilterAndFormatPrivate()
{
- $links = NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $links = $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'private',
false,
*/
public function testFilterAndFormatPublic()
{
- $links = NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $links = $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'public',
false,
*/
public function testFilterAndFormatDoNotPrependNoteUrl()
{
- $links = NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $links = $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'public',
false,
public function testFilterAndFormatPrependNoteUrl()
{
$indexUrl = 'http://localhost:7469/shaarli/';
- $links = NetscapeBookmarkUtils::filterAndFormat(
- self::$bookmarkService,
+ $links = $this->netscapeBookmarkUtils->filterAndFormat(
self::$formatter,
'public',
true,
<?php
+
namespace Shaarli\Netscape;
use DateTime;
+use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark;
-use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Bookmark\BookmarkFileService;
-use Shaarli\Bookmark\LinkDB;
+use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Config\ConfigManager;
use Shaarli\History;
/**
* Netscape bookmark import
*/
-class BookmarkImportTest extends \PHPUnit\Framework\TestCase
+class BookmarkImportTest extends TestCase
{
/**
* @var string datastore to test write operations
*/
protected $history;
+ /**
+ * @var NetscapeBookmarkUtils
+ */
+ protected $netscapeBookmarkUtils;
+
/**
* @var string Save the current timezone.
*/
$this->conf->set('resource.datastore', self::$testDatastore);
$this->history = new History(self::$historyFilePath);
$this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
+ $this->netscapeBookmarkUtils = new NetscapeBookmarkUtils($this->bookmarkService, $this->conf, $this->history);
}
/**
$this->assertEquals(
'File empty.htm (0 bytes) has an unknown file format.'
.' Nothing was imported.',
- NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import(null, $files)
);
$this->assertEquals(0, $this->bookmarkService->count());
}
$files = file2array('no_doctype.htm');
$this->assertEquals(
'File no_doctype.htm (350 bytes) has an unknown file format. Nothing was imported.',
- NetscapeBookmarkUtils::import(null, $files, null, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import(null, $files)
);
$this->assertEquals(0, $this->bookmarkService->count());
}
$this->assertStringMatchesFormat(
'File lowercase_doctype.htm (386 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import(null, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import(null, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
}
$this->assertStringMatchesFormat(
'File internet_explorer_encoding.htm (356 bytes) was successfully processed in %d seconds:'
.' 1 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import([], $files)
);
$this->assertEquals(1, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_nested.htm (1337 bytes) was successfully processed in %d seconds:'
.' 8 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import([], $files)
);
$this->assertEquals(8, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import([], $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import([], $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(2, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 0 bookmarks imported, 0 bookmarks overwritten, 2 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import($post, $files)
);
$this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
$this->assertStringMatchesFormat(
'File same_date.htm (453 bytes) was successfully processed in %d seconds:'
.' 3 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
- NetscapeBookmarkUtils::import(array(), $files, $this->bookmarkService, $this->conf, $this->history)
+ $this->netscapeBookmarkUtils->import(array(), $files)
);
$this->assertEquals(3, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
'overwrite' => 'true',
];
$files = file2array('netscape_basic.htm');
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history);
+ $this->netscapeBookmarkUtils->import($post, $files);
$history = $this->history->getHistory();
$this->assertEquals(1, count($history));
$this->assertEquals(History::IMPORT, $history[0]['event']);
$this->assertTrue(new DateTime('-5 seconds') < $history[0]['datetime']);
// re-import as private, enable overwriting
- NetscapeBookmarkUtils::import($post, $files, $this->bookmarkService, $this->conf, $this->history);
+ $this->netscapeBookmarkUtils->import($post, $files);
$history = $this->history->getHistory();
$this->assertEquals(2, count($history));
$this->assertEquals(History::IMPORT, $history[0]['event']);