createMock(Query::class); $query ->expects(self::once()) ->method('execute') ->willReturn(2); $threshold = new \DateTimeImmutable('2026-05-29 01:00:00'); $queryBuilder = $this->createMock(QueryBuilder::class); $andWhereCalls = 0; $queryBuilder ->expects(self::once()) ->method('delete') ->willReturnSelf(); $queryBuilder ->expects(self::once()) ->method('where') ->with('u.welcomeActivatedAt IS NULL') ->willReturnSelf(); $queryBuilder ->expects(self::exactly(2)) ->method('andWhere') ->willReturnCallback(function (string $condition) use (&$andWhereCalls, $queryBuilder): QueryBuilder { $expectedConditions = [ 'u.welcomeActivationExpiresAt IS NOT NULL', 'u.welcomeActivationExpiresAt <= :threshold', ]; self::assertSame($expectedConditions[$andWhereCalls], $condition); ++$andWhereCalls; return $queryBuilder; }); $queryBuilder ->expects(self::once()) ->method('setParameter') ->with('threshold', $threshold) ->willReturnSelf(); $queryBuilder ->expects(self::once()) ->method('getQuery') ->willReturn($query); $repository = new class($queryBuilder) extends UserRepository { public function __construct(private readonly QueryBuilder $queryBuilder) { } public function createQueryBuilder($alias, $indexBy = null): QueryBuilder { return $this->queryBuilder; } }; self::assertSame(2, $repository->deleteExpiredDormantGuestInvites($threshold)); } }