Merge branch 'master' of github.com:Shaarli/Shaarli into upstream

This commit is contained in:
Keith Carangelo 2021-08-26 14:17:37 -04:00
commit 6ca8ab31b2
131 changed files with 4833 additions and 2527 deletions

View file

@ -4,7 +4,6 @@
.github .github
.gitattributes .gitattributes
.gitignore .gitignore
.travis.yml
tests tests
# Docker related resources are not needed inside the container # Docker related resources are not needed inside the container

99
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,99 @@
name: Shaarli CI
on: [push, pull_request]
jobs:
php:
runs-on: ubuntu-18.04
strategy:
matrix:
php-versions: ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
name: PHP ${{ matrix.php-versions }}
steps:
- name: Set locales
run: |
sudo locale-gen de_DE.utf8 && \
sudo locale-gen en_US.utf8 && \
sudo locale-gen fr_FR.utf8 && \
sudo dpkg-reconfigure --frontend=noninteractive locales
- name: Install Gettext
run: sudo apt-get install gettext
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: gd, xml, curl, mbstring, intl, gettext
tools: composer:v2
- name: Check PHP version
run: php -v
- name: Setup Composer from PHP version + update
run: composer config --unset platform && composer config platform.php ${{ matrix.php-versions }}
- name: Update dependencies for PHP 8.x
if: ${{ matrix.php-versions == '8.0' || matrix.php-versions == '8.1' }}
run: |
composer update --ignore-platform-req=php && \
composer remove --dev --ignore-platform-req=php phpunit/phpunit && \
composer require --dev --ignore-platform-req=php phpunit/php-text-template ^2.0 && \
composer require --dev --ignore-platform-req=php phpunit/phpunit ^9.0
- name: Update dependencies for PHP 7.x
if: ${{ matrix.php-versions != '8.0' && matrix.php-versions != '8.1' }}
run: composer update
- name: Clean up
run: make clean
- name: Check permissions
run: make check_permissions
- name: Run PHPCS
run: make code_sniffer
- name: Run tests
run: make all_tests
node:
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: Yarn install
run: yarn install
- name: Verify successful frontend builds
run: yarn run build
- name: JS static analysis
run: make eslint
- name: Linter for SASS syntax
run: make sasslint
python:
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
node-version: 3.8
- name: Install dependencies
run: pip install mkdocs
- name: Build documentation
run: mkdocs build --clean

25
.github/workflows/docker-latest.yml vendored Normal file
View file

@ -0,0 +1,25 @@
name: Build/push Docker image (master/latest)
on:
push:
branches: [ master ]
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: shaarli/shaarli:latest
- name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}

31
.github/workflows/docker-tags.yml vendored Normal file
View file

@ -0,0 +1,31 @@
name: Build/push Docker image (tags/releases)
on:
push:
tags:
- "v*.*.*"
branches:
- "v*.*"
- release
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Get the tag name
run: echo "REF=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: shaarli/shaarli:${{ env.REF }}
- name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}

View file

@ -1,68 +0,0 @@
dist: bionic
matrix:
include:
# jobs for each supported php version
- language: php
php: nightly # PHP 8.0
install:
- composer self-update --2
- composer update --ignore-platform-req=php
- composer remove --dev --ignore-platform-req=php phpunit/phpunit
- composer require --dev --ignore-platform-req=php phpunit/php-text-template ^2.0
- composer require --dev --ignore-platform-req=php phpunit/phpunit ^9.0
- language: php
php: 7.4
- language: php
php: 7.3
- language: php
php: 7.2
- language: php
php: 7.1
# jobs for frontend builds
- language: node_js
node_js: 10
cache:
yarn: true
directories:
- $HOME/.cache/yarn
install:
- yarn install
before_script:
- PATH=${PATH//:\.\/node_modules\/\.bin/}
script:
- yarn run build # verify successful frontend builds
- make eslint # javascript static analysis
- make sasslint # linter for SASS syntax
# jobs for documentation builds
- language: python
python: 3.6
cache:
directories:
- $HOME/.cache/pip
install:
- pip install mkdocs
script:
- mkdocs build --clean
cache:
directories:
- $HOME/.composer/cache
before_install:
# Disable xdebug: it significantly speed up tests and linter, and we don't use coverage yet
- phpenv config-rm xdebug.ini || echo 'No xdebug config.'
install:
# install/update composer and php dependencies
- composer config --unset platform && composer config platform.php $TRAVIS_PHP_VERSION
- composer update
before_script:
- PATH=${PATH//:\.\/node_modules\/\.bin/}
script:
- make clean
- make check_permissions
- make code_sniffer
- make all_tests

View file

@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## [v0.12.2]() - UNRELEASED ## [v0.12.2]() - UNRELEASED
> The `:master` Docker image is deprecated, please use `:latest` instead.
> The `:stable` Docker image is deprecated, please use `:release` instead.
## [v0.12.1](https://github.com/shaarli/Shaarli/releases/tag/v0.12.0) - 2020-11-12 ## [v0.12.1](https://github.com/shaarli/Shaarli/releases/tag/v0.12.0) - 2020-11-12
> nginx ([#1628](https://github.com/shaarli/Shaarli/pull/1628)) and Apache ([#1630](https://github.com/shaarli/Shaarli/pull/1630)) configurations have been reviewed. It is recommended that you > nginx ([#1628](https://github.com/shaarli/Shaarli/pull/1628)) and Apache ([#1630](https://github.com/shaarli/Shaarli/pull/1630)) configurations have been reviewed. It is recommended that you

View file

@ -13,7 +13,7 @@ _It is designed to be personal (single-user), fast and handy._
[![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli) [![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli)
• •
[![](https://img.shields.io/badge/master-v0.12.x-blue.svg)](https://github.com/shaarli/Shaarli) [![](https://img.shields.io/badge/master-v0.12.x-blue.svg)](https://github.com/shaarli/Shaarli)
[![](https://img.shields.io/travis/shaarli/Shaarli.svg?label=master)](https://travis-ci.org/shaarli/Shaarli) [![](https://github.com/shaarli/Shaarli/actions/workflows/ci.yml/badge.svg)](https://github.com/shaarli/Shaarli/actions)
[![Join the chat at https://gitter.im/shaarli/Shaarli](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shaarli/Shaarli) [![Join the chat at https://gitter.im/shaarli/Shaarli](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shaarli/Shaarli)
[![Bountysource](https://www.bountysource.com/badge/team?team_id=19583&style=bounties_received)](https://www.bountysource.com/teams/shaarli/issues) [![Bountysource](https://www.bountysource.com/badge/team?team_id=19583&style=bounties_received)](https://www.bountysource.com/teams/shaarli/issues)

View file

@ -187,6 +187,7 @@ public static function getAvailableLanguages()
'fr' => t('French'), 'fr' => t('French'),
'jp' => t('Japanese'), 'jp' => t('Japanese'),
'ru' => t('Russian'), 'ru' => t('Russian'),
'zh_CN' => t('Chinese (Simplified)'),
]; ];
} }
} }

View file

@ -74,7 +74,7 @@ public function __construct(
$this->isLoggedIn = $isLoggedIn; $this->isLoggedIn = $isLoggedIn;
if (!$this->isLoggedIn && $this->conf->get('privacy.hide_public_links', false)) { if (!$this->isLoggedIn && $this->conf->get('privacy.hide_public_links', false)) {
$this->bookmarks = []; $this->bookmarks = new BookmarkArray();
} else { } else {
try { try {
$this->bookmarks = $this->bookmarksIO->read(); $this->bookmarks = $this->bookmarksIO->read();

View file

@ -12,8 +12,8 @@
*/ */
class BookmarkDefaultFormatter extends BookmarkFormatter class BookmarkDefaultFormatter extends BookmarkFormatter
{ {
public const SEARCH_HIGHLIGHT_OPEN = '||O_HIGHLIGHT'; public const SEARCH_HIGHLIGHT_OPEN = 'SHAARLI_O_HIGHLIGHT';
public const SEARCH_HIGHLIGHT_CLOSE = '||C_HIGHLIGHT'; public const SEARCH_HIGHLIGHT_CLOSE = 'SHAARLI_C_HIGHLIGHT';
/** /**
* @inheritdoc * @inheritdoc

View file

@ -71,5 +71,11 @@
"Shaarli\\Updater\\": "application/updater", "Shaarli\\Updater\\": "application/updater",
"Shaarli\\Updater\\Exception\\": "application/updater/exception" "Shaarli\\Updater\\Exception\\": "application/updater/exception"
} }
},
"autoload-dev": {
"psr-4": {
"Shaarli\\Tests\\": "tests",
"Shaarli\\Tests\\Utils\\": "tests/utils"
}
} }
} }

518
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -14,7 +14,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- if 'media.readthedocs.org' not in config.extra_css[0] %} {%- if config.extra_css|length and 'media.readthedocs.org' not in config.extra_css[0] %}
<meta name="robots" content="noindex, nofollow"> <meta name="robots" content="noindex, nofollow">
{%- endif %} {%- endif %}

View file

@ -41,9 +41,10 @@ docker run hello-world
Shaarli images are available on [DockerHub](https://hub.docker.com/r/shaarli/shaarli/) `shaarli/shaarli`: Shaarli images are available on [DockerHub](https://hub.docker.com/r/shaarli/shaarli/) `shaarli/shaarli`:
- `latest`: latest branch (last release) - `latest`: master (development) branch
- `stable`: stable branch (last release in previous major version) - `vX.Y.Z`: shaarli [releases](https://github.com/shaarli/Shaarli/releases)
- `master`: master branch (development branch) - `release`: always points to the last release
- `stable` and `master`: **deprecated**. These tags are no longer maintained and may be removed without notice
These images are built automatically on DockerHub and rely on: These images are built automatically on DockerHub and rely on:

View file

@ -49,7 +49,6 @@ Usage of each plugin is documented in it's README file:
* `archiveorg`: For each Shaare, add a link to the archived page on Archive.org * `archiveorg`: For each Shaare, add a link to the archived page on Archive.org
* `default_colors`: Override default theme colors. * `default_colors`: Override default theme colors.
* `isso`: Let visitor comment your shaares on permalinks with Isso. * `isso`: Let visitor comment your shaares on permalinks with Isso.
* [`markdown`](https://github.com/shaarli/Shaarli/blob/master/plugins/markdown/README.md): Render shaare description with Markdown syntax.
* `piwik`: A plugin that adds Piwik tracking code to Shaarli pages. * `piwik`: A plugin that adds Piwik tracking code to Shaarli pages.
* [`playvideos`](https://github.com/shaarli/Shaarli/blob/master/plugins/playvideos/README.md): Add a button in the toolbar allowing to watch all videos. * [`playvideos`](https://github.com/shaarli/Shaarli/blob/master/plugins/playvideos/README.md): Add a button in the toolbar allowing to watch all videos.
* `pubsubhubbub`: Enable PubSubHubbub feed publishing * `pubsubhubbub`: Enable PubSubHubbub feed publishing
@ -59,4 +58,4 @@ Usage of each plugin is documented in it's README file:
### Third party plugins ### Third party plugins
See [Community & related software](https://shaarli.readthedocs.io/en/master/Community-and-Related-software/) See [Community & related software](https://shaarli.readthedocs.io/en/master/Community-and-related-software/)

View file

@ -118,6 +118,7 @@ http {
ssl_certificate /path/to/certificate ssl_certificate /path/to/certificate
ssl_certificate_key /path/to/private/key ssl_certificate_key /path/to/private/key
# if shaarli is installed in a subdirectory of the main domain, edit the location accordingly
location / { location / {
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

View file

@ -59,10 +59,15 @@ Extension | Required? | Usage
[`php-json`](http://php.net/manual/en/book.json.php) | required | configuration parsing [`php-json`](http://php.net/manual/en/book.json.php) | required | configuration parsing
[`php-simplexml`](https://www.php.net/manual/en/book.simplexml.php) | required | REST API (Slim framework) [`php-simplexml`](https://www.php.net/manual/en/book.simplexml.php) | required | REST API (Slim framework)
[`php-mbstring`](http://php.net/manual/en/book.mbstring.php) | CentOS, Fedora, RHEL, Windows, some hosting providers | multibyte (Unicode) string support [`php-mbstring`](http://php.net/manual/en/book.mbstring.php) | CentOS, Fedora, RHEL, Windows, some hosting providers | multibyte (Unicode) string support
[`php-ctype`](https://www.php.net/manual/en/book.ctype.php) | required (bundled with most PHP installation) | Type checking
[`php-iconv`](https://www.php.net/manual/en/book.iconv.php) | required (bundled with most PHP installation) | Character encoding used in translations
[`php-session`](https://www.php.net/manual/en/book.session.php) | required (bundled with most PHP installation) | User session
[`php-zlib`](https://www.php.net/manual/en/book.zlib.php) | required (bundled with most PHP installation) | Datastore I/O compression
[`php-gd`](http://php.net/manual/en/book.image.php) | optional | required to use thumbnails [`php-gd`](http://php.net/manual/en/book.image.php) | optional | required to use thumbnails
[`php-intl`](http://php.net/manual/en/book.intl.php) | optional | localized text sorting (e.g. `e->è->f`) [`php-intl`](http://php.net/manual/en/book.intl.php) | optional | localized text sorting (e.g. `e->è->f`)
[`php-curl`](http://php.net/manual/en/book.curl.php) | optional | using cURL for fetching webpages and thumbnails in a more robust way [`php-curl`](http://php.net/manual/en/book.curl.php) | optional | using cURL for fetching webpages and thumbnails in a more robust way
[`php-gettext`](http://php.net/manual/en/book.gettext.php) | optional | Use the translation system in gettext mode (faster) [`php-gettext`](http://php.net/manual/en/book.gettext.php) | optional | Use the translation system in gettext mode (faster)
[`php-ldap`](https://www.php.net/manual/en/book.ldap.php) | optional | LDAP login support
Some [plugins](Plugins.md) may require additional configuration. Some [plugins](Plugins.md) may require additional configuration.
@ -300,6 +305,7 @@ server {
client_max_body_size 100m; client_max_body_size 100m;
# relative path to shaarli from the root of the webserver # relative path to shaarli from the root of the webserver
# if shaarli is installed in a subdirectory of the main domain, edit the location accordingly
location / { location / {
# default index file when no file URI is requested # default index file when no file URI is requested
index index.php; index index.php;

View file

@ -96,6 +96,14 @@ If you hosting provider only provides apache 2.2 and no support for `mod_version
Follow the instructions in the error message. Make sure you are accessing shaarli via a direct IP address or a proper hostname. If you have **no dots** in the hostname (e.g. `localhost` or `http://my-webserver/shaarli/`), some browsers will not store cookies at all (this respects the [HTTP cookie specification](http://curl.haxx.se/rfc/cookie_spec.html)). Follow the instructions in the error message. Make sure you are accessing shaarli via a direct IP address or a proper hostname. If you have **no dots** in the hostname (e.g. `localhost` or `http://my-webserver/shaarli/`), some browsers will not store cookies at all (this respects the [HTTP cookie specification](http://curl.haxx.se/rfc/cookie_spec.html)).
### Error 406 "Not acceptable"
If attempting to save a link results in a `Not acceptable` error (HTTP status code of `406`), it is likely due to strict settings for `mod_security` (a module used with Apache). This cannot be mitigated by reconfiguring Shaarli itself, and must be dealt with at the level of the underlying web server instead.
On some shared hosting services (such as **Bluehost**), `mod_security` is enabled by default, so the recommended course of action is to get in touch with the helpdesk and ask them to disable `mod_security` for your domain, sub-domain, or the subdirectory where Shaarli is installed. Ideally, you want to narrow it down to a very specific location, so as to continue reaping the benefits of `mod_security` elsewhere on your domain. If asked for specific, you can refer support staff to this [issue](https://github.com/shaarli/Shaarli/issues/1736), where more technical details are available.
---------------------------------------------------------- ----------------------------------------------------------
## Upgrades ## Upgrades
@ -164,7 +172,7 @@ You can use the third-party tool [Derefind](https://github.com/ShawnPConroy/Dere
### The bookmarklet doesn't work ### The bookmarklet doesn't work
Websites which enforce Content Security Policy (CSP), such as github.com, disallow usage of bookmarklets. Unfortunately, there is nothing Shaarli can do about it ([1](https://github.com/shaarli/Shaarli/issues/196), [2](https://bugzilla.mozilla.org/show_bug.cgi?id=866522), [3](https://code.google.com/p/chromium/issues/detail?id=233903). Some websites may disallow usage of bookmarklets through [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP). Unfortunately, there is nothing Shaarli can do about it ([1](https://github.com/shaarli/Shaarli/issues/196), [2](https://bugzilla.mozilla.org/show_bug.cgi?id=866522), [3](https://code.google.com/p/chromium/issues/detail?id=233903).
Under Opera, you can't drag'n drop the button: You have to right-click on it and add a bookmark to your personal toolbar. Under Opera, you can't drag'n drop the button: You have to right-click on it and add a bookmark to your personal toolbar.

View file

@ -143,17 +143,19 @@ A [`Makefile`](https://github.com/shaarli/Shaarli/blob/master/Makefile) is avail
### Continuous Integration ### Continuous Integration
[Travis CI](http://docs.travis-ci.com/) is a Continuous Integration build server, that runs a build: [Github Actions](https://github.com/shaarli/Shaarli/actions) is a Continuous Integration build server, that runs a build:
- each time a commit is merged to the mainline (`master` branch) - each time a commit is pushed to any branch
- each time a Pull Request is submitted or updated - each time a Pull Request is submitted or updated
After all jobs have finished, Travis returns the results to GitHub: After all jobs have finished, Github Actions returns the results to GitHub:
- a status icon represents the result for the `master` branch: [![](https://api.travis-ci.org/shaarli/Shaarli.svg)](https://travis-ci.org/shaarli/Shaarli) - a status icon represents the result for the `master` branch: [![Build Status](https://github.com/shaarli/Shaarli/actions/workflows/ci.yml/badge.svg)](https://github.com/shaarli/Shaarli/actions)
- Pull Requests are updated with the Travis build result. - Pull Requests are updated with the Github Actions build result.
See [`.travis.yml`](https://github.com/shaarli/Shaarli/blob/master/.travis.yml). Github Actions is also used to build and push [Docker](../Docker.md) images to <https://hub.docker.com/r/shaarli/shaarli> for the `master` branch and on every git `tag`/[release](https://github.com/shaarli/Shaarli/releases).
See [`.github/workflows/`](https://github.com/shaarli/Shaarli/tree/master/.github/workflows).
### Documentation ### Documentation
@ -169,13 +171,11 @@ Patches should try to stick to the [PHP Standard Recommendations](http://www.php
- [PSR-2](http://www.php-fig.org/psr/psr-2/) - Coding Style Guide - [PSR-2](http://www.php-fig.org/psr/psr-2/) - Coding Style Guide
- [PSR-12](http://www.php-fig.org/psr/psr-12/) - Extended Coding Style Guide - [PSR-12](http://www.php-fig.org/psr/psr-12/) - Extended Coding Style Guide
These are enforced on pull requests using our Continuous Integration tools. These are enforced on pull requests using our Continuous Integration tools with [PHP Code Sniffer](https://github.com/squizlabs/PHP_CodeSniffer).
**Work in progress:** Static analysis is currently being discussed here: in [#95 - Fix coding style (static analysis)](https://github.com/shaarli/Shaarli/issues/95), [#130 - Continuous Integration tools & features](https://github.com/shaarli/Shaarli/issues/130) Static analysis tools are installed with Composer dependencies, and used through Shaarli's [Makefile](https://github.com/shaarli/Shaarli/blob/master/Makefile) with `make code_sniffer`.
Static analysis tools can be installed with Composer, and used through Shaarli's [Makefile](https://github.com/shaarli/Shaarli/blob/master/Makefile).
For an overview of the available features, see: For an overview of the available features, see:
- [Code quality: Makefile to run static code checkers](https://github.com/shaarli/Shaarli/pull/124) (#124) - [Code quality: Makefile to run static code checkers](https://github.com/shaarli/Shaarli/pull/124) (#124)
- [Run PHPCS against different coding standards](https://github.com/shaarli/Shaarli/pull/276) (#276) - [Apply PHP Code Sniffer to Shaarli code base](https://github.com/shaarli/Shaarli/pull/1635) (#1635)

View file

@ -60,6 +60,7 @@ Shaarli can be used:
- Easily extensible by any client using the [REST API](REST-API.md) exposed by Shaarli - Easily extensible by any client using the [REST API](REST-API.md) exposed by Shaarli
- Bookmarklet and [other tools](Community-and-related-software.md) to share links in one click - Bookmarklet and [other tools](Community-and-related-software.md) to share links in one click
- Responsive/support for mobile browsers, degrades gracefully with Javascript disabled - Responsive/support for mobile browsers, degrades gracefully with Javascript disabled
- LDAP (single-user) login support
### Easy setup ### Easy setup

View file

@ -624,7 +624,7 @@ msgstr "Bildwand ist nicht verfügbar (Miniaturansichten sind deaktiviert)."
#: application/front/exceptions/WrongTokenException.php:16 #: application/front/exceptions/WrongTokenException.php:16
msgid "Wrong token." msgid "Wrong token."
msgstr "Falsches Zeichen." msgstr "Falsches Token."
#: application/helper/ApplicationUtils.php:165 #: application/helper/ApplicationUtils.php:165
#, php-format #, php-format

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Shaarli\n" "Project-Id-Version: Shaarli\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-19 10:19+0900\n" "POT-Creation-Date: 2021-04-04 11:29+0900\n"
"PO-Revision-Date: 2021-01-04 18:54+0900\n" "PO-Revision-Date: 2021-04-04 13:20+0900\n"
"Last-Translator: yude <yudesleepy@gmail.com>\n" "Last-Translator: yude <yudesleepy@gmail.com>\n"
"Language-Team: Shaarli\n" "Language-Team: Shaarli\n"
"Language: ja\n" "Language: ja\n"
@ -19,61 +19,38 @@ msgstr ""
"X-Poedit-SearchPathExcluded-0: node_modules\n" "X-Poedit-SearchPathExcluded-0: node_modules\n"
"X-Poedit-SearchPathExcluded-1: vendor\n" "X-Poedit-SearchPathExcluded-1: vendor\n"
#: application/ApplicationUtils.php:161 #: application/History.php:181
#, php-format
msgid ""
"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."
msgstr ""
"使用している PHP のバージョンが古すぎます! Shaarli の実行には最低でも PHP %s "
"が必要です。 現在使用している PHP のバージョンには脆弱性があり、できるだけ速"
"やかにアップデートするべきです。"
#: application/ApplicationUtils.php:192 application/ApplicationUtils.php:204
msgid "directory is not readable"
msgstr "ディレクトリを読み込めません"
#: application/ApplicationUtils.php:207
msgid "directory is not writable"
msgstr "ディレクトリに書き込めません"
#: application/ApplicationUtils.php:225
msgid "file is not readable"
msgstr "ファイルを読み取る権限がありません"
#: application/ApplicationUtils.php:228
msgid "file is not writable"
msgstr "ファイルを書き込む権限がありません"
#: application/History.php:179
msgid "History file isn't readable or writable" msgid "History file isn't readable or writable"
msgstr "履歴ファイルを読み込む、または書き込むための権限がありません" msgstr "履歴ファイルを読み込む、または書き込むための権限がありません"
#: application/History.php:190 #: application/History.php:192
msgid "Could not parse history file" msgid "Could not parse history file"
msgstr "履歴ファイルを正常に復元できませんでした" msgstr "履歴ファイルを正常に復元できませんでした"
#: application/Languages.php:181 #: application/Languages.php:184
msgid "Automatic" msgid "Automatic"
msgstr "自動" msgstr "自動"
#: application/Languages.php:182 #: application/Languages.php:185
msgid "German" msgid "German"
msgstr "ドイツ語" msgstr "ドイツ語"
#: application/Languages.php:183 #: application/Languages.php:186
msgid "English" msgid "English"
msgstr "英語" msgstr "英語"
#: application/Languages.php:184 #: application/Languages.php:187
msgid "French" msgid "French"
msgstr "フランス語" msgstr "フランス語"
#: application/Languages.php:185 #: application/Languages.php:188
msgid "Japanese" msgid "Japanese"
msgstr "日本語" msgstr "日本語"
#: application/Languages.php:189
msgid "Russian"
msgstr "ロシア語"
#: application/Thumbnailer.php:62 #: application/Thumbnailer.php:62
msgid "" msgid ""
"php-gd extension must be loaded to use thumbnails. Thumbnails are now " "php-gd extension must be loaded to use thumbnails. Thumbnails are now "
@ -82,49 +59,49 @@ msgstr ""
"サムネイルを使用するには、php-gd 拡張機能が読み込まれている必要があります。サ" "サムネイルを使用するには、php-gd 拡張機能が読み込まれている必要があります。サ"
"ムネイルは無効化されました。ページを再読込してください。" "ムネイルは無効化されました。ページを再読込してください。"
#: application/Utils.php:383 tests/UtilsTest.php:343 #: application/Utils.php:406 tests/UtilsTest.php:327
msgid "Setting not set" msgid "Setting not set"
msgstr "未設定" msgstr "未設定"
#: application/Utils.php:390 tests/UtilsTest.php:341 tests/UtilsTest.php:342 #: application/Utils.php:413 tests/UtilsTest.php:325 tests/UtilsTest.php:326
msgid "Unlimited" msgid "Unlimited"
msgstr "無制限" msgstr "無制限"
#: application/Utils.php:393 tests/UtilsTest.php:338 tests/UtilsTest.php:339 #: application/Utils.php:416 tests/UtilsTest.php:322 tests/UtilsTest.php:323
#: tests/UtilsTest.php:353 #: tests/UtilsTest.php:337
msgid "B" msgid "B"
msgstr "B" msgstr "B"
#: application/Utils.php:393 tests/UtilsTest.php:332 tests/UtilsTest.php:333 #: application/Utils.php:416 tests/UtilsTest.php:316 tests/UtilsTest.php:317
#: tests/UtilsTest.php:340 #: tests/UtilsTest.php:324
msgid "kiB" msgid "kiB"
msgstr "kiB" msgstr "kiB"
#: application/Utils.php:393 tests/UtilsTest.php:334 tests/UtilsTest.php:335 #: application/Utils.php:416 tests/UtilsTest.php:318 tests/UtilsTest.php:319
#: tests/UtilsTest.php:351 tests/UtilsTest.php:352 #: tests/UtilsTest.php:335 tests/UtilsTest.php:336
msgid "MiB" msgid "MiB"
msgstr "MiB" msgstr "MiB"
#: application/Utils.php:393 tests/UtilsTest.php:336 tests/UtilsTest.php:337 #: application/Utils.php:416 tests/UtilsTest.php:320 tests/UtilsTest.php:321
msgid "GiB" msgid "GiB"
msgstr "GiB" msgstr "GiB"
#: application/bookmark/BookmarkFileService.php:180 #: application/bookmark/BookmarkFileService.php:203
#: application/bookmark/BookmarkFileService.php:202 #: application/bookmark/BookmarkFileService.php:225
#: application/bookmark/BookmarkFileService.php:224 #: application/bookmark/BookmarkFileService.php:247
#: application/bookmark/BookmarkFileService.php:238 #: application/bookmark/BookmarkFileService.php:261
msgid "You're not authorized to alter the datastore" msgid "You're not authorized to alter the datastore"
msgstr "設定を変更する権限がありません" msgstr "設定を変更する権限がありません"
#: application/bookmark/BookmarkFileService.php:205 #: application/bookmark/BookmarkFileService.php:228
msgid "This bookmarks already exists" msgid "This bookmarks already exists"
msgstr "このブックマークは既に存在します" msgstr "このブックマークは既に存在します"
#: application/bookmark/BookmarkInitializer.php:39 #: application/bookmark/BookmarkInitializer.php:42
msgid "(private bookmark with thumbnail demo)" msgid "(private bookmark with thumbnail demo)"
msgstr "(サムネイルデモが付属しているプライベートブックマーク)" msgstr "(サムネイルデモが付属しているプライベートブックマーク)"
#: application/bookmark/BookmarkInitializer.php:42 #: application/bookmark/BookmarkInitializer.php:45
msgid "" msgid ""
"Shaarli will automatically pick up the thumbnail for links to a variety of " "Shaarli will automatically pick up the thumbnail for links to a variety of "
"websites.\n" "websites.\n"
@ -146,11 +123,11 @@ msgstr ""
"\n" "\n"
"今から、既定の shaares を編集したり、削除したりすることができます。\n" "今から、既定の shaares を編集したり、削除したりすることができます。\n"
#: application/bookmark/BookmarkInitializer.php:55 #: application/bookmark/BookmarkInitializer.php:58
msgid "Note: Shaare descriptions" msgid "Note: Shaare descriptions"
msgstr "説明: Shaare の概要" msgstr "説明: Shaare の概要"
#: application/bookmark/BookmarkInitializer.php:57 #: application/bookmark/BookmarkInitializer.php:60
msgid "" msgid ""
"Adding a shaare without entering a URL creates a text-only \"note\" post " "Adding a shaare without entering a URL creates a text-only \"note\" post "
"such as this one.\n" "such as this one.\n"
@ -214,14 +191,14 @@ msgstr ""
"| レモン | 果物 | 黄 | 30 |\n" "| レモン | 果物 | 黄 | 30 |\n"
"| 人参 | 野菜 | 赤 | 14 |\n" "| 人参 | 野菜 | 赤 | 14 |\n"
#: application/bookmark/BookmarkInitializer.php:91 #: application/bookmark/BookmarkInitializer.php:94
#: application/legacy/LegacyLinkDB.php:246 #: application/legacy/LegacyLinkDB.php:246
msgid "" msgid ""
"The personal, minimalist, super-fast, database free, bookmarking service" "The personal, minimalist, super-fast, database free, bookmarking service"
msgstr "" msgstr ""
"個人向けの、ミニマムで高速でかつデータベースのいらないブックマークサービス" "個人向けの、ミニマムで高速でかつデータベースのいらないブックマークサービス"
#: application/bookmark/BookmarkInitializer.php:94 #: application/bookmark/BookmarkInitializer.php:97
msgid "" msgid ""
"Welcome to Shaarli!\n" "Welcome to Shaarli!\n"
"\n" "\n"
@ -269,11 +246,11 @@ msgstr ""
"何か問題に遭遇したり、提案があれば、気軽に [Issue](https://github.com/" "何か問題に遭遇したり、提案があれば、気軽に [Issue](https://github.com/"
"shaarli/Shaarli/issues) を開いてください。\n" "shaarli/Shaarli/issues) を開いてください。\n"
#: application/bookmark/exception/BookmarkNotFoundException.php:13 #: application/bookmark/exception/BookmarkNotFoundException.php:14
msgid "The link you are trying to reach does not exist or has been deleted." msgid "The link you are trying to reach does not exist or has been deleted."
msgstr "開こうとしたリンクは存在しないか、削除されています。" msgstr "開こうとしたリンクは存在しないか、削除されています。"
#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:129 #: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:131
msgid "" msgid ""
"Shaarli could not create the config file. Please make sure Shaarli has the " "Shaarli could not create the config file. Please make sure Shaarli has the "
"right to write in the folder is it installed in." "right to write in the folder is it installed in."
@ -282,13 +259,13 @@ msgstr ""
"ていて、インストールされているディレクトリに書き込みできることを確認してくだ" "ていて、インストールされているディレクトリに書き込みできることを確認してくだ"
"さい。" "さい。"
#: application/config/ConfigManager.php:136 #: application/config/ConfigManager.php:137
#: application/config/ConfigManager.php:163 #: application/config/ConfigManager.php:164
msgid "Invalid setting key parameter. String expected, got: " msgid "Invalid setting key parameter. String expected, got: "
msgstr "" msgstr ""
"不正なキーの値です。文字列が想定されていますが、次のように入力されました: " "不正なキーの値です。文字列が想定されていますが、次のように入力されました: "
#: application/config/exception/MissingFieldConfigException.php:21 #: application/config/exception/MissingFieldConfigException.php:20
#, php-format #, php-format
msgid "Configuration value is required for %s" msgid "Configuration value is required for %s"
msgstr "%s には設定が必要です" msgstr "%s には設定が必要です"
@ -297,42 +274,43 @@ msgstr "%s には設定が必要です"
msgid "An error occurred while trying to save plugins loading order." msgid "An error occurred while trying to save plugins loading order."
msgstr "プラグインの読込順を変更する際にエラーが発生しました。" msgstr "プラグインの読込順を変更する際にエラーが発生しました。"
#: application/config/exception/UnauthorizedConfigException.php:16 #: application/config/exception/UnauthorizedConfigException.php:15
msgid "You are not authorized to alter config." msgid "You are not authorized to alter config."
msgstr "設定を変更する権限がありません。" msgstr "設定を変更する権限がありません。"
#: application/exceptions/IOException.php:22 #: application/exceptions/IOException.php:23
msgid "Error accessing" msgid "Error accessing"
msgstr "読込中にエラーが発生しました" msgstr "読込中にエラーが発生しました"
#: application/feed/FeedBuilder.php:179 #: application/feed/FeedBuilder.php:174
msgid "Direct link" msgid "Direct link"
msgstr "ダイレクトリンク" msgstr "ダイレクトリンク"
#: application/feed/FeedBuilder.php:181 #: application/feed/FeedBuilder.php:176
msgid "Permalink" msgid "Permalink"
msgstr "パーマリンク" msgstr "パーマリンク"
#: application/front/controller/admin/ConfigureController.php:54 #: application/front/controller/admin/ConfigureController.php:56
msgid "Configure" msgid "Configure"
msgstr "設定" msgstr "設定"
#: application/front/controller/admin/ConfigureController.php:102 #: application/front/controller/admin/ConfigureController.php:106
#: application/legacy/LegacyUpdater.php:537 #: application/legacy/LegacyUpdater.php:539
msgid "You have enabled or changed thumbnails mode." msgid "You have enabled or changed thumbnails mode."
msgstr "サムネイルのモードを有効化、または変更しました。" msgstr "サムネイルのモードを有効化、または変更しました。"
#: application/front/controller/admin/ConfigureController.php:103 #: application/front/controller/admin/ConfigureController.php:108
#: application/legacy/LegacyUpdater.php:538 #: application/front/controller/admin/ServerController.php:81
#: application/legacy/LegacyUpdater.php:540
msgid "Please synchronize them." msgid "Please synchronize them."
msgstr "それらを同期してください。" msgstr "それらを同期してください。"
#: application/front/controller/admin/ConfigureController.php:113 #: application/front/controller/admin/ConfigureController.php:119
#: application/front/controller/visitor/InstallController.php:136 #: application/front/controller/visitor/InstallController.php:154
msgid "Error while writing config file after configuration update." msgid "Error while writing config file after configuration update."
msgstr "設定ファイルを更新した後の書き込みに失敗しました。" msgstr "設定ファイルを更新した後の書き込みに失敗しました。"
#: application/front/controller/admin/ConfigureController.php:122 #: application/front/controller/admin/ConfigureController.php:128
msgid "Configuration was saved." msgid "Configuration was saved."
msgstr "設定は保存されました。" msgstr "設定は保存されました。"
@ -362,61 +340,42 @@ msgstr ""
"ルサイズ (%s) よりも大きいです。もう少し小さいものをアップロードしてくださ" "ルサイズ (%s) よりも大きいです。もう少し小さいものをアップロードしてくださ"
"い。" "い。"
#: application/front/controller/admin/ManageShaareController.php:29 #: application/front/controller/admin/ManageTagController.php:30
msgid "Shaare a new link" msgid "whitespace"
msgstr "新しいリンクを追加" msgstr "空白"
#: application/front/controller/admin/ManageShaareController.php:78 #: application/front/controller/admin/ManageTagController.php:35
msgid "Note: "
msgstr "注: "
#: application/front/controller/admin/ManageShaareController.php:109
#: application/front/controller/admin/ManageShaareController.php:206
#: application/front/controller/admin/ManageShaareController.php:275
#: application/front/controller/admin/ManageShaareController.php:315
#, php-format
msgid "Bookmark with identifier %s could not be found."
msgstr "%s という識別子を持ったブックマークは見つかりませんでした。"
#: application/front/controller/admin/ManageShaareController.php:194
#: application/front/controller/admin/ManageShaareController.php:252
msgid "Invalid bookmark ID provided."
msgstr "不正なブックマーク ID が入力されました。"
#: application/front/controller/admin/ManageShaareController.php:260
msgid "Invalid visibility provided."
msgstr "不正な公開設定が入力されました。"
#: application/front/controller/admin/ManageShaareController.php:363
msgid "Edit"
msgstr "共有"
#: application/front/controller/admin/ManageShaareController.php:366
msgid "Shaare"
msgstr "Shaare"
#: application/front/controller/admin/ManageTagController.php:29
msgid "Manage tags" msgid "Manage tags"
msgstr "タグを設定" msgstr "タグを設定"
#: application/front/controller/admin/ManageTagController.php:48 #: application/front/controller/admin/ManageTagController.php:54
msgid "Invalid tags provided." msgid "Invalid tags provided."
msgstr "不正なタグが入力されました。" msgstr "不正なタグが入力されました。"
#: application/front/controller/admin/ManageTagController.php:72 #: application/front/controller/admin/ManageTagController.php:81
#, php-format #, php-format
msgid "The tag was removed from %d bookmark." msgid "The tag was removed from %d bookmark."
msgid_plural "The tag was removed from %d bookmarks." msgid_plural "The tag was removed from %d bookmarks."
msgstr[0] "%d 件のリンクからタグが削除されました。" msgstr[0] "%d 件のリンクからタグが削除されました。"
msgstr[1] "%d 件のリンクからタグが削除されました。" msgstr[1] "%d 件のリンクからタグが削除されました。"
#: application/front/controller/admin/ManageTagController.php:77 #: application/front/controller/admin/ManageTagController.php:86
#, php-format #, php-format
msgid "The tag was renamed in %d bookmark." msgid "The tag was renamed in %d bookmark."
msgid_plural "The tag was renamed in %d bookmarks." msgid_plural "The tag was renamed in %d bookmarks."
msgstr[0] "このタグを持つ %d 件のリンクにおいて、名前が変更されました。" msgstr[0] "このタグを持つ %d 件のリンクにおいて、名前が変更されました。"
msgstr[1] "このタグを持つ %d 件のリンクにおいて、名前が変更されました。" msgstr[1] "このタグを持つ %d 件のリンクにおいて、名前が変更されました。"
#: application/front/controller/admin/ManageTagController.php:108
msgid "Tags separator must be a single character."
msgstr "タグを分離する文字は1つでなければいけません。"
#: application/front/controller/admin/ManageTagController.php:114
msgid "These characters are reserved and can't be used as tags separator: "
msgstr ""
"それらの文字は予約文字であり、タグを分離するための文字として使うことはできま"
"せん: "
#: application/front/controller/admin/PasswordController.php:28 #: application/front/controller/admin/PasswordController.php:28
msgid "Change password" msgid "Change password"
msgstr "パスワードを変更" msgstr "パスワードを変更"
@ -447,6 +406,55 @@ msgstr "設定が正常に保存されました。"
msgid "Error while saving plugin configuration: " msgid "Error while saving plugin configuration: "
msgstr "プラグインの設定ファイルを保存するときにエラーが発生しました: " msgstr "プラグインの設定ファイルを保存するときにエラーが発生しました: "
#: application/front/controller/admin/ServerController.php:35
msgid "Check disabled"
msgstr "無効になっている項目をチェック"
#: application/front/controller/admin/ServerController.php:62
msgid "Server administration"
msgstr "サーバー管理"
#: application/front/controller/admin/ServerController.php:79
msgid "Thumbnails cache has been cleared."
msgstr "サムネイルのキャッシュがクリアされました。"
#: application/front/controller/admin/ServerController.php:90
msgid "Shaarli's cache folder has been cleared!"
msgstr "Shaarli のキャッシュのフォルダーがクリアされました!"
#: application/front/controller/admin/ShaareAddController.php:26
msgid "Shaare a new link"
msgstr "新しいリンクを追加"
#: application/front/controller/admin/ShaareManageController.php:35
#: application/front/controller/admin/ShaareManageController.php:97
msgid "Invalid bookmark ID provided."
msgstr "不正なブックマーク ID が入力されました。"
#: application/front/controller/admin/ShaareManageController.php:47
#: application/front/controller/admin/ShaareManageController.php:120
#: application/front/controller/admin/ShaareManageController.php:160
#: application/front/controller/admin/ShaarePublishController.php:82
#, php-format
msgid "Bookmark with identifier %s could not be found."
msgstr "%s という識別子を持ったブックマークは見つかりませんでした。"
#: application/front/controller/admin/ShaareManageController.php:105
msgid "Invalid visibility provided."
msgstr "不正な公開設定が入力されました。"
#: application/front/controller/admin/ShaarePublishController.php:173
msgid "Edit"
msgstr "共有"
#: application/front/controller/admin/ShaarePublishController.php:176
msgid "Shaare"
msgstr "Shaare"
#: application/front/controller/admin/ShaarePublishController.php:208
msgid "Note: "
msgstr "注: "
#: application/front/controller/admin/ThumbnailsController.php:37 #: application/front/controller/admin/ThumbnailsController.php:37
msgid "Thumbnails update" msgid "Thumbnails update"
msgstr "サムネイルの更新" msgstr "サムネイルの更新"
@ -455,23 +463,44 @@ msgstr "サムネイルの更新"
msgid "Tools" msgid "Tools"
msgstr "ツール" msgstr "ツール"
#: application/front/controller/visitor/BookmarkListController.php:116 #: application/front/controller/visitor/BookmarkListController.php:103
msgid "Search: " msgid "Search: "
msgstr "検索: " msgstr "検索: "
#: application/front/controller/visitor/DailyController.php:45 #: application/front/controller/visitor/DailyController.php:201
msgid "Today" msgid "day"
msgstr "日" msgstr "日"
#: application/front/controller/visitor/DailyController.php:47 #: application/front/controller/visitor/DailyController.php:201
msgid "Yesterday" #: application/front/controller/visitor/DailyController.php:204
msgstr "昨日"
#: application/front/controller/visitor/DailyController.php:85
msgid "Daily" msgid "Daily"
msgstr "デイリー" msgstr "デイリー"
#: application/front/controller/visitor/ErrorController.php:36 #: application/front/controller/visitor/DailyController.php:202
msgid "week"
msgstr "週"
#: application/front/controller/visitor/DailyController.php:202
msgid "Weekly"
msgstr "週間"
#: application/front/controller/visitor/DailyController.php:203
msgid "month"
msgstr "月"
#: application/front/controller/visitor/DailyController.php:203
msgid "Monthly"
msgstr "月間"
#: application/front/controller/visitor/ErrorController.php:30
msgid "Error: "
msgstr "エラー: "
#: application/front/controller/visitor/ErrorController.php:34
msgid "Please report it on Github."
msgstr "GitHub で報告してください。"
#: application/front/controller/visitor/ErrorController.php:39
msgid "An unexpected error occurred." msgid "An unexpected error occurred."
msgstr "予期しないエラーが発生しました。" msgstr "予期しないエラーが発生しました。"
@ -479,7 +508,11 @@ msgstr "予期しないエラーが発生しました。"
msgid "Requested page could not be found." msgid "Requested page could not be found."
msgstr "リクエストされたページは存在しません。" msgstr "リクエストされたページは存在しません。"
#: application/front/controller/visitor/InstallController.php:73 #: application/front/controller/visitor/InstallController.php:70
msgid "Install Shaarli"
msgstr "Shaarli をインストール"
#: application/front/controller/visitor/InstallController.php:90
#, php-format #, php-format
msgid "" msgid ""
"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the " "<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
@ -497,14 +530,14 @@ msgstr ""
"ります。IP アドレスや完全なドメイン名でサーバーにアクセスすることをおすすめし" "ります。IP アドレスや完全なドメイン名でサーバーにアクセスすることをおすすめし"
"ます。<br>" "ます。<br>"
#: application/front/controller/visitor/InstallController.php:144 #: application/front/controller/visitor/InstallController.php:162
msgid "" msgid ""
"Shaarli is now configured. Please login and start shaaring your bookmarks!" "Shaarli is now configured. Please login and start shaaring your bookmarks!"
msgstr "" msgstr ""
"Shaarli の設定が完了しました。ログインして、あなたのブックマークを登録しま" "Shaarli の設定が完了しました。ログインして、あなたのブックマークを登録しま"
"しょう!" "しょう!"
#: application/front/controller/visitor/InstallController.php:158 #: application/front/controller/visitor/InstallController.php:176
msgid "Insufficient permissions:" msgid "Insufficient permissions:"
msgstr "権限がありません:" msgstr "権限がありません:"
@ -520,7 +553,7 @@ msgstr "不正なユーザー名、またはパスワードです。"
msgid "Picture wall" msgid "Picture wall"
msgstr "ピクチャウォール" msgstr "ピクチャウォール"
#: application/front/controller/visitor/TagCloudController.php:88 #: application/front/controller/visitor/TagCloudController.php:90
msgid "Tag " msgid "Tag "
msgstr "タグ " msgstr "タグ "
@ -547,6 +580,94 @@ msgstr "ピクチャ ウォールは利用できません (サムネイルが無
msgid "Wrong token." msgid "Wrong token."
msgstr "不正なトークンです。" msgstr "不正なトークンです。"
#: application/helper/ApplicationUtils.php:165
#, php-format
msgid ""
"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."
msgstr ""
"使用している PHP のバージョンが古すぎます! Shaarli の実行には最低でも PHP %s "
"が必要です。 現在使用している PHP のバージョンには脆弱性があり、できるだけ速"
"やかにアップデートするべきです。"
#: application/helper/ApplicationUtils.php:200
#: application/helper/ApplicationUtils.php:220
msgid "directory is not readable"
msgstr "ディレクトリを読み込めません"
#: application/helper/ApplicationUtils.php:223
msgid "directory is not writable"
msgstr "ディレクトリに書き込めません"
#: application/helper/ApplicationUtils.php:247
msgid "file is not readable"
msgstr "ファイルを読み取る権限がありません"
#: application/helper/ApplicationUtils.php:250
msgid "file is not writable"
msgstr "ファイルを書き込む権限がありません"
#: application/helper/ApplicationUtils.php:265
msgid ""
"Lock can not be acquired on the datastore. You might encounter concurrent "
"access issues."
msgstr ""
"ロックはデータストアでは取得できません。同時にアクセスしたことによってエラー"
"が発生した可能性があります。"
#: application/helper/ApplicationUtils.php:298
msgid "Configuration parsing"
msgstr "設定ファイルのパース"
#: application/helper/ApplicationUtils.php:299
msgid "Slim Framework (routing, etc.)"
msgstr "軽量なフレームワーク (ルーティングなど)"
#: application/helper/ApplicationUtils.php:300
msgid "Multibyte (Unicode) string support"
msgstr "マルチバイト (Unicode) の文字のサポート"
#: application/helper/ApplicationUtils.php:301
msgid "Required to use thumbnails"
msgstr "サムネイルを使うことは必須です"
#: application/helper/ApplicationUtils.php:302
msgid "Localized text sorting (e.g. e->è->f)"
msgstr "ローカライズされた文字のソート (例: e->è->f)"
#: application/helper/ApplicationUtils.php:303
msgid "Better retrieval of bookmark metadata and thumbnail"
msgstr "ブックマークのメタデータとサムネイルの改善された検索"
#: application/helper/ApplicationUtils.php:304
msgid "Use the translation system in gettext mode"
msgstr "gettext モードで翻訳システムを使用"
#: application/helper/ApplicationUtils.php:305
msgid "Login using LDAP server"
msgstr "LDAP サーバーを使用してログイン"
#: application/helper/DailyPageHelper.php:179
msgid "Week"
msgstr "週"
#: application/helper/DailyPageHelper.php:183
msgid "Today"
msgstr "今日"
#: application/helper/DailyPageHelper.php:185
msgid "Yesterday"
msgstr "昨日"
#: application/helper/FileUtils.php:100
msgid "Provided path is not a directory."
msgstr "入力されたパスはディレクトリではありません。"
#: application/helper/FileUtils.php:104
msgid "Trying to delete a folder outside of Shaarli path."
msgstr "Shaarli のパスの外にあるフォルダを削除しようとしています。"
#: application/legacy/LegacyLinkDB.php:131 #: application/legacy/LegacyLinkDB.php:131
msgid "You are not authorized to add a link." msgid "You are not authorized to add a link."
msgstr "リンクを追加するには、ログインする必要があります。" msgstr "リンクを追加するには、ログインする必要があります。"
@ -597,7 +718,7 @@ msgstr ""
msgid "Couldn't retrieve updater class methods." msgid "Couldn't retrieve updater class methods."
msgstr "アップデーターのクラスメゾットを受信できませんでした。" msgstr "アップデーターのクラスメゾットを受信できませんでした。"
#: application/legacy/LegacyUpdater.php:538 #: application/legacy/LegacyUpdater.php:540
msgid "<a href=\"./admin/thumbnails\">" msgid "<a href=\"./admin/thumbnails\">"
msgstr "<a href=\"./admin/thumbnails\">" msgstr "<a href=\"./admin/thumbnails\">"
@ -623,16 +744,17 @@ msgstr ""
"が %d 秒で処理され、%d 件のリンクがインポートされ、%d 件のリンクが上書きさ" "が %d 秒で処理され、%d 件のリンクがインポートされ、%d 件のリンクが上書きさ"
"れ、%d 件のリンクがスキップされました。" "れ、%d 件のリンクがスキップされました。"
#: application/plugin/PluginManager.php:124 #: application/plugin/PluginManager.php:103
#: application/plugin/PluginManager.php:141
msgid " [plugin incompatibility]: " msgid " [plugin incompatibility]: "
msgstr " [非対応のプラグイン]: " msgstr " [非対応のプラグイン]: "
#: application/plugin/exception/PluginFileNotFoundException.php:21 #: application/plugin/exception/PluginFileNotFoundException.php:22
#, php-format #, php-format
msgid "Plugin \"%s\" files not found." msgid "Plugin \"%s\" files not found."
msgstr "プラグイン「%s」のファイルが存在しません。" msgstr "プラグイン「%s」のファイルが存在しません。"
#: application/render/PageCacheManager.php:32 #: application/render/PageCacheManager.php:33
#, php-format #, php-format
msgid "Cannot purge %s: no directory" msgid "Cannot purge %s: no directory"
msgstr "%s を削除できません: ディレクトリが存在しません" msgstr "%s を削除できません: ディレクトリが存在しません"
@ -641,7 +763,7 @@ msgstr "%s を削除できません: ディレクトリが存在しません"
msgid "An error occurred while running the update " msgid "An error occurred while running the update "
msgstr "更新中に問題が発生しました " msgstr "更新中に問題が発生しました "
#: index.php:65 #: index.php:82
msgid "Shared bookmarks on " msgid "Shared bookmarks on "
msgstr "次において共有されたリンク " msgstr "次において共有されたリンク "
@ -657,11 +779,11 @@ msgstr "リンクを追加"
msgid "Adds the addlink input on the linklist page." msgid "Adds the addlink input on the linklist page."
msgstr "リンク一覧のページに、リンクを追加するためのフォームを表示する。" msgstr "リンク一覧のページに、リンクを追加するためのフォームを表示する。"
#: plugins/archiveorg/archiveorg.php:28 #: plugins/archiveorg/archiveorg.php:29
msgid "View on archive.org" msgid "View on archive.org"
msgstr "archive.org 上で表示する" msgstr "archive.org 上で表示する"
#: plugins/archiveorg/archiveorg.php:41 #: plugins/archiveorg/archiveorg.php:42
msgid "For each link, add an Archive.org icon." msgid "For each link, add an Archive.org icon."
msgstr "それぞれのリンクに、Archive.org のアイコンを追加する。" msgstr "それぞれのリンクに、Archive.org のアイコンを追加する。"
@ -673,24 +795,24 @@ msgstr ""
"既定の色のプラグインにおけるエラー: このプラグインは有効なので、カスタム カ" "既定の色のプラグインにおけるエラー: このプラグインは有効なので、カスタム カ"
"ラーは適用されません。" "ラーは適用されません。"
#: plugins/default_colors/default_colors.php:113 #: plugins/default_colors/default_colors.php:127
msgid "Override default theme colors. Use any CSS valid color." msgid "Override default theme colors. Use any CSS valid color."
msgstr "" msgstr ""
"既定のテーマの色を上書きします。どのような CSS カラーコードでも使えます。" "既定のテーマの色を上書きします。どのような CSS カラーコードでも使えます。"
#: plugins/default_colors/default_colors.php:114 #: plugins/default_colors/default_colors.php:128
msgid "Main color (navbar green)" msgid "Main color (navbar green)"
msgstr "メイン カラー (ナビバーの緑)" msgstr "メイン カラー (ナビバーの緑)"
#: plugins/default_colors/default_colors.php:115 #: plugins/default_colors/default_colors.php:129
msgid "Background color (light grey)" msgid "Background color (light grey)"
msgstr "背景色 (灰色)" msgstr "背景色 (灰色)"
#: plugins/default_colors/default_colors.php:116 #: plugins/default_colors/default_colors.php:130
msgid "Dark main color (e.g. visited links)" msgid "Dark main color (e.g. visited links)"
msgstr "暗い方の メイン カラー (例: 閲覧済みリンク)" msgstr "暗い方の メイン カラー (例: 閲覧済みリンク)"
#: plugins/demo_plugin/demo_plugin.php:477 #: plugins/demo_plugin/demo_plugin.php:528
msgid "" msgid ""
"A demo plugin covering all use cases for template designers and plugin " "A demo plugin covering all use cases for template designers and plugin "
"developers." "developers."
@ -698,11 +820,11 @@ msgstr ""
"テンプレートのデザイナーや、プラグインの開発者のためのすべての状況に対応でき" "テンプレートのデザイナーや、プラグインの開発者のためのすべての状況に対応でき"
"るデモプラグインです。" "るデモプラグインです。"
#: plugins/demo_plugin/demo_plugin.php:478 #: plugins/demo_plugin/demo_plugin.php:529
msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed." msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed."
msgstr "これはデモプラグイン専用のパラメーターです。末尾に追加されます。" msgstr "これはデモプラグイン専用のパラメーターです。末尾に追加されます。"
#: plugins/demo_plugin/demo_plugin.php:479 #: plugins/demo_plugin/demo_plugin.php:530
msgid "Other demo parameter" msgid "Other demo parameter"
msgstr "他のデモ パラメーター" msgstr "他のデモ パラメーター"
@ -724,7 +846,7 @@ msgstr ""
msgid "Isso server URL (without 'http://')" msgid "Isso server URL (without 'http://')"
msgstr "Isso server URL ('http://' 抜き)" msgstr "Isso server URL ('http://' 抜き)"
#: plugins/piwik/piwik.php:23 #: plugins/piwik/piwik.php:24
msgid "" msgid ""
"Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin " "Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin "
"administration page." "administration page."
@ -732,27 +854,27 @@ msgstr ""
"Piwik プラグインエラー: PIWIK_URL と PIWIK_SITEID の値をプラグイン管理ページ" "Piwik プラグインエラー: PIWIK_URL と PIWIK_SITEID の値をプラグイン管理ページ"
"で指定してください。" "で指定してください。"
#: plugins/piwik/piwik.php:72 #: plugins/piwik/piwik.php:73
msgid "A plugin that adds Piwik tracking code to Shaarli pages." msgid "A plugin that adds Piwik tracking code to Shaarli pages."
msgstr "Piwik のトラッキングコードをShaarliに追加するプラグインです。" msgstr "Piwik のトラッキングコードをShaarliに追加するプラグインです。"
#: plugins/piwik/piwik.php:73 #: plugins/piwik/piwik.php:74
msgid "Piwik URL" msgid "Piwik URL"
msgstr "Piwik URL" msgstr "Piwik URL"
#: plugins/piwik/piwik.php:74 #: plugins/piwik/piwik.php:75
msgid "Piwik site ID" msgid "Piwik site ID"
msgstr "Piwik サイトID" msgstr "Piwik サイトID"
#: plugins/playvideos/playvideos.php:25 #: plugins/playvideos/playvideos.php:26
msgid "Video player" msgid "Video player"
msgstr "動画プレイヤー" msgstr "動画プレイヤー"
#: plugins/playvideos/playvideos.php:28 #: plugins/playvideos/playvideos.php:29
msgid "Play Videos" msgid "Play Videos"
msgstr "動画を再生" msgstr "動画を再生"
#: plugins/playvideos/playvideos.php:59 #: plugins/playvideos/playvideos.php:60
msgid "Add a button in the toolbar allowing to watch all videos." msgid "Add a button in the toolbar allowing to watch all videos."
msgstr "すべての動画を閲覧するボタンをツールバーに追加します。" msgstr "すべての動画を閲覧するボタンをツールバーに追加します。"
@ -779,11 +901,11 @@ msgstr "ハブ %s からの不正なレスポンス"
msgid "Enable PubSubHubbub feed publishing." msgid "Enable PubSubHubbub feed publishing."
msgstr "PubSubHubbub へのフィードを公開する。" msgstr "PubSubHubbub へのフィードを公開する。"
#: plugins/qrcode/qrcode.php:73 plugins/wallabag/wallabag.php:70 #: plugins/qrcode/qrcode.php:74 plugins/wallabag/wallabag.php:72
msgid "For each link, add a QRCode icon." msgid "For each link, add a QRCode icon."
msgstr "それぞれのリンクについて、QRコードのアイコンを追加する。" msgstr "それぞれのリンクについて、QRコードのアイコンを追加する。"
#: plugins/wallabag/wallabag.php:21 #: plugins/wallabag/wallabag.php:22
msgid "" msgid ""
"Wallabag plugin error: Please define the \"WALLABAG_URL\" setting in the " "Wallabag plugin error: Please define the \"WALLABAG_URL\" setting in the "
"plugin administration page." "plugin administration page."
@ -791,15 +913,15 @@ msgstr ""
"Wallabag プラグインエラー: \"WALLABAG_URL\" の値をプラグイン管理ページにおい" "Wallabag プラグインエラー: \"WALLABAG_URL\" の値をプラグイン管理ページにおい"
"て指定してください。" "て指定してください。"
#: plugins/wallabag/wallabag.php:47 #: plugins/wallabag/wallabag.php:49
msgid "Save to wallabag" msgid "Save to wallabag"
msgstr "Wallabag に保存" msgstr "Wallabag に保存"
#: plugins/wallabag/wallabag.php:71 #: plugins/wallabag/wallabag.php:73
msgid "Wallabag API URL" msgid "Wallabag API URL"
msgstr "Wallabag のAPIのURL" msgstr "Wallabag のAPIのURL"
#: plugins/wallabag/wallabag.php:72 #: plugins/wallabag/wallabag.php:74
msgid "Wallabag API version (1 or 2)" msgid "Wallabag API version (1 or 2)"
msgstr "Wallabag のAPIのバージョン (1 または 2)" msgstr "Wallabag のAPIのバージョン (1 または 2)"
@ -944,9 +1066,6 @@ msgstr[1] "検索"
#~ msgid "Do not show any links if the user is not logged in" #~ msgid "Do not show any links if the user is not logged in"
#~ msgstr "ログインしていないユーザーには何のリンクも表示しない" #~ msgstr "ログインしていないユーザーには何のリンクも表示しない"
#~ msgid "Check updates"
#~ msgstr "更新を確認"
#~ msgid "Notify me when a new release is ready" #~ msgid "Notify me when a new release is ready"
#~ msgstr "新しいバージョンがリリースされたときに通知" #~ msgstr "新しいバージョンがリリースされたときに通知"
@ -1043,9 +1162,6 @@ msgstr[1] "検索"
#~ msgid "Add default tags" #~ msgid "Add default tags"
#~ msgstr "既定のタグを追加" #~ msgstr "既定のタグを追加"
#~ msgid "Install Shaarli"
#~ msgstr "Shaarli をインストール"
#~ msgid "" #~ msgid ""
#~ "It looks like it's the first time you run Shaarli. Please configure it." #~ "It looks like it's the first time you run Shaarli. Please configure it."
#~ msgstr "どうやら Shaarli を初めて起動しているようです。設定してください。" #~ msgstr "どうやら Shaarli を初めて起動しているようです。設定してください。"
@ -1161,9 +1277,6 @@ msgstr[1] "検索"
#~ msgid "is available" #~ msgid "is available"
#~ msgstr "が利用可能" #~ msgstr "が利用可能"
#~ msgid "Error"
#~ msgstr "エラー"
#~ msgid "Picture Wall" #~ msgid "Picture Wall"
#~ msgstr "ピクチャーウォール" #~ msgstr "ピクチャーウォール"

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,7 @@ site_dir: doc/html
# - https://github.com/rtfd/readthedocs.org/issues/4314 # - https://github.com/rtfd/readthedocs.org/issues/4314
# strict: true # strict: true
pages: nav:
- Home: index.md - Home: index.md
- Setup: - Setup:
- Server configuration: Server-configuration.md - Server configuration: Server-configuration.md

View file

@ -5,7 +5,7 @@
<file>index.php</file> <file>index.php</file>
<file>application</file> <file>application</file>
<file>plugins</file> <file>plugins</file>
<!-- <file>tests</file>--> <file>tests</file>
<exclude-pattern>*/*.css</exclude-pattern> <exclude-pattern>*/*.css</exclude-pattern>
<exclude-pattern>*/*.js</exclude-pattern> <exclude-pattern>*/*.js</exclude-pattern>
@ -19,5 +19,11 @@
<!-- index.php bootstraps everything, so yes mixed symbols with side effects --> <!-- index.php bootstraps everything, so yes mixed symbols with side effects -->
<exclude-pattern>index.php</exclude-pattern> <exclude-pattern>index.php</exclude-pattern>
<exclude-pattern>plugins/*</exclude-pattern> <exclude-pattern>plugins/*</exclude-pattern>
<exclude-pattern>tests/bootstrap.php</exclude-pattern>
<exclude-pattern>tests/utils/RainTPL.php</exclude-pattern>
</rule>
<rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace">
<exclude-pattern>tests/utils/RainTPL.php</exclude-pattern>
</rule> </rule>
</ruleset> </ruleset>

View file

@ -39,7 +39,7 @@ public function setUp(): void
public function testPlugin(): void public function testPlugin(): void
{ {
PluginManager::$PLUGINS_PATH = self::$pluginPath; PluginManager::$PLUGINS_PATH = self::$pluginPath;
$this->pluginManager->load(array(self::$pluginName)); $this->pluginManager->load([self::$pluginName]);
$this->assertTrue(function_exists('hook_test_random')); $this->assertTrue(function_exists('hook_test_random'));
@ -50,19 +50,19 @@ public function testPlugin(): void
static::assertSame('woot', $data[1]); static::assertSame('woot', $data[1]);
$data = [0 => 'woot']; $data = [0 => 'woot'];
$this->pluginManager->executeHooks('random', $data, array('target' => 'test')); $this->pluginManager->executeHooks('random', $data, ['target' => 'test']);
static::assertCount(2, $data); static::assertCount(2, $data);
static::assertSame('page test', $data[1]); static::assertSame('page test', $data[1]);
$data = [0 => 'woot']; $data = [0 => 'woot'];
$this->pluginManager->executeHooks('random', $data, array('loggedin' => true)); $this->pluginManager->executeHooks('random', $data, ['loggedin' => true]);
static::assertCount(2, $data); static::assertCount(2, $data);
static::assertEquals('loggedin', $data[1]); static::assertEquals('loggedin', $data[1]);
$data = [0 => 'woot']; $data = [0 => 'woot'];
$this->pluginManager->executeHooks('random', $data, array('loggedin' => null)); $this->pluginManager->executeHooks('random', $data, ['loggedin' => null]);
static::assertCount(3, $data); static::assertCount(3, $data);
static::assertEquals('loggedin', $data[1]); static::assertEquals('loggedin', $data[1]);
@ -76,7 +76,7 @@ public function testPlugin(): void
public function testPluginWithPhpError(): void public function testPluginWithPhpError(): void
{ {
PluginManager::$PLUGINS_PATH = self::$pluginPath; PluginManager::$PLUGINS_PATH = self::$pluginPath;
$this->pluginManager->load(array(self::$pluginName)); $this->pluginManager->load([self::$pluginName]);
$this->assertTrue(function_exists('hook_test_error')); $this->assertTrue(function_exists('hook_test_error'));

View file

@ -15,9 +15,9 @@
*/ */
class ThumbnailerTest extends TestCase class ThumbnailerTest extends TestCase
{ {
const WIDTH = 190; protected const WIDTH = 190;
const HEIGHT = 210; protected const HEIGHT = 210;
/** /**
* @var Thumbnailer; * @var Thumbnailer;
@ -103,10 +103,10 @@ protected function rrmdirContent($dir)
$objects = scandir($dir); $objects = scandir($dir);
foreach ($objects as $object) { foreach ($objects as $object) {
if ($object != "." && $object != "..") { if ($object != "." && $object != "..") {
if (is_dir($dir."/".$object)) { if (is_dir($dir . "/" . $object)) {
$this->rrmdirContent($dir."/".$object); $this->rrmdirContent($dir . "/" . $object);
} else { } else {
unlink($dir."/".$object); unlink($dir . "/" . $object);
} }
} }
} }

View file

@ -1,14 +1,17 @@
<?php <?php
/** /**
* TimeZone's tests * TimeZone's tests
*/ */
require_once 'application/TimeZone.php'; namespace Shaarli\Tests;
use Shaarli\TestCase;
/** /**
* Unitary tests for timezone utilities * Unitary tests for timezone utilities
*/ */
class TimeZoneTest extends \Shaarli\TestCase class TimeZoneTest extends TestCase
{ {
/** /**
* @var array of timezones * @var array of timezones

View file

@ -1,16 +1,18 @@
<?php <?php
/** /**
* Utilities' tests * Utilities' tests
*/ */
require_once 'application/Utils.php'; namespace Shaarli\Tests;
require_once 'application/Languages.php';
use DateTime;
use Shaarli\TestCase;
/** /**
* Unitary tests for Shaarli utilities * Unitary tests for Shaarli utilities
*/ */
class UtilsTest extends \Shaarli\TestCase class UtilsTest extends TestCase
{ {
// Log file // Log file
protected static $testLogFile = 'tests.log'; protected static $testLogFile = 'tests.log';
@ -54,7 +56,7 @@ protected function setUp(): void
/** /**
* Returns a list of the elements from the last logged entry * Returns a list of the elements from the last logged entry
* *
* @return list (date, ip address, message) * @return array (date, ip address, message)
*/ */
protected function getLastLogEntry() protected function getLastLogEntry()
{ {
@ -187,7 +189,7 @@ public function testGenerateLocation()
public function testGenerateLocationLoop() public function testGenerateLocationLoop()
{ {
$ref = 'http://localhost/?test'; $ref = 'http://localhost/?test';
$this->assertEquals('./?', generateLocation($ref, 'localhost', array('test'))); $this->assertEquals('./?', generateLocation($ref, 'localhost', ['test']));
} }
/** /**
@ -313,15 +315,15 @@ public function testReturnBytes()
*/ */
public function testHumanBytes() public function testHumanBytes()
{ {
$this->assertEquals('2'. t('kiB'), human_bytes(2 * 1024)); $this->assertEquals('2' . t('kiB'), human_bytes(2 * 1024));
$this->assertEquals('2'. t('kiB'), human_bytes(strval(2 * 1024))); $this->assertEquals('2' . t('kiB'), human_bytes(strval(2 * 1024)));
$this->assertEquals('2'. t('MiB'), human_bytes(2 * (pow(1024, 2)))); $this->assertEquals('2' . t('MiB'), human_bytes(2 * (pow(1024, 2))));
$this->assertEquals('2'. t('MiB'), human_bytes(strval(2 * (pow(1024, 2))))); $this->assertEquals('2' . t('MiB'), human_bytes(strval(2 * (pow(1024, 2)))));
$this->assertEquals('2'. t('GiB'), human_bytes(2 * (pow(1024, 3)))); $this->assertEquals('2' . t('GiB'), human_bytes(2 * (pow(1024, 3))));
$this->assertEquals('2'. t('GiB'), human_bytes(strval(2 * (pow(1024, 3))))); $this->assertEquals('2' . t('GiB'), human_bytes(strval(2 * (pow(1024, 3)))));
$this->assertEquals('374'. t('B'), human_bytes(374)); $this->assertEquals('374' . t('B'), human_bytes(374));
$this->assertEquals('374'. t('B'), human_bytes('374')); $this->assertEquals('374' . t('B'), human_bytes('374'));
$this->assertEquals('232'. t('kiB'), human_bytes(237481)); $this->assertEquals('232' . t('kiB'), human_bytes(237481));
$this->assertEquals(t('Unlimited'), human_bytes('0')); $this->assertEquals(t('Unlimited'), human_bytes('0'));
$this->assertEquals(t('Unlimited'), human_bytes(0)); $this->assertEquals(t('Unlimited'), human_bytes(0));
$this->assertEquals(t('Setting not set'), human_bytes('')); $this->assertEquals(t('Setting not set'), human_bytes(''));
@ -332,9 +334,9 @@ public function testHumanBytes()
*/ */
public function testGetMaxUploadSize() public function testGetMaxUploadSize()
{ {
$this->assertEquals('1'. t('MiB'), get_max_upload_size(2097152, '1024k')); $this->assertEquals('1' . t('MiB'), get_max_upload_size(2097152, '1024k'));
$this->assertEquals('1'. t('MiB'), get_max_upload_size('1m', '2m')); $this->assertEquals('1' . t('MiB'), get_max_upload_size('1m', '2m'));
$this->assertEquals('100'. t('B'), get_max_upload_size(100, 100)); $this->assertEquals('100' . t('B'), get_max_upload_size(100, 100));
} }
/** /**

View file

@ -1,9 +1,11 @@
<?php <?php
namespace Shaarli\Api; namespace Shaarli\Api;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +34,7 @@ class ApiMiddlewareTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -49,7 +51,7 @@ protected function setUp(): void
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('api.secret', 'NapoleonWasALizard'); $this->conf->set('api.secret', 'NapoleonWasALizard');
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
@ -80,7 +82,7 @@ public function testInvokeMiddlewareWithValidToken(): void
$env = Environment::mock([ $env = Environment::mock([
'REQUEST_METHOD' => 'GET', 'REQUEST_METHOD' => 'GET',
'REQUEST_URI' => '/echo', 'REQUEST_URI' => '/echo',
'HTTP_AUTHORIZATION'=> 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard'), 'HTTP_AUTHORIZATION' => 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard'),
]); ]);
$request = Request::createFromEnvironment($env); $request = Request::createFromEnvironment($env);
$response = new Response(); $response = new Response();
@ -196,7 +198,7 @@ public function testInvokeMiddlewareNoSecretSetDebug()
$env = Environment::mock([ $env = Environment::mock([
'REQUEST_METHOD' => 'GET', 'REQUEST_METHOD' => 'GET',
'REQUEST_URI' => '/echo', 'REQUEST_URI' => '/echo',
'HTTP_AUTHORIZATION'=> 'Bearer jwt', 'HTTP_AUTHORIZATION' => 'Bearer jwt',
]); ]);
$request = Request::createFromEnvironment($env); $request = Request::createFromEnvironment($env);
$response = new Response(); $response = new Response();
@ -219,7 +221,7 @@ public function testInvalidJwtAuthHeaderDebug()
$env = Environment::mock([ $env = Environment::mock([
'REQUEST_METHOD' => 'GET', 'REQUEST_METHOD' => 'GET',
'REQUEST_URI' => '/echo', 'REQUEST_URI' => '/echo',
'HTTP_AUTHORIZATION'=> 'PolarBearer jwt', 'HTTP_AUTHORIZATION' => 'PolarBearer jwt',
]); ]);
$request = Request::createFromEnvironment($env); $request = Request::createFromEnvironment($env);
$response = new Response(); $response = new Response();
@ -245,7 +247,7 @@ public function testInvokeMiddlewareInvalidJwtDebug()
$env = Environment::mock([ $env = Environment::mock([
'REQUEST_METHOD' => 'GET', 'REQUEST_METHOD' => 'GET',
'REQUEST_URI' => '/echo', 'REQUEST_URI' => '/echo',
'HTTP_AUTHORIZATION'=> 'Bearer jwt', 'HTTP_AUTHORIZATION' => 'Bearer jwt',
]); ]);
$request = Request::createFromEnvironment($env); $request = Request::createFromEnvironment($env);
$response = new Response(); $response = new Response();

View file

@ -32,10 +32,10 @@ public static function generateValidJwtToken($secret)
"alg": "HS512" "alg": "HS512"
}'); }');
$payload = Base64Url::encode('{ $payload = Base64Url::encode('{
"iat": '. time() .' "iat": ' . time() . '
}'); }');
$signature = Base64Url::encode(hash_hmac('sha512', $header .'.'. $payload, $secret, true)); $signature = Base64Url::encode(hash_hmac('sha512', $header . '.' . $payload, $secret, true));
return $header .'.'. $payload .'.'. $signature; return $header . '.' . $payload . '.' . $signature;
} }
/** /**

View file

@ -4,14 +4,14 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceHistory;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
require_once 'tests/utils/ReferenceHistory.php'; class HistoryTest extends TestCase
class HistoryTest extends \Shaarli\TestCase
{ {
/** /**
* @var string datastore to test write operations * @var string datastore to test write operations
@ -24,7 +24,7 @@ class HistoryTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceHistory instance. * @var ReferenceHistory instance.
*/ */
protected $refHistory = null; protected $refHistory = null;
@ -44,7 +44,7 @@ class HistoryTest extends \Shaarli\TestCase
protected function setUp(): void protected function setUp(): void
{ {
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->refHistory = new \ReferenceHistory(); $this->refHistory = new ReferenceHistory();
$this->refHistory->write(self::$testHistory); $this->refHistory->write(self::$testHistory);
$this->container = new Container(); $this->container = new Container();
$this->container['conf'] = $this->conf; $this->container['conf'] = $this->conf;

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -7,6 +8,7 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +34,7 @@ class InfoTest extends TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -54,7 +56,7 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
@ -95,7 +97,7 @@ public function testGetInfo()
$this->assertEquals(200, $response->getStatusCode()); $this->assertEquals(200, $response->getStatusCode());
$data = json_decode((string) $response->getBody(), true); $data = json_decode((string) $response->getBody(), true);
$this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']);
$this->assertEquals(2, $data['private_counter']); $this->assertEquals(2, $data['private_counter']);
$this->assertEquals('Shaarli', $data['settings']['title']); $this->assertEquals('Shaarli', $data['settings']['title']);
$this->assertEquals('?', $data['settings']['header_link']); $this->assertEquals('?', $data['settings']['header_link']);
@ -106,7 +108,7 @@ public function testGetInfo()
$title = 'My bookmarks'; $title = 'My bookmarks';
$headerLink = 'http://shaarli.tld'; $headerLink = 'http://shaarli.tld';
$timezone = 'Europe/Paris'; $timezone = 'Europe/Paris';
$enabledPlugins = array('foo', 'bar'); $enabledPlugins = ['foo', 'bar'];
$defaultPrivateLinks = true; $defaultPrivateLinks = true;
$this->conf->set('general.title', $title); $this->conf->set('general.title', $title);
$this->conf->set('general.header_link', $headerLink); $this->conf->set('general.header_link', $headerLink);
@ -118,7 +120,7 @@ public function testGetInfo()
$this->assertEquals(200, $response->getStatusCode()); $this->assertEquals(200, $response->getStatusCode());
$data = json_decode((string) $response->getBody(), true); $data = json_decode((string) $response->getBody(), true);
$this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']);
$this->assertEquals(2, $data['private_counter']); $this->assertEquals(2, $data['private_counter']);
$this->assertEquals($title, $data['settings']['title']); $this->assertEquals($title, $data['settings']['title']);
$this->assertEquals($headerLink, $data['settings']['header_link']); $this->assertEquals($headerLink, $data['settings']['header_link']);

View file

@ -1,6 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -8,6 +7,8 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceHistory;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -31,7 +32,7 @@ class DeleteLinkTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -69,9 +70,9 @@ protected function setUp(): void
$this->mutex = new NoMutex(); $this->mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory(); $refHistory = new ReferenceHistory();
$refHistory->write(self::$testHistory); $refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory); $this->history = new History(self::$testHistory);
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);

View file

@ -8,6 +8,7 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -35,7 +36,7 @@ class GetLinkIdTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -52,7 +53,7 @@ class GetLinkIdTest extends \Shaarli\TestCase
/** /**
* Number of JSON fields per link. * Number of JSON fields per link.
*/ */
const NB_FIELDS_LINK = 9; protected const NB_FIELDS_LINK = 9;
/** /**
* Before each test, instantiate a new Api with its config, plugins and bookmarks. * Before each test, instantiate a new Api with its config, plugins and bookmarks.
@ -62,7 +63,7 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -8,6 +9,7 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -35,7 +37,7 @@ class GetLinksTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -52,7 +54,7 @@ class GetLinksTest extends \Shaarli\TestCase
/** /**
* Number of JSON field per link. * Number of JSON field per link.
*/ */
const NB_FIELDS_LINK = 9; protected const NB_FIELDS_LINK = 9;
/** /**
* Before every test, instantiate a new Api with its config, plugins and bookmarks. * Before every test, instantiate a new Api with its config, plugins and bookmarks.
@ -62,7 +64,7 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
@ -329,7 +331,7 @@ public function testGetLinksSearchTerm()
// URL encoding // URL encoding
$env = Environment::mock([ $env = Environment::mock([
'REQUEST_METHOD' => 'GET', 'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => 'searchterm='. urlencode('@web') 'QUERY_STRING' => 'searchterm=' . urlencode('@web')
]); ]);
$request = Request::createFromEnvironment($env); $request = Request::createFromEnvironment($env);
$response = $this->controller->getLinks($request, new Response()); $response = $this->controller->getLinks($request, new Response());
@ -430,7 +432,7 @@ public function testGetLinksSearchTags()
$response = $this->controller->getLinks($request, new Response()); $response = $this->controller->getLinks($request, new Response());
$this->assertEquals(200, $response->getStatusCode()); $this->assertEquals(200, $response->getStatusCode());
$data = json_decode((string) $response->getBody(), true); $data = json_decode((string) $response->getBody(), true);
$this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, count($data)); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data));
$this->assertEquals(10, $data[0]['id']); $this->assertEquals(10, $data[0]['id']);
$this->assertEquals(41, $data[2]['id']); $this->assertEquals(41, $data[2]['id']);

View file

@ -9,6 +9,8 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceHistory;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -40,7 +42,7 @@ class PostLinkTest extends TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -67,7 +69,7 @@ class PostLinkTest extends TestCase
/** /**
* Number of JSON field per link. * Number of JSON field per link.
*/ */
const NB_FIELDS_LINK = 9; protected const NB_FIELDS_LINK = 9;
/** /**
* Before every test, instantiate a new Api with its config, plugins and bookmarks. * Before every test, instantiate a new Api with its config, plugins and bookmarks.
@ -77,9 +79,9 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory(); $refHistory = new ReferenceHistory();
$refHistory->write(self::$testHistory); $refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory); $this->history = new History(self::$testHistory);
$pluginManager = new PluginManager($this->conf); $pluginManager = new PluginManager($this->conf);

View file

@ -1,6 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -9,6 +8,8 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceHistory;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +33,7 @@ class PutLinkTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -59,7 +60,7 @@ class PutLinkTest extends \Shaarli\TestCase
/** /**
* Number of JSON field per link. * Number of JSON field per link.
*/ */
const NB_FIELDS_LINK = 9; protected const NB_FIELDS_LINK = 9;
/** /**
* Before every test, instantiate a new Api with its config, plugins and bookmarks. * Before every test, instantiate a new Api with its config, plugins and bookmarks.
@ -69,9 +70,9 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory(); $refHistory = new ReferenceHistory();
$refHistory->write(self::$testHistory); $refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory); $this->history = new History(self::$testHistory);
$pluginManager = new PluginManager($this->conf); $pluginManager = new PluginManager($this->conf);

View file

@ -1,6 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -9,6 +8,8 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceHistory;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +33,7 @@ class DeleteTagTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -70,9 +71,9 @@ protected function setUp(): void
$this->mutex = new NoMutex(); $this->mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory(); $refHistory = new ReferenceHistory();
$refHistory->write(self::$testHistory); $refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory); $this->history = new History(self::$testHistory);
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);

View file

@ -8,6 +8,7 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -33,7 +34,7 @@ class GetTagNameTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -53,7 +54,7 @@ class GetTagNameTest extends \Shaarli\TestCase
/** /**
* Number of JSON fields per link. * Number of JSON fields per link.
*/ */
const NB_FIELDS_TAG = 2; protected const NB_FIELDS_TAG = 2;
/** /**
* Before each test, instantiate a new Api with its config, plugins and bookmarks. * Before each test, instantiate a new Api with its config, plugins and bookmarks.
@ -63,7 +64,7 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Api\Controllers; namespace Shaarli\Api\Controllers;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
@ -7,6 +8,7 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +34,7 @@ class GetTagsTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -57,7 +59,7 @@ class GetTagsTest extends \Shaarli\TestCase
/** /**
* Number of JSON field per link. * Number of JSON field per link.
*/ */
const NB_FIELDS_TAG = 2; protected const NB_FIELDS_TAG = 2;
/** /**
* Before every test, instantiate a new Api with its config, plugins and bookmarks. * Before every test, instantiate a new Api with its config, plugins and bookmarks.
@ -67,7 +69,7 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);

View file

@ -9,6 +9,8 @@
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\Tests\Utils\ReferenceHistory;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Slim\Container; use Slim\Container;
use Slim\Http\Environment; use Slim\Http\Environment;
use Slim\Http\Request; use Slim\Http\Request;
@ -32,7 +34,7 @@ class PutTagTest extends \Shaarli\TestCase
protected $conf; protected $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected $refDB = null; protected $refDB = null;
@ -62,7 +64,7 @@ class PutTagTest extends \Shaarli\TestCase
/** /**
* Number of JSON field per link. * Number of JSON field per link.
*/ */
const NB_FIELDS_TAG = 2; protected const NB_FIELDS_TAG = 2;
/** /**
* Before every test, instantiate a new Api with its config, plugins and bookmarks. * Before every test, instantiate a new Api with its config, plugins and bookmarks.
@ -72,9 +74,9 @@ protected function setUp(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$this->conf = new ConfigManager('tests/utils/config/configJson'); $this->conf = new ConfigManager('tests/utils/config/configJson');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$refHistory = new \ReferenceHistory(); $refHistory = new ReferenceHistory();
$refHistory->write(self::$testHistory); $refHistory->write(self::$testHistory);
$this->history = new History(self::$testHistory); $this->history = new History(self::$testHistory);
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);

View file

@ -3,6 +3,7 @@
namespace Shaarli\Bookmark; namespace Shaarli\Bookmark;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* Class BookmarkArrayTest * Class BookmarkArrayTest
@ -185,7 +186,7 @@ public function testArrayAccessIterate()
$this->assertCount(3, $array); $this->assertCount(3, $array);
foreach ($array as $id => $bookmark) { foreach ($array as $id => $bookmark) {
$this->assertEquals(${'bookmark'. $id}, $bookmark); $this->assertEquals(${'bookmark' . $id}, $bookmark);
} }
} }
@ -194,7 +195,7 @@ public function testArrayAccessIterate()
*/ */
public function testReorder() public function testReorder()
{ {
$refDB = new \ReferenceLinkDB(); $refDB = new ReferenceLinkDB();
$refDB->write('sandbox/datastore.php'); $refDB->write('sandbox/datastore.php');

View file

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Link datastore tests * Link datastore tests
*/ */
@ -7,7 +8,6 @@
use DateTime; use DateTime;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
use ReferenceLinkDB;
use ReflectionClass; use ReflectionClass;
use Shaarli; use Shaarli;
use Shaarli\Bookmark\Exception\BookmarkNotFoundException; use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
@ -16,6 +16,8 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\FakeBookmarkService;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* Unitary tests for LegacyLinkDBTest * Unitary tests for LegacyLinkDBTest
@ -82,19 +84,19 @@ protected function setUp(): void
unlink(self::$testDatastore); unlink(self::$testDatastore);
} }
if (file_exists(self::$testConf .'.json.php')) { if (file_exists(self::$testConf . '.json.php')) {
unlink(self::$testConf .'.json.php'); unlink(self::$testConf . '.json.php');
} }
if (file_exists(self::$testUpdates)) { if (file_exists(self::$testUpdates)) {
unlink(self::$testUpdates); unlink(self::$testUpdates);
} }
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->conf->set('resource.updates', self::$testUpdates); $this->conf->set('resource.updates', self::$testUpdates);
$this->refDB = new \ReferenceLinkDB(); $this->refDB = new ReferenceLinkDB();
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$this->history = new History('sandbox/history.php'); $this->history = new History('sandbox/history.php');
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);
@ -123,12 +125,12 @@ public function testDatabaseMigration()
define('SHAARLI_VERSION', 'dev'); define('SHAARLI_VERSION', 'dev');
} }
$this->refDB = new \ReferenceLinkDB(true); $this->refDB = new ReferenceLinkDB(true);
$this->refDB->write(self::$testDatastore); $this->refDB->write(self::$testDatastore);
$db = self::getMethod('migrate'); $db = self::getMethod('migrate');
$db->invokeArgs($this->privateLinkDB, []); $db->invokeArgs($this->privateLinkDB, []);
$db = new \FakeBookmarkService( $db = new FakeBookmarkService(
$this->conf, $this->conf,
$this->pluginManager, $this->pluginManager,
$this->history, $this->history,
@ -203,7 +205,7 @@ public function testAddFull()
$this->assertEquals($updated, $bookmark->getUpdated()); $this->assertEquals($updated, $bookmark->getUpdated());
// reload from file // reload from file
$this->privateLinkDB = new \FakeBookmarkService( $this->privateLinkDB = new FakeBookmarkService(
$this->conf, $this->conf,
$this->pluginManager, $this->pluginManager,
$this->history, $this->history,
@ -714,7 +716,7 @@ public function testCheckDBNewLoggedOut()
{ {
unlink(self::$testDatastore); unlink(self::$testDatastore);
$this->assertFileNotExists(self::$testDatastore); $this->assertFileNotExists(self::$testDatastore);
$db = new \FakeBookmarkService($this->conf, $this->pluginManager, $this->history, $this->mutex, false); $db = new FakeBookmarkService($this->conf, $this->pluginManager, $this->history, $this->mutex, false);
$this->assertFileNotExists(self::$testDatastore); $this->assertFileNotExists(self::$testDatastore);
$this->assertInstanceOf(BookmarkArray::class, $db->getBookmarks()); $this->assertInstanceOf(BookmarkArray::class, $db->getBookmarks());
$this->assertCount(0, $db->getBookmarks()); $this->assertCount(0, $db->getBookmarks());

View file

@ -3,11 +3,12 @@
namespace Shaarli\Bookmark; namespace Shaarli\Bookmark;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
use ReferenceLinkDB;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\FakeBookmarkService;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* Class BookmarkFilterTest. * Class BookmarkFilterTest.
@ -46,10 +47,10 @@ public static function setUpBeforeClass(): void
$conf = new ConfigManager('tests/utils/config/configJson'); $conf = new ConfigManager('tests/utils/config/configJson');
$conf->set('resource.datastore', self::$testDatastore); $conf->set('resource.datastore', self::$testDatastore);
static::$pluginManager = new PluginManager($conf); static::$pluginManager = new PluginManager($conf);
self::$refDB = new \ReferenceLinkDB(); self::$refDB = new ReferenceLinkDB();
self::$refDB->write(self::$testDatastore); self::$refDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
self::$bookmarkService = new \FakeBookmarkService($conf, static::$pluginManager, $history, $mutex, true); self::$bookmarkService = new FakeBookmarkService($conf, static::$pluginManager, $history, $mutex, true);
self::$linkFilter = new BookmarkFilter(self::$bookmarkService->getBookmarks(), $conf, static::$pluginManager); self::$linkFilter = new BookmarkFilter(self::$bookmarkService->getBookmarks(), $conf, static::$pluginManager);
} }
@ -417,28 +418,28 @@ public function testFilterCrossedSearch()
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT, BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array($tags, $terms) [$tags, $terms]
)) ))
); );
$this->assertEquals( $this->assertEquals(
2, 2,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT, BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array('', $terms) ['', $terms]
)) ))
); );
$this->assertEquals( $this->assertEquals(
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT, BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array(false, 'PSR-2') [false, 'PSR-2']
)) ))
); );
$this->assertEquals( $this->assertEquals(
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT, BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
array($tags, '') [$tags, '']
)) ))
); );
$this->assertEquals( $this->assertEquals(

View file

@ -7,6 +7,7 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* Class BookmarkInitializerTest * Class BookmarkInitializerTest
@ -52,7 +53,7 @@ public function setUp(): void
unlink(self::$testDatastore); unlink(self::$testDatastore);
} }
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$this->pluginManager = new PluginManager($this->conf); $this->pluginManager = new PluginManager($this->conf);
@ -73,7 +74,7 @@ public function setUp(): void
*/ */
public function testInitializeNotEmptyDataStore(): void public function testInitializeNotEmptyDataStore(): void
{ {
$refDB = new \ReferenceLinkDB(); $refDB = new ReferenceLinkDB();
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$this->bookmarkService = new BookmarkFileService( $this->bookmarkService = new BookmarkFileService(
$this->conf, $this->conf,

View file

@ -167,7 +167,7 @@ public function testValidateNotValidNoId()
$exception = $e; $exception = $e;
} }
$this->assertNotNull($exception); $this->assertNotNull($exception);
$this->assertContainsPolyfill('- ID: '. PHP_EOL, $exception->getMessage()); $this->assertContainsPolyfill('- ID: ' . PHP_EOL, $exception->getMessage());
} }
/** /**
@ -186,7 +186,7 @@ public function testValidateNotValidNoShortUrl()
$exception = $e; $exception = $e;
} }
$this->assertNotNull($exception); $this->assertNotNull($exception);
$this->assertContainsPolyfill('- ShortUrl: '. PHP_EOL, $exception->getMessage()); $this->assertContainsPolyfill('- ShortUrl: ' . PHP_EOL, $exception->getMessage());
} }
/** /**
@ -205,7 +205,7 @@ public function testValidateNotValidNoCreated()
$exception = $e; $exception = $e;
} }
$this->assertNotNull($exception); $this->assertNotNull($exception);
$this->assertContainsPolyfill('- Created: '. PHP_EOL, $exception->getMessage()); $this->assertContainsPolyfill('- Created: ' . PHP_EOL, $exception->getMessage());
} }
/** /**

View file

@ -4,8 +4,6 @@
use Shaarli\TestCase; use Shaarli\TestCase;
require_once 'tests/utils/CurlUtils.php';
/** /**
* Class LinkUtilsTest. * Class LinkUtilsTest.
*/ */
@ -142,7 +140,7 @@ public function testHtmlExtractExistentNameTag()
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
// OpenGraph multiple properties both end with noise // OpenGraph multiple properties both end with noise
$html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" '. $html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" ' .
'tag2="content2" content="' . $description . '" tag3="content3">'; 'tag2="content2" content="' . $description . '" tag3="content3">';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
@ -159,7 +157,7 @@ public function testHtmlExtractExistentNameTag()
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
// OpenGraph reversed multiple properties both end with noise // OpenGraph reversed multiple properties both end with noise
$html = '<meta tag1="content1" content="' . $description . '" tag2="content2" '. $html = '<meta tag1="content1" content="' . $description . '" tag2="content2" ' .
'property="og:unrelated1 og:description og:unrelated2" tag3="content3">'; 'property="og:unrelated1 og:description og:unrelated2" tag3="content3">';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
@ -178,7 +176,7 @@ public function testHtmlExtractExistentNameTagWithMixedQuotes(): void
$html = '<meta property="og:description" content="' . $description . '">'; $html = '<meta property="og:description" content="' . $description . '">';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
$html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" '. $html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" ' .
'tag2="content2" content="' . $description . '" tag3="content3">'; 'tag2="content2" content="' . $description . '" tag3="content3">';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
@ -190,7 +188,7 @@ public function testHtmlExtractExistentNameTagWithMixedQuotes(): void
$html = '<meta property="og:description" content=\'' . $description . '\'>'; $html = '<meta property="og:description" content=\'' . $description . '\'>';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
$html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" '. $html = '<meta tag1="content1" property="og:unrelated1 og:description og:unrelated2" ' .
'tag2="content2" content=\'' . $description . '\' tag3="content3">'; 'tag2="content2" content=\'' . $description . '\' tag3="content3">';
$this->assertEquals($description, html_extract_tag('description', $html)); $this->assertEquals($description, html_extract_tag('description', $html));
@ -247,9 +245,9 @@ public function testHtmlExtractNonExistentOgTag()
public function testHtmlExtractDescriptionFromGoogleRealCase(): void public function testHtmlExtractDescriptionFromGoogleRealCase(): void
{ {
$html = 'id="gsr"><meta content="Fêtes de fin d\'année" property="twitter:title"><meta '. $html = 'id="gsr"><meta content="Fêtes de fin d\'année" property="twitter:title"><meta ' .
'content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="twitter:description">'. 'content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="twitter:description">' .
'<meta content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="og:description">'. '<meta content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="og:description">' .
'<meta content="summary_large_image" property="twitter:card"><meta co' '<meta content="summary_large_image" property="twitter:card"><meta co'
; ;
$this->assertSame('Bonnes fêtes de fin d\'année ! #GoogleDoodle', html_extract_tag('description', $html)); $this->assertSame('Bonnes fêtes de fin d\'année ! #GoogleDoodle', html_extract_tag('description', $html));
@ -701,7 +699,10 @@ public function testTagsFilterWithSpaceSeparator(): void
static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter(['tag1', 'tag2', 'tag3'], $separator)); static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter(['tag1', 'tag2', 'tag3'], $separator));
static::assertSame(['tag1,', 'tag2@', 'tag3'], tags_filter(['tag1,', 'tag2@', 'tag3'], $separator)); static::assertSame(['tag1,', 'tag2@', 'tag3'], tags_filter(['tag1,', 'tag2@', 'tag3'], $separator));
static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter([' tag1 ', 'tag2', 'tag3 '], $separator)); static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter([' tag1 ', 'tag2', 'tag3 '], $separator));
static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter([' tag1 ', ' ', 'tag2', ' ', 'tag3 '], $separator)); static::assertSame(
['tag1', 'tag2', 'tag3'],
tags_filter([' tag1 ', ' ', 'tag2', ' ', 'tag3 '], $separator)
);
static::assertSame(['tag1'], tags_filter([' tag1 '], $separator)); static::assertSame(['tag1'], tags_filter([' tag1 '], $separator));
static::assertSame([], tags_filter([' '], $separator)); static::assertSame([], tags_filter([' '], $separator));
static::assertSame([], tags_filter([], $separator)); static::assertSame([], tags_filter([], $separator));
@ -721,7 +722,10 @@ public function testTagsArrayFilterWithSpaceSeparator(): void
['tag1', 'tag2, and other', 'tag3'], ['tag1', 'tag2, and other', 'tag3'],
tags_filter(['@@@@ tag1@@@', ' @tag2, and other @', 'tag3@@@@'], $separator) tags_filter(['@@@@ tag1@@@', ' @tag2, and other @', 'tag3@@@@'], $separator)
); );
static::assertSame(['tag1', 'tag2', 'tag3'], tags_filter(['@@@tag1@@@', '@', 'tag2', '@@@', 'tag3@@@'], $separator)); static::assertSame(
['tag1', 'tag2', 'tag3'],
tags_filter(['@@@tag1@@@', '@', 'tag2', '@@@', 'tag3@@@'], $separator)
);
static::assertSame(['tag1'], tags_filter(['@@@@tag1@@@@'], $separator)); static::assertSame(['tag1'], tags_filter(['@@@@tag1@@@@'], $separator));
static::assertSame([], tags_filter(['@@@'], $separator)); static::assertSame([], tags_filter(['@@@'], $separator));
static::assertSame([], tags_filter([], $separator)); static::assertSame([], tags_filter([], $separator));

View file

@ -2,6 +2,8 @@
require_once 'vendor/autoload.php'; require_once 'vendor/autoload.php';
use Shaarli\Tests\Utils\ReferenceSessionIdHashes;
$conf = new \Shaarli\Config\ConfigManager('tests/utils/config/configJson'); $conf = new \Shaarli\Config\ConfigManager('tests/utils/config/configJson');
new \Shaarli\Languages('en', $conf); new \Shaarli\Languages('en', $conf);
@ -13,23 +15,26 @@ function is_iterable($var)
} }
} }
// TODO: remove this after fixing UT // raw functions
require_once 'application/config/ConfigPlugin.php';
require_once 'application/bookmark/LinkUtils.php'; require_once 'application/bookmark/LinkUtils.php';
require_once 'application/Utils.php';
require_once 'application/http/UrlUtils.php'; require_once 'application/http/UrlUtils.php';
require_once 'application/http/HttpUtils.php'; require_once 'application/http/HttpUtils.php';
require_once 'application/Utils.php';
require_once 'application/TimeZone.php';
require_once 'tests/utils/CurlUtils.php';
require_once 'tests/utils/RainTPL.php';
// TODO: remove this after fixing UT
require_once 'tests/TestCase.php'; require_once 'tests/TestCase.php';
require_once 'tests/container/ShaarliTestContainer.php'; require_once 'tests/container/ShaarliTestContainer.php';
require_once 'tests/front/controller/visitor/FrontControllerMockHelper.php'; require_once 'tests/front/controller/visitor/FrontControllerMockHelper.php';
require_once 'tests/front/controller/admin/FrontAdminControllerMockHelper.php'; require_once 'tests/front/controller/admin/FrontAdminControllerMockHelper.php';
require_once 'tests/updater/DummyUpdater.php';
require_once 'tests/utils/FakeBookmarkService.php';
require_once 'tests/utils/FakeConfigManager.php'; require_once 'tests/utils/FakeConfigManager.php';
require_once 'tests/utils/ReferenceHistory.php'; require_once 'tests/utils/ReferenceHistory.php';
require_once 'tests/utils/ReferenceLinkDB.php'; require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'tests/utils/ReferenceSessionIdHashes.php';
\ReferenceSessionIdHashes::genAllHashes(); ReferenceSessionIdHashes::genAllHashes();
if (!defined('SHAARLI_MUTEX_FILE')) { if (!defined('SHAARLI_MUTEX_FILE')) {
define('SHAARLI_MUTEX_FILE', __FILE__); define('SHAARLI_MUTEX_FILE', __FILE__);

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Config; namespace Shaarli\Config;
/** /**
@ -29,13 +30,13 @@ public function testSetGet()
$this->conf->set('paramInt', 42); $this->conf->set('paramInt', 42);
$this->conf->set('paramString', 'value1'); $this->conf->set('paramString', 'value1');
$this->conf->set('paramBool', false); $this->conf->set('paramBool', false);
$this->conf->set('paramArray', array('foo' => 'bar')); $this->conf->set('paramArray', ['foo' => 'bar']);
$this->conf->set('paramNull', null); $this->conf->set('paramNull', null);
$this->assertEquals(42, $this->conf->get('paramInt')); $this->assertEquals(42, $this->conf->get('paramInt'));
$this->assertEquals('value1', $this->conf->get('paramString')); $this->assertEquals('value1', $this->conf->get('paramString'));
$this->assertFalse($this->conf->get('paramBool')); $this->assertFalse($this->conf->get('paramBool'));
$this->assertEquals(array('foo' => 'bar'), $this->conf->get('paramArray')); $this->assertEquals(['foo' => 'bar'], $this->conf->get('paramArray'));
$this->assertEquals(null, $this->conf->get('paramNull')); $this->assertEquals(null, $this->conf->get('paramNull'));
} }
@ -51,7 +52,7 @@ public function testSetWriteGet()
$this->conf->set('paramInt', 42); $this->conf->set('paramInt', 42);
$this->conf->set('paramString', 'value1'); $this->conf->set('paramString', 'value1');
$this->conf->set('paramBool', false); $this->conf->set('paramBool', false);
$this->conf->set('paramArray', array('foo' => 'bar')); $this->conf->set('paramArray', ['foo' => 'bar']);
$this->conf->set('paramNull', null); $this->conf->set('paramNull', null);
$this->conf->setConfigFile('tests/utils/config/configTmp'); $this->conf->setConfigFile('tests/utils/config/configTmp');
@ -62,7 +63,7 @@ public function testSetWriteGet()
$this->assertEquals(42, $this->conf->get('paramInt')); $this->assertEquals(42, $this->conf->get('paramInt'));
$this->assertEquals('value1', $this->conf->get('paramString')); $this->assertEquals('value1', $this->conf->get('paramString'));
$this->assertFalse($this->conf->get('paramBool')); $this->assertFalse($this->conf->get('paramBool'));
$this->assertEquals(array('foo' => 'bar'), $this->conf->get('paramArray')); $this->assertEquals(['foo' => 'bar'], $this->conf->get('paramArray'));
$this->assertEquals(null, $this->conf->get('paramNull')); $this->assertEquals(null, $this->conf->get('paramNull'));
} }
@ -112,7 +113,7 @@ public function testSetArrayKey()
$this->expectException(\Exception::class); $this->expectException(\Exception::class);
$this->expectExceptionMessageRegExp('#^Invalid setting key parameter. String expected, got.*#'); $this->expectExceptionMessageRegExp('#^Invalid setting key parameter. String expected, got.*#');
$this->conf->set(array('foo' => 'bar'), 'stuff'); $this->conf->set(['foo' => 'bar'], 'stuff');
} }
/** /**

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Config; namespace Shaarli\Config;
/** /**
@ -37,7 +38,7 @@ public function testRead()
*/ */
public function testReadNonExistent() public function testReadNonExistent()
{ {
$this->assertEquals(array(), $this->configIO->read('nope')); $this->assertEquals([], $this->configIO->read('nope'));
} }
/** /**
@ -60,16 +61,16 @@ public function testReadEmpty()
public function testWriteNew() public function testWriteNew()
{ {
$dataFile = 'tests/utils/config/configWrite.php'; $dataFile = 'tests/utils/config/configWrite.php';
$data = array( $data = [
'login' => 'root', 'login' => 'root',
'redirector' => 'lala', 'redirector' => 'lala',
'config' => array( 'config' => [
'DATASTORE' => 'data/datastore.php', 'DATASTORE' => 'data/datastore.php',
), ],
'plugins' => array( 'plugins' => [
'WALLABAG_VERSION' => '1', 'WALLABAG_VERSION' => '1',
) ]
); ];
$this->configIO->write($dataFile, $data); $this->configIO->write($dataFile, $data);
$expected = '<?php $expected = '<?php
$GLOBALS[\'login\'] = \'root\'; $GLOBALS[\'login\'] = \'root\';

View file

@ -1,15 +1,15 @@
<?php <?php
namespace Shaarli\Config; namespace Shaarli\Config;
use Shaarli\Config\Exception\PluginConfigOrderException; use Shaarli\Config\Exception\PluginConfigOrderException;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase;
require_once 'application/config/ConfigPlugin.php';
/** /**
* Unitary tests for Shaarli config related functions * Unitary tests for Shaarli config related functions
*/ */
class ConfigPluginTest extends \Shaarli\TestCase class ConfigPluginTest extends TestCase
{ {
/** /**
* Test save_plugin_config with valid data. * Test save_plugin_config with valid data.
@ -35,12 +35,16 @@ public function testSavePluginConfigValid()
mkdir($path = __DIR__ . '/folder'); mkdir($path = __DIR__ . '/folder');
PluginManager::$PLUGINS_PATH = $path; PluginManager::$PLUGINS_PATH = $path;
array_map(function (string $plugin) use ($path) { touch($path . '/' . $plugin); }, $expected); array_map(function (string $plugin) use ($path) {
touch($path . '/' . $plugin);
}, $expected);
$out = save_plugin_config($data); $out = save_plugin_config($data);
$this->assertEquals($expected, $out); $this->assertEquals($expected, $out);
array_map(function (string $plugin) use ($path) { unlink($path . '/' . $plugin); }, $expected); array_map(function (string $plugin) use ($path) {
unlink($path . '/' . $plugin);
}, $expected);
rmdir($path); rmdir($path);
} }
@ -49,15 +53,15 @@ public function testSavePluginConfigValid()
*/ */
public function testSavePluginConfigInvalid() public function testSavePluginConfigInvalid()
{ {
$this->expectException(\Shaarli\Config\Exception\PluginConfigOrderException::class); $this->expectException(PluginConfigOrderException::class);
$data = array( $data = [
'plugin2' => 0, 'plugin2' => 0,
'plugin3' => 0, 'plugin3' => 0,
'order_plugin3' => 0, 'order_plugin3' => 0,
'plugin4' => 0, 'plugin4' => 0,
'order_plugin4' => 0, 'order_plugin4' => 0,
); ];
save_plugin_config($data); save_plugin_config($data);
} }
@ -67,7 +71,7 @@ public function testSavePluginConfigInvalid()
*/ */
public function testSavePluginConfigEmpty() public function testSavePluginConfigEmpty()
{ {
$this->assertEquals(array(), save_plugin_config(array())); $this->assertEquals([], save_plugin_config([]));
} }
/** /**
@ -75,14 +79,14 @@ public function testSavePluginConfigEmpty()
*/ */
public function testValidatePluginOrderValid() public function testValidatePluginOrderValid()
{ {
$data = array( $data = [
'order_plugin1' => 2, 'order_plugin1' => 2,
'plugin2' => 0, 'plugin2' => 0,
'plugin3' => 0, 'plugin3' => 0,
'order_plugin3' => 1, 'order_plugin3' => 1,
'plugin4' => 0, 'plugin4' => 0,
'order_plugin4' => 5, 'order_plugin4' => 5,
); ];
$this->assertTrue(validate_plugin_order($data)); $this->assertTrue(validate_plugin_order($data));
} }
@ -92,11 +96,11 @@ public function testValidatePluginOrderValid()
*/ */
public function testValidatePluginOrderInvalid() public function testValidatePluginOrderInvalid()
{ {
$data = array( $data = [
'order_plugin1' => 2, 'order_plugin1' => 2,
'order_plugin3' => 1, 'order_plugin3' => 1,
'order_plugin4' => 1, 'order_plugin4' => 1,
); ];
$this->assertFalse(validate_plugin_order($data)); $this->assertFalse(validate_plugin_order($data));
} }
@ -106,20 +110,20 @@ public function testValidatePluginOrderInvalid()
*/ */
public function testLoadPluginParameterValues() public function testLoadPluginParameterValues()
{ {
$plugins = array( $plugins = [
'plugin_name' => array( 'plugin_name' => [
'parameters' => array( 'parameters' => [
'param1' => array('value' => true), 'param1' => ['value' => true],
'param2' => array('value' => false), 'param2' => ['value' => false],
'param3' => array('value' => ''), 'param3' => ['value' => ''],
) ]
) ]
); ];
$parameters = array( $parameters = [
'param1' => 'value1', 'param1' => 'value1',
'param2' => 'value2', 'param2' => 'value2',
); ];
$result = load_plugin_parameter_values($plugins, $parameters); $result = load_plugin_parameter_values($plugins, $parameters);
$this->assertEquals('value1', $result['plugin_name']['parameters']['param1']['value']); $this->assertEquals('value1', $result['plugin_name']['parameters']['param1']['value']);

View file

@ -1,7 +1,9 @@
<?php <?php
/** /**
* PageCache tests * PageCache tests
*/ */
namespace Shaarli\Feed; namespace Shaarli\Feed;
/** /**

View file

@ -4,7 +4,6 @@
use DateTime; use DateTime;
use malkusch\lock\mutex\NoMutex; use malkusch\lock\mutex\NoMutex;
use ReferenceLinkDB;
use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkFileService; use Shaarli\Bookmark\BookmarkFileService;
use Shaarli\Bookmark\LinkDB; use Shaarli\Bookmark\LinkDB;
@ -13,6 +12,7 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* FeedBuilderTest class. * FeedBuilderTest class.
@ -52,7 +52,7 @@ public static function setUpBeforeClass(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
$conf = new ConfigManager('tests/utils/config/configJson'); $conf = new ConfigManager('tests/utils/config/configJson');
$conf->set('resource.datastore', self::$testDatastore); $conf->set('resource.datastore', self::$testDatastore);
$refLinkDB = new \ReferenceLinkDB(); $refLinkDB = new ReferenceLinkDB();
$refLinkDB->write(self::$testDatastore); $refLinkDB->write(self::$testDatastore);
$history = new History('sandbox/history.php'); $history = new History('sandbox/history.php');
$factory = new FormatterFactory($conf, true); $factory = new FormatterFactory($conf, true);
@ -66,13 +66,13 @@ public static function setUpBeforeClass(): void
true true
); );
self::$serverInfo = array( self::$serverInfo = [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/index.php', 'SCRIPT_NAME' => '/index.php',
'REQUEST_URI' => '/feed/atom', 'REQUEST_URI' => '/feed/atom',
); ];
} }
/** /**
@ -100,7 +100,10 @@ public function testRSSBuildData()
// Test first not pinned link (note link) // Test first not pinned link (note link)
$link = $data['links'][array_keys($data['links'])[0]]; $link = $data['links'][array_keys($data['links'])[0]];
$this->assertEquals(41, $link['id']); $this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'),
$link['created']
);
$this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']); $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']);
$this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']); $this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']);
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']); $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']);
@ -149,10 +152,10 @@ public function testAtomBuildData()
*/ */
public function testBuildDataFiltered() public function testBuildDataFiltered()
{ {
$criteria = array( $criteria = [
'searchtags' => 'stuff', 'searchtags' => 'stuff',
'searchterm' => 'beard', 'searchterm' => 'beard',
); ];
$feedBuilder = new FeedBuilder( $feedBuilder = new FeedBuilder(
self::$bookmarkService, self::$bookmarkService,
self::$formatter, self::$formatter,
@ -164,7 +167,10 @@ public function testBuildDataFiltered()
$this->assertEquals(1, count($data['links'])); $this->assertEquals(1, count($data['links']));
$link = array_shift($data['links']); $link = array_shift($data['links']);
$this->assertEquals(41, $link['id']); $this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'),
$link['created']
);
} }
/** /**
@ -172,9 +178,9 @@ public function testBuildDataFiltered()
*/ */
public function testBuildDataCount() public function testBuildDataCount()
{ {
$criteria = array( $criteria = [
'nb' => '3', 'nb' => '3',
); ];
$feedBuilder = new FeedBuilder( $feedBuilder = new FeedBuilder(
self::$bookmarkService, self::$bookmarkService,
self::$formatter, self::$formatter,
@ -186,7 +192,10 @@ public function testBuildDataCount()
$this->assertEquals(3, count($data['links'])); $this->assertEquals(3, count($data['links']));
$link = $data['links'][array_keys($data['links'])[0]]; $link = $data['links'][array_keys($data['links'])[0]];
$this->assertEquals(41, $link['id']); $this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'),
$link['created']
);
} }
/** /**
@ -208,7 +217,10 @@ public function testBuildDataPermalinks()
// First link is a permalink // First link is a permalink
$link = $data['links'][array_keys($data['links'])[0]]; $link = $data['links'][array_keys($data['links'])[0]];
$this->assertEquals(41, $link['id']); $this->assertEquals(41, $link['id']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'),
$link['created']
);
$this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']); $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']);
$this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']); $this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']);
$this->assertContainsPolyfill('Direct link', $link['description']); $this->assertContainsPolyfill('Direct link', $link['description']);
@ -216,7 +228,10 @@ public function testBuildDataPermalinks()
// Second link is a direct link // Second link is a direct link
$link = $data['links'][array_keys($data['links'])[1]]; $link = $data['links'][array_keys($data['links'])[1]];
$this->assertEquals(8, $link['id']); $this->assertEquals(8, $link['id']);
$this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'), $link['created']); $this->assertEquals(
DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'),
$link['created']
);
$this->assertEquals('http://host.tld/shaare/RttfEw', $link['guid']); $this->assertEquals('http://host.tld/shaare/RttfEw', $link['guid']);
$this->assertEquals('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['url']); $this->assertEquals('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['url']);
$this->assertContainsPolyfill('Direct link', $link['description']); $this->assertContainsPolyfill('Direct link', $link['description']);
@ -259,13 +274,13 @@ public function testBuildDataHideDates()
*/ */
public function testBuildDataServerSubdir() public function testBuildDataServerSubdir()
{ {
$serverInfo = array( $serverInfo = [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080', 'SERVER_PORT' => '8080',
'SCRIPT_NAME' => '/~user/shaarli/index.php', 'SCRIPT_NAME' => '/~user/shaarli/index.php',
'REQUEST_URI' => '/~user/shaarli/feed/atom', 'REQUEST_URI' => '/~user/shaarli/feed/atom',
); ];
$feedBuilder = new FeedBuilder( $feedBuilder = new FeedBuilder(
self::$bookmarkService, self::$bookmarkService,
self::$formatter, self::$formatter,

View file

@ -27,7 +27,7 @@ class BookmarkDefaultFormatterTest extends TestCase
*/ */
protected function setUp(): void protected function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkDefaultFormatter($this->conf, true); $this->formatter = new BookmarkDefaultFormatter($this->conf, true);
} }
@ -112,9 +112,9 @@ public function testFormatDescription()
{ {
$description = []; $description = [];
$description[] = 'This a <strong>description</strong>' . PHP_EOL; $description[] = 'This a <strong>description</strong>' . PHP_EOL;
$description[] = 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL; $description[] = 'text https://sub.domain.tld?query=here&for=real#hash more text' . PHP_EOL;
$description[] = 'Also, there is an #hashtag added'. PHP_EOL; $description[] = 'Also, there is an #hashtag added' . PHP_EOL;
$description[] = ' A N D KEEP SPACES ! '. PHP_EOL; $description[] = ' A N D KEEP SPACES ! ' . PHP_EOL;
$bookmark = new Bookmark(); $bookmark = new Bookmark();
$bookmark->setDescription(implode('', $description)); $bookmark->setDescription(implode('', $description));
@ -122,10 +122,10 @@ public function testFormatDescription()
$description[0] = 'This a &lt;strong&gt;description&lt;/strong&gt;<br />'; $description[0] = 'This a &lt;strong&gt;description&lt;/strong&gt;<br />';
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash'; $url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$description[1] = 'text <a href="'. $url .'">'. $url .'</a> more text<br />'; $description[1] = 'text <a href="' . $url . '">' . $url . '</a> more text<br />';
$description[2] = 'Also, there is an <a href="./add-tag/hashtag" '. $description[2] = 'Also, there is an <a href="./add-tag/hashtag" ' .
'title="Hashtag hashtag">#hashtag</a> added<br />'; 'title="Hashtag hashtag">#hashtag</a> added<br />';
$description[3] = '&nbsp; &nbsp; A &nbsp;N &nbsp;D KEEP &nbsp; &nbsp; '. $description[3] = '&nbsp; &nbsp; A &nbsp;N &nbsp;D KEEP &nbsp; &nbsp; ' .
'SPACES &nbsp; &nbsp;! &nbsp; <br />'; 'SPACES &nbsp; &nbsp;! &nbsp; <br />';
$this->assertEquals(implode(PHP_EOL, $description) . PHP_EOL, $link['description']); $this->assertEquals(implode(PHP_EOL, $description) . PHP_EOL, $link['description']);
@ -148,7 +148,7 @@ public function testFormatNoteWithIndexUrl()
$this->assertEquals($root . $short, $link['url']); $this->assertEquals($root . $short, $link['url']);
$this->assertEquals($root . $short, $link['real_url']); $this->assertEquals($root . $short, $link['real_url']);
$this->assertEquals( $this->assertEquals(
'Text <a href="'. $root .'./add-tag/hashtag" title="Hashtag hashtag">'. 'Text <a href="' . $root . './add-tag/hashtag" title="Hashtag hashtag">' .
'#hashtag</a> more text', '#hashtag</a> more text',
$link['description'] $link['description']
); );

View file

@ -27,7 +27,7 @@ class BookmarkMarkdownExtraFormatterTest extends TestCase
*/ */
public function setUp(): void public function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkMarkdownExtraFormatter($this->conf, true); $this->formatter = new BookmarkMarkdownExtraFormatter($this->conf, true);
} }
@ -60,8 +60,8 @@ public function testFormatExtra(): void
); );
$this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']); $this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']);
$this->assertEquals( $this->assertEquals(
'<div class="markdown"><p>'. '<div class="markdown"><p>' .
'&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;'. '&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;' .
'</p></div>', '</p></div>',
$link['description'] $link['description']
); );
@ -112,21 +112,21 @@ public function testFormatExtraMinimal(): void
*/ */
public function testFormatExtrraDescription(): void public function testFormatExtrraDescription(): void
{ {
$description = 'This a <strong>description</strong>'. PHP_EOL; $description = 'This a <strong>description</strong>' . PHP_EOL;
$description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL; $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text' . PHP_EOL;
$description .= 'Also, there is an #hashtag added'. PHP_EOL; $description .= 'Also, there is an #hashtag added' . PHP_EOL;
$description .= ' A N D KEEP SPACES ! '. PHP_EOL; $description .= ' A N D KEEP SPACES ! ' . PHP_EOL;
$description .= '# Header {.class}'. PHP_EOL; $description .= '# Header {.class}' . PHP_EOL;
$bookmark = new Bookmark(); $bookmark = new Bookmark();
$bookmark->setDescription($description); $bookmark->setDescription($description);
$link = $this->formatter->format($bookmark); $link = $this->formatter->format($bookmark);
$description = '<div class="markdown"><p>'; $description = '<div class="markdown"><p>';
$description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />'. PHP_EOL; $description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />' . PHP_EOL;
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash'; $url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL; $description .= 'text <a href="' . $url . '">' . $url . '</a> more text<br />' . PHP_EOL;
$description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />'. PHP_EOL; $description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />' . PHP_EOL;
$description .= 'A N D KEEP SPACES ! </p>' . PHP_EOL; $description .= 'A N D KEEP SPACES ! </p>' . PHP_EOL;
$description .= '<h1 class="class">Header</h1>'; $description .= '<h1 class="class">Header</h1>';
$description .= '</div>'; $description .= '</div>';
@ -148,7 +148,7 @@ public function testFormatExtraNoteWithIndexUrl(): void
$this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/'); $this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
$description = '<div class="markdown"><p>'; $description = '<div class="markdown"><p>';
$description .= 'Text <a href="'. $root .'./add-tag/hashtag">#hashtag</a> more text'; $description .= 'Text <a href="' . $root . './add-tag/hashtag">#hashtag</a> more text';
$description .= '</p></div>'; $description .= '</p></div>';
$link = $this->formatter->format($bookmark); $link = $this->formatter->format($bookmark);

View file

@ -27,7 +27,7 @@ class BookmarkMarkdownFormatterTest extends TestCase
*/ */
protected function setUp(): void protected function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkMarkdownFormatter($this->conf, true); $this->formatter = new BookmarkMarkdownFormatter($this->conf, true);
} }
@ -60,8 +60,8 @@ public function testFormatFull()
); );
$this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']); $this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']);
$this->assertEquals( $this->assertEquals(
'<div class="markdown"><p>'. '<div class="markdown"><p>' .
'&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;'. '&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;' .
'</p></div>', '</p></div>',
$link['description'] $link['description']
); );
@ -112,20 +112,20 @@ public function testFormatMinimal()
*/ */
public function testFormatDescription() public function testFormatDescription()
{ {
$description = 'This a <strong>description</strong>'. PHP_EOL; $description = 'This a <strong>description</strong>' . PHP_EOL;
$description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL; $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text' . PHP_EOL;
$description .= 'Also, there is an #hashtag added'. PHP_EOL; $description .= 'Also, there is an #hashtag added' . PHP_EOL;
$description .= ' A N D KEEP SPACES ! '. PHP_EOL; $description .= ' A N D KEEP SPACES ! ' . PHP_EOL;
$bookmark = new Bookmark(); $bookmark = new Bookmark();
$bookmark->setDescription($description); $bookmark->setDescription($description);
$link = $this->formatter->format($bookmark); $link = $this->formatter->format($bookmark);
$description = '<div class="markdown"><p>'; $description = '<div class="markdown"><p>';
$description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />'. PHP_EOL; $description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />' . PHP_EOL;
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash'; $url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL; $description .= 'text <a href="' . $url . '">' . $url . '</a> more text<br />' . PHP_EOL;
$description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />'. PHP_EOL; $description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />' . PHP_EOL;
$description .= 'A N D KEEP SPACES ! '; $description .= 'A N D KEEP SPACES ! ';
$description .= '</p></div>'; $description .= '</p></div>';
@ -137,11 +137,11 @@ public function testFormatDescription()
*/ */
public function testFormatDescriptionWithSearchHighlight() public function testFormatDescriptionWithSearchHighlight()
{ {
$description = 'This a <strong>description</strong>'. PHP_EOL; $description = 'This a <strong>description</strong>' . PHP_EOL;
$description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL; $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text' . PHP_EOL;
$description .= 'Also, there is an #hashtag added'. PHP_EOL; $description .= 'Also, there is an #hashtag added' . PHP_EOL;
$description .= ' A N D KEEP SPACES ! '. PHP_EOL; $description .= ' A N D KEEP SPACES ! ' . PHP_EOL;
$description .= 'And [yet another link](https://other.domain.tld)'. PHP_EOL; $description .= 'And [yet another link](https://other.domain.tld)' . PHP_EOL;
$bookmark = new Bookmark(); $bookmark = new Bookmark();
$bookmark->setDescription($description); $bookmark->setDescription($description);
@ -164,9 +164,9 @@ public function testFormatDescriptionWithSearchHighlight()
$url = 'https://sub.domain.tld?query=here&amp;for=real#hash'; $url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
$highlighted = 'https://<span class="search-highlight">sub</span>.domain.tld'; $highlighted = 'https://<span class="search-highlight">sub</span>.domain.tld';
$highlighted .= '?query=here&amp;for=real#<span class="search-highlight">hash</span>'; $highlighted .= '?query=here&amp;for=real#<span class="search-highlight">hash</span>';
$description .= 'text <a href="'. $url .'">'. $highlighted .'</a> more text<br />'. PHP_EOL; $description .= 'text <a href="' . $url . '">' . $highlighted . '</a> more text<br />' . PHP_EOL;
$description .= 'Also, there is an <a href="./add-tag/hashtag">#<span class="search-highlight">hasht</span>' . $description .= 'Also, there is an <a href="./add-tag/hashtag">#<span class="search-highlight">hasht</span>' .
'ag</a> added<br />'. PHP_EOL; 'ag</a> added<br />' . PHP_EOL;
$description .= 'A N D KEEP SPACES !<br />' . PHP_EOL; $description .= 'A N D KEEP SPACES !<br />' . PHP_EOL;
$description .= 'And <a href="https://other.domain.tld">' . $description .= 'And <a href="https://other.domain.tld">' .
'<span class="search-highlight">yet another link</span></a>'; '<span class="search-highlight">yet another link</span></a>';
@ -189,7 +189,7 @@ public function testFormatNoteWithIndexUrl()
$this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/'); $this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
$description = '<div class="markdown"><p>'; $description = '<div class="markdown"><p>';
$description .= 'Text <a href="'. $root .'./add-tag/hashtag">#hashtag</a> more text'; $description .= 'Text <a href="' . $root . './add-tag/hashtag">#hashtag</a> more text';
$description .= '</p></div>'; $description .= '</p></div>';
$link = $this->formatter->format($bookmark); $link = $this->formatter->format($bookmark);

View file

@ -27,7 +27,7 @@ class BookmarkRawFormatterTest extends TestCase
*/ */
protected function setUp(): void protected function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->formatter = new BookmarkRawFormatter($this->conf, true); $this->formatter = new BookmarkRawFormatter($this->conf, true);
} }

View file

@ -26,7 +26,7 @@ class FormatterFactoryTest extends TestCase
*/ */
protected function setUp(): void protected function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
$this->conf = new ConfigManager(self::$testConf); $this->conf = new ConfigManager(self::$testConf);
$this->factory = new FormatterFactory($this->conf, true); $this->factory = new FormatterFactory($this->conf, true);
} }

View file

@ -63,7 +63,8 @@ public function testMiddlewareWhileLoggedOut(): void
$response = new Response(); $response = new Response();
/** @var Response $result */ /** @var Response $result */
$result = $this->middleware->__invoke($request, $response, function () {}); $result = $this->middleware->__invoke($request, $response, function () {
});
static::assertSame(302, $result->getStatusCode()); static::assertSame(302, $result->getStatusCode());
static::assertSame( static::assertSame(

View file

@ -91,7 +91,7 @@ public function testMiddlewareExecutionWithFrontException(): void
$controller = function (): void { $controller = function (): void {
$exception = new LoginBannedException(); $exception = new LoginBannedException();
throw new $exception; throw new $exception();
}; };
$pageBuilder = $this->createMock(PageBuilder::class); $pageBuilder = $this->createMock(PageBuilder::class);
@ -148,7 +148,8 @@ public function testMiddlewareExecutionWithServerException(): void
return $uri; return $uri;
}); });
$dummyException = new class() extends \Exception {}; $dummyException = new class () extends \Exception {
};
$response = new Response(); $response = new Response();
$controller = function () use ($dummyException): void { $controller = function () use ($dummyException): void {

View file

@ -62,7 +62,7 @@ public function testIndex(): void
static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']); static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']);
static::assertSame('api.enabled', $assignedVariables['api_enabled']); static::assertSame('api.enabled', $assignedVariables['api_enabled']);
static::assertSame('api.secret', $assignedVariables['api_secret']); static::assertSame('api.secret', $assignedVariables['api_secret']);
static::assertCount(6, $assignedVariables['languages']); static::assertCount(7, $assignedVariables['languages']);
static::assertArrayHasKey('gd_enabled', $assignedVariables); static::assertArrayHasKey('gd_enabled', $assignedVariables);
static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']); static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']);
} }
@ -122,8 +122,7 @@ public function testSaveNewConfig(): void
} }
return $parameters[$key]; return $parameters[$key];
} });
);
$response = new Response(); $response = new Response();
@ -137,8 +136,7 @@ public function testSaveNewConfig(): void
} }
static::assertSame($parametersConfigMapping[$key], $value); static::assertSame($parametersConfigMapping[$key], $value);
} });
);
$result = $this->controller->save($request, $response); $result = $this->controller->save($request, $response);
static::assertSame(302, $result->getStatusCode()); static::assertSame(302, $result->getStatusCode());

