. */ declare(strict_types=1); namespace SP\Tests\Modules\Web\Controllers\Account; use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\MockObject\Exception; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use SP\Core\Crypt\Crypt; use SP\Core\Crypt\Vault; use SP\Domain\Account\Dtos\PublicLinkKey; use SP\Domain\Account\Models\PublicLink; use SP\Domain\Common\Models\Simple; use SP\Domain\Core\Exceptions\CryptException; use SP\Domain\Core\Exceptions\InvalidClassException; use SP\Infrastructure\Database\QueryResult; use SP\Infrastructure\File\FileException; use SP\Mvc\View\OutputHandlerInterface; use SP\Tests\Generators\AccountDataGenerator; use SP\Tests\Generators\PublicLinkDataGenerator; use SP\Tests\IntegrationTestCase; use Symfony\Component\DomCrawler\Crawler; /** * Class ViewLinkControllerTest */ #[Group('integration')] class ViewLinkControllerTest extends IntegrationTestCase { /** * @throws NotFoundExceptionInterface * @throws Exception * @throws FileException * @throws InvalidClassException * @throws ContainerExceptionInterface * @throws CryptException * @throws EnvironmentIsBrokenException */ public function testViewLinkAction() { $account = serialize(Simple::buildFromSimpleModel(AccountDataGenerator::factory()->buildAccount())); $publicLinkKey = new PublicLinkKey($this->passwordSalt); $vault = Vault::factory(new Crypt())->saveData($account, $publicLinkKey->getKey()); $publicLink = PublicLinkDataGenerator::factory() ->buildPublicLink() ->mutate( [ 'dateExpire' => time() + 100, 'maxCountViews' => 3, 'countViews' => 0, 'hash' => $publicLinkKey->getHash(), 'data' => $vault->getSerialized() ] ); $this->addDatabaseResolver(PublicLink::class, new QueryResult([$publicLink])); $definitions = $this->getModuleDefinitions(); $definitions[OutputHandlerInterface::class] = $this->setupOutputHandler(function (string $output): void { $crawler = new Crawler($output); $filter = $crawler->filterXPath( '//div[@id="actions" and @class="public-link"]//table[@class="data"]|//div[@class="item-actions"]//button' )->extract(['id']); assert(!empty($output)); assert(count($filter) === 2); $this->assertTrue(true); }); $container = $this->buildContainer( $definitions, $this->buildRequest('get', 'index.php', ['r' => 'account/viewLink/' . self::$faker->sha1()]) ); $this->runApp($container); } }