connection = Server::get(IDBConnection::class); $this->extraPermissions = new ExtraPermissions( $this->createStub(LoggerInterface::class), $this->createStub(IManager::class), $this->createStub(IAppConfig::class), $this->createStub(AppConfig::class), $this->connection, null, ); $this->cleanUp(); } protected function tearDown(): void { $this->cleanUp(); parent::tearDown(); } private function cleanUp(): void { $this->connection->prepare( "DELETE FROM `*PREFIX*onlyoffice_permissions` WHERE `share_id` IN (?, ?, ?)" )->execute([self::SHARE_ID_A, self::SHARE_ID_B, self::SHARE_ID_C]); } private function insertRow(string $shareId, int $permissions = ExtraPermissions::REVIEW): void { $this->connection->prepare( "INSERT INTO `*PREFIX*onlyoffice_permissions` (`share_id`, `permissions`) VALUES (?, ?)" )->execute([$shareId, $permissions]); } private function rowExists(string $shareId): bool { $result = $this->connection->prepare( "SELECT COUNT(*) AS cnt FROM `*PREFIX*onlyoffice_permissions` WHERE `share_id` = ?" )->execute([$shareId]); $row = $result->fetch(); return (int)$row["cnt"] > 0; } /** * Returns true and removes the row for the given share ID. */ public function testDeleteRemovesExistingRow(): void { $this->insertRow(self::SHARE_ID_A); $result = $this->extraPermissions->delete(self::SHARE_ID_A); $this->assertTrue($result); $this->assertFalse($this->rowExists(self::SHARE_ID_A)); } /** * Returns true even when no row exists for the given share ID. */ public function testDeleteReturnsTrueWhenRowDoesNotExist(): void { $result = $this->extraPermissions->delete(self::SHARE_ID_A); $this->assertTrue($result); } /** * Removes only the targeted share row, leaving others intact. */ public function testDeleteDoesNotAffectOtherRows(): void { $this->insertRow(self::SHARE_ID_A); $this->insertRow(self::SHARE_ID_B); $this->extraPermissions->delete(self::SHARE_ID_A); $this->assertFalse($this->rowExists(self::SHARE_ID_A)); $this->assertTrue($this->rowExists(self::SHARE_ID_B)); } /** * Removes all rows whose share IDs appear in the given list. */ public function testDeleteListRemovesAllMatchingRows(): void { $this->insertRow(self::SHARE_ID_A); $this->insertRow(self::SHARE_ID_B); $this->insertRow(self::SHARE_ID_C); $result = $this->extraPermissions->deleteList([self::SHARE_ID_A, self::SHARE_ID_B, self::SHARE_ID_C]); $this->assertTrue($result); $this->assertFalse($this->rowExists(self::SHARE_ID_A)); $this->assertFalse($this->rowExists(self::SHARE_ID_B)); $this->assertFalse($this->rowExists(self::SHARE_ID_C)); } /** * Removes only the listed share rows, leaving unlisted ones intact. */ public function testDeleteListDoesNotAffectUnlistedRows(): void { $this->insertRow(self::SHARE_ID_A); $this->insertRow(self::SHARE_ID_B); $this->extraPermissions->deleteList([self::SHARE_ID_A]); $this->assertFalse($this->rowExists(self::SHARE_ID_A)); $this->assertTrue($this->rowExists(self::SHARE_ID_B)); } /** * Accepts a single-element list without SQL errors. */ public function testDeleteListWithSingleElement(): void { $this->insertRow(self::SHARE_ID_A); $result = $this->extraPermissions->deleteList([self::SHARE_ID_A]); $this->assertTrue($result); $this->assertFalse($this->rowExists(self::SHARE_ID_A)); } }