View file

@ -80,7 +80,10 @@ function (
string $selection, string $selection,
bool $prependNoteUrl, bool $prependNoteUrl,
string $indexUrl string $indexUrl
) use ($parameters, $bookmarks): array { ) use (
$parameters,
$bookmarks
): array {
static::assertInstanceOf(BookmarkRawFormatter::class, $formatter); static::assertInstanceOf(BookmarkRawFormatter::class, $formatter);
static::assertSame($parameters['selection'], $selection); static::assertSame($parameters['selection'], $selection);
static::assertTrue($prependNoteUrl); static::assertTrue($prependNoteUrl);

View file

@ -74,7 +74,10 @@ public function testImportDefault(): void
function ( function (
array $post, array $post,
UploadedFileInterface $file UploadedFileInterface $file
) use ($parameters, $requestFile): string { ) use (
$parameters,
$requestFile
): string {
static::assertSame($parameters, $post); static::assertSame($parameters, $post);
static::assertSame($requestFile, $file); static::assertSame($requestFile, $file);

View file

@ -16,7 +16,7 @@ class PluginsControllerTest extends TestCase
{ {
use FrontAdminControllerMockHelper; use FrontAdminControllerMockHelper;
const PLUGIN_NAMES = ['plugin1', 'plugin2', 'plugin3', 'plugin4']; protected const PLUGIN_NAMES = ['plugin1', 'plugin2', 'plugin3', 'plugin4'];
/** @var PluginsController */ /** @var PluginsController */
protected $controller; protected $controller;
@ -29,13 +29,17 @@ public function setUp(): void
mkdir($path = __DIR__ . '/folder'); mkdir($path = __DIR__ . '/folder');
PluginManager::$PLUGINS_PATH = $path; PluginManager::$PLUGINS_PATH = $path;
array_map(function (string $plugin) use ($path) { touch($path . '/' . $plugin); }, static::PLUGIN_NAMES); array_map(function (string $plugin) use ($path) {
touch($path . '/' . $plugin);
}, static::PLUGIN_NAMES);
} }
public function tearDown(): void public function tearDown(): void
{ {
$path = __DIR__ . '/folder'; $path = __DIR__ . '/folder';
array_map(function (string $plugin) use ($path) { unlink($path . '/' . $plugin); }, static::PLUGIN_NAMES); array_map(function (string $plugin) use ($path) {
unlink($path . '/' . $plugin);
}, static::PLUGIN_NAMES);
rmdir($path); rmdir($path);
} }

View file

@ -365,5 +365,4 @@ public function testSaveBookmarkWrongToken(): void
$this->controller->save($request, $response); $this->controller->save($request, $response);
} }
} }

