<?php
+
namespace Shaarli\Netscape;
use DateTime;
+use malkusch\lock\mutex\NoMutex;
+use Psr\Http\Message\UploadedFileInterface;
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;
+use Shaarli\TestCase;
+use Slim\Http\UploadedFile;
/**
* Utility function to load a file's metadata in a $_FILES-like array
*
* @param string $filename Basename of the file
*
- * @return array A $_FILES-like array
+ * @return UploadedFileInterface Upload file in PSR-7 compatible object
*/
function file2array($filename)
{
- return array(
- 'filetoupload' => array(
- 'name' => $filename,
- 'tmp_name' => __DIR__ . '/input/' . $filename,
- 'size' => filesize(__DIR__ . '/input/' . $filename)
- )
+ return new UploadedFile(
+ __DIR__ . '/input/' . $filename,
+ $filename,
+ null,
+ filesize(__DIR__ . '/input/' . $filename)
);
}
/**
* 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.
*/
protected static $defaultTimeZone;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
self::$defaultTimeZone = date_default_timezone_get();
// Timezone without DST for test consistency
/**
* Resets test data before each test
*/
- protected function setUp()
+ protected function setUp(): void
{
+ $mutex = new NoMutex();
if (file_exists(self::$testDatastore)) {
unlink(self::$testDatastore);
}
$this->conf->set('resource.page_cache', $this->pagecache);
$this->conf->set('resource.datastore', self::$testDatastore);
$this->history = new History(self::$historyFilePath);
- $this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
+ $this->bookmarkService = new BookmarkFileService($this->conf, $this->history, $mutex, true);
+ $this->netscapeBookmarkUtils = new NetscapeBookmarkUtils($this->bookmarkService, $this->conf, $this->history);
}
/**
* Delete history file.
*/
- public function tearDown()
+ protected function tearDown(): void
{
@unlink(self::$historyFilePath);
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
date_default_timezone_set(self::$defaultTimeZone);
}
$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));
{
$post = array(
'privacy' => 'public',
- 'default_tags' => 'tag1,tag2 tag3'
+ 'default_tags' => 'tag1 tag2 tag3'
);
$files = file2array('netscape_basic.htm');
$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));
{
$post = array(
'privacy' => 'public',
- 'default_tags' => 'tag1&,tag2 "tag3"'
+ 'default_tags' => 'tag1& tag2 "tag3"'
);
$files = file2array('netscape_basic.htm');
$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));
);
}
+ /**
+ * Add user-specified tags to all imported bookmarks
+ */
+ public function testSetDefaultTagsWithCustomSeparator()
+ {
+ $separator = '@';
+ $this->conf->set('general.tags_separator', $separator);
+ $post = [
+ 'privacy' => 'public',
+ 'default_tags' => 'tag1@tag2@tag3@multiple words tag'
+ ];
+ $files = file2array('netscape_basic.htm');
+ $this->assertStringMatchesFormat(
+ 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
+ .' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
+ $this->netscapeBookmarkUtils->import($post, $files)
+ );
+ $this->assertEquals(2, $this->bookmarkService->count());
+ $this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
+ $this->assertEquals(
+ 'tag1@tag2@tag3@multiple words tag@private@secret',
+ $this->bookmarkService->get(0)->getTagsString($separator)
+ );
+ $this->assertEquals(
+ ['tag1', 'tag2', 'tag3', 'multiple words tag', 'private', 'secret'],
+ $this->bookmarkService->get(0)->getTags()
+ );
+ $this->assertEquals(
+ 'tag1@tag2@tag3@multiple words tag@public@hello@world',
+ $this->bookmarkService->get(1)->getTagsString($separator)
+ );
+ $this->assertEquals(
+ ['tag1', 'tag2', 'tag3', 'multiple words tag', 'public', 'hello', 'world'],
+ $this->bookmarkService->get(1)->getTags()
+ );
+ }
+
/**
* Ensure each imported bookmark has a unique id
*
$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']);