symfony codeception: Проверка запрета доступа к методу контроллера/авторизации, броска исключения expectThrowable - Пример
Primary tabs
Предположим, что у нас есть метод контроллера с описанием доступа вроде:
При этом у нас метод контролеера имеет какой-то такой доступ: <pre class="brush: php"> #[IsGranted(attribute: 'ROLE_USER', message: 'Нужна авторизация', exceptionCode: 401)] #[IsGranted( attribute: new Expression('is_granted("ROLE_A") or is_granted("ROLE_UR")' . ' and user.getId() === subject'), subject: new Expression('args["post"].getUserId()'), message: 'Пользователь не является автором поста.', )] #[Route('/edit/{id}', name: 'app_post_edit', methods: 'PUT')] public function edit( Post $post, EntityManagerInterface $entityManager, </pre>
Тогда проверить, что пользователь не имеет доступа можно как-то так:
/** * @before authAsSimpleUserPetya */ public function canNotEditBySimpleUserArticleCreatedByOtherSimpleUser(FunctionalTester $I) { $client = $this->client; // говорим, что мы ожидаем отказ доступа в виде исключения $I->expectThrowable(AccessDeniedException::class, function () use ($client) { $client->request( 'PUT', '/api/' . $this->getApiVersion() . '/post/edit/' . $this->postId, [], [], [], '{"tags":[555,111,24,7,1],"questions":[]}' ); }); // $I->pre('Запрет другому пользователю редактировать статью пользователя Vasya'); }
(мы каким-то образом логинимся под пользователем, который не имеет доступа к редактированию, тут используется аннотация before кодесепшенна)
-- для перехвата таким способом именно в тесте нужно будет выключить перехват исключений в клиенте.
- Log in to post comments
- 465 reads