View file

@ -26,7 +26,7 @@ public function setUp(): void
{ {
$this->createContainer(); $this->createContainer();
$this->controller = new class($this->container) extends ShaarliAdminController $this->controller = new class ($this->container) extends ShaarliAdminController
{ {
public function checkToken(Request $request): bool public function checkToken(Request $request): bool
{ {

View file

@ -54,8 +54,7 @@ public function testIndexDefaultFirstPage(): void
(new Bookmark())->setId(1)->setUrl('http://url1.tld')->setTitle('Title 1'), (new Bookmark())->setId(1)->setUrl('http://url1.tld')->setTitle('Title 1'),
(new Bookmark())->setId(2)->setUrl('http://url2.tld')->setTitle('Title 2'), (new Bookmark())->setId(2)->setUrl('http://url2.tld')->setTitle('Title 2'),
(new Bookmark())->setId(3)->setUrl('http://url3.tld')->setTitle('Title 3'), (new Bookmark())->setId(3)->setUrl('http://url3.tld')->setTitle('Title 3'),
], 0, 2) ], 0, 2));
);
$this->container->sessionManager $this->container->sessionManager
->method('getSessionParameter') ->method('getSessionParameter')

View file

@ -102,7 +102,7 @@ function (string $hook, array $data, array $param) use ($currentDay, $previousDa
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertSame('daily', (string) $result->getBody()); static::assertSame('daily', (string) $result->getBody());
static::assertSame( static::assertSame(
'Daily - '. format_date($currentDay, false, true) .' - Shaarli', 'Daily - ' . format_date($currentDay, false, true) . ' - Shaarli',
$assignedVariables['pagetitle'] $assignedVariables['pagetitle']
); );
static::assertEquals($currentDay, $assignedVariables['dayDate']); static::assertEquals($currentDay, $assignedVariables['dayDate']);
@ -225,7 +225,7 @@ public function testValidIndexControllerInvokeNoFutureOrPast(): void
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertSame('daily', (string) $result->getBody()); static::assertSame('daily', (string) $result->getBody());
static::assertSame( static::assertSame(
'Daily - '. format_date($currentDay, false, true) .' - Shaarli', 'Daily - ' . format_date($currentDay, false, true) . ' - Shaarli',
$assignedVariables['pagetitle'] $assignedVariables['pagetitle']
); );
static::assertCount(1, $assignedVariables['linksToDisplay']); static::assertCount(1, $assignedVariables['linksToDisplay']);
@ -285,7 +285,9 @@ public function testValidIndexControllerInvokeHeightAdjustment(): void
static::assertCount(7, $assignedVariables['linksToDisplay']); static::assertCount(7, $assignedVariables['linksToDisplay']);
$columnIds = function (array $column): array { $columnIds = function (array $column): array {
return array_map(function (array $item): int { return $item['id']; }, $column); return array_map(function (array $item): int {
return $item['id'];
}, $column);
}; };
static::assertSame([1, 4, 6], $columnIds($assignedVariables['cols'][0])); static::assertSame([1, 4, 6], $columnIds($assignedVariables['cols'][0]));
@ -366,8 +368,7 @@ public function testValidRssControllerInvokeDefault(): void
$cachedPage->expects(static::once())->method('cache')->with('dailyrss'); $cachedPage->expects(static::once())->method('cache')->with('dailyrss');
return $cachedPage; return $cachedPage;
} });
);
// Save RainTPL assigned variables // Save RainTPL assigned variables
$assignedVariables = []; $assignedVariables = [];
@ -390,7 +391,7 @@ public function testValidRssControllerInvokeDefault(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame(format_date($date, false), $day['date_human']); static::assertSame(format_date($date, false), $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?day=' . $dates[0]->format('Ymd'), $day['absolute_url']);
static::assertCount(1, $day['links']); static::assertCount(1, $day['links']);
static::assertSame(1, $day['links'][0]['id']); static::assertSame(1, $day['links'][0]['id']);
static::assertSame('http://domain.tld/1', $day['links'][0]['url']); static::assertSame('http://domain.tld/1', $day['links'][0]['url']);
@ -402,7 +403,7 @@ public function testValidRssControllerInvokeDefault(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame(format_date($date, false), $day['date_human']); static::assertSame(format_date($date, false), $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?day=' . $dates[1]->format('Ymd'), $day['absolute_url']);
static::assertCount(2, $day['links']); static::assertCount(2, $day['links']);
static::assertSame(2, $day['links'][0]['id']); static::assertSame(2, $day['links'][0]['id']);
@ -418,7 +419,7 @@ public function testValidRssControllerInvokeDefault(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame(format_date($date, false), $day['date_human']); static::assertSame(format_date($date, false), $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?day='. $dates[2]->format('Ymd'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?day=' . $dates[2]->format('Ymd'), $day['absolute_url']);
static::assertCount(1, $day['links']); static::assertCount(1, $day['links']);
static::assertSame(4, $day['links'][0]['id']); static::assertSame(4, $day['links'][0]['id']);
static::assertSame('http://domain.tld/4', $day['links'][0]['url']); static::assertSame('http://domain.tld/4', $day['links'][0]['url']);
@ -647,7 +648,7 @@ public function testSimpleRssWeekly(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame('Week 21 (May 18, 2020)', $day['date_human']); static::assertSame('Week 21 (May 18, 2020)', $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?week='. $dates[0]->format('YW'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?week=' . $dates[0]->format('YW'), $day['absolute_url']);
static::assertCount(1, $day['links']); static::assertCount(1, $day['links']);
$day = $assignedVariables['days'][$dates[1]->format('YW')]; $day = $assignedVariables['days'][$dates[1]->format('YW')];
@ -656,7 +657,7 @@ public function testSimpleRssWeekly(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame('Week 20 (May 11, 2020)', $day['date_human']); static::assertSame('Week 20 (May 11, 2020)', $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?week='. $dates[1]->format('YW'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?week=' . $dates[1]->format('YW'), $day['absolute_url']);
static::assertCount(2, $day['links']); static::assertCount(2, $day['links']);
} }
@ -710,7 +711,7 @@ public function testSimpleRssMonthly(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame('May, 2020', $day['date_human']); static::assertSame('May, 2020', $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?month='. $dates[0]->format('Ym'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?month=' . $dates[0]->format('Ym'), $day['absolute_url']);
static::assertCount(1, $day['links']); static::assertCount(1, $day['links']);
$day = $assignedVariables['days'][$dates[1]->format('Ym')]; $day = $assignedVariables['days'][$dates[1]->format('Ym')];
@ -719,7 +720,7 @@ public function testSimpleRssMonthly(): void
static::assertEquals($date, $day['date']); static::assertEquals($date, $day['date']);
static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); static::assertSame($date->format(\DateTime::RSS), $day['date_rss']);
static::assertSame('April, 2020', $day['date_human']); static::assertSame('April, 2020', $day['date_human']);
static::assertSame('http://shaarli/subfolder/daily?month='. $dates[1]->format('Ym'), $day['absolute_url']); static::assertSame('http://shaarli/subfolder/daily?month=' . $dates[1]->format('Ym'), $day['absolute_url']);
static::assertCount(2, $day['links']); static::assertCount(2, $day['links']);
} }
} }

View file

@ -41,7 +41,8 @@ public function testDisplayFrontExceptionError(): void
$result = ($this->controller)( $result = ($this->controller)(
$request, $request,
$response, $response,
new class($message, $errorCode) extends ShaarliFrontException {} new class ($message, $errorCode) extends ShaarliFrontException {
}
); );
static::assertSame($errorCode, $result->getStatusCode()); static::assertSame($errorCode, $result->getStatusCode());

View file

@ -118,5 +118,5 @@ protected static function generateString(int $length): string
/** /**
* Force to be used in PHPUnit context. * Force to be used in PHPUnit context.
*/ */
protected abstract function isInTestsContext(): bool; abstract protected function isInTestsContext(): bool;
} }

