mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2025-01-03 14:32:40 +00:00
Convert method coverage
This commit is contained in:
parent
ba4d3f497b
commit
2aa4fc9215
14 changed files with 768 additions and 1107 deletions
File diff suppressed because it is too large
Load diff
|
@ -10,6 +10,8 @@ namespace JKingWeb\Arsse\TestCase\Database;
|
|||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use DateTimeImmutable as Date;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesCleanup {
|
||||
protected function setUpSeriesCleanup(): void {
|
||||
|
@ -171,7 +173,7 @@ trait SeriesCleanup {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedCleanup */
|
||||
#[CoversMethod(Database::class, "feedCleanup")]
|
||||
public function testCleanUpOrphanedFeeds(): void {
|
||||
Arsse::$db->feedCleanup();
|
||||
$now = gmdate("Y-m-d H:i:s");
|
||||
|
@ -184,7 +186,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedCleanup */
|
||||
#[CoversMethod(Database::class, "feedCleanup")]
|
||||
public function testCleanUpOrphanedFeedsWithUnlimitedRetention(): void {
|
||||
Arsse::$conf->import([
|
||||
'purgeFeeds' => null,
|
||||
|
@ -199,7 +201,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::iconCleanup */
|
||||
#[CoversMethod(Database::class, "iconCleanup")]
|
||||
public function testCleanUpOrphanedIcons(): void {
|
||||
Arsse::$db->iconCleanup();
|
||||
$now = gmdate("Y-m-d H:i:s");
|
||||
|
@ -212,7 +214,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::iconCleanup */
|
||||
#[CoversMethod(Database::class, "iconCleanup")]
|
||||
public function testCleanUpOrphanedIconsWithUnlimitedRetention(): void {
|
||||
Arsse::$conf->import([
|
||||
'purgeFeeds' => null,
|
||||
|
@ -227,7 +229,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::articleCleanup */
|
||||
#[CoversMethod(Database::class, "articleCleanup")]
|
||||
public function testCleanUpOldArticlesWithStandardRetention(): void {
|
||||
Arsse::$db->articleCleanup();
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -239,7 +241,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::articleCleanup */
|
||||
#[CoversMethod(Database::class, "articleCleanup")]
|
||||
public function testCleanUpOldArticlesWithUnlimitedReadRetention(): void {
|
||||
Arsse::$conf->import([
|
||||
'purgeArticlesRead' => null,
|
||||
|
@ -254,7 +256,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::articleCleanup */
|
||||
#[CoversMethod(Database::class, "articleCleanup")]
|
||||
public function testCleanUpOldArticlesWithUnlimitedUnreadRetention(): void {
|
||||
Arsse::$conf->import([
|
||||
'purgeArticlesUnread' => null,
|
||||
|
@ -269,7 +271,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::articleCleanup */
|
||||
#[CoversMethod(Database::class, "articleCleanup")]
|
||||
public function testCleanUpOldArticlesWithUnlimitedRetention(): void {
|
||||
Arsse::$conf->import([
|
||||
'purgeArticlesRead' => null,
|
||||
|
@ -282,7 +284,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::sessionCleanup */
|
||||
#[CoversMethod(Database::class, "sessionCleanup")]
|
||||
public function testCleanUpExpiredSessions(): void {
|
||||
Arsse::$db->sessionCleanup();
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -294,7 +296,7 @@ trait SeriesCleanup {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenCleanup */
|
||||
#[CoversMethod(Database::class, "tokenCleanup")]
|
||||
public function testCleanUpExpiredTokens(): void {
|
||||
Arsse::$db->tokenCleanup();
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
|
|
@ -9,7 +9,10 @@ declare(strict_types=1);
|
|||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use JKingWeb\Arsse\Test\Result;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
|
||||
trait SeriesFeed {
|
||||
protected $matches;
|
||||
|
@ -193,12 +196,12 @@ trait SeriesFeed {
|
|||
unset($this->data, $this->matches);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedMatchLatest */
|
||||
#[CoversMethod(Database::class, "feedMatchLatest")]
|
||||
public function testListLatestItems(): void {
|
||||
$this->assertResult($this->matches, Arsse::$db->feedMatchLatest(1, 2));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedMatchIds */
|
||||
#[CoversMethod(Database::class, "feedMatchIds")]
|
||||
public function testMatchItemsById(): void {
|
||||
$this->assertResult($this->matches, Arsse::$db->feedMatchIds(1, ['804e517d623390e71497982c77cf6823180342ebcd2e7d5e32da1e55b09dd180','db3e736c2c492f5def5c5da33ddcbea1824040e9ced2142069276b0a6e291a41']));
|
||||
foreach ($this->matches as $m) {
|
||||
|
@ -210,10 +213,8 @@ trait SeriesFeed {
|
|||
$this->assertResult([['id' => 1]], Arsse::$db->feedMatchIds(1, ['e433653cef2e572eee4215fa299a4a5af9137b2cefd6283c85bd69a32915beda'])); // this ID appears in both feed 1 and feed 2; only one result should be returned
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideFilterRules
|
||||
* @covers \JKingWeb\Arsse\Database::feedRulesGet
|
||||
*/
|
||||
#[DataProvider("provideFilterRules")]
|
||||
#[CoversMethod(Database::class, "feedRulesGet")]
|
||||
public function testGetRules(int $in, array $exp): void {
|
||||
$this->assertSame($exp, Arsse::$db->feedRulesGet($in));
|
||||
}
|
||||
|
@ -228,7 +229,7 @@ trait SeriesFeed {
|
|||
];
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateAFeed(): void {
|
||||
// update a valid feed with both new and changed items
|
||||
Arsse::$db->feedUpdate(1);
|
||||
|
@ -270,25 +271,25 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateAMissingFeed(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->feedUpdate(2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateAnInvalidFeed(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->feedUpdate(-1);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateAFeedThrowingExceptions(): void {
|
||||
$this->assertException("invalidUrl", "Feed");
|
||||
Arsse::$db->feedUpdate(3, true);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateAFeedWithEnclosuresAndCategories(): void {
|
||||
Arsse::$db->feedUpdate(5);
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -309,7 +310,7 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedListStale */
|
||||
#[CoversMethod(Database::class, "feedListStale")]
|
||||
public function testListStaleFeeds(): void {
|
||||
$this->assertEquals([1,3,4], Arsse::$db->feedListStale());
|
||||
Arsse::$db->feedUpdate(3);
|
||||
|
@ -317,7 +318,7 @@ trait SeriesFeed {
|
|||
$this->assertEquals([1], Arsse::$db->feedListStale());
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testCheckIconDuringFeedUpdate(): void {
|
||||
Arsse::$db->feedUpdate(6);
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -327,7 +328,7 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testAssignIconDuringFeedUpdate(): void {
|
||||
Arsse::$db->feedUpdate(7);
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -338,7 +339,7 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testChangeIconDuringFeedUpdate(): void {
|
||||
Arsse::$db->feedUpdate(8);
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -349,7 +350,7 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testAddIconDuringFeedUpdate(): void {
|
||||
Arsse::$db->feedUpdate(9);
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -361,7 +362,7 @@ trait SeriesFeed {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::feedUpdate */
|
||||
#[CoversMethod(Database::class, "feedUpdate")]
|
||||
public function testUpdateUnmodifiedFeed(): void {
|
||||
$this->markTestIncomplete("FIXME: there is a bug here around calculation of nextFetch date");
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
|
|
@ -9,6 +9,8 @@ declare(strict_types=1);
|
|||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesFolder {
|
||||
protected function setUpSeriesFolder(): void {
|
||||
|
@ -100,11 +102,9 @@ trait SeriesFolder {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddARootFolder(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$folderID = $this->nextID("arsse_folders");
|
||||
|
@ -114,21 +114,17 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddADuplicateRootFolder(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => "Politics"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddANestedFolder(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$folderID = $this->nextID("arsse_folders");
|
||||
|
@ -138,70 +134,56 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddANestedFolderToAMissingParent(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => "Sociology", 'parent' => 2112]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddANestedFolderToAnInvalidParent(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => "Sociology", 'parent' => "stringFolderId"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddANestedFolderForTheWrongOwner(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => "Sociology", 'parent' => 4]); // folder ID 4 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddAFolderWithAMissingName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddAFolderWithABlankName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => ""]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderAdd
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderAdd")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testAddAFolderWithAWhitespaceName(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderAdd("john.doe@example.com", ['name' => " "]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderList
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderList")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
public function testListRootFolders(): void {
|
||||
$exp = [
|
||||
['id' => 5, 'name' => "Politics", 'parent' => null, 'children' => 0, 'feeds' => 2],
|
||||
|
@ -216,10 +198,8 @@ trait SeriesFolder {
|
|||
$this->assertResult($exp, Arsse::$db->folderList("admin@example.net", null, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderList
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderList")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
public function testListFoldersRecursively(): void {
|
||||
$exp = [
|
||||
['id' => 5, 'name' => "Politics", 'parent' => null, 'children' => 0, 'feeds' => 2],
|
||||
|
@ -239,25 +219,21 @@ trait SeriesFolder {
|
|||
$this->assertResult($exp, Arsse::$db->folderList("jane.doe@example.com", 4, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderList
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderList")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
public function testListFoldersOfAMissingParent(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderList("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderList
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderList")]
|
||||
#[CoversMethod(Database::class, "folderValidateId")]
|
||||
public function testListFoldersOfTheWrongOwner(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderList("john.doe@example.com", 4); // folder ID 4 belongs to Jane
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderRemove */
|
||||
#[CoversMethod(Database::class, "folderRemove")]
|
||||
public function testRemoveAFolder(): void {
|
||||
$this->assertTrue(Arsse::$db->folderRemove("john.doe@example.com", 6));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_folders' => ['id','owner', 'parent', 'name']]);
|
||||
|
@ -265,7 +241,7 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderRemove */
|
||||
#[CoversMethod(Database::class, "folderRemove")]
|
||||
public function testRemoveAFolderTree(): void {
|
||||
$this->assertTrue(Arsse::$db->folderRemove("john.doe@example.com", 1));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_folders' => ['id','owner', 'parent', 'name']]);
|
||||
|
@ -275,25 +251,25 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderRemove */
|
||||
#[CoversMethod(Database::class, "folderRemove")]
|
||||
public function testRemoveAMissingFolder(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderRemove("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderRemove */
|
||||
#[CoversMethod(Database::class, "folderRemove")]
|
||||
public function testRemoveAnInvalidFolder(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderRemove("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderRemove */
|
||||
#[CoversMethod(Database::class, "folderRemove")]
|
||||
public function testRemoveAFolderOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderRemove("john.doe@example.com", 4); // folder ID 4 belongs to Jane
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesGet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesGet")]
|
||||
public function testGetThePropertiesOfAFolder(): void {
|
||||
$exp = [
|
||||
'id' => 6,
|
||||
|
@ -303,33 +279,31 @@ trait SeriesFolder {
|
|||
$this->assertArraySubset($exp, Arsse::$db->folderPropertiesGet("john.doe@example.com", 6));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesGet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesGet")]
|
||||
public function testGetThePropertiesOfAMissingFolder(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesGet("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesGet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesGet")]
|
||||
public function testGetThePropertiesOfAnInvalidFolder(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesGet("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesGet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesGet")]
|
||||
public function testGetThePropertiesOfAFolderOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesGet("john.doe@example.com", 4); // folder ID 4 belongs to Jane
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesSet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
public function testMakeNoChangesToAFolder(): void {
|
||||
$this->assertFalse(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, []));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testRenameAFolder(): void {
|
||||
$this->assertTrue(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['name' => "Opinion"]));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_folders' => ['id','owner', 'parent', 'name']]);
|
||||
|
@ -337,45 +311,35 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testRenameTheRootFolder(): void {
|
||||
$this->assertFalse(Arsse::$db->folderPropertiesSet("john.doe@example.com", null, ['name' => "Opinion"]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testRenameAFolderToTheEmptyString(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['name' => ""]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testRenameAFolderToWhitespaceOnly(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['name' => " "]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
public function testRenameAFolderToAnInvalidValue(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['name' => []]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveAFolder(): void {
|
||||
$this->assertTrue(Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['parent' => 5]));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_folders' => ['id','owner', 'parent', 'name']]);
|
||||
|
@ -383,83 +347,69 @@ trait SeriesFolder {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveTheRootFolder(): void {
|
||||
$this->assertException("circularDependence", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 0, ['parent' => 1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveAFolderToItsDescendant(): void {
|
||||
$this->assertException("circularDependence", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 1, ['parent' => 3]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveAFolderToItself(): void {
|
||||
$this->assertException("circularDependence", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 1, ['parent' => 1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveAFolderToAMissingParent(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 1, ['parent' => 2112]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testMoveAFolderToAnInvalidParent(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 1, ['parent' => "ThisFolderDoesNotExist"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testCauseAFolderCollision(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 6, ['parent' => null]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::folderPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateName
|
||||
* @covers \JKingWeb\Arsse\Database::folderValidateMove
|
||||
*/
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "folderValidateName")]
|
||||
#[CoversMethod(Database::class, "folderValidateMove")]
|
||||
public function testCauseACompoundFolderCollision(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 3, ['parent' => null, 'name' => "Technology"]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesSet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
public function testSetThePropertiesOfAMissingFolder(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 2112, ['parent' => null]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesSet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
public function testSetThePropertiesOfAnInvalidFolder(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", -1, ['parent' => null]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::folderPropertiesSet */
|
||||
#[CoversMethod(Database::class, "folderPropertiesSet")]
|
||||
public function testSetThePropertiesOfAFolderForTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->folderPropertiesSet("john.doe@example.com", 4, ['parent' => null]); // folder ID 4 belongs to Jane
|
||||
|
|
|
@ -9,6 +9,8 @@ declare(strict_types=1);
|
|||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesIcon {
|
||||
protected function setUpSeriesIcon(): void {
|
||||
|
@ -84,7 +86,7 @@ trait SeriesIcon {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::iconList */
|
||||
#[CoversMethod(Database::class, "iconList")]
|
||||
public function testListTheIconsOfAUser() {
|
||||
$exp = [
|
||||
['id' => 1,'url' => 'http://localhost:8000/Icon/PNG', 'type' => 'image/png', 'data' => base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAADUlEQVQYV2NgYGBgAAAABQABijPjAAAAAABJRU5ErkJggg==")],
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace JKingWeb\Arsse\TestCase\Database;
|
|||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use JKingWeb\Arsse\Context\Context;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesLabel {
|
||||
protected $checkLabels;
|
||||
|
@ -256,10 +257,8 @@ trait SeriesLabel {
|
|||
unset($this->data, $this->checkLabels, $this->checkMembers, $this->user);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelAdd
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelAdd")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testAddALabel(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$labelID = $this->nextID("arsse_labels");
|
||||
|
@ -269,43 +268,35 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelAdd
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelAdd")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testAddADuplicateLabel(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelAdd("john.doe@example.com", ['name' => "Interesting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelAdd
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelAdd")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testAddALabelWithAMissingName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelAdd("john.doe@example.com", []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelAdd
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelAdd")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testAddALabelWithABlankName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelAdd("john.doe@example.com", ['name' => ""]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelAdd
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelAdd")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testAddALabelWithAWhitespaceName(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelAdd("john.doe@example.com", ['name' => " "]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::labelList */
|
||||
#[CoversMethod(Database::class, "labelList")]
|
||||
public function testListLabels(): void {
|
||||
$exp = [
|
||||
['id' => 2, 'name' => "Fascinating", 'articles' => 3, 'read' => 1],
|
||||
|
@ -321,10 +312,8 @@ trait SeriesLabel {
|
|||
$this->assertResult($exp, Arsse::$db->labelList("jane.doe@example.com", false));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveALabel(): void {
|
||||
$this->assertTrue(Arsse::$db->labelRemove("john.doe@example.com", 1));
|
||||
$state = $this->primeExpectations($this->data, $this->checkLabels);
|
||||
|
@ -332,10 +321,8 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveALabelByName(): void {
|
||||
$this->assertTrue(Arsse::$db->labelRemove("john.doe@example.com", "Interesting", true));
|
||||
$state = $this->primeExpectations($this->data, $this->checkLabels);
|
||||
|
@ -343,46 +330,36 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveAMissingLabel(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelRemove("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveAnInvalidLabel(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelRemove("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveAnInvalidLabelByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelRemove("john.doe@example.com", [], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelRemove
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelRemove")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testRemoveALabelOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelRemove("john.doe@example.com", 3); // label ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testGetThePropertiesOfALabel(): void {
|
||||
$exp = [
|
||||
'id' => 2,
|
||||
|
@ -394,56 +371,44 @@ trait SeriesLabel {
|
|||
$this->assertArraySubset($exp, Arsse::$db->labelPropertiesGet("john.doe@example.com", "Fascinating", true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testGetThePropertiesOfAMissingLabel(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesGet("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testGetThePropertiesOfAnInvalidLabel(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesGet("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testGetThePropertiesOfAnInvalidLabelByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesGet("john.doe@example.com", [], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testGetThePropertiesOfALabelOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesGet("john.doe@example.com", 3); // label ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testMakeNoChangesToALabel(): void {
|
||||
$this->assertFalse(Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, []));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testRenameALabel(): void {
|
||||
$this->assertTrue(Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, ['name' => "Curious"]));
|
||||
$state = $this->primeExpectations($this->data, $this->checkLabels);
|
||||
|
@ -451,11 +416,9 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testRenameALabelByName(): void {
|
||||
$this->assertTrue(Arsse::$db->labelPropertiesSet("john.doe@example.com", "Interesting", ['name' => "Curious"], true));
|
||||
$state = $this->primeExpectations($this->data, $this->checkLabels);
|
||||
|
@ -463,90 +426,72 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testRenameALabelToTheEmptyString(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, ['name' => ""]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testRenameALabelToWhitespaceOnly(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, ['name' => " "]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testRenameALabelToAnInvalidValue(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, ['name' => []]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testCauseALabelCollision(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesSet("john.doe@example.com", 1, ['name' => "Fascinating"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testSetThePropertiesOfAMissingLabel(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesSet("john.doe@example.com", 2112, ['name' => "Exciting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testSetThePropertiesOfAnInvalidLabel(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesSet("john.doe@example.com", -1, ['name' => "Exciting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testSetThePropertiesOfAnInvalidLabelByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesSet("john.doe@example.com", [], ['name' => "Exciting"], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
#[CoversMethod(Database::class, "labelValidateName")]
|
||||
public function testSetThePropertiesOfALabelForTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelPropertiesSet("john.doe@example.com", 3, ['name' => "Exciting"]); // label ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testListLabelledArticles(): void {
|
||||
$exp = [1,19];
|
||||
$this->assertEquals($exp, Arsse::$db->labelArticlesGet("john.doe@example.com", 1));
|
||||
|
@ -559,28 +504,22 @@ trait SeriesLabel {
|
|||
$this->assertEquals($exp, Arsse::$db->labelArticlesGet("john.doe@example.com", "Lonely", true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testListLabelledArticlesForAMissingLabel(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelArticlesGet("john.doe@example.com", 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesGet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesGet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testListLabelledArticlesForAnInvalidLabel(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->labelArticlesGet("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testApplyALabelToArticles(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([2,5]));
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -589,10 +528,8 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testClearALabelFromArticles(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([1,5]), Database::ASSOC_REMOVE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -600,10 +537,8 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testApplyALabelToArticlesByName(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", "Interesting", (new Context)->articles([2,5]), Database::ASSOC_ADD, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -612,10 +547,8 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testClearALabelFromArticlesByName(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", "Interesting", (new Context)->articles([1,5]), Database::ASSOC_REMOVE, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -623,30 +556,24 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testApplyALabelToNoArticles(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([10000]));
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testClearALabelFromNoArticles(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([10000]), Database::ASSOC_REMOVE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testReplaceArticlesOfALabel(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([2,5]), Database::ASSOC_REPLACE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -657,10 +584,8 @@ trait SeriesLabel {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::labelArticlesSet
|
||||
* @covers \JKingWeb\Arsse\Database::labelValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "labelArticlesSet")]
|
||||
#[CoversMethod(Database::class, "labelValidateId")]
|
||||
public function testPurgeArticlesOfALabel(): void {
|
||||
Arsse::$db->labelArticlesSet("john.doe@example.com", 1, (new Context)->articles([10000]), Database::ASSOC_REPLACE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
|
|
@ -8,8 +8,9 @@ declare(strict_types=1);
|
|||
|
||||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Test\Database;
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesMeta {
|
||||
protected function setUpSeriesMeta(): void {
|
||||
|
@ -37,7 +38,7 @@ trait SeriesMeta {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::metaSet */
|
||||
#[CoversMethod(Database::class, "metaSet")]
|
||||
public function testAddANewValue(): void {
|
||||
$this->assertTrue(Arsse::$db->metaSet("favourite", "Cygnus X-1"));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_meta' => ['key','value']]);
|
||||
|
@ -45,7 +46,7 @@ trait SeriesMeta {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::metaSet */
|
||||
#[CoversMethod(Database::class, "metaSet")]
|
||||
public function testAddANewTypedValue(): void {
|
||||
$this->assertTrue(Arsse::$db->metaSet("answer", 42, "int"));
|
||||
$this->assertTrue(Arsse::$db->metaSet("true", true, "bool"));
|
||||
|
@ -59,7 +60,7 @@ trait SeriesMeta {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::metaSet */
|
||||
#[CoversMethod(Database::class, "metaSet")]
|
||||
public function testChangeAnExistingValue(): void {
|
||||
$this->assertTrue(Arsse::$db->metaSet("album", "Hemispheres"));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_meta' => ['key','value']]);
|
||||
|
@ -67,7 +68,7 @@ trait SeriesMeta {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::metaRemove */
|
||||
#[CoversMethod(Database::class, "metaRemove")]
|
||||
public function testRemoveAValue(): void {
|
||||
$this->assertTrue(Arsse::$db->metaRemove("album"));
|
||||
$this->assertFalse(Arsse::$db->metaRemove("album"));
|
||||
|
@ -76,7 +77,7 @@ trait SeriesMeta {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::metaGet */
|
||||
#[CoversMethod(Database::class, "metaGet")]
|
||||
public function testRetrieveAValue(): void {
|
||||
$this->assertSame("".Database::SCHEMA_VERSION, Arsse::$db->metaGet("schema_version"));
|
||||
$this->assertSame("A Farewell to Kings", Arsse::$db->metaGet("album"));
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace JKingWeb\Arsse\TestCase\Database;
|
|||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesMiscellany {
|
||||
protected function setUpSeriesMiscellany(): void {
|
||||
|
@ -21,22 +22,18 @@ trait SeriesMiscellany {
|
|||
protected function tearDownSeriesMiscellany(): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::__construct
|
||||
* @covers \JKingWeb\Arsse\Database::driverSchemaVersion
|
||||
* @covers \JKingWeb\Arsse\Database::driverSchemaUpdate
|
||||
*/
|
||||
#[CoversMethod(Database::class, "__construct")]
|
||||
#[CoversMethod(Database::class, "driverSchemaVersion")]
|
||||
#[CoversMethod(Database::class, "driverSchemaUpdate")]
|
||||
public function testInitializeDatabase(): void {
|
||||
static::dbRaze(static::$drv);
|
||||
$d = new Database(true);
|
||||
$this->assertSame(Database::SCHEMA_VERSION, $d->driverSchemaVersion());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::__construct
|
||||
* @covers \JKingWeb\Arsse\Database::driverSchemaVersion
|
||||
* @covers \JKingWeb\Arsse\Database::driverSchemaUpdate
|
||||
*/
|
||||
#[CoversMethod(Database::class, "__construct")]
|
||||
#[CoversMethod(Database::class, "driverSchemaVersion")]
|
||||
#[CoversMethod(Database::class, "driverSchemaUpdate")]
|
||||
public function testManuallyInitializeDatabase(): void {
|
||||
static::dbRaze(static::$drv);
|
||||
$d = new Database(false);
|
||||
|
@ -46,12 +43,12 @@ trait SeriesMiscellany {
|
|||
$this->assertFalse($d->driverSchemaUpdate());
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::driverCharsetAcceptable */
|
||||
#[CoversMethod(Database::class, "driverCharsetAcceptable")]
|
||||
public function testCheckCharacterSetAcceptability(): void {
|
||||
$this->assertIsBool(Arsse::$db->driverCharsetAcceptable());
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::driverMaintenance */
|
||||
#[CoversMethod(Database::class, "driverMaintenance")]
|
||||
public function testPerformMaintenance(): void {
|
||||
$this->assertTrue(Arsse::$db->driverMaintenance());
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ namespace JKingWeb\Arsse\TestCase\Database;
|
|||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Misc\Date;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesSession {
|
||||
protected function setUpSeriesSession(): void {
|
||||
|
@ -56,10 +58,8 @@ trait SeriesSession {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::sessionResume
|
||||
* @covers \JKingWeb\Arsse\Database::sessionExpiringSoon
|
||||
*/
|
||||
#[CoversMethod(Database::class, "sessionResume")]
|
||||
#[CoversMethod(Database::class, "sessionExpiringSoon")]
|
||||
public function testResumeAValidSession(): void {
|
||||
$exp1 = [
|
||||
'id' => "80fa94c1a11f11e78667001e673b2560",
|
||||
|
@ -78,34 +78,28 @@ trait SeriesSession {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::sessionResume
|
||||
* @covers \JKingWeb\Arsse\Database::sessionExpiringSoon
|
||||
*/
|
||||
#[CoversMethod(Database::class, "sessionResume")]
|
||||
#[CoversMethod(Database::class, "sessionExpiringSoon")]
|
||||
public function testResumeAMissingSession(): void {
|
||||
$this->assertException("invalid", "User", "ExceptionSession");
|
||||
Arsse::$db->sessionResume("thisSessionDoesNotExist");
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::sessionResume
|
||||
* @covers \JKingWeb\Arsse\Database::sessionExpiringSoon
|
||||
*/
|
||||
#[CoversMethod(Database::class, "sessionResume")]
|
||||
#[CoversMethod(Database::class, "sessionExpiringSoon")]
|
||||
public function testResumeAnExpiredSession(): void {
|
||||
$this->assertException("invalid", "User", "ExceptionSession");
|
||||
Arsse::$db->sessionResume("27c6de8da13311e78667001e673b2560");
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::sessionResume
|
||||
* @covers \JKingWeb\Arsse\Database::sessionExpiringSoon
|
||||
*/
|
||||
#[CoversMethod(Database::class, "sessionResume")]
|
||||
#[CoversMethod(Database::class, "sessionExpiringSoon")]
|
||||
public function testResumeAStaleSession(): void {
|
||||
$this->assertException("invalid", "User", "ExceptionSession");
|
||||
Arsse::$db->sessionResume("ab3b3eb8a13311e78667001e673b2560");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::sessionCreate */
|
||||
#[CoversMethod(Database::class, "sessionCreate")]
|
||||
public function testCreateASession(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$id = Arsse::$db->sessionCreate($user);
|
||||
|
@ -115,7 +109,7 @@ trait SeriesSession {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::sessionDestroy */
|
||||
#[CoversMethod(Database::class, "sessionDestroy")]
|
||||
public function testDestroyASession(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$id = "80fa94c1a11f11e78667001e673b2560";
|
||||
|
@ -127,7 +121,7 @@ trait SeriesSession {
|
|||
$this->assertFalse(Arsse::$db->sessionDestroy($user, $id));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::sessionDestroy */
|
||||
#[CoversMethod(Database::class, "sessionDestroy")]
|
||||
public function testDestroyAllSessions(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$this->assertTrue(Arsse::$db->sessionDestroy($user));
|
||||
|
@ -138,7 +132,7 @@ trait SeriesSession {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::sessionDestroy */
|
||||
#[CoversMethod(Database::class, "sessionDestroy")]
|
||||
public function testDestroyASessionForTheWrongUser(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$id = "80fa94c1a11f11e78667001e673b2560";
|
||||
|
|
|
@ -12,6 +12,8 @@ use GuzzleHttp\Exception\ClientException;
|
|||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Test\Database;
|
||||
use JKingWeb\Arsse\Feed\Exception as FeedException;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
|
||||
trait SeriesSubscription {
|
||||
public function setUpSeriesSubscription(): void {
|
||||
|
@ -205,10 +207,8 @@ trait SeriesSubscription {
|
|||
unset($this->data, $this->user);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddASubscriptionToAnExistingFeed(): void {
|
||||
$url = "http://example.com/feed1";
|
||||
$subID = $this->nextID("arsse_subscriptions");
|
||||
|
@ -224,10 +224,8 @@ trait SeriesSubscription {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddASubscriptionToANewFeed(): void {
|
||||
$url = "http://example.org/feed1";
|
||||
$feedID = $this->nextID("arsse_feeds");
|
||||
|
@ -245,10 +243,8 @@ trait SeriesSubscription {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddASubscriptionToANewFeedViaDiscovery(): void {
|
||||
$url = "http://localhost:8000/Feed/Discovery/Valid";
|
||||
$discovered = "http://localhost:8000/Feed/Discovery/Feed";
|
||||
|
@ -267,10 +263,8 @@ trait SeriesSubscription {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddASubscriptionToAnInvalidFeed(): void {
|
||||
$url = "http://example.org/feed1";
|
||||
$feedID = $this->nextID("arsse_feeds");
|
||||
|
@ -289,30 +283,24 @@ trait SeriesSubscription {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddADuplicateSubscription(): void {
|
||||
$url = "http://example.com/feed2";
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionAdd($this->user, $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddADuplicateSubscriptionWithEquivalentUrl(): void {
|
||||
$url = "http://EXAMPLE.COM/feed2";
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionAdd($this->user, $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionAdd
|
||||
* @covers \JKingWeb\Arsse\Database::feedAdd
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionAdd")]
|
||||
#[CoversMethod(Database::class, "feedAdd")]
|
||||
public function testAddADuplicateSubscriptionViaRedirection(): void {
|
||||
$url = "http://localhost:8000/Feed/Parsing/Valid";
|
||||
Arsse::$db->subscriptionAdd($this->user, $url);
|
||||
|
@ -321,7 +309,7 @@ trait SeriesSubscription {
|
|||
$this->assertSame($subID, Arsse::$db->subscriptionAdd($this->user, $url));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRemove */
|
||||
#[CoversMethod(Database::class, "subscriptionRemove")]
|
||||
public function testRemoveASubscription(): void {
|
||||
$this->assertTrue(Arsse::$db->subscriptionRemove($this->user, 1));
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -332,29 +320,27 @@ trait SeriesSubscription {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRemove */
|
||||
#[CoversMethod(Database::class, "subscriptionRemove")]
|
||||
public function testRemoveAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionRemove($this->user, 2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRemove */
|
||||
#[CoversMethod(Database::class, "subscriptionRemove")]
|
||||
public function testRemoveAnInvalidSubscription(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionRemove($this->user, -1);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRemove */
|
||||
#[CoversMethod(Database::class, "subscriptionRemove")]
|
||||
public function testRemoveASubscriptionForTheWrongOwner(): void {
|
||||
$this->user = "jane.doe@example.com";
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionRemove($this->user, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionList
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesGet
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionList")]
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesGet")]
|
||||
public function testListSubscriptions(): void {
|
||||
$exp = [
|
||||
[
|
||||
|
@ -415,7 +401,7 @@ trait SeriesSubscription {
|
|||
$this->assertResult($exp, Arsse::$db->subscriptionList("jill.doe@example.com"));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionList */
|
||||
#[CoversMethod(Database::class, "subscriptionList")]
|
||||
public function testListSubscriptionsInAFolder(): void {
|
||||
$exp = [
|
||||
[
|
||||
|
@ -431,7 +417,7 @@ trait SeriesSubscription {
|
|||
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user, null, false));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionList */
|
||||
#[CoversMethod(Database::class, "subscriptionList")]
|
||||
public function testListSubscriptionsWithRecursion(): void {
|
||||
$exp = [
|
||||
[
|
||||
|
@ -447,41 +433,39 @@ trait SeriesSubscription {
|
|||
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user, 2));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionList */
|
||||
#[CoversMethod(Database::class, "subscriptionList")]
|
||||
public function testListSubscriptionsInAMissingFolder(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionList($this->user, 4);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionCount */
|
||||
#[CoversMethod(Database::class, "subscriptionCount")]
|
||||
public function testCountSubscriptions(): void {
|
||||
$this->assertSame(3, Arsse::$db->subscriptionCount($this->user));
|
||||
$this->assertSame(1, Arsse::$db->subscriptionCount($this->user, 2));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionCount */
|
||||
#[CoversMethod(Database::class, "subscriptionCount")]
|
||||
public function testCountSubscriptionsInAMissingFolder(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionCount($this->user, 4);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionPropertiesGet */
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesGet")]
|
||||
public function testGetThePropertiesOfAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesGet($this->user, 2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionPropertiesGet */
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesGet")]
|
||||
public function testGetThePropertiesOfAnInvalidSubscription(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesGet($this->user, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testSetThePropertiesOfASubscription(): void {
|
||||
Arsse::$db->subscriptionPropertiesSet($this->user, 1, [
|
||||
'title' => "Ook Ook",
|
||||
|
@ -510,31 +494,25 @@ trait SeriesSubscription {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testMoveASubscriptionToAMissingFolder(): void {
|
||||
$this->assertException("idMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesSet($this->user, 1, ['folder' => 4]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testMoveASubscriptionToTheRootFolder(): void {
|
||||
$this->assertTrue(Arsse::$db->subscriptionPropertiesSet($this->user, 3, ['folder' => null]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideInvalidSubscriptionProperties
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[DataProvider("provideInvalidSubscriptionProperties")]
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testSetThePropertiesOfASubscriptionToInvalidValues(array $data, string $exp): void {
|
||||
$this->assertException($exp, "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesSet($this->user, 1, $data);
|
||||
|
@ -552,36 +530,30 @@ trait SeriesSubscription {
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testRenameASubscriptionToZero(): void {
|
||||
$this->assertTrue(Arsse::$db->subscriptionPropertiesSet($this->user, 1, ['title' => 0]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testSetThePropertiesOfAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesSet($this->user, 2112, ['folder' => null]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testSetThePropertiesOfAnInvalidSubscription(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionPropertiesSet($this->user, -1, ['folder' => null]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionIcon */
|
||||
#[CoversMethod(Database::class, "subscriptionIcon")]
|
||||
public function testRetrieveTheFaviconOfASubscription(): void {
|
||||
$exp = "http://example.com/favicon.ico";
|
||||
$this->assertSame($exp, Arsse::$db->subscriptionIcon(null, 1)['url']);
|
||||
|
@ -589,13 +561,13 @@ trait SeriesSubscription {
|
|||
$this->assertSame(null, Arsse::$db->subscriptionIcon(null, 6));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionIcon */
|
||||
#[CoversMethod(Database::class, "subscriptionIcon")]
|
||||
public function testRetrieveTheFaviconOfAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionIcon(null, -2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionIcon */
|
||||
#[CoversMethod(Database::class, "subscriptionIcon")]
|
||||
public function testRetrieveTheFaviconOfASubscriptionWithUser(): void {
|
||||
$exp = "http://example.com/favicon.ico";
|
||||
$user = "john.doe@example.com";
|
||||
|
@ -605,14 +577,14 @@ trait SeriesSubscription {
|
|||
$this->assertSame($exp, Arsse::$db->subscriptionIcon($user, 2)['url']);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionIcon */
|
||||
#[CoversMethod(Database::class, "subscriptionIcon")]
|
||||
public function testRetrieveTheFaviconOfASubscriptionOfTheWrongUser(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionIcon($user, 2);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionTagsGet */
|
||||
#[CoversMethod(Database::class, "subscriptionTagsGet")]
|
||||
public function testListTheTagsOfASubscription(): void {
|
||||
$this->assertEquals([1,2], Arsse::$db->subscriptionTagsGet("john.doe@example.com", 1));
|
||||
$this->assertEquals([2], Arsse::$db->subscriptionTagsGet("john.doe@example.com", 3));
|
||||
|
@ -620,30 +592,28 @@ trait SeriesSubscription {
|
|||
$this->assertEquals(["Fascinating"], Arsse::$db->subscriptionTagsGet("john.doe@example.com", 3, true));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionTagsGet */
|
||||
#[CoversMethod(Database::class, "subscriptionTagsGet")]
|
||||
public function testListTheTagsOfAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->subscriptionTagsGet($this->user, 101);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRefreshed */
|
||||
#[CoversMethod(Database::class, "subscriptionRefreshed")]
|
||||
public function testGetRefreshTimeOfASubscription(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$this->assertTime(strtotime("now + 1 hour"), Arsse::$db->subscriptionRefreshed($user));
|
||||
$this->assertTime(strtotime("now - 1 hour"), Arsse::$db->subscriptionRefreshed($user, 1));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::subscriptionRefreshed */
|
||||
#[CoversMethod(Database::class, "subscriptionRefreshed")]
|
||||
public function testGetRefreshTimeOfAMissingSubscription(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
$this->assertTime(strtotime("now - 1 hour"), Arsse::$db->subscriptionRefreshed("john.doe@example.com", 2));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::subscriptionRulesApply
|
||||
*/
|
||||
#[CoversMethod(Database::class, "subscriptionPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "subscriptionValidateId")]
|
||||
#[CoversMethod(Database::class, "subscriptionRulesApply")]
|
||||
public function testSetTheFilterRulesOfASubscriptionCheckingMarks(): void {
|
||||
Arsse::$db->subscriptionPropertiesSet("jack.doe@example.com", 5, ['keep_rule' => "1|B|3|D", 'block_rule' => "4"]);
|
||||
$state = $this->primeExpectations($this->data, ['arsse_marks' => ['article', 'subscription', 'hidden']]);
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace JKingWeb\Arsse\TestCase\Database;
|
|||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesTag {
|
||||
protected $checkMembers;
|
||||
|
@ -114,10 +115,8 @@ trait SeriesTag {
|
|||
unset($this->data, $this->checkTags, $this->checkMembers, $this->user);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagAdd
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagAdd")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testAddATag(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$tagID = $this->nextID("arsse_tags");
|
||||
|
@ -127,43 +126,35 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagAdd
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagAdd")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testAddADuplicateTag(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagAdd("john.doe@example.com", ['name' => "Interesting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagAdd
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagAdd")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testAddATagWithAMissingName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagAdd("john.doe@example.com", []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagAdd
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagAdd")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testAddATagWithABlankName(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagAdd("john.doe@example.com", ['name' => ""]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagAdd
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagAdd")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testAddATagWithAWhitespaceName(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagAdd("john.doe@example.com", ['name' => " "]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tagList */
|
||||
#[CoversMethod(Database::class, "tagList")]
|
||||
public function testListTags(): void {
|
||||
$exp = [
|
||||
['id' => 2, 'name' => "Fascinating"],
|
||||
|
@ -179,10 +170,8 @@ trait SeriesTag {
|
|||
$this->assertResult($exp, Arsse::$db->tagList("jane.doe@example.com", false));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveATag(): void {
|
||||
$this->assertTrue(Arsse::$db->tagRemove("john.doe@example.com", 1));
|
||||
$state = $this->primeExpectations($this->data, $this->checkTags);
|
||||
|
@ -190,10 +179,8 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveATagByName(): void {
|
||||
$this->assertTrue(Arsse::$db->tagRemove("john.doe@example.com", "Interesting", true));
|
||||
$state = $this->primeExpectations($this->data, $this->checkTags);
|
||||
|
@ -201,46 +188,36 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveAMissingTag(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagRemove("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveAnInvalidTag(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagRemove("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveAnInvalidTagByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagRemove("john.doe@example.com", [], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagRemove
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagRemove")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testRemoveATagOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagRemove("john.doe@example.com", 3); // tag ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testGetThePropertiesOfATag(): void {
|
||||
$exp = [
|
||||
'id' => 2,
|
||||
|
@ -250,56 +227,44 @@ trait SeriesTag {
|
|||
$this->assertArraySubset($exp, Arsse::$db->tagPropertiesGet("john.doe@example.com", "Fascinating", true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testGetThePropertiesOfAMissingTag(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesGet("john.doe@example.com", 2112);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testGetThePropertiesOfAnInvalidTag(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesGet("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testGetThePropertiesOfAnInvalidTagByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesGet("john.doe@example.com", [], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testGetThePropertiesOfATagOfTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesGet("john.doe@example.com", 3); // tag ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testMakeNoChangesToATag(): void {
|
||||
$this->assertFalse(Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, []));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testRenameATag(): void {
|
||||
$this->assertTrue(Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, ['name' => "Curious"]));
|
||||
$state = $this->primeExpectations($this->data, $this->checkTags);
|
||||
|
@ -307,11 +272,9 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testRenameATagByName(): void {
|
||||
$this->assertTrue(Arsse::$db->tagPropertiesSet("john.doe@example.com", "Interesting", ['name' => "Curious"], true));
|
||||
$state = $this->primeExpectations($this->data, $this->checkTags);
|
||||
|
@ -319,90 +282,72 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testRenameATagToTheEmptyString(): void {
|
||||
$this->assertException("missing", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, ['name' => ""]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testRenameATagToWhitespaceOnly(): void {
|
||||
$this->assertException("whitespace", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, ['name' => " "]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testRenameATagToAnInvalidValue(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
$this->assertTrue(Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, ['name' => []]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testCauseATagCollision(): void {
|
||||
$this->assertException("constraintViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesSet("john.doe@example.com", 1, ['name' => "Fascinating"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testSetThePropertiesOfAMissingTag(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesSet("john.doe@example.com", 2112, ['name' => "Exciting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testSetThePropertiesOfAnInvalidTag(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesSet("john.doe@example.com", -1, ['name' => "Exciting"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testSetThePropertiesOfAnInvalidTagByName(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesSet("john.doe@example.com", [], ['name' => "Exciting"], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagPropertiesSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateName
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagPropertiesSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
#[CoversMethod(Database::class, "tagValidateName")]
|
||||
public function testSetThePropertiesOfATagForTheWrongOwner(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagPropertiesSet("john.doe@example.com", 3, ['name' => "Exciting"]); // tag ID 3 belongs to Jane
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testListTaggedSubscriptions(): void {
|
||||
$exp = [1,5];
|
||||
$this->assertEquals($exp, Arsse::$db->tagSubscriptionsGet("john.doe@example.com", 1));
|
||||
|
@ -415,28 +360,22 @@ trait SeriesTag {
|
|||
$this->assertEquals($exp, Arsse::$db->tagSubscriptionsGet("john.doe@example.com", "Lonely", true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testListTaggedSubscriptionsForAMissingTag(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagSubscriptionsGet("john.doe@example.com", 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsGet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsGet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testListTaggedSubscriptionsForAnInvalidTag(): void {
|
||||
$this->assertException("typeViolation", "Db", "ExceptionInput");
|
||||
Arsse::$db->tagSubscriptionsGet("john.doe@example.com", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testApplyATagToSubscriptions(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", 1, [3,4]);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -445,10 +384,8 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testClearATagFromSubscriptions(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", 1, [1,3], Database::ASSOC_REMOVE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -456,10 +393,8 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testApplyATagToSubscriptionsByName(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", "Interesting", [3,4], Database::ASSOC_ADD, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -468,10 +403,8 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testClearATagFromSubscriptionsByName(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", "Interesting", [1,3], Database::ASSOC_REMOVE, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -479,30 +412,24 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testApplyATagToNoSubscriptionsByName(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", "Interesting", [], Database::ASSOC_ADD, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testClearATagFromNoSubscriptionsByName(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", "Interesting", [], Database::ASSOC_REMOVE, true);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testReplaceSubscriptionsOfATag(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", 1, [3,4], Database::ASSOC_REPLACE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -513,10 +440,8 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::tagSubscriptionsSet
|
||||
* @covers \JKingWeb\Arsse\Database::tagValidateId
|
||||
*/
|
||||
#[CoversMethod(Database::class, "tagSubscriptionsSet")]
|
||||
#[CoversMethod(Database::class, "tagValidateId")]
|
||||
public function testPurgeSubscriptionsOfATag(): void {
|
||||
Arsse::$db->tagSubscriptionsSet("john.doe@example.com", 1, [], Database::ASSOC_REPLACE);
|
||||
$state = $this->primeExpectations($this->data, $this->checkMembers);
|
||||
|
@ -525,7 +450,7 @@ trait SeriesTag {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tagSummarize */
|
||||
#[CoversMethod(Database::class, "tagSummarize")]
|
||||
public function testSummarizeTags(): void {
|
||||
$exp = [
|
||||
['id' => 1, 'name' => "Interesting", 'subscription' => 1],
|
||||
|
|
|
@ -9,6 +9,8 @@ declare(strict_types=1);
|
|||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
trait SeriesToken {
|
||||
protected function setUpSeriesToken(): void {
|
||||
|
@ -54,7 +56,7 @@ trait SeriesToken {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenLookup */
|
||||
#[CoversMethod(Database::class, "tokenLookup")]
|
||||
public function testLookUpAValidToken(): void {
|
||||
$exp1 = [
|
||||
'id' => "80fa94c1a11f11e78667001e673b2560",
|
||||
|
@ -76,25 +78,25 @@ trait SeriesToken {
|
|||
$this->assertArraySubset($exp3, Arsse::$db->tokenLookup("class.class", "ab3b3eb8a13311e78667001e673b2560"));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenLookup */
|
||||
#[CoversMethod(Database::class, "tokenLookup")]
|
||||
public function testLookUpAMissingToken(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tokenLookup("class", "thisTokenDoesNotExist");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenLookup */
|
||||
#[CoversMethod(Database::class, "tokenLookup")]
|
||||
public function testLookUpAnExpiredToken(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tokenLookup("fever.login", "27c6de8da13311e78667001e673b2560");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenLookup */
|
||||
#[CoversMethod(Database::class, "tokenLookup")]
|
||||
public function testLookUpATokenOfTheWrongClass(): void {
|
||||
$this->assertException("subjectMissing", "Db", "ExceptionInput");
|
||||
Arsse::$db->tokenLookup("some.class", "80fa94c1a11f11e78667001e673b2560");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenCreate */
|
||||
#[CoversMethod(Database::class, "tokenCreate")]
|
||||
public function testCreateAToken(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$state = $this->primeExpectations($this->data, ['arsse_tokens' => ["id", "class", "expires", "user"]]);
|
||||
|
@ -109,13 +111,13 @@ trait SeriesToken {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenCreate */
|
||||
#[CoversMethod(Database::class, "tokenCreate")]
|
||||
public function testCreateATokenForAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->tokenCreate("fever.login", "jane.doe@example.biz");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenRevoke */
|
||||
#[CoversMethod(Database::class, "tokenRevoke")]
|
||||
public function testRevokeAToken(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$id = "80fa94c1a11f11e78667001e673b2560";
|
||||
|
@ -127,7 +129,7 @@ trait SeriesToken {
|
|||
$this->assertFalse(Arsse::$db->tokenRevoke($user, "fever.login", $id));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenRevoke */
|
||||
#[CoversMethod(Database::class, "tokenRevoke")]
|
||||
public function testRevokeAllTokens(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$state = $this->primeExpectations($this->data, ['arsse_tokens' => ["id", "expires", "user"]]);
|
||||
|
@ -142,7 +144,7 @@ trait SeriesToken {
|
|||
$this->assertFalse(Arsse::$db->tokenRevoke($user, "unknown.class"));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::tokenList */
|
||||
#[CoversMethod(Database::class, "tokenList")]
|
||||
public function testListTokens(): void {
|
||||
$user = "jane.doe@example.com";
|
||||
$exp = [
|
||||
|
|
|
@ -9,6 +9,9 @@ declare(strict_types=1);
|
|||
namespace JKingWeb\Arsse\TestCase\Database;
|
||||
|
||||
use JKingWeb\Arsse\Arsse;
|
||||
use JKingWeb\Arsse\Database;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
|
||||
trait SeriesUser {
|
||||
protected function setUpSeriesUser(): void {
|
||||
|
@ -49,27 +52,27 @@ trait SeriesUser {
|
|||
unset($this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userExists */
|
||||
#[CoversMethod(Database::class, "userExists")]
|
||||
public function testCheckThatAUserExists(): void {
|
||||
$this->assertTrue(Arsse::$db->userExists("jane.doe@example.com"));
|
||||
$this->assertFalse(Arsse::$db->userExists("jane.doe@example.org"));
|
||||
$this->compareExpectations(static::$drv, $this->data);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPasswordGet */
|
||||
#[CoversMethod(Database::class, "userPasswordGet")]
|
||||
public function testGetAPassword(): void {
|
||||
$hash = Arsse::$db->userPasswordGet("admin@example.net");
|
||||
$this->assertSame('$2y$10$PbcG2ZR3Z8TuPzM7aHTF8.v61dtCjzjK78gdZJcp4UePE8T9jEgBW', $hash);
|
||||
$this->assertTrue(password_verify("secret", $hash));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPasswordGet */
|
||||
#[CoversMethod(Database::class, "userPasswordGet")]
|
||||
public function testGetThePasswordOfAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userPasswordGet("john.doe@example.org");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userAdd */
|
||||
#[CoversMethod(Database::class, "userAdd")]
|
||||
public function testAddANewUser(): void {
|
||||
$this->assertTrue(Arsse::$db->userAdd("john.doe@example.org", ""));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_users' => ['id']]);
|
||||
|
@ -77,13 +80,13 @@ trait SeriesUser {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userAdd */
|
||||
#[CoversMethod(Database::class, "userAdd")]
|
||||
public function testAddAnExistingUser(): void {
|
||||
$this->assertException("alreadyExists", "User", "ExceptionConflict");
|
||||
Arsse::$db->userAdd("john.doe@example.com", "");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRemove */
|
||||
#[CoversMethod(Database::class, "userRemove")]
|
||||
public function testRemoveAUser(): void {
|
||||
$this->assertTrue(Arsse::$db->userRemove("admin@example.net"));
|
||||
$state = $this->primeExpectations($this->data, ['arsse_users' => ['id']]);
|
||||
|
@ -91,19 +94,19 @@ trait SeriesUser {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRemove */
|
||||
#[CoversMethod(Database::class, "userRemove")]
|
||||
public function testRemoveAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userRemove("john.doe@example.org");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userList */
|
||||
#[CoversMethod(Database::class, "userList")]
|
||||
public function testListAllUsers(): void {
|
||||
$users = ["admin@example.net", "jane.doe@example.com", "john.doe@example.com"];
|
||||
$this->assertSame($users, Arsse::$db->userList());
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPasswordSet */
|
||||
#[CoversMethod(Database::class, "userPasswordSet")]
|
||||
public function testSetAPassword(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$pass = "secret";
|
||||
|
@ -114,7 +117,7 @@ trait SeriesUser {
|
|||
$this->assertTrue(password_verify($pass, $hash), "Failed verifying password of $user '$pass' against hash '$hash'.");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPasswordSet */
|
||||
#[CoversMethod(Database::class, "userPasswordSet")]
|
||||
public function testUnsetAPassword(): void {
|
||||
$user = "john.doe@example.com";
|
||||
$this->assertEquals("", Arsse::$db->userPasswordGet($user));
|
||||
|
@ -122,16 +125,14 @@ trait SeriesUser {
|
|||
$this->assertNull(Arsse::$db->userPasswordGet($user));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPasswordSet */
|
||||
#[CoversMethod(Database::class, "userPasswordSet")]
|
||||
public function testSetThePasswordOfAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userPasswordSet("john.doe@example.org", "secret");
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideMetaData
|
||||
* @covers \JKingWeb\Arsse\Database::userPropertiesGet
|
||||
*/
|
||||
#[DataProvider("provideMetaData")]
|
||||
#[CoversMethod(Database::class, "userPropertiesGet")]
|
||||
public function testGetMetadata(string $user, bool $includeLarge, array $exp): void {
|
||||
$this->assertSame($exp, Arsse::$db->userPropertiesGet($user, $includeLarge));
|
||||
}
|
||||
|
@ -147,13 +148,13 @@ trait SeriesUser {
|
|||
];
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPropertiesGet */
|
||||
#[CoversMethod(Database::class, "userPropertiesGet")]
|
||||
public function testGetTheMetadataOfAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userPropertiesGet("john.doe@example.org");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPropertiesSet */
|
||||
#[CoversMethod(Database::class, "userPropertiesSet")]
|
||||
public function testSetMetadata(): void {
|
||||
$in = [
|
||||
'admin' => true,
|
||||
|
@ -170,7 +171,7 @@ trait SeriesUser {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPropertiesSet */
|
||||
#[CoversMethod(Database::class, "userPropertiesSet")]
|
||||
public function testSetNoMetadata(): void {
|
||||
$in = [
|
||||
'num' => 2112,
|
||||
|
@ -181,26 +182,26 @@ trait SeriesUser {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userPropertiesSet */
|
||||
#[CoversMethod(Database::class, "userPropertiesSet")]
|
||||
public function testSetTheMetadataOfAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userPropertiesSet("john.doe@example.org", ['admin' => true]);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userLookup */
|
||||
#[CoversMethod(Database::class, "userLookup")]
|
||||
public function testLookUpAUserByNumber(): void {
|
||||
$this->assertSame("admin@example.net", Arsse::$db->userLookup(1));
|
||||
$this->assertSame("jane.doe@example.com", Arsse::$db->userLookup(2));
|
||||
$this->assertSame("john.doe@example.com", Arsse::$db->userLookup(3));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userLookup */
|
||||
#[CoversMethod(Database::class, "userLookup")]
|
||||
public function testLookUpAMissingUserByNumber(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userLookup(2112);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRename */
|
||||
#[CoversMethod(Database::class, "userRename")]
|
||||
public function testRenameAUser(): void {
|
||||
$this->assertTrue(Arsse::$db->userRename("john.doe@example.com", "juan.doe@example.com"));
|
||||
$state = $this->primeExpectations($this->data, [
|
||||
|
@ -212,24 +213,24 @@ trait SeriesUser {
|
|||
$this->compareExpectations(static::$drv, $state);
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRename */
|
||||
#[CoversMethod(Database::class, "userRename")]
|
||||
public function testRenameAUserToTheSameName(): void {
|
||||
$this->assertFalse(Arsse::$db->userRename("john.doe@example.com", "john.doe@example.com"));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRename */
|
||||
#[CoversMethod(Database::class, "userRename")]
|
||||
public function testRenameAMissingUser(): void {
|
||||
$this->assertException("doesNotExist", "User", "ExceptionConflict");
|
||||
Arsse::$db->userRename("juan.doe@example.com", "john.doe@example.com");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userRename */
|
||||
#[CoversMethod(Database::class, "userRename")]
|
||||
public function testRenameAUserToADuplicateName(): void {
|
||||
$this->assertException("alreadyExists", "User", "ExceptionConflict");
|
||||
Arsse::$db->userRename("john.doe@example.com", "jane.doe@example.com");
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::userAdd */
|
||||
#[CoversMethod(Database::class, "userAdd")]
|
||||
public function testAddFirstUser(): void {
|
||||
// first truncate the users table
|
||||
static::$drv->exec("DELETE FROM arsse_users");
|
||||
|
|
|
@ -12,6 +12,7 @@ use JKingWeb\Arsse\Database;
|
|||
use JKingWeb\Arsse\Db\Transaction;
|
||||
use PHPUnit\Framework\Attributes\CoversNothing;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
|
||||
#[CoversNothing]
|
||||
class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
||||
|
@ -38,9 +39,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
return $m->invoke($this->db, ...$arg);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::generateIn
|
||||
*/
|
||||
#[CoversMethod(Database::class, "generateIn")]
|
||||
#[DataProvider('provideInClauses')]
|
||||
public function testGenerateInClause(string $clause, array $values, array $inV, string $inT): void {
|
||||
$types = array_fill(0, sizeof($values), $inT);
|
||||
|
@ -75,9 +74,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \JKingWeb\Arsse\Database::generateSearch
|
||||
*/
|
||||
#[CoversMethod(Database::class, "generateSearch")]
|
||||
#[DataProvider('provideSearchClauses')]
|
||||
public function testGenerateSearchClause(string $clause, array $values, array $inV, array $inC, bool $inAny): void {
|
||||
// this is not an exhaustive test; integration tests already cover the ins and outs of the functionality
|
||||
|
@ -102,7 +99,7 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
];
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::generateSet */
|
||||
#[CoversMethod(Database::class, "generateSet")]
|
||||
public function testGenerateSetClause(): void {
|
||||
$in = [
|
||||
'ook' => true,
|
||||
|
@ -124,12 +121,12 @@ class TestDatabase extends \JKingWeb\Arsse\Test\AbstractTest {
|
|||
$this->assertSame($exp, $this->invoke("generateSet", $in, $valid));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::begin */
|
||||
#[CoversMethod(Database::class, "begin")]
|
||||
public function testBeginATransaction(): void {
|
||||
$this->assertInstanceOf(Transaction::class, $this->invoke("begin"));
|
||||
}
|
||||
|
||||
/** @covers \JKingWeb\Arsse\Database::caller */
|
||||
#[CoversMethod(Database::class, "caller")]
|
||||
public function testReportCallingMethod(): void {
|
||||
$this->assertSame("caller", $this->invoke("caller"));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue