. */ declare(strict_types=1); namespace SP\Tests\Modules\Web\Controllers\AccessManager; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\MockObject\Stub; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use SP\Domain\Config\Ports\ConfigDataInterface; use SP\Domain\Core\Bootstrap\BootstrapInterface; use SP\Domain\Core\Bootstrap\ModuleInterface; use SP\Domain\Core\Exceptions\InvalidClassException; use SP\Domain\User\Models\ProfileData; use SP\Infrastructure\File\FileException; use SP\Infrastructure\File\FileSystem; use SP\Modules\Web\Bootstrap; use SP\Mvc\View\OutputHandlerInterface; use SP\Tests\IntegrationTestCase; use Symfony\Component\DomCrawler\Crawler; /** * Class IndexControllerTest */ #[Group('integration')] class IndexControllerTest extends IntegrationTestCase { /** * @throws Exception * @throws FileException * @throws InvalidClassException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function testIndexAction() { $outputHandler = $this->createMock(OutputHandlerInterface::class); $definitions = FileSystem::require(FileSystem::buildPath(REAL_APP_ROOT, 'app', 'modules', 'web', 'module.php')); $definitions[OutputHandlerInterface::class] = $outputHandler; $outputHandler->expects($this->once()) ->method('bufferedContent') ->with( self::callback(static function (callable $callback) { ob_start(); $callback(); $output = ob_get_clean(); $crawler = new Crawler($output); $filter = $crawler->filterXPath( '//div[contains(@id, \'tabs-\')]//form' )->extract(['id']); return !empty($output) && count($filter) === 5; }) ); $container = $this->buildContainer( $definitions, $this->buildRequest('get', 'index.php', ['r' => 'accessManager/index']) ); Bootstrap::run($container->get(BootstrapInterface::class), $container->get(ModuleInterface::class)); } protected function getUserProfile(): ProfileData { return new ProfileData( [ 'mgmUsers' => true, 'mgmGroups' => true, 'mgmProfiles' => true, 'mgmApiTokens' => true, 'mgmPublicLinks' => true ] ); } protected function getConfigData(): ConfigDataInterface|Stub { $configData = parent::getConfigData(); $configData->method('isPublinksEnabled')->willReturn(true); return $configData; } }