View file

@ -15,7 +15,7 @@ class InstallControllerTest extends TestCase
{ {
use FrontControllerMockHelper; use FrontControllerMockHelper;
const MOCK_FILE = '.tmp'; protected const MOCK_FILE = '.tmp';
/** @var InstallController */ /** @var InstallController */
protected $controller; protected $controller;

View file

@ -32,7 +32,7 @@ public function setUp(): void
{ {
$this->createContainer(); $this->createContainer();
$this->controller = new class($this->container) extends ShaarliVisitorController $this->controller = new class ($this->container) extends ShaarliVisitorController
{ {
public function assignView(string $key, $value): ShaarliVisitorController public function assignView(string $key, $value): ShaarliVisitorController
{ {

View file

@ -1,10 +1,9 @@
<?php <?php
namespace Shaarli\Helper; namespace Shaarli\Helper;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\FakeApplicationUtils; use Shaarli\Tests\Utils\FakeApplicationUtils;
require_once 'tests/utils/FakeApplicationUtils.php';
/** /**
* Unitary tests for Shaarli utilities * Unitary tests for Shaarli utilities
@ -49,7 +48,7 @@ public function testGetVersionCode()
'0.5.4', '0.5.4',
ApplicationUtils::getVersion( ApplicationUtils::getVersion(
'https://raw.githubusercontent.com/shaarli/Shaarli/' 'https://raw.githubusercontent.com/shaarli/Shaarli/'
.'v0.5.4/shaarli_version.php', . 'v0.5.4/shaarli_version.php',
$testTimeout $testTimeout
) )
); );
@ -57,7 +56,7 @@ public function testGetVersionCode()
self::$versionPattern, self::$versionPattern,
ApplicationUtils::getVersion( ApplicationUtils::getVersion(
'https://raw.githubusercontent.com/shaarli/Shaarli/' 'https://raw.githubusercontent.com/shaarli/Shaarli/'
.'latest/shaarli_version.php', . 'latest/shaarli_version.php',
$testTimeout $testTimeout
) )
); );
@ -68,7 +67,7 @@ public function testGetVersionCode()
*/ */
public function testGetVersionCodeFromFile() public function testGetVersionCodeFromFile()
{ {
file_put_contents('sandbox/version.php', '<?php /* 1.2.3 */ ?>'. PHP_EOL); file_put_contents('sandbox/version.php', '<?php /* 1.2.3 */ ?>' . PHP_EOL);
$this->assertEquals( $this->assertEquals(
'1.2.3', '1.2.3',
ApplicationUtils::getVersion('sandbox/version.php', 1) ApplicationUtils::getVersion('sandbox/version.php', 1)
@ -301,7 +300,7 @@ public function testCheckCurrentResourcePermissions()
$conf->set('resource.update_check', 'data/lastupdatecheck.txt'); $conf->set('resource.update_check', 'data/lastupdatecheck.txt');
$this->assertEquals( $this->assertEquals(
array(), [],
ApplicationUtils::checkResourcePermissions($conf) ApplicationUtils::checkResourcePermissions($conf)
); );
} }
@ -324,7 +323,7 @@ public function testCheckCurrentResourcePermissionsErrors()
$conf->set('resource.raintpl_theme', 'null/tpl/default'); $conf->set('resource.raintpl_theme', 'null/tpl/default');
$conf->set('resource.update_check', 'null/data/lastupdatecheck.txt'); $conf->set('resource.update_check', 'null/data/lastupdatecheck.txt');
$this->assertEquals( $this->assertEquals(
array( [
'"null/tpl" directory is not readable', '"null/tpl" directory is not readable',
'"null/tpl/default" directory is not readable', '"null/tpl/default" directory is not readable',
'"null/cache" directory is not readable', '"null/cache" directory is not readable',
@ -335,7 +334,7 @@ public function testCheckCurrentResourcePermissionsErrors()
'"null/pagecache" directory is not writable', '"null/pagecache" directory is not writable',
'"null/tmp" directory is not readable', '"null/tmp" directory is not readable',
'"null/tmp" directory is not writable' '"null/tmp" directory is not writable'
), ],
ApplicationUtils::checkResourcePermissions($conf) ApplicationUtils::checkResourcePermissions($conf)
); );
} }

View file

@ -4,6 +4,7 @@
namespace Shaarli\Helper; namespace Shaarli\Helper;
use DateTime;
use DateTimeImmutable; use DateTimeImmutable;
use DateTimeInterface; use DateTimeInterface;
use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\Bookmark;
@ -147,7 +148,8 @@ public function getDescriptionByTypeExceptionUnknownType(): void
/** /**
* @dataProvider getRssLengthsByType * @dataProvider getRssLengthsByType
*/ */
public function testGeRssLengthsByType(string $type): void { public function testGeRssLengthsByType(string $type): void
{
$length = DailyPageHelper::getRssLengthByType($type); $length = DailyPageHelper::getRssLengthByType($type);
static::assertIsInt($length); static::assertIsInt($length);
@ -208,31 +210,31 @@ public function getRequestedTypes(): array
public function getRequestedDateTimes(): array public function getRequestedDateTimes(): array
{ {
return [ return [
[DailyPageHelper::DAY, '20201013', null, new \DateTime('2020-10-13')], [DailyPageHelper::DAY, '20201013', null, new DateTime('2020-10-13')],
[ [
DailyPageHelper::DAY, DailyPageHelper::DAY,
'', '',
(new Bookmark())->setCreated($date = new \DateTime('2020-10-13 12:05:31')), (new Bookmark())->setCreated($date = new DateTime('2020-10-13 12:05:31')),
$date, $date,
], ],
[DailyPageHelper::DAY, '', null, new \DateTime()], [DailyPageHelper::DAY, '', null, new DateTime()],
[DailyPageHelper::WEEK, '202030', null, new \DateTime('2020-07-20')], [DailyPageHelper::WEEK, '202030', null, new DateTime('2020-07-20')],
[ [
DailyPageHelper::WEEK, DailyPageHelper::WEEK,
'', '',
(new Bookmark())->setCreated($date = new \DateTime('2020-10-13 12:05:31')), (new Bookmark())->setCreated($date = new DateTime('2020-10-13 12:05:31')),
new \DateTime('2020-10-13'), new DateTime('2020-10-13'),
], ],
[DailyPageHelper::WEEK, '', null, new \DateTime(), 'Ym'], [DailyPageHelper::WEEK, '', null, new DateTime(), 'Ym'],
[DailyPageHelper::MONTH, '202008', null, new \DateTime('2020-08-01'), 'Ym'], [DailyPageHelper::MONTH, '202008', null, new DateTime('2020-08-01'), 'Ym'],
[ [
DailyPageHelper::MONTH, DailyPageHelper::MONTH,
'', '',
(new Bookmark())->setCreated($date = new \DateTime('2020-10-13 12:05:31')), (new Bookmark())->setCreated($date = new DateTime('2020-10-13 12:05:31')),
new \DateTime('2020-10-13'), new DateTime('2020-10-13'),
'Ym' 'Ym'
], ],
[DailyPageHelper::MONTH, '', null, new \DateTime(), 'Ym'], [DailyPageHelper::MONTH, '', null, new DateTime(), 'Ym'],
]; ];
} }
@ -254,9 +256,9 @@ public function getFormatsByType(): array
public function getStartDatesByType(): array public function getStartDatesByType(): array
{ {
return [ return [
[DailyPageHelper::DAY, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-09 00:00:00')], [DailyPageHelper::DAY, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-09 00:00:00')],
[DailyPageHelper::WEEK, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-05 00:00:00')], [DailyPageHelper::WEEK, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-05 00:00:00')],
[DailyPageHelper::MONTH, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-01 00:00:00')], [DailyPageHelper::MONTH, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-01 00:00:00')],
]; ];
} }
@ -266,9 +268,9 @@ public function getStartDatesByType(): array
public function getEndDatesByType(): array public function getEndDatesByType(): array
{ {
return [ return [
[DailyPageHelper::DAY, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-09 23:59:59')], [DailyPageHelper::DAY, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-09 23:59:59')],
[DailyPageHelper::WEEK, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-11 23:59:59')], [DailyPageHelper::WEEK, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-11 23:59:59')],
[DailyPageHelper::MONTH, new DateTimeImmutable('2020-10-09 04:05:06'), new \DateTime('2020-10-31 23:59:59')], [DailyPageHelper::MONTH, new DateTimeImmutable('2020-10-09 04:05:06'), new DateTime('2020-10-31 23:59:59')],
]; ];
} }
@ -321,20 +323,20 @@ public function getCacheDatePeriodByType(): array
[ [
DailyPageHelper::DAY, DailyPageHelper::DAY,
new DateTimeImmutable('2020-10-09 04:05:06'), new DateTimeImmutable('2020-10-09 04:05:06'),
new \DateTime('2020-10-09 00:00:00'), new DateTime('2020-10-09 00:00:00'),
new \DateTime('2020-10-09 23:59:59'), new DateTime('2020-10-09 23:59:59'),
], ],
[ [
DailyPageHelper::WEEK, DailyPageHelper::WEEK,
new DateTimeImmutable('2020-10-09 04:05:06'), new DateTimeImmutable('2020-10-09 04:05:06'),
new \DateTime('2020-10-05 00:00:00'), new DateTime('2020-10-05 00:00:00'),
new \DateTime('2020-10-11 23:59:59'), new DateTime('2020-10-11 23:59:59'),
], ],
[ [
DailyPageHelper::MONTH, DailyPageHelper::MONTH,
new DateTimeImmutable('2020-10-09 04:05:06'), new DateTimeImmutable('2020-10-09 04:05:06'),
new \DateTime('2020-10-01 00:00:00'), new DateTime('2020-10-01 00:00:00'),
new \DateTime('2020-10-31 23:59:59'), new DateTime('2020-10-31 23:59:59'),
], ],
]; ];
} }

View file

@ -1,12 +1,11 @@
<?php <?php
/** /**
* HttpUtils' tests * HttpUtils' tests
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for client_ip_id() * Unitary tests for client_ip_id()
*/ */

View file

@ -1,12 +1,11 @@
<?php <?php
/** /**
* HttpUtils' tests * HttpUtils' tests
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for get_http_response() * Unitary tests for get_http_response()
*/ */

View file

@ -2,8 +2,6 @@
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for getIpAddressFromProxy() * Unitary tests for getIpAddressFromProxy()
*/ */
@ -15,7 +13,7 @@ class GetIpAdressFromProxyTest extends \Shaarli\TestCase
*/ */
public function testWithoutProxy() public function testWithoutProxy()
{ {
$this->assertFalse(getIpAddressFromProxy(array(), array())); $this->assertFalse(getIpAddressFromProxy([], []));
} }
/** /**
@ -24,8 +22,8 @@ public function testWithoutProxy()
public function testWithOneForwardedIp() public function testWithOneForwardedIp()
{ {
$ip = '1.1.1.1'; $ip = '1.1.1.1';
$server = array('HTTP_X_FORWARDED_FOR' => $ip); $server = ['HTTP_X_FORWARDED_FOR' => $ip];
$this->assertEquals($ip, getIpAddressFromProxy($server, array())); $this->assertEquals($ip, getIpAddressFromProxy($server, []));
} }
/** /**
@ -36,11 +34,11 @@ public function testWithMultipleForwardedIp()
$ip = '1.1.1.1'; $ip = '1.1.1.1';
$ip2 = '2.2.2.2'; $ip2 = '2.2.2.2';
$server = array('HTTP_X_FORWARDED_FOR' => $ip .','. $ip2); $server = ['HTTP_X_FORWARDED_FOR' => $ip . ',' . $ip2];
$this->assertEquals($ip2, getIpAddressFromProxy($server, array())); $this->assertEquals($ip2, getIpAddressFromProxy($server, []));
$server = array('HTTP_X_FORWARDED_FOR' => $ip .' , '. $ip2); $server = ['HTTP_X_FORWARDED_FOR' => $ip . ' , ' . $ip2];
$this->assertEquals($ip2, getIpAddressFromProxy($server, array())); $this->assertEquals($ip2, getIpAddressFromProxy($server, []));
} }
/** /**
@ -51,11 +49,11 @@ public function testWithTrustedIp()
$ip = '1.1.1.1'; $ip = '1.1.1.1';
$ip2 = '2.2.2.2'; $ip2 = '2.2.2.2';
$server = array('HTTP_X_FORWARDED_FOR' => $ip); $server = ['HTTP_X_FORWARDED_FOR' => $ip];
$this->assertFalse(getIpAddressFromProxy($server, array($ip))); $this->assertFalse(getIpAddressFromProxy($server, [$ip]));
$server = array('HTTP_X_FORWARDED_FOR' => $ip .','. $ip2); $server = ['HTTP_X_FORWARDED_FOR' => $ip . ',' . $ip2];
$this->assertEquals($ip2, getIpAddressFromProxy($server, array($ip))); $this->assertEquals($ip2, getIpAddressFromProxy($server, [$ip]));
$this->assertFalse(getIpAddressFromProxy($server, array($ip, $ip2))); $this->assertFalse(getIpAddressFromProxy($server, [$ip, $ip2]));
} }
} }

View file

@ -1,4 +1,5 @@
<?php <?php
/** /**
* HttpUtils' tests * HttpUtils' tests
*/ */
@ -7,8 +8,6 @@
use Shaarli\TestCase; use Shaarli\TestCase;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for index_url() * Unitary tests for index_url()
*/ */
@ -22,24 +21,24 @@ public function testRemoveIndex()
$this->assertEquals( $this->assertEquals(
'http://host.tld/', 'http://host.tld/',
index_url( index_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/index.php' 'SCRIPT_NAME' => '/index.php'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/admin/', 'http://host.tld/admin/',
index_url( index_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/index.php' 'SCRIPT_NAME' => '/admin/index.php'
) ]
) )
); );
} }
@ -52,24 +51,24 @@ public function testOtherResource()
$this->assertEquals( $this->assertEquals(
'http://host.tld/page.php', 'http://host.tld/page.php',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/page.php' 'SCRIPT_NAME' => '/page.php'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/admin/page.php', 'http://host.tld/admin/page.php',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/page.php' 'SCRIPT_NAME' => '/admin/page.php'
) ]
) )
); );
} }
@ -82,26 +81,26 @@ public function testPageUrlWithRoute()
$this->assertEquals( $this->assertEquals(
'http://host.tld/picture-wall', 'http://host.tld/picture-wall',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/index.php', 'SCRIPT_NAME' => '/index.php',
'REQUEST_URI' => '/picture-wall', 'REQUEST_URI' => '/picture-wall',
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/admin/picture-wall', 'http://host.tld/admin/picture-wall',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/index.php', 'SCRIPT_NAME' => '/admin/index.php',
'REQUEST_URI' => '/admin/picture-wall', 'REQUEST_URI' => '/admin/picture-wall',
) ]
) )
); );
} }
@ -114,26 +113,26 @@ public function testPageUrlWithRouteUnderSubfolder()
$this->assertEquals( $this->assertEquals(
'http://host.tld/subfolder/picture-wall', 'http://host.tld/subfolder/picture-wall',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/subfolder/index.php', 'SCRIPT_NAME' => '/subfolder/index.php',
'REQUEST_URI' => '/subfolder/picture-wall', 'REQUEST_URI' => '/subfolder/picture-wall',
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/subfolder/admin/picture-wall', 'http://host.tld/subfolder/admin/picture-wall',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/subfolder/admin/index.php', 'SCRIPT_NAME' => '/subfolder/admin/index.php',
'REQUEST_URI' => '/subfolder/admin/picture-wall', 'REQUEST_URI' => '/subfolder/admin/picture-wall',
) ]
) )
); );
} }

