mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 13:12:41 +00:00
Upgrade to PHPUnit 8
This commit is contained in:
parent
b8b8a6aa70
commit
17a2fa96f8
53 changed files with 273 additions and 180 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -9,7 +9,8 @@
|
|||
/arsse.db*
|
||||
/config.php
|
||||
/.php_cs.cache
|
||||
yarn-error.log
|
||||
/yarn-error.log
|
||||
/tests/.phpunit.result.cache
|
||||
|
||||
|
||||
# Windows files
|
||||
|
|
|
@ -17,7 +17,7 @@ use JKingWeb\Arsse\ImportExport\OPML;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\CLI */
|
||||
class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData(false);
|
||||
$this->cli = \Phake::partialMock(CLI::class);
|
||||
\Phake::when($this->cli)->logError->thenReturn(null);
|
||||
|
@ -57,7 +57,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertLoaded(false);
|
||||
}
|
||||
|
||||
public function provideHelpText() {
|
||||
public function provideHelpText(): iterable {
|
||||
return [
|
||||
["arsse.php --help", "arsse.php"],
|
||||
["arsse --help", "arsse"],
|
||||
|
@ -98,7 +98,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify(Arsse::$db)->feedUpdate;
|
||||
}
|
||||
|
||||
public function provideFeedUpdates() {
|
||||
public function provideFeedUpdates(): iterable {
|
||||
return [
|
||||
["arsse.php feed refresh 1", 0, ""],
|
||||
["arsse.php feed refresh 2", 10502, ""],
|
||||
|
@ -117,7 +117,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify($conf)->exportFile($file, true);
|
||||
}
|
||||
|
||||
public function provideDefaultConfigurationSaves() {
|
||||
public function provideDefaultConfigurationSaves(): iterable {
|
||||
return [
|
||||
["arsse.php conf save-defaults", 0, "php://output"],
|
||||
["arsse.php conf save-defaults -", 0, "php://output"],
|
||||
|
@ -134,7 +134,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserList() {
|
||||
public function provideUserList(): iterable {
|
||||
$list = ["john.doe@example.com", "jane.doe@example.com"];
|
||||
$str = implode(PHP_EOL, $list);
|
||||
return [
|
||||
|
@ -160,7 +160,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserAdditions() {
|
||||
public function provideUserAdditions(): iterable {
|
||||
return [
|
||||
["arsse.php user add john.doe@example.com", 10403, ""],
|
||||
["arsse.php user add jane.doe@example.com", 0, "random password"],
|
||||
|
@ -186,7 +186,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserAuthentication() {
|
||||
public function provideUserAuthentication(): iterable {
|
||||
$l = new \JKingWeb\Arsse\Lang;
|
||||
$success = $l("CLI.Auth.Success");
|
||||
$failure = $l("CLI.Auth.Failure");
|
||||
|
@ -215,7 +215,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserRemovals() {
|
||||
public function provideUserRemovals(): iterable {
|
||||
return [
|
||||
["arsse.php user remove john.doe@example.com", 0, ""],
|
||||
["arsse.php user remove jane.doe@example.com", 10402, ""],
|
||||
|
@ -241,7 +241,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserPasswordChanges() {
|
||||
public function provideUserPasswordChanges(): iterable {
|
||||
return [
|
||||
["arsse.php user set-pass john.doe@example.com", 0, "random password"],
|
||||
["arsse.php user set-pass john.doe@example.com superman", 0, ""],
|
||||
|
@ -271,7 +271,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertConsole($this->cli, $cmd, $exitStatus, $output);
|
||||
}
|
||||
|
||||
public function provideUserPasswordClearings() {
|
||||
public function provideUserPasswordClearings(): iterable {
|
||||
return [
|
||||
["arsse.php user unset-pass john.doe@example.com", 0, ""],
|
||||
["arsse.php user unset-pass jane.doe@example.com", 10402, ""],
|
||||
|
@ -292,7 +292,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify($opml)->exportFile($file, $user, $flat);
|
||||
}
|
||||
|
||||
public function provideOpmlExports() {
|
||||
public function provideOpmlExports(): iterable {
|
||||
return [
|
||||
["arsse.php export john.doe@example.com", 0, "php://output", "john.doe@example.com", false],
|
||||
["arsse.php export john.doe@example.com -", 0, "php://output", "john.doe@example.com", false],
|
||||
|
@ -333,7 +333,7 @@ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify($opml)->importFile($file, $user, $flat, $replace);
|
||||
}
|
||||
|
||||
public function provideOpmlImports() {
|
||||
public function provideOpmlImports(): iterable {
|
||||
return [
|
||||
["arsse.php import john.doe@example.com", 0, "php://input", "john.doe@example.com", false, false],
|
||||
["arsse.php import john.doe@example.com -", 0, "php://input", "john.doe@example.com", false, false],
|
||||
|
|
|
@ -14,7 +14,7 @@ class TestConf extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
public static $vfs;
|
||||
public static $path;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::$vfs = vfsStream::setup("root", null, [
|
||||
'confGood' => '<?php return Array("lang" => "xx");',
|
||||
|
@ -32,7 +32,7 @@ class TestConf extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
chmod(self::$path."confForbidden", 0000);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::$path = null;
|
||||
self::$vfs = null;
|
||||
self::clearData();
|
||||
|
|
|
@ -41,7 +41,7 @@ abstract class AbstractTest extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
return $class->getShortName();
|
||||
}
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// establish a clean baseline
|
||||
static::clearData();
|
||||
// perform an initial connection to the database to reset its version to zero
|
||||
|
@ -61,7 +61,7 @@ abstract class AbstractTest extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
Arsse::$db->driverSchemaUpdate();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
// get the name of the test's test series
|
||||
$this->series = $this->findTraitofTest($this->getName(false));
|
||||
static::clearData();
|
||||
|
@ -83,7 +83,7 @@ abstract class AbstractTest extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
// call the series-specific teardown method
|
||||
$this->series = $this->findTraitofTest($this->getName(false));
|
||||
$tearDown = "tearDown".$this->series;
|
||||
|
@ -96,7 +96,7 @@ abstract class AbstractTest extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
static::clearData();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$drv) {
|
||||
// wipe the database absolutely clean
|
||||
static::dbRaze(static::$drv);
|
||||
|
|
|
@ -420,7 +420,7 @@ trait SeriesArticle {
|
|||
$this->assertEquals($exp, $ids);
|
||||
}
|
||||
|
||||
public function provideContextMatches() {
|
||||
public function provideContextMatches(): iterable {
|
||||
return [
|
||||
'Blank context' => [new Context, [1,2,3,4,5,6,7,8,19,20]],
|
||||
'Folder tree' => [(new Context)->folder(1), [5,6,7,8]],
|
||||
|
@ -582,7 +582,7 @@ trait SeriesArticle {
|
|||
$this->assertSame($exp, $act);
|
||||
}
|
||||
|
||||
public function provideOrderedLists() {
|
||||
public function provideOrderedLists(): iterable {
|
||||
return [
|
||||
[["id"], [1,2,3,4,5,6,7,8,19,20]],
|
||||
[["id asc"], [1,2,3,4,5,6,7,8,19,20]],
|
||||
|
@ -1058,7 +1058,7 @@ trait SeriesArticle {
|
|||
Arsse::$db->articleList($this->user, (new Context)->$option([]));
|
||||
}
|
||||
|
||||
public function provideArrayContextOptions() {
|
||||
public function provideArrayContextOptions(): iterable {
|
||||
foreach ([
|
||||
"articles", "editions",
|
||||
"subscriptions", "foldersShallow", //"folders",
|
||||
|
|
|
@ -42,7 +42,7 @@ trait SeriesMiscellany {
|
|||
}
|
||||
|
||||
public function testCheckCharacterSetAcceptability() {
|
||||
$this->assertInternalType("bool", Arsse::$db->driverCharsetAcceptable());
|
||||
$this->assertIsBool(Arsse::$db->driverCharsetAcceptable());
|
||||
}
|
||||
|
||||
public function testPerformMaintenance() {
|
||||
|
|
|
@ -12,7 +12,7 @@ use JKingWeb\Arsse\Database;
|
|||
class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
protected $db = null;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
try {
|
||||
|
@ -22,7 +22,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
$this->db = null;
|
||||
self::clearData();
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $this->db->generateIn($inV, $inT));
|
||||
}
|
||||
|
||||
public function provideInClauses() {
|
||||
public function provideInClauses(): iterable {
|
||||
$l = Database::LIMIT_SET_SIZE + 1;
|
||||
$strings = array_fill(0, $l, "");
|
||||
$ints = range(1, $l);
|
||||
|
@ -69,7 +69,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $this->db->generateSearch($inV, $inC, $inAny));
|
||||
}
|
||||
|
||||
public function provideSearchClauses() {
|
||||
public function provideSearchClauses(): iterable {
|
||||
$terms = array_fill(0, Database::LIMIT_SET_SIZE + 1, "a");
|
||||
$clause = array_fill(0, Database::LIMIT_SET_SIZE + 1, "test like '%a%' escape '^'");
|
||||
$longString = str_repeat("0", Database::LIMIT_SET_STRING_LENGTH + 1);
|
||||
|
|
|
@ -23,14 +23,14 @@ abstract class BaseDriver extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
//'dbSQLite3File' => "(temporary file)",
|
||||
];
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// establish a clean baseline
|
||||
static::clearData();
|
||||
static::setConf(static::$conf);
|
||||
static::$interface = static::dbInterface();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf(static::$conf);
|
||||
if (!static::$interface) {
|
||||
|
@ -45,13 +45,13 @@ abstract class BaseDriver extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->drv = new static::$dbDriverClass;
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
// deconstruct the driver
|
||||
unset($this->drv);
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
// completely clear the database
|
||||
static::dbRaze(static::$interface);
|
||||
|
|
|
@ -15,14 +15,14 @@ abstract class BaseResult extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
|
||||
abstract protected function makeResult(string $q): array;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// establish a clean baseline
|
||||
static::clearData();
|
||||
static::setConf();
|
||||
static::$interface = static::dbInterface();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
if (!static::$interface) {
|
||||
|
@ -33,11 +33,11 @@ abstract class BaseResult extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->resultClass = static::$dbResultClass;
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
// completely clear the database
|
||||
static::dbRaze(static::$interface);
|
||||
|
|
|
@ -15,14 +15,14 @@ abstract class BaseStatement extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
abstract protected function makeStatement(string $q, array $types = []): array;
|
||||
abstract protected function decorateTypeSyntax(string $value, string $type): string;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// establish a clean baseline
|
||||
static::clearData();
|
||||
static::setConf();
|
||||
static::$interface = static::dbInterface();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
if (!static::$interface) {
|
||||
|
@ -33,11 +33,11 @@ abstract class BaseStatement extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->statementClass = static::$dbStatementClass;
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
// completely clear the database
|
||||
static::dbRaze(static::$interface);
|
||||
|
@ -129,7 +129,7 @@ abstract class BaseStatement extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$s->runArray(['ook', 'eek']);
|
||||
}
|
||||
|
||||
public function provideBindings() {
|
||||
public function provideBindings(): iterable {
|
||||
$dateMutable = new \DateTime("Noon Today", new \DateTimezone("America/Toronto"));
|
||||
$dateImmutable = new \DateTimeImmutable("Noon Today", new \DateTimezone("America/Toronto"));
|
||||
$dateUTC = new \DateTime("@".$dateMutable->getTimestamp(), new \DateTimezone("UTC"));
|
||||
|
@ -272,7 +272,7 @@ abstract class BaseStatement extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideBinaryBindings() {
|
||||
public function provideBinaryBindings(): iterable {
|
||||
$dateMutable = new \DateTime("Noon Today", new \DateTimezone("America/Toronto"));
|
||||
$dateImmutable = new \DateTimeImmutable("Noon Today", new \DateTimezone("America/Toronto"));
|
||||
$dateUTC = new \DateTime("@".$dateMutable->getTimestamp(), new \DateTimezone("UTC"));
|
||||
|
|
|
@ -18,14 +18,14 @@ class BaseUpdate extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected $base;
|
||||
protected $path;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// establish a clean baseline
|
||||
static::clearData();
|
||||
static::setConf();
|
||||
static::$interface = static::dbInterface();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!static::$interface) {
|
||||
$this->markTestSkipped(static::$implementation." database driver not available");
|
||||
}
|
||||
|
@ -42,14 +42,14 @@ class BaseUpdate extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
static::dbRaze(static::$interface);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
// deconstruct the driver
|
||||
unset($this->drv);
|
||||
unset($this->path, $this->base, $this->vfs);
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
// completely clear the database
|
||||
static::dbRaze(static::$interface);
|
||||
|
|
|
@ -13,7 +13,7 @@ use JKingWeb\Arsse\Db\MySQL\Driver as Driver;
|
|||
* @covers \JKingWeb\Arsse\Db\MySQL\Driver<extended>
|
||||
* @covers \JKingWeb\Arsse\Db\MySQL\ExceptionBuilder */
|
||||
class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("MySQL extension not loaded");
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ use JKingWeb\Arsse\Db\MySQL\PDODriver as Driver;
|
|||
* @covers \JKingWeb\Arsse\Db\MySQL\PDODriver<extended>
|
||||
* @covers \JKingWeb\Arsse\Db\MySQL\ExceptionBuilder */
|
||||
class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("PDO-MySQL extension not loaded");
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ use JKingWeb\Arsse\Db\PostgreSQL\Driver;
|
|||
* @group slow
|
||||
* @covers \JKingWeb\Arsse\Db\PostgreSQL\Driver<extended> */
|
||||
class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("PostgreSQL extension not loaded");
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideConnectionStrings() {
|
||||
public function provideConnectionStrings(): iterable {
|
||||
return [
|
||||
[false, "arsse", "secret", "arsse", "", 5432, "", "dbname='arsse' password='secret' user='arsse'"],
|
||||
[false, "arsse", "p word", "arsse", "", 5432, "", "dbname='arsse' password='p word' user='arsse'"],
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestDatabase extends \JKingWeb\Arsse\TestCase\Database\AbstractTest {
|
|||
return (int) static::$drv->query("SELECT coalesce(last_value, (select max(id) from $table)) + 1 from pg_sequences where sequencename = '{$table}_id_seq'")->getValue();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
$seqList =
|
||||
"select
|
||||
|
|
|
@ -18,7 +18,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
protected $lock = ["BEGIN", "LOCK TABLE arsse_meta IN EXCLUSIVE MODE NOWAIT"];
|
||||
protected $setVersion = "UPDATE arsse_meta set value = '#' where key = 'schema_version'";
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
try {
|
||||
$this->drv->exec("ROLLBACK");
|
||||
} catch (\Throwable $e) {
|
||||
|
@ -26,7 +26,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
parent::tearDown();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
static::dbRaze(static::$interface);
|
||||
@pg_close(static::$interface);
|
||||
|
|
|
@ -21,7 +21,7 @@ class TestResult extends \JKingWeb\Arsse\TestCase\Db\BaseResult {
|
|||
return [static::$interface, $set];
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
static::dbRaze(static::$interface);
|
||||
@pg_close(static::$interface);
|
||||
|
|
|
@ -32,7 +32,7 @@ class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
|
|||
}
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
if (static::$interface) {
|
||||
static::dbRaze(static::$interface);
|
||||
@pg_close(static::$interface);
|
||||
|
|
|
@ -13,7 +13,7 @@ use JKingWeb\Arsse\Db\PostgreSQL\PDODriver as Driver;
|
|||
* @group slow
|
||||
* @covers \JKingWeb\Arsse\Db\PostgreSQL\PDODriver<extended> */
|
||||
class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("PDO-PostgreSQL extension not loaded");
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideConnectionStrings() {
|
||||
public function provideConnectionStrings(): iterable {
|
||||
return [
|
||||
[false, "arsse", "secret", "arsse", "", 5432, "", "dbname='arsse' password='secret' user='arsse'"],
|
||||
[false, "arsse", "p word", "arsse", "", 5432, "", "dbname='arsse' password='p word' user='arsse'"],
|
||||
|
|
|
@ -20,7 +20,7 @@ class TestDatabase extends \JKingWeb\Arsse\TestCase\Database\AbstractTest {
|
|||
return (int) static::$drv->query("SELECT coalesce(last_value, (select max(id) from $table)) + 1 from pg_sequences where sequencename = '{$table}_id_seq'")->getValue();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
$seqList =
|
||||
"select
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
protected $lock = ["BEGIN", "LOCK TABLE arsse_meta IN EXCLUSIVE MODE NOWAIT"];
|
||||
protected $setVersion = "UPDATE arsse_meta set value = '#' where key = 'schema_version'";
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
try {
|
||||
$this->drv->exec("ROLLBACK");
|
||||
} catch (\Throwable $e) {
|
||||
|
|
|
@ -18,7 +18,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected $drv;
|
||||
protected $ch;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("SQLite extension not loaded");
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
self::setConf();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
protected $setVersion = "PRAGMA user_version=#";
|
||||
protected static $file;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// create a temporary database file rather than using a memory database
|
||||
// some tests require one connection to block another, so a memory database is not suitable
|
||||
static::$file = tempnam(sys_get_temp_dir(), 'ook');
|
||||
|
@ -25,7 +25,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
parent::setUpBeforeclass();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
static::$interface->close();
|
||||
static::$interface = null;
|
||||
parent::tearDownAfterClass();
|
||||
|
|
|
@ -15,7 +15,7 @@ class TestResult extends \JKingWeb\Arsse\TestCase\Db\BaseResult {
|
|||
protected static $createMeta = "CREATE TABLE arsse_meta(key text primary key not null, value text) without rowid";
|
||||
protected static $createTest = "CREATE TABLE arsse_test(id integer primary key)";
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
static::$interface->close();
|
||||
static::$interface = null;
|
||||
parent::tearDownAfterClass();
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace JKingWeb\Arsse\TestCase\Db\SQLite3;
|
|||
class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
|
||||
use \JKingWeb\Arsse\Test\DatabaseDrivers\SQLite3;
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
static::$interface->close();
|
||||
static::$interface = null;
|
||||
parent::tearDownAfterClass();
|
||||
|
|
|
@ -15,7 +15,7 @@ class TestUpdate extends \JKingWeb\Arsse\TestCase\Db\BaseUpdate {
|
|||
protected static $minimal1 = "create table arsse_meta(key text primary key not null, value text); pragma user_version=1";
|
||||
protected static $minimal2 = "pragma user_version=2";
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
static::$interface->close();
|
||||
static::$interface = null;
|
||||
parent::tearDownAfterClass();
|
||||
|
|
|
@ -20,7 +20,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected $drv;
|
||||
protected $ch;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!Driver::requirementsMet()) {
|
||||
$this->markTestSkipped("PDO-SQLite extension not loaded");
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
self::setConf();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
protected $setVersion = "PRAGMA user_version=#";
|
||||
protected static $file;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
public static function setUpBeforeClass(): void {
|
||||
// create a temporary database file rather than using a memory database
|
||||
// some tests require one connection to block another, so a memory database is not suitable
|
||||
static::$file = tempnam(sys_get_temp_dir(), 'ook');
|
||||
|
@ -27,7 +27,7 @@ class TestDriver extends \JKingWeb\Arsse\TestCase\Db\BaseDriver {
|
|||
parent::setUpBeforeclass();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
public static function tearDownAfterClass(): void {
|
||||
parent::tearDownAfterClass();
|
||||
@unlink(self::$file);
|
||||
self::$file = null;
|
||||
|
|
|
@ -14,7 +14,7 @@ use JKingWeb\Arsse\Db\Exception;
|
|||
class TestTransaction extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
protected $drv;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
$drv = \Phake::mock(\JKingWeb\Arsse\Db\SQLite3\Driver::class);
|
||||
\Phake::when($drv)->savepointRelease->thenReturn(true);
|
||||
|
|
|
@ -13,14 +13,14 @@ use JKingWeb\Arsse\Lang\Exception as LangException;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\AbstractException */
|
||||
class TestException extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData(false);
|
||||
// create a mock Lang object so as not to create a dependency loop
|
||||
Arsse::$lang = \Phake::mock(Lang::class);
|
||||
\Phake::when(Arsse::$lang)->msg->thenReturn("");
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
// verify calls to the mock Lang object
|
||||
\Phake::verify(Arsse::$lang, \Phake::atLeast(0))->msg($this->isType("string"), $this->anything());
|
||||
\Phake::verifyNoOtherInteractions(Arsse::$lang);
|
||||
|
|
|
@ -88,7 +88,7 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
],
|
||||
];
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!@file_get_contents(self::$host."IsUp")) {
|
||||
$this->markTestSkipped("Test Web server is not accepting requests");
|
||||
}
|
||||
|
@ -264,7 +264,7 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertTime($exp, $f->nextFetch);
|
||||
}
|
||||
|
||||
public function provide304Timestamps() {
|
||||
public function provide304Timestamps(): iterable {
|
||||
return [
|
||||
'less than half an hour 1' => ["now", "now + 15 minutes"],
|
||||
'less than half an hour 2' => ["now - 29 minutes", "now + 15 minutes"],
|
||||
|
|
|
@ -16,7 +16,7 @@ class TestFetching extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected static $host = "http://localhost:8000/";
|
||||
protected $base = "";
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
if (!extension_loaded('curl')) {
|
||||
$this->markTestSkipped("Feed fetching tests are only accurate with curl enabled.");
|
||||
} elseif (!@file_get_contents(self::$host."IsUp")) {
|
||||
|
|
|
@ -16,7 +16,7 @@ class TestFile extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected $path;
|
||||
protected $proc;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
// create a mock Import/Export processor with stubbed underlying import/export routines
|
||||
$this->proc = \Phake::partialMock(AbstractImportExport::class);
|
||||
|
@ -37,7 +37,7 @@ class TestFile extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
chmod($this->path."importBadFile", 0000);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
$this->path = null;
|
||||
$this->vfs = null;
|
||||
$this->proc = null;
|
||||
|
@ -60,7 +60,7 @@ class TestFile extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideFileExports() {
|
||||
public function provideFileExports(): iterable {
|
||||
$createException = new Exception("fileUncreatable");
|
||||
$writeException = new Exception("fileUnwritable");
|
||||
return [
|
||||
|
@ -98,7 +98,7 @@ class TestFile extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideFileImports() {
|
||||
public function provideFileImports(): iterable {
|
||||
$missingException = new Exception("fileMissing");
|
||||
$permissionException = new Exception("fileUnreadable");
|
||||
return [
|
||||
|
|
|
@ -23,7 +23,7 @@ class TestImportExport extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
'arsse_tag_members' => ["tag", "subscription", "assigned"],
|
||||
];
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
// create a mock user manager
|
||||
Arsse::$user = \Phake::mock(\JKingWeb\Arsse\User::class);
|
||||
|
@ -140,7 +140,7 @@ class TestImportExport extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->primeDatabase($this->drv, $this->data);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
$this->drv = null;
|
||||
$this->proc = null;
|
||||
self::clearData();
|
||||
|
|
|
@ -79,7 +79,7 @@ OPML_EXPORT_SERIALIZATION;
|
|||
</opml>
|
||||
OPML_EXPORT_SERIALIZATION;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
Arsse::$db = \Phake::mock(\JKingWeb\Arsse\Database::class);
|
||||
Arsse::$user = \Phake::mock(\JKingWeb\Arsse\User::class);
|
||||
|
@ -119,7 +119,7 @@ OPML_EXPORT_SERIALIZATION;
|
|||
}
|
||||
}
|
||||
|
||||
public function provideParserData() {
|
||||
public function provideParserData(): iterable {
|
||||
return [
|
||||
["BrokenXML.opml", false, new Exception("invalidSyntax")],
|
||||
["BrokenOPML.1.opml", false, new Exception("invalidSemantics")],
|
||||
|
|
|
@ -10,7 +10,7 @@ use JKingWeb\Arsse\Misc\Date;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\Misc\Date */
|
||||
class TestDate extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ use JKingWeb\Arsse\Misc\URL;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\Misc\URL */
|
||||
class TestURL extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@ class TestURL extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, URL::normalize($url, $user, $pass));
|
||||
}
|
||||
|
||||
public function provideNormalizations() {
|
||||
public function provideNormalizations(): iterable {
|
||||
return [
|
||||
["http://example.com/", "http://example.com/"],
|
||||
["HTTP://example.com/", "http://example.com/"],
|
||||
|
@ -81,7 +81,7 @@ class TestURL extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, URL::queryAppend($url, $query));
|
||||
}
|
||||
|
||||
public function provideQueries() {
|
||||
public function provideQueries(): iterable {
|
||||
return [
|
||||
["/", "ook=eek", "/?ook=eek"],
|
||||
["/?", "ook=eek", "/?ook=eek"],
|
||||
|
|
|
@ -12,7 +12,7 @@ use JKingWeb\Arsse\Test\Result;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\Misc\ValueInfo */
|
||||
class TestValueInfo extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
@ -424,7 +424,7 @@ class TestValueInfo extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideSimpleNormalizationValues() {
|
||||
public function provideSimpleNormalizationValues(): iterable {
|
||||
$types = [
|
||||
"Mixed",
|
||||
"Null",
|
||||
|
@ -556,7 +556,7 @@ class TestValueInfo extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideDateNormalizationValues() {
|
||||
public function provideDateNormalizationValues(): iterable {
|
||||
$formats = [
|
||||
"microtime",
|
||||
"iso8601",
|
||||
|
|
|
@ -152,7 +152,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
return $this->serverRequest($method, $url, $prefix, [], [], $dataPost, $type, $dataGet, $user);
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock user manager
|
||||
|
@ -168,7 +168,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::when($this->h)->baseResponse->thenReturn([]);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
@ -192,7 +192,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertMessage($exp, $act);
|
||||
}
|
||||
|
||||
public function provideTokenAuthenticationRequests() {
|
||||
public function provideTokenAuthenticationRequests(): iterable {
|
||||
$success = new JsonResponse(['auth' => 1]);
|
||||
$failure = new JsonResponse(['auth' => 0]);
|
||||
$denied = new EmptyResponse(401);
|
||||
|
@ -313,7 +313,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, $c, $fields, $order);
|
||||
}
|
||||
|
||||
public function provideItemListContexts() {
|
||||
public function provideItemListContexts(): iterable {
|
||||
$c = (new Context)->limit(50);
|
||||
return [
|
||||
["items", (clone $c), false],
|
||||
|
@ -388,7 +388,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideMarkingContexts() {
|
||||
public function provideMarkingContexts(): iterable {
|
||||
$markRead = ['read' => true];
|
||||
$markUnread = ['read' => false];
|
||||
$markSaved = ['starred' => true];
|
||||
|
@ -431,7 +431,7 @@ class TestAPI extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertMessage($exp, $this->h->dispatch($req));
|
||||
}
|
||||
|
||||
public function provideInvalidRequests() {
|
||||
public function provideInvalidRequests(): iterable {
|
||||
return [
|
||||
'Not an API request' => [$this->req(""), new EmptyResponse(404)],
|
||||
'Wrong method' => [$this->req("api", "", "GET"), new EmptyResponse(405, ['Allow' => "OPTIONS,POST"])],
|
||||
|
|
|
@ -18,7 +18,7 @@ use JKingWeb\Arsse\REST\Fever\User as FeverUser;
|
|||
class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
protected $u;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock user manager
|
||||
|
@ -31,7 +31,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->u = new FeverUser();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function providePasswordCreations() {
|
||||
public function providePasswordCreations(): iterable {
|
||||
return [
|
||||
["jane.doe@example.com", "secret", "secret"],
|
||||
["jane.doe@example.com", "superman", "superman"],
|
||||
|
@ -83,7 +83,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $this->u->authenticate($user, $password));
|
||||
}
|
||||
|
||||
public function provideUserAuthenticationRequests() {
|
||||
public function provideUserAuthenticationRequests(): iterable {
|
||||
return [
|
||||
["jane.doe@example.com", "secret", true],
|
||||
["jane.doe@example.com", "superman", false],
|
||||
|
|
|
@ -305,7 +305,7 @@ class TestV1_2 extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
return $this->h->dispatch($req);
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock user manager
|
||||
|
@ -317,7 +317,7 @@ class TestV1_2 extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->h = new V1_2();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ use Zend\Diactoros\Response\EmptyResponse;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\REST\NextCloudNews\Versions */
|
||||
class TestVersions extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertEquals($exp, $out);
|
||||
}
|
||||
|
||||
public function provideApiMatchData() {
|
||||
public function provideApiMatchData(): iterable {
|
||||
$real = null;
|
||||
$fake = [
|
||||
'unstripped' => ['match' => "/full/url", 'strip' => "", 'class' => "UnstrippedProtocol"],
|
||||
|
@ -80,7 +80,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertMessage($exp, $act);
|
||||
}
|
||||
|
||||
public function provideAuthenticableRequests() {
|
||||
public function provideAuthenticableRequests(): iterable {
|
||||
return [
|
||||
[['PHP_AUTH_USER' => "john.doe@example.com", 'PHP_AUTH_PW' => "secret"], ['authenticated' => true, 'authenticatedUser' => "john.doe@example.com"]],
|
||||
[['PHP_AUTH_USER' => "john.doe@example.com", 'PHP_AUTH_PW' => "secret", 'REMOTE_USER' => "jane.doe@example.com"], ['authenticated' => true, 'authenticatedUser' => "john.doe@example.com"]],
|
||||
|
@ -112,7 +112,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $act);
|
||||
}
|
||||
|
||||
public function provideUnnormalizedOrigins() {
|
||||
public function provideUnnormalizedOrigins(): iterable {
|
||||
return [
|
||||
["null", "null"],
|
||||
["http://example.com", "http://example.com"],
|
||||
|
@ -161,7 +161,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $act);
|
||||
}
|
||||
|
||||
public function provideCorsNegotiations() {
|
||||
public function provideCorsNegotiations(): iterable {
|
||||
return [
|
||||
["http://example", true ],
|
||||
["http://example", true, "http://example", "*" ],
|
||||
|
@ -196,7 +196,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertMessage($exp, $act);
|
||||
}
|
||||
|
||||
public function provideCorsHeaders() {
|
||||
public function provideCorsHeaders(): iterable {
|
||||
return [
|
||||
["GET", ['Origin' => "null"], [], [
|
||||
'Access-Control-Allow-Origin' => "null",
|
||||
|
@ -264,7 +264,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertMessage($exp, $act);
|
||||
}
|
||||
|
||||
public function provideUnnormalizedResponses() {
|
||||
public function provideUnnormalizedResponses(): iterable {
|
||||
$stream = fopen("php://memory", "w+b");
|
||||
fwrite($stream, "ook");
|
||||
return [
|
||||
|
@ -322,7 +322,7 @@ class TestREST extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify($r)->normalizeResponse;
|
||||
}
|
||||
|
||||
public function provideMockRequests() {
|
||||
public function provideMockRequests(): iterable {
|
||||
return [
|
||||
[new ServerRequest([], [], "/index.php/apps/news/api/v1-2/feeds", "GET"), "GET", true, NCN::class, "/feeds"],
|
||||
[new ServerRequest([], [], "/index.php/apps/news/api/v1-2/feeds", "HEAD"), "GET", true, NCN::class, "/feeds"],
|
||||
|
|
|
@ -154,7 +154,7 @@ LONG_STRING;
|
|||
]);
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock user manager
|
||||
|
@ -174,7 +174,7 @@ LONG_STRING;
|
|||
$this->h = new API();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
@ -231,7 +231,7 @@ LONG_STRING;
|
|||
\Phake::verify(Arsse::$db, \Phake::times(0))->sessionResume($this->anything());
|
||||
}
|
||||
|
||||
public function provideLoginRequests() {
|
||||
public function provideLoginRequests(): iterable {
|
||||
return $this->generateLoginRequests("login");
|
||||
}
|
||||
|
||||
|
@ -269,7 +269,7 @@ LONG_STRING;
|
|||
$this->assertSame($exp2, Arsse::$user->id);
|
||||
}
|
||||
|
||||
public function provideResumeRequests() {
|
||||
public function provideResumeRequests(): iterable {
|
||||
return $this->generateLoginRequests("isLoggedIn");
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestIcon extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
protected $h;
|
||||
protected $user = "john.doe@example.com";
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock user manager
|
||||
|
@ -29,7 +29,7 @@ class TestIcon extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->h = new Icon();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ use JKingWeb\Arsse\REST\TinyTinyRSS\Search;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\REST\TinyTinyRSS\Search */
|
||||
class TestSearch extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function provideSearchStrings() {
|
||||
public function provideSearchStrings(): iterable {
|
||||
return [
|
||||
'Blank string' => ["", new Context],
|
||||
'Whitespace only' => [" \n \t", new Context],
|
||||
|
|
|
@ -15,7 +15,7 @@ use JKingWeb\Arsse\Misc\Date;
|
|||
class TestService extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
protected $srv;
|
||||
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
Arsse::$db = \Phake::mock(Database::class);
|
||||
|
|
|
@ -13,7 +13,7 @@ use JKingWeb\Arsse\User\Internal\Driver;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\User\Internal\Driver */
|
||||
class TestInternal extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock database interface
|
||||
|
@ -46,7 +46,7 @@ class TestInternal extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, (new Driver)->auth($user, $password));
|
||||
}
|
||||
|
||||
public function provideAuthentication() {
|
||||
public function provideAuthentication(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
$owen = "owen.hardy@example.com";
|
||||
|
|
|
@ -14,7 +14,7 @@ use JKingWeb\Arsse\User\Driver;
|
|||
|
||||
/** @covers \JKingWeb\Arsse\User */
|
||||
class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
self::setConf();
|
||||
// create a mock database interface
|
||||
|
@ -60,7 +60,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
\Phake::verify(Arsse::$db, \Phake::times($exp && $user === "jane.doe@example.com" ? 1 : 0))->userAdd($user, $password);
|
||||
}
|
||||
|
||||
public function provideAuthentication() {
|
||||
public function provideAuthentication(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -86,7 +86,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $u->list());
|
||||
}
|
||||
|
||||
public function provideUserList() {
|
||||
public function provideUserList(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -107,7 +107,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $u->exists($user));
|
||||
}
|
||||
|
||||
public function provideExistence() {
|
||||
public function provideExistence(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -166,7 +166,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideAdditions() {
|
||||
public function provideAdditions(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -201,7 +201,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function provideRemovals() {
|
||||
public function provideRemovals(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -281,7 +281,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function providePasswordChanges() {
|
||||
public function providePasswordChanges(): iterable {
|
||||
$john = "john.doe@example.com";
|
||||
$jane = "jane.doe@example.com";
|
||||
return [
|
||||
|
@ -314,7 +314,7 @@ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
}
|
||||
}
|
||||
|
||||
public function providePasswordClearings() {
|
||||
public function providePasswordClearings(): iterable {
|
||||
$forbidden = new \JKingWeb\Arsse\User\ExceptionAuthz("notAuthorized");
|
||||
$missing = new \JKingWeb\Arsse\User\Exception("doesNotExist");
|
||||
return [
|
||||
|
|
|
@ -24,11 +24,13 @@ use Zend\Diactoros\Response\XmlResponse;
|
|||
|
||||
/** @coversNothing */
|
||||
abstract class AbstractTest extends \PHPUnit\Framework\TestCase {
|
||||
public function setUp() {
|
||||
use \DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
|
||||
|
||||
public function setUp(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
self::clearData();
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ use JKingWeb\Arsse\Arsse;
|
|||
use org\bovigo\vfs\vfsStream;
|
||||
|
||||
trait Setup {
|
||||
public function setUp() {
|
||||
public function setUp(): void {
|
||||
// test files
|
||||
$this->files = [
|
||||
'en.php' => '<?php return ["Test.presentText" => "and the Philosopher\'s Stone"];',
|
||||
|
@ -47,7 +47,7 @@ trait Setup {
|
|||
}
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown(): void {
|
||||
// verify calls to the mock Lang object
|
||||
\Phake::verify(Arsse::$lang, \Phake::atLeast(0))->msg($this->isType("string"), $this->anything());
|
||||
\Phake::verifyNoOtherInteractions(Arsse::$lang);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"require": {
|
||||
"phpunit/phpunit": "6.* | 7.*",
|
||||
"phpunit/phpunit": "8.*",
|
||||
"dms/phpunit-arraysubset-asserts": "^0.1",
|
||||
"phake/phake": "^3.0",
|
||||
"clue/arguments": "^2.0",
|
||||
"mikey179/vfsstream": "^1.6",
|
||||
|
|
183
vendor-bin/phpunit/composer.lock
generated
183
vendor-bin/phpunit/composer.lock
generated
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "0efc271cb10b6582cac5f373a48fc969",
|
||||
"content-hash": "95cd95b15b030103607205ea2f05ea81",
|
||||
"packages": [
|
||||
{
|
||||
"name": "clue/arguments",
|
||||
|
@ -56,6 +56,47 @@
|
|||
],
|
||||
"time": "2016-12-18T14:37:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dms/phpunit-arraysubset-asserts",
|
||||
"version": "v0.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/rdohms/phpunit-arraysubset-asserts.git",
|
||||
"reference": "d618ece5d53e05be87eba835b079377eaafbd7c8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/rdohms/phpunit-arraysubset-asserts/zipball/d618ece5d53e05be87eba835b079377eaafbd7c8",
|
||||
"reference": "d618ece5d53e05be87eba835b079377eaafbd7c8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2",
|
||||
"phpunit/phpunit": "^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"dms/coding-standard": "^1.0",
|
||||
"squizlabs/php_codesniffer": "^3.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DMS\\PHPUnitExtensions\\ArraySubset\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Rafael Dohms",
|
||||
"email": "rdohms@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "This package provides Array Subset and related asserts once depracated in PHPunit 8",
|
||||
"time": "2019-02-17T14:29:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/instantiator",
|
||||
"version": "1.2.0",
|
||||
|
@ -581,40 +622,40 @@
|
|||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "6.1.4",
|
||||
"version": "7.0.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
|
||||
"reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
|
||||
"reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa0d179a13284c7420fc281fc32750e6cc7c9e2f",
|
||||
"reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"php": "^7.1",
|
||||
"phpunit/php-file-iterator": "^2.0",
|
||||
"php": "^7.2",
|
||||
"phpunit/php-file-iterator": "^2.0.2",
|
||||
"phpunit/php-text-template": "^1.2.1",
|
||||
"phpunit/php-token-stream": "^3.0",
|
||||
"phpunit/php-token-stream": "^3.1.1",
|
||||
"sebastian/code-unit-reverse-lookup": "^1.0.1",
|
||||
"sebastian/environment": "^3.1 || ^4.0",
|
||||
"sebastian/environment": "^4.2.2",
|
||||
"sebastian/version": "^2.0.1",
|
||||
"theseer/tokenizer": "^1.1"
|
||||
"theseer/tokenizer": "^1.1.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7.0"
|
||||
"phpunit/phpunit": "^8.2.2"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-xdebug": "^2.6.0"
|
||||
"ext-xdebug": "^2.7.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "6.1-dev"
|
||||
"dev-master": "7.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
|
@ -640,7 +681,7 @@
|
|||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2018-10-31T16:06:48+00:00"
|
||||
"time": "2019-09-17T06:24:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
|
@ -833,53 +874,52 @@
|
|||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "7.5.16",
|
||||
"version": "8.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "316afa6888d2562e04aeb67ea7f2017a0eb41661"
|
||||
"reference": "366a4a0f2b971fd43b7c351d621e8dd7d7131869"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/316afa6888d2562e04aeb67ea7f2017a0eb41661",
|
||||
"reference": "316afa6888d2562e04aeb67ea7f2017a0eb41661",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/366a4a0f2b971fd43b7c351d621e8dd7d7131869",
|
||||
"reference": "366a4a0f2b971fd43b7c351d621e8dd7d7131869",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.1",
|
||||
"doctrine/instantiator": "^1.2.0",
|
||||
"ext-dom": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-xml": "*",
|
||||
"myclabs/deep-copy": "^1.7",
|
||||
"phar-io/manifest": "^1.0.2",
|
||||
"phar-io/version": "^2.0",
|
||||
"php": "^7.1",
|
||||
"phpspec/prophecy": "^1.7",
|
||||
"phpunit/php-code-coverage": "^6.0.7",
|
||||
"phpunit/php-file-iterator": "^2.0.1",
|
||||
"ext-xmlwriter": "*",
|
||||
"myclabs/deep-copy": "^1.9.1",
|
||||
"phar-io/manifest": "^1.0.3",
|
||||
"phar-io/version": "^2.0.1",
|
||||
"php": "^7.2",
|
||||
"phpspec/prophecy": "^1.8.1",
|
||||
"phpunit/php-code-coverage": "^7.0.7",
|
||||
"phpunit/php-file-iterator": "^2.0.2",
|
||||
"phpunit/php-text-template": "^1.2.1",
|
||||
"phpunit/php-timer": "^2.1",
|
||||
"sebastian/comparator": "^3.0",
|
||||
"sebastian/diff": "^3.0",
|
||||
"sebastian/environment": "^4.0",
|
||||
"sebastian/exporter": "^3.1",
|
||||
"sebastian/global-state": "^2.0",
|
||||
"phpunit/php-timer": "^2.1.2",
|
||||
"sebastian/comparator": "^3.0.2",
|
||||
"sebastian/diff": "^3.0.2",
|
||||
"sebastian/environment": "^4.2.2",
|
||||
"sebastian/exporter": "^3.1.1",
|
||||
"sebastian/global-state": "^3.0.0",
|
||||
"sebastian/object-enumerator": "^3.0.3",
|
||||
"sebastian/resource-operations": "^2.0",
|
||||
"sebastian/resource-operations": "^2.0.1",
|
||||
"sebastian/type": "^1.1.3",
|
||||
"sebastian/version": "^2.0.1"
|
||||
},
|
||||
"conflict": {
|
||||
"phpunit/phpunit-mock-objects": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-pdo": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-soap": "*",
|
||||
"ext-xdebug": "*",
|
||||
"phpunit/php-invoker": "^2.0"
|
||||
"phpunit/php-invoker": "^2.0.0"
|
||||
},
|
||||
"bin": [
|
||||
"phpunit"
|
||||
|
@ -887,7 +927,7 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "7.5-dev"
|
||||
"dev-master": "8.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
|
@ -913,7 +953,7 @@
|
|||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2019-09-14T09:08:39+00:00"
|
||||
"time": "2019-10-07T12:57:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/code-unit-reverse-lookup",
|
||||
|
@ -1202,23 +1242,26 @@
|
|||
},
|
||||
{
|
||||
"name": "sebastian/global-state",
|
||||
"version": "2.0.0",
|
||||
"version": "3.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/global-state.git",
|
||||
"reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
|
||||
"reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
|
||||
"reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
|
||||
"reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.0"
|
||||
"php": "^7.2",
|
||||
"sebastian/object-reflector": "^1.1.1",
|
||||
"sebastian/recursion-context": "^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^6.0"
|
||||
"ext-dom": "*",
|
||||
"phpunit/phpunit": "^8.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-uopz": "*"
|
||||
|
@ -1226,7 +1269,7 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0-dev"
|
||||
"dev-master": "3.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
|
@ -1249,7 +1292,7 @@
|
|||
"keywords": [
|
||||
"global state"
|
||||
],
|
||||
"time": "2017-04-27T15:39:26+00:00"
|
||||
"time": "2019-02-01T05:30:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/object-enumerator",
|
||||
|
@ -1438,6 +1481,52 @@
|
|||
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
|
||||
"time": "2018-10-04T04:07:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/type",
|
||||
"version": "1.1.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/type.git",
|
||||
"reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
|
||||
"reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.1-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Collection of value objects that represent the types of the PHP type system",
|
||||
"homepage": "https://github.com/sebastianbergmann/type",
|
||||
"time": "2019-07-02T08:10:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/version",
|
||||
"version": "2.0.1",
|
||||
|
|
Loading…
Reference in a new issue