seasonVoter = new SeasonVoter(); $this->token = $this->createStub(TokenInterface::class); $user = $this->createStub(User::class); $this->token->method('getUser')->willReturn($user); } #[DataProvider('typesProvider')] public function testWithTypes(mixed $subject): void { $this->assertSame(VoterInterface::ACCESS_GRANTED, $this->seasonVoter->vote($this->token, $subject, ['SEASON_EDIT'])); } public function testNotOwnerWillReturnDenied(): void { $season = self::createStub(Season::class); $season->method('isOwner')->willReturn(false); $this->assertSame(VoterInterface::ACCESS_DENIED, $this->seasonVoter->vote($this->token, $season, ['SEASON_EDIT'])); } public static function typesProvider(): \Generator { $season = self::createStub(Season::class); $season->method('isOwner')->willReturn(true); yield 'Season' => [$season]; $candidate = self::createStub(Candidate::class); $candidate->season = $season; yield 'Candidate' => [$candidate]; $quiz = self::createStub(Quiz::class); $quiz->season = $season; yield 'Quiz' => [$quiz]; $elimination = self::createStub(Elimination::class); $elimination->quiz = $quiz; yield 'Elimination' => [$elimination]; $question = self::createStub(Question::class); $question->quiz = $quiz; yield 'Question' => [$question]; $answer = self::createStub(Answer::class); $answer->question = $question; yield 'Answer' => [$answer]; } public function testWrongUserTypeReturnFalse(): void { $user = self::createStub(UserInterface::class); $token = $this->createStub(TokenInterface::class); $token->method('getUser')->willReturn($user); $this->assertSame(VoterInterface::ACCESS_DENIED, $this->seasonVoter->vote($token, new Season(), ['SEASON_EDIT'])); } public function testAdminCanDoAnything(): void { $user = new User(); $user->roles = ['ROLE_ADMIN']; $token = $this->createStub(TokenInterface::class); $token->method('getUser')->willReturn($user); $this->assertSame(VoterInterface::ACCESS_GRANTED, $this->seasonVoter->vote($token, new Season(), ['SEASON_EDIT'])); } public function testRandomClassWillAbstain(): void { $subject = new \stdClass(); $this->assertSame(VoterInterface::ACCESS_ABSTAIN, $this->seasonVoter->vote($this->token, $subject, ['SEASON_EDIT'])); } public function testRandomSunjectWillAbstain(): void { $subject = new Season(); $this->assertSame(VoterInterface::ACCESS_ABSTAIN, $this->seasonVoter->vote($this->token, $subject, ['DO_NOTHING'])); } }