View file

@ -25,26 +25,26 @@ public function testIndexUrlWithConstantDefined()
$this->assertEquals( $this->assertEquals(
'http://other-host.tld/subfolder/', 'http://other-host.tld/subfolder/',
index_url( index_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/index.php', 'SCRIPT_NAME' => '/index.php',
'REQUEST_URI' => '/picture-wall', 'REQUEST_URI' => '/picture-wall',
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://other-host.tld/subfolder/', 'http://other-host.tld/subfolder/',
index_url( index_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/index.php', 'SCRIPT_NAME' => '/admin/index.php',
'REQUEST_URI' => '/admin/picture-wall', 'REQUEST_URI' => '/admin/picture-wall',
) ]
) )
); );
} }

View file

@ -2,8 +2,6 @@
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Class IsHttpsTest * Class IsHttpsTest
* *

View file

@ -1,12 +1,11 @@
<?php <?php
/** /**
* HttpUtils' tests * HttpUtils' tests
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for page_url() * Unitary tests for page_url()
*/ */
@ -20,26 +19,26 @@ public function testRemoveIndex()
$this->assertEquals( $this->assertEquals(
'http://host.tld/?p1=v1&p2=v2', 'http://host.tld/?p1=v1&p2=v2',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/index.php', 'SCRIPT_NAME' => '/index.php',
'QUERY_STRING' => 'p1=v1&p2=v2' 'QUERY_STRING' => 'p1=v1&p2=v2'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/admin/?action=edit_tag', 'http://host.tld/admin/?action=edit_tag',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/index.php', 'SCRIPT_NAME' => '/admin/index.php',
'QUERY_STRING' => 'action=edit_tag' 'QUERY_STRING' => 'action=edit_tag'
) ]
) )
); );
} }
@ -52,26 +51,26 @@ public function testOtherResource()
$this->assertEquals( $this->assertEquals(
'http://host.tld/page.php?p1=v1&p2=v2', 'http://host.tld/page.php?p1=v1&p2=v2',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/page.php', 'SCRIPT_NAME' => '/page.php',
'QUERY_STRING' => 'p1=v1&p2=v2' 'QUERY_STRING' => 'p1=v1&p2=v2'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'http://host.tld/admin/page.php?action=edit_tag', 'http://host.tld/admin/page.php?action=edit_tag',
page_url( page_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'SCRIPT_NAME' => '/admin/page.php', 'SCRIPT_NAME' => '/admin/page.php',
'QUERY_STRING' => 'action=edit_tag' 'QUERY_STRING' => 'action=edit_tag'
) ]
) )
); );
} }

View file

