. */ namespace SP\Tests\Infrastructure\Account\Repositories; use Aura\SqlQuery\QueryFactory; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Constraint\Callback; use PHPUnit\Framework\MockObject\MockObject; use SP\Domain\Common\Models\Simple; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Database\Ports\DatabaseInterface; use SP\Infrastructure\Account\Repositories\AccountToFavorite; use SP\Infrastructure\Database\QueryData; use SP\Infrastructure\Database\QueryResult; use SP\Tests\UnitaryTestCase; /** * Class AccountToFavoriteRepositoryTest * */ #[Group('unitary')] class AccountToFavoriteTest extends UnitaryTestCase { private MockObject|DatabaseInterface $database; private AccountToFavorite $accountToFavorite; public function testGetForUserId() { $id = self::$faker->randomNumber(); $callback = new Callback( static function (QueryData $arg) use ($id) { $query = $arg->getQuery(); return $query->getBindValues()['userId'] === $id && $arg->getMapClassName() === Simple::class && !empty($query->getStatement()); } ); $this->database->expects(self::once()) ->method('runQuery') ->with($callback) ->willReturn(new QueryResult()); $this->accountToFavorite->getForUserId($id); } public function testDelete() { $accountId = self::$faker->randomNumber(); $userId = self::$faker->randomNumber(); $callback = new Callback( static function (QueryData $arg) use ($accountId, $userId) { $query = $arg->getQuery(); $params = $query->getBindValues(); return $params['accountId'] === $accountId && $params['userId'] === $userId && !empty($query->getStatement()); } ); $this->database ->expects(self::once()) ->method('runQuery') ->with($callback) ->willReturn(new QueryResult(null, 1)); $this->assertTrue($this->accountToFavorite->delete($accountId, $userId)); } /** * @throws ConstraintException * @throws QueryException */ public function testAdd() { $accountId = self::$faker->randomNumber(); $userId = self::$faker->randomNumber(); $expected = new QueryResult(null, 0, self::$faker->randomNumber()); $callback = new Callback( static function (QueryData $arg) use ($accountId, $userId) { $query = $arg->getQuery(); $params = $query->getBindValues(); return $params['accountId'] === $accountId && $params['userId'] === $userId && !empty($query->getStatement()); } ); $this->database->expects(self::once()) ->method('runQuery') ->with($callback) ->willReturn($expected); $this->assertEquals($expected->getLastId(), $this->accountToFavorite->add($accountId, $userId)); } protected function setUp(): void { parent::setUp(); $this->database = $this->createMock(DatabaseInterface::class); $queryFactory = new QueryFactory('mysql'); $this->accountToFavorite = new AccountToFavorite( $this->database, $this->context, $this->application->getEventDispatcher(), $queryFactory, ); } }