@ -1,12 +1,11 @@
<?php <?php
/** /**
* HttpUtils' tests * HttpUtils' tests
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/HttpUtils.php';
/** /**
* Unitary tests for server_url() * Unitary tests for server_url()
*/ */
@ -20,22 +19,22 @@ public function testHttpsScheme()
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'ON', 'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '443' 'SERVER_PORT' => '443'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld:8080', 'https://host.tld:8080',
server_url( server_url(
array( [
'HTTPS' => 'ON', 'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080' 'SERVER_PORT' => '8080'
) ]
) )
); );
} }
@ -48,22 +47,22 @@ public function testHttpsProxyForwardedHost()
$this->assertEquals( $this->assertEquals(
'https://host.tld:8080', 'https://host.tld:8080',
server_url( server_url(
array( [
'HTTP_X_FORWARDED_PROTO' => 'https', 'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '8080', 'HTTP_X_FORWARDED_PORT' => '8080',
'HTTP_X_FORWARDED_HOST' => 'host.tld' 'HTTP_X_FORWARDED_HOST' => 'host.tld'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld:4974', 'https://host.tld:4974',
server_url( server_url(
array( [
'HTTP_X_FORWARDED_PROTO' => 'https, https', 'HTTP_X_FORWARDED_PROTO' => 'https, https',
'HTTP_X_FORWARDED_PORT' => '4974, 80', 'HTTP_X_FORWARDED_PORT' => '4974, 80',
'HTTP_X_FORWARDED_HOST' => 'host.tld, example.com' 'HTTP_X_FORWARDED_HOST' => 'host.tld, example.com'
) ]
) )
); );
} }
@ -76,51 +75,51 @@ public function testHttpsProxyForward()
$this->assertEquals( $this->assertEquals(
'https://host.tld:8080', 'https://host.tld:8080',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https', 'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '8080' 'HTTP_X_FORWARDED_PORT' => '8080'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https' 'HTTP_X_FORWARDED_PROTO' => 'https'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https', 'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '443' 'HTTP_X_FORWARDED_PORT' => '443'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld:4974', 'https://host.tld:4974',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https, https', 'HTTP_X_FORWARDED_PROTO' => 'https, https',
'HTTP_X_FORWARDED_PORT' => '4974, 80' 'HTTP_X_FORWARDED_PORT' => '4974, 80'
) ]
) )
); );
} }
@ -134,11 +133,11 @@ public function testPort()
$this->assertEquals( $this->assertEquals(
'http://host.tld:8080', 'http://host.tld:8080',
server_url( server_url(
array( [
'HTTPS' => 'OFF', 'HTTPS' => 'OFF',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080' 'SERVER_PORT' => '8080'
) ]
) )
); );
@ -146,11 +145,11 @@ public function testPort()
$this->assertEquals( $this->assertEquals(
'https://host.tld:8080', 'https://host.tld:8080',
server_url( server_url(
array( [
'HTTPS' => 'ON', 'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080' 'SERVER_PORT' => '8080'
) ]
) )
); );
} }
@ -163,11 +162,11 @@ public function testStandardHttpPort()
$this->assertEquals( $this->assertEquals(
'http://host.tld', 'http://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'OFF', 'HTTPS' => 'OFF',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80' 'SERVER_PORT' => '80'
) ]
) )
); );
} }
@ -180,11 +179,11 @@ public function testStandardHttpsPort()
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'ON', 'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '443' 'SERVER_PORT' => '443'
) ]
) )
); );
} }
@ -197,26 +196,26 @@ public function testHttpWithPort433()
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'http', 'HTTP_X_FORWARDED_PROTO' => 'http',
'HTTP_X_FORWARDED_PORT' => '443' 'HTTP_X_FORWARDED_PORT' => '443'
) ]
) )
); );
$this->assertEquals( $this->assertEquals(
'https://host.tld', 'https://host.tld',
server_url( server_url(
array( [
'HTTPS' => 'Off', 'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld', 'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80', 'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https, http', 'HTTP_X_FORWARDED_PROTO' => 'https, http',
'HTTP_X_FORWARDED_PORT' => '443, 80' 'HTTP_X_FORWARDED_PORT' => '443, 80'
) ]
) )
); );
} }

View file

@ -66,7 +66,12 @@ function (&$charset) use (
->expects(static::once()) ->expects(static::once())
->method('getCurlDownloadCallback') ->method('getCurlDownloadCallback')
->willReturnCallback( ->willReturnCallback(
function (&$charset, &$title, &$description, &$tags) use ( function (
&$charset,
&$title,
&$description,
&$tags
) use (
$remoteCharset, $remoteCharset,
$remoteTitle, $remoteTitle,
$remoteDesc, $remoteDesc,
@ -95,7 +100,7 @@ function (&$charset, &$title, &$description, &$tags) use (
->expects(static::once()) ->expects(static::once())
->method('getHttpResponse') ->method('getHttpResponse')
->with($url, 30, 4194304) ->with($url, 30, 4194304)
->willReturnCallback(function($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void { ->willReturnCallback(function ($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void {
$headerCallback(); $headerCallback();
$dlCallback(); $dlCallback();
}) })
@ -124,7 +129,8 @@ public function testEmptyRetrieval(): void
->method('getCurlDownloadCallback') ->method('getCurlDownloadCallback')
->willReturnCallback( ->willReturnCallback(
function (): callable { function (): callable {
return function (): void {}; return function (): void {
};
} }
) )
; ;
@ -133,7 +139,8 @@ function (): callable {
->method('getCurlHeaderCallback') ->method('getCurlHeaderCallback')
->willReturnCallback( ->willReturnCallback(
function (): callable { function (): callable {
return function (): void {}; return function (): void {
};
} }
) )
; ;
@ -141,7 +148,7 @@ function (): callable {
->expects(static::once()) ->expects(static::once())
->method('getHttpResponse') ->method('getHttpResponse')
->with($url, 30, 4194304) ->with($url, 30, 4194304)
->willReturnCallback(function($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void { ->willReturnCallback(function ($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void {
$headerCallback(); $headerCallback();
$dlCallback(); $dlCallback();
}) })

View file

@ -1,4 +1,5 @@
<?php <?php
/** /**
* UrlUtils's tests * UrlUtils's tests
*/ */

View file

@ -1,12 +1,11 @@
<?php <?php
/** /**
* Unitary tests for cleanup_url() * Unitary tests for cleanup_url()
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/UrlUtils.php';
class CleanupUrlTest extends \Shaarli\TestCase class CleanupUrlTest extends \Shaarli\TestCase
{ {
/** /**
@ -29,7 +28,7 @@ public function testCleanupUrlEmpty()
public function testCleanupUrlAlreadyClean() public function testCleanupUrlAlreadyClean()
{ {
$this->assertEquals($this->ref, cleanup_url($this->ref)); $this->assertEquals($this->ref, cleanup_url($this->ref));
$this->ref2 = $this->ref.'/path/to/dir/'; $this->ref2 = $this->ref . '/path/to/dir/';
$this->assertEquals($this->ref2, cleanup_url($this->ref2)); $this->assertEquals($this->ref2, cleanup_url($this->ref2));
} }
@ -38,9 +37,9 @@ public function testCleanupUrlAlreadyClean()
*/ */
public function testCleanupUrlFragment() public function testCleanupUrlFragment()
{ {
$this->assertEquals($this->ref, cleanup_url($this->ref.'#tk.rss_all')); $this->assertEquals($this->ref, cleanup_url($this->ref . '#tk.rss_all'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'#xtor=RSS-')); $this->assertEquals($this->ref, cleanup_url($this->ref . '#xtor=RSS-'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'#xtor=RSS-U3ht0tkc4b')); $this->assertEquals($this->ref, cleanup_url($this->ref . '#xtor=RSS-U3ht0tkc4b'));
} }
/** /**
@ -48,23 +47,23 @@ public function testCleanupUrlFragment()
*/ */
public function testCleanupUrlQuerySingle() public function testCleanupUrlQuerySingle()
{ {
$this->assertEquals($this->ref, cleanup_url($this->ref.'?action_object_map=junk')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?action_object_map=junk'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?action_ref_map=Cr4p!')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?action_ref_map=Cr4p!'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?action_type_map=g4R84g3')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?action_type_map=g4R84g3'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?fb_stuff=v41u3')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?fb_stuff=v41u3'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?fb=71m3w4573')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?fb=71m3w4573'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_campaign=zomg')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?utm_campaign=zomg'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_medium=numnum')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?utm_medium=numnum'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_source=c0d3')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?utm_source=c0d3'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?utm_term=1n4l')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?utm_term=1n4l'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?xtor=some-url')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?xtor=some-url'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_name=junk')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?campaign_name=junk'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_start=junk')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?campaign_start=junk'));
$this->assertEquals($this->ref, cleanup_url($this->ref.'?campaign_item_index=junk')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?campaign_item_index=junk'));
} }
/** /**
@ -72,14 +71,14 @@ public function testCleanupUrlQuerySingle()
*/ */
public function testCleanupUrlQueryMultiple() public function testCleanupUrlQueryMultiple()
{ {
$this->assertEquals($this->ref, cleanup_url($this->ref.'?xtor=some-url&fb=som3th1ng')); $this->assertEquals($this->ref, cleanup_url($this->ref . '?xtor=some-url&fb=som3th1ng'));
$this->assertEquals($this->ref, cleanup_url( $this->assertEquals($this->ref, cleanup_url(
$this->ref.'?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3' $this->ref . '?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3'
)); ));
$this->assertEquals($this->ref, cleanup_url( $this->assertEquals($this->ref, cleanup_url(
$this->ref.'?campaign_start=zomg&campaign_name=numnum' $this->ref . '?campaign_start=zomg&campaign_name=numnum'
)); ));
} }
@ -89,22 +88,22 @@ public function testCleanupUrlQueryMultiple()
public function testCleanupUrlQueryFragment() public function testCleanupUrlQueryFragment()
{ {
$this->assertEquals($this->ref, cleanup_url( $this->assertEquals($this->ref, cleanup_url(
$this->ref.'?xtor=some-url&fb=som3th1ng#tk.rss_all' $this->ref . '?xtor=some-url&fb=som3th1ng#tk.rss_all'
)); ));
// ditch annoying query params and fragment, keep useful params // ditch annoying query params and fragment, keep useful params
$this->assertEquals( $this->assertEquals(
$this->ref.'?my=stuff&is=kept', $this->ref . '?my=stuff&is=kept',
cleanup_url( cleanup_url(
$this->ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all' $this->ref . '?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
) )
); );
// ditch annoying query params, keep useful params and fragment // ditch annoying query params, keep useful params and fragment
$this->assertEquals( $this->assertEquals(
$this->ref.'?my=stuff&is=kept#again', $this->ref . '?my=stuff&is=kept#again',
cleanup_url( cleanup_url(
$this->ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again' $this->ref . '?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
) )
); );
} }

View file

@ -1,13 +1,14 @@
<?php <?php
/** /**
* Unitary tests for get_url_scheme() * Unitary tests for get_url_scheme()
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/UrlUtils.php'; use Shaarli\TestCase;
class GetUrlSchemeTest extends \Shaarli\TestCase class GetUrlSchemeTest extends TestCase
{ {
/** /**
* Get empty scheme string for empty UrlUtils * Get empty scheme string for empty UrlUtils

View file

@ -1,23 +1,24 @@
<?php <?php
/** /**
* Unpares UrlUtils's tests * Unpares UrlUtils's tests
*/ */
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/UrlUtils.php'; use Shaarli\TestCase;
/** /**
* Unitary tests for unparse_url() * Unitary tests for unparse_url()
*/ */
class UnparseUrlTest extends \Shaarli\TestCase class UnparseUrlTest extends TestCase
{ {
/** /**
* Thanks for building nothing * Thanks for building nothing
*/ */
public function testUnparseEmptyArray() public function testUnparseEmptyArray()
{ {
$this->assertEquals('', unparse_url(array())); $this->assertEquals('', unparse_url([]));
} }
/** /**
@ -26,7 +27,7 @@ public function testUnparseEmptyArray()
public function testUnparseFull() public function testUnparseFull()
{ {
$ref = 'http://username:password@hostname:9090/path' $ref = 'http://username:password@hostname:9090/path'
.'?arg1=value1&arg2=value2#anchor'; . '?arg1=value1&arg2=value2#anchor';
$this->assertEquals($ref, unparse_url(parse_url($ref))); $this->assertEquals($ref, unparse_url(parse_url($ref)));
} }
} }

View file

@ -2,14 +2,14 @@
namespace Shaarli\Http; namespace Shaarli\Http;
require_once 'application/http/UrlUtils.php'; use Shaarli\TestCase;
/** /**
* Class WhitelistProtocolsTest * Class WhitelistProtocolsTest
* *
* Test whitelist_protocols() function of UrlUtils. * Test whitelist_protocols() function of UrlUtils.
*/ */
class WhitelistProtocolsTest extends \Shaarli\TestCase class WhitelistProtocolsTest extends TestCase
{ {
/** /**
* Test whitelist_protocols() on a note (relative URL). * Test whitelist_protocols() on a note (relative URL).
@ -30,7 +30,7 @@ public function testWhitelistProtocolMissing()
{ {
$whitelist = ['ftp', 'magnet']; $whitelist = ['ftp', 'magnet'];
$url = 'test.tld/path/?query=value#hash'; $url = 'test.tld/path/?query=value#hash';
$this->assertEquals('http://'. $url, whitelist_protocols($url, $whitelist)); $this->assertEquals('http://' . $url, whitelist_protocols($url, $whitelist));
} }
/** /**

View file

@ -1,4 +1,5 @@
<?php <?php
require_once 'tests/bootstrap.php'; require_once 'tests/bootstrap.php';
if (! empty(getenv('UT_LOCALE'))) { if (! empty(getenv('UT_LOCALE'))) {

View file

@ -1,7 +1,8 @@
<?php <?php
require_once 'tests/UtilsTest.php'; namespace Shaarli\Tests;
use DateTime;
class UtilsDeTest extends UtilsTest class UtilsDeTest extends UtilsTest
{ {

View file

@ -1,7 +1,8 @@
<?php <?php
require_once 'tests/UtilsTest.php'; namespace Shaarli\Tests;
use DateTime;
class UtilsEnTest extends UtilsTest class UtilsEnTest extends UtilsTest
{ {

View file

@ -1,9 +1,10 @@
<?php <?php
namespace Shaarli\Tests;
namespace Shaarli;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\Languages;
use Shaarli\TestCase;
/** /**
* Class LanguagesFrTest * Class LanguagesFrTest
@ -12,7 +13,7 @@
* *
* @package Shaarli * @package Shaarli
*/ */
class LanguagesFrTest extends \Shaarli\TestCase class LanguagesFrTest extends TestCase
{ {
/** /**
* @var string Config file path (without extension). * @var string Config file path (without extension).

View file

@ -1,7 +1,8 @@
<?php <?php
require_once 'tests/UtilsTest.php'; namespace Shaarli\Tests;
use DateTime;
class UtilsFrTest extends UtilsTest class UtilsFrTest extends UtilsTest
{ {

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Updater; namespace Shaarli\Updater;
use Exception; use Exception;

View file

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Link datastore tests * Link datastore tests
*/ */
@ -6,14 +7,10 @@
namespace Shaarli\Legacy; namespace Shaarli\Legacy;
use DateTime; use DateTime;
use ReferenceLinkDB;
use ReflectionClass; use ReflectionClass;
use Shaarli; use Shaarli;
use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\Bookmark;
use Shaarli\Tests\Utils\ReferenceLinkDB;
require_once 'application/Utils.php';
require_once 'tests/utils/ReferenceLinkDB.php';
/** /**
* Unitary tests for LegacyLinkDBTest * Unitary tests for LegacyLinkDBTest
@ -118,7 +115,7 @@ public function testCheckDBNew()
$this->assertFileNotExists(self::$testDatastore); $this->assertFileNotExists(self::$testDatastore);
$checkDB = self::getMethod('check'); $checkDB = self::getMethod('check');
$checkDB->invokeArgs($linkDB, array()); $checkDB->invokeArgs($linkDB, []);
$this->assertFileExists(self::$testDatastore); $this->assertFileExists(self::$testDatastore);
// ensure the correct data has been written // ensure the correct data has been written
@ -135,7 +132,7 @@ public function testCheckDBLoad()
$this->assertGreaterThan(0, $datastoreSize); $this->assertGreaterThan(0, $datastoreSize);
$checkDB = self::getMethod('check'); $checkDB = self::getMethod('check');
$checkDB->invokeArgs($linkDB, array()); $checkDB->invokeArgs($linkDB, []);
// ensure the datastore is left unmodified // ensure the datastore is left unmodified
$this->assertEquals( $this->assertEquals(
@ -185,7 +182,7 @@ public function testSave()
$testDB = new LegacyLinkDB(self::$testDatastore, true, false); $testDB = new LegacyLinkDB(self::$testDatastore, true, false);
$dbSize = sizeof($testDB); $dbSize = sizeof($testDB);
$link = array( $link = [
'id' => 43, 'id' => 43,
'title' => 'an additional link', 'title' => 'an additional link',
'url' => 'http://dum.my', 'url' => 'http://dum.my',
@ -193,7 +190,7 @@ public function testSave()
'private' => 0, 'private' => 0,
'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150518_190000'), 'created' => DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150518_190000'),
'tags' => 'unit test' 'tags' => 'unit test'
); ];
$testDB[$link['id']] = $link; $testDB[$link['id']] = $link;
$testDB->save('tests'); $testDB->save('tests');
@ -239,12 +236,12 @@ public function testCountHiddenPublic()
public function testDays() public function testDays()
{ {
$this->assertEquals( $this->assertEquals(
array('20100309', '20100310', '20121206', '20121207', '20130614', '20150310'), ['20100309', '20100310', '20121206', '20121207', '20130614', '20150310'],
self::$publicLinkDB->days() self::$publicLinkDB->days()
); );
$this->assertEquals( $this->assertEquals(
array('20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'), ['20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'],
self::$privateLinkDB->days() self::$privateLinkDB->days()
); );
} }
@ -280,7 +277,7 @@ public function testGetUnknownLinkFromURL()
public function testAllTags() public function testAllTags()
{ {
$this->assertEquals( $this->assertEquals(
array( [
'web' => 3, 'web' => 3,
'cartoon' => 2, 'cartoon' => 2,
'gnu' => 2, 'gnu' => 2,
@ -300,12 +297,12 @@ public function testAllTags()
'coding-style' => 1, 'coding-style' => 1,
'quality' => 1, 'quality' => 1,
'standards' => 1, 'standards' => 1,
), ],
self::$publicLinkDB->linksCountPerTag() self::$publicLinkDB->linksCountPerTag()
); );
$this->assertEquals( $this->assertEquals(
array( [
'web' => 4, 'web' => 4,
'cartoon' => 3, 'cartoon' => 3,
'gnu' => 2, 'gnu' => 2,
@ -332,11 +329,11 @@ public function testAllTags()
'coding-style' => 1, 'coding-style' => 1,
'quality' => 1, 'quality' => 1,
'standards' => 1, 'standards' => 1,
), ],
self::$privateLinkDB->linksCountPerTag() self::$privateLinkDB->linksCountPerTag()
); );
$this->assertEquals( $this->assertEquals(
array( [
'web' => 4, 'web' => 4,
'cartoon' => 2, 'cartoon' => 2,
'gnu' => 1, 'gnu' => 1,
@ -349,17 +346,17 @@ public function testAllTags()
'Mercurial' => 1, 'Mercurial' => 1,
'.hidden' => 1, '.hidden' => 1,
'hashtag' => 1, 'hashtag' => 1,
), ],
self::$privateLinkDB->linksCountPerTag(['web']) self::$privateLinkDB->linksCountPerTag(['web'])
); );
$this->assertEquals( $this->assertEquals(
array( [
'web' => 1, 'web' => 1,
'html' => 1, 'html' => 1,
'w3c' => 1, 'w3c' => 1,
'css' => 1, 'css' => 1,
'Mercurial' => 1, 'Mercurial' => 1,
), ],
self::$privateLinkDB->linksCountPerTag(['web'], 'private') self::$privateLinkDB->linksCountPerTag(['web'], 'private')
); );
} }
@ -370,7 +367,7 @@ public function testAllTags()
public function testFilterString() public function testFilterString()
{ {
$tags = 'dev cartoon'; $tags = 'dev cartoon';
$request = array('searchtags' => $tags); $request = ['searchtags' => $tags];
$this->assertEquals( $this->assertEquals(
2, 2,
count(self::$privateLinkDB->filterSearch($request, true, false)) count(self::$privateLinkDB->filterSearch($request, true, false))
@ -382,8 +379,8 @@ public function testFilterString()
*/ */
public function testFilterArray() public function testFilterArray()
{ {
$tags = array('dev', 'cartoon'); $tags = ['dev', 'cartoon'];
$request = array('searchtags' => $tags); $request = ['searchtags' => $tags];
$this->assertEquals( $this->assertEquals(
2, 2,
count(self::$privateLinkDB->filterSearch($request, true, false)) count(self::$privateLinkDB->filterSearch($request, true, false))
@ -397,7 +394,7 @@ public function testFilterArray()
public function testHiddenTags() public function testHiddenTags()
{ {
$tags = '.hidden'; $tags = '.hidden';
$request = array('searchtags' => $tags); $request = ['searchtags' => $tags];
$this->assertEquals( $this->assertEquals(
1, 1,
count(self::$privateLinkDB->filterSearch($request, true, false)) count(self::$privateLinkDB->filterSearch($request, true, false))
@ -639,7 +636,7 @@ public function testConsistentOrder()
for ($i = 0; $i < 4; ++$i) { for ($i = 0; $i < 4; ++$i) {
$linkDB[$nextId + $i] = [ $linkDB[$nextId + $i] = [
'id' => $nextId + $i, 'id' => $nextId + $i,
'url' => 'http://'. $i, 'url' => 'http://' . $i,
'created' => $creation, 'created' => $creation,
'title' => true, 'title' => true,
'description' => true, 'description' => true,
@ -657,7 +654,7 @@ public function testConsistentOrder()
continue; continue;
} }
$this->assertEquals($nextId + $count, $link['id']); $this->assertEquals($nextId + $count, $link['id']);
$this->assertEquals('http://'. $count, $link['url']); $this->assertEquals('http://' . $count, $link['url']);
if (--$count < 0) { if (--$count < 0) {
break; break;
} }

View file

@ -2,10 +2,9 @@
namespace Shaarli\Bookmark; namespace Shaarli\Bookmark;
use Exception;
use ReferenceLinkDB;
use Shaarli\Legacy\LegacyLinkDB; use Shaarli\Legacy\LegacyLinkDB;
use Shaarli\Legacy\LegacyLinkFilter; use Shaarli\Legacy\LegacyLinkFilter;
use Shaarli\Tests\Utils\ReferenceLinkDB;
/** /**
* Class LegacyLinkFilterTest. * Class LegacyLinkFilterTest.
@ -450,28 +449,28 @@ public function testFilterCrossedSearch()
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT, LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array($tags, $terms) [$tags, $terms]
)) ))
); );
$this->assertEquals( $this->assertEquals(
2, 2,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT, LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array('', $terms) ['', $terms]
)) ))
); );
$this->assertEquals( $this->assertEquals(
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT, LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array(false, 'PSR-2') [false, 'PSR-2']
)) ))
); );
$this->assertEquals( $this->assertEquals(
1, 1,
count(self::$linkFilter->filter( count(self::$linkFilter->filter(
LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT, LegacyLinkFilter::$FILTER_TAG | LegacyLinkFilter::$FILTER_TEXT,
array($tags, '') [$tags, '']
)) ))
); );
$this->assertEquals( $this->assertEquals(

View file

@ -1,4 +1,5 @@
<?php <?php
namespace Shaarli\Updater; namespace Shaarli\Updater;
use DateTime; use DateTime;
@ -9,18 +10,16 @@
use Shaarli\Config\ConfigPhp; use Shaarli\Config\ConfigPhp;
use Shaarli\Legacy\LegacyLinkDB; use Shaarli\Legacy\LegacyLinkDB;
use Shaarli\Legacy\LegacyUpdater; use Shaarli\Legacy\LegacyUpdater;
use Shaarli\TestCase;
use Shaarli\Tests\updater\DummyUpdater;
use Shaarli\Tests\Utils\ReferenceLinkDB;
use Shaarli\Thumbnailer; use Shaarli\Thumbnailer;
require_once 'application/updater/UpdaterUtils.php';
require_once 'tests/updater/DummyUpdater.php';
require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'inc/rain.tpl.class.php';
/** /**
* Class UpdaterTest. * Class UpdaterTest.
* Runs unit tests against the updater class. * Runs unit tests against the updater class.
*/ */
class LegacyUpdaterTest extends \Shaarli\TestCase class LegacyUpdaterTest extends TestCase
{ {
/** /**
* @var string Path to test datastore. * @var string Path to test datastore.
@ -42,7 +41,7 @@ class LegacyUpdaterTest extends \Shaarli\TestCase
*/ */
protected function setUp(): void protected function setUp(): void
{ {
copy('tests/utils/config/configJson.json.php', self::$configFile .'.json.php'); copy('tests/utils/config/configJson.json.php', self::$configFile . '.json.php');
$this->conf = new ConfigManager(self::$configFile); $this->conf = new ConfigManager(self::$configFile);
} }
@ -51,10 +50,10 @@ protected function setUp(): void
*/ */
public function testReadEmptyUpdatesFile() public function testReadEmptyUpdatesFile()
{ {
$this->assertEquals(array(), UpdaterUtils::readUpdatesFile('')); $this->assertEquals([], UpdaterUtils::readUpdatesFile(''));
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt'; $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
touch($updatesFile); touch($updatesFile);
$this->assertEquals(array(), UpdaterUtils::readUpdatesFile($updatesFile)); $this->assertEquals([], UpdaterUtils::readUpdatesFile($updatesFile));
unlink($updatesFile); unlink($updatesFile);
} }
@ -64,7 +63,7 @@ public function testReadEmptyUpdatesFile()
public function testReadWriteUpdatesFile() public function testReadWriteUpdatesFile()
{ {
$updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt'; $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
$updatesMethods = array('m1', 'm2', 'm3'); $updatesMethods = ['m1', 'm2', 'm3'];
UpdaterUtils::writeUpdatesFile($updatesFile, $updatesMethods); UpdaterUtils::writeUpdatesFile($updatesFile, $updatesMethods);
$readMethods = UpdaterUtils::readUpdatesFile($updatesFile); $readMethods = UpdaterUtils::readUpdatesFile($updatesFile);
@ -86,7 +85,7 @@ public function testWriteEmptyUpdatesFile()
$this->expectException(\Exception::class); $this->expectException(\Exception::class);
$this->expectExceptionMessageRegExp('/Updates file path is not set(.*)/'); $this->expectExceptionMessageRegExp('/Updates file path is not set(.*)/');
UpdaterUtils::writeUpdatesFile('', array('test')); UpdaterUtils::writeUpdatesFile('', ['test']);
} }
/** /**
@ -101,7 +100,7 @@ public function testWriteUpdatesFileNotWritable()
touch($updatesFile); touch($updatesFile);
chmod($updatesFile, 0444); chmod($updatesFile, 0444);
try { try {
@UpdaterUtils::writeUpdatesFile($updatesFile, array('test')); @UpdaterUtils::writeUpdatesFile($updatesFile, ['test']);
} catch (Exception $e) { } catch (Exception $e) {
unlink($updatesFile); unlink($updatesFile);
throw $e; throw $e;
@ -115,17 +114,17 @@ public function testWriteUpdatesFileNotWritable()
*/ */
public function testNoUpdates() public function testNoUpdates()
{ {
$updates = array( $updates = [
'updateMethodDummy1', 'updateMethodDummy1',
'updateMethodDummy2', 'updateMethodDummy2',
'updateMethodDummy3', 'updateMethodDummy3',
'updateMethodException', 'updateMethodException',
); ];
$updater = new DummyUpdater($updates, array(), $this->conf, true); $updater = new DummyUpdater($updates, [], $this->conf, true);
$this->assertEquals(array(), $updater->update()); $this->assertEquals([], $updater->update());
$updater = new DummyUpdater(array(), array(), $this->conf, false); $updater = new DummyUpdater([], [], $this->conf, false);
$this->assertEquals(array(), $updater->update()); $this->assertEquals([], $updater->update());
} }
/** /**
@ -133,13 +132,13 @@ public function testNoUpdates()
*/ */
public function testUpdatesFirstTime() public function testUpdatesFirstTime()
{ {
$updates = array('updateMethodException',); $updates = ['updateMethodException',];
$expectedUpdates = array( $expectedUpdates = [
'updateMethodDummy1', 'updateMethodDummy1',
'updateMethodDummy2', 'updateMethodDummy2',
'updateMethodDummy3', 'updateMethodDummy3',
); ];
$updater = new DummyUpdater($updates, array(), $this->conf, true); $updater = new DummyUpdater($updates, [], $this->conf, true);
$this->assertEquals($expectedUpdates, $updater->update()); $this->assertEquals($expectedUpdates, $updater->update());
} }
@ -148,14 +147,14 @@ public function testUpdatesFirstTime()
*/ */
public function testOneUpdate() public function testOneUpdate()
{ {
$updates = array( $updates = [
'updateMethodDummy1', 'updateMethodDummy1',
'updateMethodDummy3', 'updateMethodDummy3',
'updateMethodException', 'updateMethodException',
); ];
$expectedUpdate = array('updateMethodDummy2'); $expectedUpdate = ['updateMethodDummy2'];
$updater = new DummyUpdater($updates, array(), $this->conf, true); $updater = new DummyUpdater($updates, [], $this->conf, true);
$this->assertEquals($expectedUpdate, $updater->update()); $this->assertEquals($expectedUpdate, $updater->update());
} }
@ -166,13 +165,13 @@ public function testUpdateFailed()
{ {
$this->expectException(\Exception::class); $this->expectException(\Exception::class);
$updates = array( $updates = [
'updateMethodDummy1', 'updateMethodDummy1',
'updateMethodDummy2', 'updateMethodDummy2',
'updateMethodDummy3', 'updateMethodDummy3',
); ];
$updater = new DummyUpdater($updates, array(), $this->conf, true); $updater = new DummyUpdater($updates, [], $this->conf, true);
$updater->update(); $updater->update();
} }
@ -197,7 +196,7 @@ public function testUpdateMergeDeprecatedConfig()
$this->conf->setConfigFile('tests/updater/config'); $this->conf->setConfigFile('tests/updater/config');
// merge configs // merge configs
$updater = new LegacyUpdater(array(), array(), $this->conf, true); $updater = new LegacyUpdater([], [], $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(); $updater->updateMethodMergeDeprecatedConfigFile();
@ -214,7 +213,7 @@ public function testUpdateMergeDeprecatedConfig()
*/ */
public function testMergeDeprecatedConfigNoFile() public function testMergeDeprecatedConfigNoFile()
{ {
$updater = new LegacyUpdater(array(), array(), $this->conf, true); $updater = new LegacyUpdater([], [], $this->conf, true);
$updater->updateMethodMergeDeprecatedConfigFile(); $updater->updateMethodMergeDeprecatedConfigFile();
$this->assertEquals('root', $this->conf->get('credentials.login')); $this->assertEquals('root', $this->conf->get('credentials.login'));
@ -225,14 +224,14 @@ public function testMergeDeprecatedConfigNoFile()
*/ */
public function testRenameDashTags() public function testRenameDashTags()
{ {
$refDB = new \ReferenceLinkDB(true); $refDB = new ReferenceLinkDB(true);
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$this->assertEmpty($linkDB->filterSearch(array('searchtags' => 'exclude'))); $this->assertEmpty($linkDB->filterSearch(['searchtags' => 'exclude']));
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true); $updater = new LegacyUpdater([], $linkDB, $this->conf, true);
$updater->updateMethodRenameDashTags(); $updater->updateMethodRenameDashTags();
$this->assertNotEmpty($linkDB->filterSearch(array('searchtags' => 'exclude'))); $this->assertNotEmpty($linkDB->filterSearch(['searchtags' => 'exclude']));
} }
/** /**
@ -247,7 +246,7 @@ public function testConfigToJson()
// The ConfigIO is initialized with ConfigPhp. // The ConfigIO is initialized with ConfigPhp.
$this->assertTrue($this->conf->getConfigIO() instanceof ConfigPhp); $this->assertTrue($this->conf->getConfigIO() instanceof ConfigPhp);
$updater = new LegacyUpdater(array(), array(), $this->conf, false); $updater = new LegacyUpdater([], [], $this->conf, false);
$done = $updater->updateMethodConfigToJson(); $done = $updater->updateMethodConfigToJson();
$this->assertTrue($done); $this->assertTrue($done);
@ -272,7 +271,7 @@ public function testConfigToJson()
public function testConfigToJsonNothingToDo() public function testConfigToJsonNothingToDo()
{ {
$filetime = filemtime($this->conf->getConfigFileExt()); $filetime = filemtime($this->conf->getConfigFileExt());
$updater = new LegacyUpdater(array(), array(), $this->conf, false); $updater = new LegacyUpdater([], [], $this->conf, false);
$done = $updater->updateMethodConfigToJson(); $done = $updater->updateMethodConfigToJson();
$this->assertTrue($done); $this->assertTrue($done);
$expected = filemtime($this->conf->getConfigFileExt()); $expected = filemtime($this->conf->getConfigFileExt());
@ -291,7 +290,7 @@ public function testEscapeConfig()
$headerLink = '<script>alert("header_link");</script>'; $headerLink = '<script>alert("header_link");</script>';
$this->conf->set('general.title', $title); $this->conf->set('general.title', $title);
$this->conf->set('general.header_link', $headerLink); $this->conf->set('general.header_link', $headerLink);
$updater = new LegacyUpdater(array(), array(), $this->conf, true); $updater = new LegacyUpdater([], [], $this->conf, true);
$done = $updater->updateMethodEscapeUnescapedConfig(); $done = $updater->updateMethodEscapeUnescapedConfig();
$this->assertTrue($done); $this->assertTrue($done);
$this->conf->reload(); $this->conf->reload();
@ -306,9 +305,9 @@ public function testEscapeConfig()
public function testUpdateApiSettings() public function testUpdateApiSettings()
{ {
$confFile = 'sandbox/config'; $confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php'); copy(self::$configFile . '.json.php', $confFile . '.json.php');
$conf = new ConfigManager($confFile); $conf = new ConfigManager($confFile);
$updater = new LegacyUpdater(array(), array(), $conf, true); $updater = new LegacyUpdater([], [], $conf, true);
$this->assertFalse($conf->exists('api.enabled')); $this->assertFalse($conf->exists('api.enabled'));
$this->assertFalse($conf->exists('api.secret')); $this->assertFalse($conf->exists('api.secret'));
@ -316,7 +315,7 @@ public function testUpdateApiSettings()
$conf->reload(); $conf->reload();
$this->assertTrue($conf->get('api.enabled')); $this->assertTrue($conf->get('api.enabled'));
$this->assertTrue($conf->exists('api.secret')); $this->assertTrue($conf->exists('api.secret'));
unlink($confFile .'.json.php'); unlink($confFile . '.json.php');
} }
/** /**
@ -325,15 +324,15 @@ public function testUpdateApiSettings()
public function testUpdateApiSettingsNothingToDo() public function testUpdateApiSettingsNothingToDo()
{ {
$confFile = 'sandbox/config'; $confFile = 'sandbox/config';
copy(self::$configFile .'.json.php', $confFile .'.json.php'); copy(self::$configFile . '.json.php', $confFile . '.json.php');
$conf = new ConfigManager($confFile); $conf = new ConfigManager($confFile);
$conf->set('api.enabled', false); $conf->set('api.enabled', false);
$conf->set('api.secret', ''); $conf->set('api.secret', '');
$updater = new LegacyUpdater(array(), array(), $conf, true); $updater = new LegacyUpdater([], [], $conf, true);
$updater->updateMethodApiSettings(); $updater->updateMethodApiSettings();
$this->assertFalse($conf->get('api.enabled')); $this->assertFalse($conf->get('api.enabled'));
$this->assertEmpty($conf->get('api.secret')); $this->assertEmpty($conf->get('api.secret'));
unlink($confFile .'.json.php'); unlink($confFile . '.json.php');
} }
/** /**
@ -341,8 +340,8 @@ public function testUpdateApiSettingsNothingToDo()
*/ */
public function testDatastoreIds() public function testDatastoreIds()
{ {
$links = array( $links = [
'20121206_182539' => array( '20121206_182539' => [
'linkdate' => '20121206_182539', 'linkdate' => '20121206_182539',
'title' => 'Geek and Poke', 'title' => 'Geek and Poke',
'url' => 'http://geek-and-poke.com/', 'url' => 'http://geek-and-poke.com/',
@ -350,25 +349,25 @@ public function testDatastoreIds()
'tags' => 'dev cartoon tag1 tag2 tag3 tag4 ', 'tags' => 'dev cartoon tag1 tag2 tag3 tag4 ',
'updated' => '20121206_190301', 'updated' => '20121206_190301',
'private' => false, 'private' => false,
), ],
'20121206_172539' => array( '20121206_172539' => [
'linkdate' => '20121206_172539', 'linkdate' => '20121206_172539',
'title' => 'UserFriendly - Samba', 'title' => 'UserFriendly - Samba',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20010306', 'url' => 'http://ars.userfriendly.org/cartoons/?id=20010306',
'description' => '', 'description' => '',
'tags' => 'samba cartoon web', 'tags' => 'samba cartoon web',
'private' => false, 'private' => false,
), ],
'20121206_142300' => array( '20121206_142300' => [
'linkdate' => '20121206_142300', 'linkdate' => '20121206_142300',
'title' => 'UserFriendly - Web Designer', 'title' => 'UserFriendly - Web Designer',
'url' => 'http://ars.userfriendly.org/cartoons/?id=20121206', 'url' => 'http://ars.userfriendly.org/cartoons/?id=20121206',
'description' => 'Naming conventions... #private', 'description' => 'Naming conventions... #private',
'tags' => 'samba cartoon web', 'tags' => 'samba cartoon web',
'private' => true, 'private' => true,
), ],
); ];
$refDB = new \ReferenceLinkDB(true); $refDB = new ReferenceLinkDB(true);
$refDB->setLinks($links); $refDB->setLinks($links);
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
@ -378,12 +377,12 @@ public function testDatastoreIds()
$this->conf->set('resource.data_dir', 'sandbox'); $this->conf->set('resource.data_dir', 'sandbox');
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true); $updater = new LegacyUpdater([], $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds()); $this->assertTrue($updater->updateMethodDatastoreIds());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$backupFiles = glob($this->conf->get('resource.data_dir') . '/datastore.'. date('YmdH') .'*.php'); $backupFiles = glob($this->conf->get('resource.data_dir') . '/datastore.' . date('YmdH') . '*.php');
$backup = null; $backup = null;
foreach ($backupFiles as $backupFile) { foreach ($backupFiles as $backupFile) {
if (strpos($backupFile, '_1') === false) { if (strpos($backupFile, '_1') === false) {
@ -437,7 +436,7 @@ public function testDatastoreIds()
*/ */
public function testDatastoreIdsNothingToDo() public function testDatastoreIdsNothingToDo()
{ {
$refDB = new \ReferenceLinkDB(true); $refDB = new ReferenceLinkDB(true);
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
@ -445,7 +444,7 @@ public function testDatastoreIdsNothingToDo()
$this->conf->set('resource.datastore', self::$testDatastore); $this->conf->set('resource.datastore', self::$testDatastore);
$checksum = hash_file('sha1', self::$testDatastore); $checksum = hash_file('sha1', self::$testDatastore);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true); $updater = new LegacyUpdater([], $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodDatastoreIds()); $this->assertTrue($updater->updateMethodDatastoreIds());
$this->assertEquals($checksum, hash_file('sha1', self::$testDatastore)); $this->assertEquals($checksum, hash_file('sha1', self::$testDatastore));
} }
@ -478,9 +477,9 @@ public function testDefaultThemeWithCustomTheme()
$sandbox = 'sandbox/config'; $sandbox = 'sandbox/config';
copy(self::$configFile . '.json.php', $sandbox . '.json.php'); copy(self::$configFile . '.json.php', $sandbox . '.json.php');
$this->conf = new ConfigManager($sandbox); $this->conf = new ConfigManager($sandbox);
mkdir('sandbox/'. $theme); mkdir('sandbox/' . $theme);
touch('sandbox/'. $theme .'/linklist.html'); touch('sandbox/' . $theme . '/linklist.html');
$this->conf->set('resource.raintpl_tpl', 'sandbox/'. $theme .'/'); $this->conf->set('resource.raintpl_tpl', 'sandbox/' . $theme . '/');
$updater = new LegacyUpdater([], [], $this->conf, true); $updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodDefaultTheme()); $this->assertTrue($updater->updateMethodDefaultTheme());
@ -490,8 +489,8 @@ public function testDefaultThemeWithCustomTheme()
$this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl')); $this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
$this->assertEquals($theme, $this->conf->get('resource.theme')); $this->assertEquals($theme, $this->conf->get('resource.theme'));
unlink($sandbox . '.json.php'); unlink($sandbox . '.json.php');
unlink('sandbox/'. $theme .'/linklist.html'); unlink('sandbox/' . $theme . '/linklist.html');
rmdir('sandbox/'. $theme); rmdir('sandbox/' . $theme);
} }
/** /**
@ -572,11 +571,11 @@ public function testUpdatePiwikUrlValid()
$this->conf->set('plugins.PIWIK_URL', $url); $this->conf->set('plugins.PIWIK_URL', $url);
$updater = new LegacyUpdater([], [], $this->conf, true); $updater = new LegacyUpdater([], [], $this->conf, true);
$this->assertTrue($updater->updateMethodPiwikUrl()); $this->assertTrue($updater->updateMethodPiwikUrl());
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL')); $this->assertEquals('http://' . $url, $this->conf->get('plugins.PIWIK_URL'));
// reload from file // reload from file
$this->conf = new ConfigManager($sandboxConf); $this->conf = new ConfigManager($sandboxConf);
$this->assertEquals('http://'. $url, $this->conf->get('plugins.PIWIK_URL')); $this->assertEquals('http://' . $url, $this->conf->get('plugins.PIWIK_URL'));
} }
/** /**
@ -781,12 +780,12 @@ public function testUpdateStickyValid()
1 => ['id' => 1] + $blank, 1 => ['id' => 1] + $blank,
2 => ['id' => 2] + $blank, 2 => ['id' => 2] + $blank,
]; ];
$refDB = new \ReferenceLinkDB(true); $refDB = new ReferenceLinkDB(true);
$refDB->setLinks($links); $refDB->setLinks($links);
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true); $updater = new LegacyUpdater([], $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky()); $this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
@ -812,12 +811,12 @@ public function testUpdateStickyNothingToDo()
1 => ['id' => 1, 'sticky' => true] + $blank, 1 => ['id' => 1, 'sticky' => true] + $blank,
2 => ['id' => 2] + $blank, 2 => ['id' => 2] + $blank,
]; ];
$refDB = new \ReferenceLinkDB(true); $refDB = new ReferenceLinkDB(true);
$refDB->setLinks($links); $refDB->setLinks($links);
$refDB->write(self::$testDatastore); $refDB->write(self::$testDatastore);
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);
$updater = new LegacyUpdater(array(), $linkDB, $this->conf, true); $updater = new LegacyUpdater([], $linkDB, $this->conf, true);
$this->assertTrue($updater->updateMethodSetSticky()); $this->assertTrue($updater->updateMethodSetSticky());
$linkDB = new LegacyLinkDB(self::$testDatastore, true, false); $linkDB = new LegacyLinkDB(self::$testDatastore, true, false);

View file

@ -10,8 +10,7 @@
use Shaarli\History; use Shaarli\History;
use Shaarli\Plugin\PluginManager; use Shaarli\Plugin\PluginManager;
use Shaarli\TestCase; use Shaarli\TestCase;
use Shaarli\Tests\Utils\ReferenceLinkDB;
require_once 'tests/utils/ReferenceLinkDB.php';
/** /**
* Netscape bookmark export * Netscape bookmark export
@ -29,7 +28,7 @@ class BookmarkExportTest extends TestCase
protected static $conf; protected static $conf;
/** /**
* @var \ReferenceLinkDB instance. * @var ReferenceLinkDB instance.
*/ */
protected static $refDb = null; protected static $refDb = null;
@ -64,7 +63,7 @@ public static function setUpBeforeClass(): void
$mutex = new NoMutex(); $mutex = new NoMutex();
static::$conf = new ConfigManager('tests/utils/config/configJson'); static::$conf = new ConfigManager('tests/utils/config/configJson');
static::$conf->set('resource.datastore', static::$testDatastore); static::$conf->set('resource.datastore', static::$testDatastore);
static::$refDb = new \ReferenceLinkDB(); static::$refDb = new ReferenceLinkDB();
static::$refDb->write(static::$testDatastore); static::$refDb->write(static::$testDatastore);
static::$history = new History('sandbox/history.php'); static::$history = new History('sandbox/history.php');
static::$pluginManager = new PluginManager(static::$conf); static::$pluginManager = new PluginManager(static::$conf);

View file

@ -135,7 +135,7 @@ public function testImportEmptyData()
$files = file2array('empty.htm'); $files = file2array('empty.htm');
$this->assertEquals( $this->assertEquals(
'File empty.htm (0 bytes) has an unknown file format.' 'File empty.htm (0 bytes) has an unknown file format.'
.' Nothing was imported.', . ' Nothing was imported.',
$this->netscapeBookmarkUtils->import(null, $files) $this->netscapeBookmarkUtils->import(null, $files)
); );
$this->assertEquals(0, $this->bookmarkService->count()); $this->assertEquals(0, $this->bookmarkService->count());
@ -162,7 +162,7 @@ public function testImportLowecaseDoctype()
$files = file2array('lowercase_doctype.htm'); $files = file2array('lowercase_doctype.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File lowercase_doctype.htm (386 bytes) was successfully processed in %d seconds:' 'File lowercase_doctype.htm (386 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import(null, $files) $this->netscapeBookmarkUtils->import(null, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -177,7 +177,7 @@ public function testImportInternetExplorerEncoding()
$files = file2array('internet_explorer_encoding.htm'); $files = file2array('internet_explorer_encoding.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File internet_explorer_encoding.htm (356 bytes) was successfully processed in %d seconds:' 'File internet_explorer_encoding.htm (356 bytes) was successfully processed in %d seconds:'
.' 1 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 1 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import([], $files) $this->netscapeBookmarkUtils->import([], $files)
); );
$this->assertEquals(1, $this->bookmarkService->count()); $this->assertEquals(1, $this->bookmarkService->count());
@ -205,7 +205,7 @@ public function testImportNested()
$files = file2array('netscape_nested.htm'); $files = file2array('netscape_nested.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_nested.htm (1337 bytes) was successfully processed in %d seconds:' 'File netscape_nested.htm (1337 bytes) was successfully processed in %d seconds:'
.' 8 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 8 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import([], $files) $this->netscapeBookmarkUtils->import([], $files)
); );
$this->assertEquals(8, $this->bookmarkService->count()); $this->assertEquals(8, $this->bookmarkService->count());
@ -326,7 +326,7 @@ public function testImportDefaultPrivacyNoPost()
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import([], $files) $this->netscapeBookmarkUtils->import([], $files)
); );
@ -365,11 +365,11 @@ public function testImportDefaultPrivacyNoPost()
*/ */
public function testImportKeepPrivacy() public function testImportKeepPrivacy()
{ {
$post = array('privacy' => 'default'); $post = ['privacy' => 'default'];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
@ -408,11 +408,11 @@ public function testImportKeepPrivacy()
*/ */
public function testImportAsPublic() public function testImportAsPublic()
{ {
$post = array('privacy' => 'public'); $post = ['privacy' => 'public'];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -426,11 +426,11 @@ public function testImportAsPublic()
*/ */
public function testImportAsPrivate() public function testImportAsPrivate()
{ {
$post = array('privacy' => 'private'); $post = ['privacy' => 'private'];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -447,10 +447,10 @@ public function testOverwriteAsPublic()
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
// import bookmarks as private // import bookmarks as private
$post = array('privacy' => 'private'); $post = ['privacy' => 'private'];
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -459,13 +459,13 @@ public function testOverwriteAsPublic()
$this->assertTrue($this->bookmarkService->get(1)->isPrivate()); $this->assertTrue($this->bookmarkService->get(1)->isPrivate());
// re-import as public, enable overwriting // re-import as public, enable overwriting
$post = array( $post = [
'privacy' => 'public', 'privacy' => 'public',
'overwrite' => 'true' 'overwrite' => 'true'
); ];
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -482,10 +482,10 @@ public function testOverwriteAsPrivate()
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
// import bookmarks as public // import bookmarks as public
$post = array('privacy' => 'public'); $post = ['privacy' => 'public'];
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -494,13 +494,13 @@ public function testOverwriteAsPrivate()
$this->assertFalse($this->bookmarkService->get(1)->isPrivate()); $this->assertFalse($this->bookmarkService->get(1)->isPrivate());
// re-import as private, enable overwriting // re-import as private, enable overwriting
$post = array( $post = [
'privacy' => 'private', 'privacy' => 'private',
'overwrite' => 'true' 'overwrite' => 'true'
); ];
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 2 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -514,21 +514,21 @@ public function testOverwriteAsPrivate()
*/ */
public function testSkipOverwrite() public function testSkipOverwrite()
{ {
$post = array('privacy' => 'public'); $post = ['privacy' => 'public'];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE)); $this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));
// re-import as private, DO NOT enable overwriting // re-import as private, DO NOT enable overwriting
$post = array('privacy' => 'private'); $post = ['privacy' => 'private'];
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 0 bookmarks imported, 0 bookmarks overwritten, 2 bookmarks skipped.', . ' 0 bookmarks imported, 0 bookmarks overwritten, 2 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -540,14 +540,14 @@ public function testSkipOverwrite()
*/ */
public function testSetDefaultTags() public function testSetDefaultTags()
{ {
$post = array( $post = [
'privacy' => 'public', 'privacy' => 'public',
'default_tags' => 'tag1 tag2 tag3' 'default_tags' => 'tag1 tag2 tag3'
); ];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -561,14 +561,14 @@ public function testSetDefaultTags()
*/ */
public function testSanitizeDefaultTags() public function testSanitizeDefaultTags()
{ {
$post = array( $post = [
'privacy' => 'public', 'privacy' => 'public',
'default_tags' => 'tag1& tag2 "tag3"' 'default_tags' => 'tag1& tag2 "tag3"'
); ];
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -597,7 +597,7 @@ public function testSetDefaultTagsWithCustomSeparator()
$files = file2array('netscape_basic.htm'); $files = file2array('netscape_basic.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:' 'File netscape_basic.htm (482 bytes) was successfully processed in %d seconds:'
.' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 2 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import($post, $files) $this->netscapeBookmarkUtils->import($post, $files)
); );
$this->assertEquals(2, $this->bookmarkService->count()); $this->assertEquals(2, $this->bookmarkService->count());
@ -630,8 +630,8 @@ public function testImportSameDate()
$files = file2array('same_date.htm'); $files = file2array('same_date.htm');
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
'File same_date.htm (453 bytes) was successfully processed in %d seconds:' 'File same_date.htm (453 bytes) was successfully processed in %d seconds:'
.' 3 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.', . ' 3 bookmarks imported, 0 bookmarks overwritten, 0 bookmarks skipped.',
$this->netscapeBookmarkUtils->import(array(), $files) $this->netscapeBookmarkUtils->import([], $files)
); );
$this->assertEquals(3, $this->bookmarkService->count()); $this->assertEquals(3, $this->bookmarkService->count());
$this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE)); $this->assertEquals(0, $this->bookmarkService->count(BookmarkFilter::$PRIVATE));

Some files were not shown because too many files have changed in this diff Show more