diff --git a/lib/SP/Repositories/Category/CategoryRepository.php b/lib/SP/Repositories/Category/CategoryRepository.php index 42dfef1d..51e02515 100644 --- a/lib/SP/Repositories/Category/CategoryRepository.php +++ b/lib/SP/Repositories/Category/CategoryRepository.php @@ -154,7 +154,7 @@ class CategoryRepository extends Repository implements RepositoryItemInterface * * @param int $id * - * @return CategoryData + * @return QueryResult * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ @@ -165,7 +165,7 @@ class CategoryRepository extends Repository implements RepositoryItemInterface $queryData->setQuery('SELECT id, `name`, description FROM Category WHERE id = ? LIMIT 1'); $queryData->addParam($id); - return $this->db->doSelect($queryData)->getData(); + return $this->db->doSelect($queryData); } /** @@ -173,7 +173,7 @@ class CategoryRepository extends Repository implements RepositoryItemInterface * * @param string $name * - * @return CategoryData + * @return QueryResult * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ @@ -187,13 +187,13 @@ class CategoryRepository extends Repository implements RepositoryItemInterface $this->makeItemHash($name, $this->db->getDbHandler()) ]); - return $this->db->doSelect($queryData)->getData(); + return $this->db->doSelect($queryData); } /** * Returns all the items * - * @return CategoryData[] + * @return QueryResult * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ @@ -203,7 +203,7 @@ class CategoryRepository extends Repository implements RepositoryItemInterface $queryData->setMapClassName(CategoryData::class); $queryData->setQuery('SELECT id, `name`, description, `hash` FROM Category ORDER BY `name`'); - return $this->db->doSelect($queryData)->getDataAsArray(); + return $this->db->doSelect($queryData); } /** @@ -211,14 +211,14 @@ class CategoryRepository extends Repository implements RepositoryItemInterface * * @param array $ids * - * @return array + * @return QueryResult * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ public function getByIdBatch(array $ids) { if (empty($ids)) { - return []; + return new QueryResult(); } $query = /** @lang SQL */ @@ -229,7 +229,7 @@ class CategoryRepository extends Repository implements RepositoryItemInterface $queryData->setQuery($query); $queryData->setParams($ids); - return $this->db->doSelect($queryData)->getDataAsArray(); + return $this->db->doSelect($queryData); } /** @@ -243,6 +243,10 @@ class CategoryRepository extends Repository implements RepositoryItemInterface */ public function deleteByIdBatch(array $ids) { + if (empty($ids)) { + return 0; + } + $queryData = new QueryData(); $queryData->setQuery('DELETE FROM Category WHERE id IN (' . $this->getParamsFromArray($ids) . ')'); $queryData->setParams($ids); diff --git a/lib/SP/Repositories/Client/ClientRepository.php b/lib/SP/Repositories/Client/ClientRepository.php index 973ba5f7..5faa000b 100644 --- a/lib/SP/Repositories/Client/ClientRepository.php +++ b/lib/SP/Repositories/Client/ClientRepository.php @@ -165,7 +165,7 @@ class ClientRepository extends Repository implements RepositoryItemInterface * * @param int $id * - * @return ClientData + * @return QueryResult * @throws QueryException * @throws ConstraintException */ @@ -176,7 +176,7 @@ class ClientRepository extends Repository implements RepositoryItemInterface $queryData->setQuery('SELECT id, `name`, description, isGlobal FROM Client WHERE id = ? LIMIT 1'); $queryData->addParam($id); - return $this->db->doSelect($queryData)->getData(); + return $this->db->doSelect($queryData); } /** @@ -184,7 +184,7 @@ class ClientRepository extends Repository implements RepositoryItemInterface * * @param string $name * - * @return ClientData + * @return QueryResult * @throws QueryException * @throws ConstraintException */ @@ -198,13 +198,13 @@ class ClientRepository extends Repository implements RepositoryItemInterface $this->makeItemHash($name, $this->db->getDbHandler()) ]); - return $this->db->doSelect($queryData)->getData(); + return $this->db->doSelect($queryData); } /** * Returns all the items * - * @return ClientData[] + * @return QueryResult * @throws QueryException * @throws ConstraintException */ @@ -214,7 +214,7 @@ class ClientRepository extends Repository implements RepositoryItemInterface $queryData->setQuery('SELECT id, `name`, description, isGlobal FROM Client ORDER BY `name`'); $queryData->setMapClassName(ClientData::class); - return $this->db->doSelect($queryData)->getDataAsArray(); + return $this->db->doSelect($queryData); } /** @@ -334,7 +334,7 @@ class ClientRepository extends Repository implements RepositoryItemInterface * * @param QueryCondition $queryFilter * - * @return ItemData[] + * @return QueryResult * @throws QueryException * @throws ConstraintException */ @@ -359,6 +359,6 @@ class ClientRepository extends Repository implements RepositoryItemInterface $queryData->setQuery($query); $queryData->setParams($queryFilter->getParams()); - return $this->db->doSelect($queryData)->getDataAsArray(); + return $this->db->doSelect($queryData); } } \ No newline at end of file diff --git a/lib/SP/Services/Category/CategoryService.php b/lib/SP/Services/Category/CategoryService.php index c7f39739..b8af92c0 100644 --- a/lib/SP/Services/Category/CategoryService.php +++ b/lib/SP/Services/Category/CategoryService.php @@ -29,6 +29,7 @@ use SP\DataModel\CategoryData; use SP\DataModel\ItemSearchData; use SP\Repositories\Category\CategoryRepository; use SP\Repositories\DuplicatedItemException; +use SP\Repositories\NoSuchItemException; use SP\Services\Service; use SP\Services\ServiceException; use SP\Services\ServiceItemTrait; @@ -48,15 +49,6 @@ class CategoryService extends Service */ protected $categoryRepository; - /** - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface - */ - public function initialize() - { - $this->categoryRepository = $this->dic->get(CategoryRepository::class); - } - /** * @param ItemSearchData $itemSearchData * @@ -73,12 +65,19 @@ class CategoryService extends Service * @param int $id * * @return CategoryData + * @throws NoSuchItemException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ public function getById($id) { - return $this->categoryRepository->getById($id); + $result = $this->categoryRepository->getById($id); + + if ($result->getNumRows() === 0) { + throw new NoSuchItemException(__u('Categoría no encontrada'), NoSuchItemException::INFO); + } + + return $result->getData(); } /** @@ -89,24 +88,31 @@ class CategoryService extends Service * @return CategoryData * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException + * @throws NoSuchItemException */ public function getByName($name) { - return $this->categoryRepository->getByName($name); + $result = $this->categoryRepository->getByName($name); + + if ($result->getNumRows() === 0) { + throw new NoSuchItemException(__u('Categoría no encontrada'), NoSuchItemException::INFO); + } + + return $result->getData(); } /** * @param $id * * @return $this - * @throws SPException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException + * @throws NoSuchItemException */ public function delete($id) { if ($this->categoryRepository->delete($id) === 0) { - throw new ServiceException(__u('Categoría no encontrada'), ServiceException::INFO); + throw new NoSuchItemException(__u('Categoría no encontrada'), NoSuchItemException::INFO); } return $this; @@ -124,8 +130,8 @@ class CategoryService extends Service */ public function deleteByIdBatch(array $ids) { - if (($count = $this->categoryRepository->deleteByIdBatch($ids)) === count($ids)) { - throw new ServiceException(__u('Error al eliminar la categoría'), ServiceException::WARNING); + if (($count = $this->categoryRepository->deleteByIdBatch($ids)) !== count($ids)) { + throw new ServiceException(__u('Error al eliminar las categorías'), ServiceException::WARNING); } return $count; @@ -165,6 +171,15 @@ class CategoryService extends Service */ public function getAllBasic() { - return $this->categoryRepository->getAll(); + return $this->categoryRepository->getAll()->getDataAsArray(); + } + + /** + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface + */ + protected function initialize() + { + $this->categoryRepository = $this->dic->get(CategoryRepository::class); } } \ No newline at end of file diff --git a/lib/SP/Services/Client/ClientService.php b/lib/SP/Services/Client/ClientService.php index 12d6a5a7..db375480 100644 --- a/lib/SP/Services/Client/ClientService.php +++ b/lib/SP/Services/Client/ClientService.php @@ -31,6 +31,7 @@ use SP\DataModel\ItemData; use SP\DataModel\ItemSearchData; use SP\Repositories\Client\ClientRepository; use SP\Repositories\DuplicatedItemException; +use SP\Repositories\NoSuchItemException; use SP\Services\Service; use SP\Services\ServiceException; use SP\Services\ServiceItemTrait; @@ -65,12 +66,17 @@ class ClientService extends Service * @param int $id * * @return ClientData + * @throws NoSuchItemException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException */ public function getById($id) { - return $this->clientRepository->getById($id); + if (($result = $this->clientRepository->getById($id))->getNumRows() === 0) { + throw new NoSuchItemException(__u('Cliente no encontrado'), NoSuchItemException::INFO); + } + + return $result->getData(); } /** @@ -81,21 +87,27 @@ class ClientService extends Service * @return ClientData * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException + * @throws NoSuchItemException */ public function getByName($name) { - return $this->clientRepository->getByName($name); + if (($result = $this->clientRepository->getByName($name))->getNumRows() === 0) { + throw new NoSuchItemException(__u('Cliente no encontrado'), NoSuchItemException::INFO); + } + + return $result->getData(); } /** * @param $id + * * @return $this * @throws SPException */ public function delete($id) { if ($this->clientRepository->delete($id) === 0) { - throw new ServiceException(__u('Cliente no encontrado'), ServiceException::INFO); + throw new NoSuchItemException(__u('Cliente no encontrado'), NoSuchItemException::INFO); } return $this; @@ -103,6 +115,7 @@ class ClientService extends Service /** * @param array $ids + * * @return int * @throws ServiceException * @throws \SP\Core\Exceptions\ConstraintException @@ -119,6 +132,7 @@ class ClientService extends Service /** * @param $itemData + * * @return int * @throws SPException * @throws DuplicatedItemException @@ -130,7 +144,8 @@ class ClientService extends Service /** * @param $itemData - * @return mixed + * + * @return int * @throws SPException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException @@ -149,7 +164,7 @@ class ClientService extends Service */ public function getAllBasic() { - return $this->clientRepository->getAll(); + return $this->clientRepository->getAll()->getDataAsArray(); } /** @@ -161,7 +176,7 @@ class ClientService extends Service */ public function getAllForUser() { - return $this->clientRepository->getAllForFilter(AccountUtil::getAccountFilterUser($this->context)); + return $this->clientRepository->getAllForFilter(AccountUtil::getAccountFilterUser($this->context))->getDataAsArray(); } /** diff --git a/tests/Repositories/CategoryRepositoryTest.php b/tests/Repositories/CategoryRepositoryTest.php index 8b446ac5..e98713b1 100644 --- a/tests/Repositories/CategoryRepositoryTest.php +++ b/tests/Repositories/CategoryRepositoryTest.php @@ -74,23 +74,26 @@ class CategoryRepositoryTest extends DatabaseTestCase */ public function testGetByName() { - $this->assertNull(self::$repository->getByName('Prueba')); + $this->assertEquals(0, self::$repository->getByName('Prueba')->getNumRows()); - $category = self::$repository->getByName('Web'); + $result = self::$repository->getByName('Web'); + $data = $result->getData(); - $this->assertEquals(1, $category->getId()); - $this->assertEquals('Web sites', $category->getDescription()); + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Web sites', $data->getDescription()); - $category = self::$repository->getByName('Linux'); + $result = self::$repository->getByName('Linux'); + $data = $result->getData(); - $this->assertEquals(2, $category->getId()); - $this->assertEquals('Linux server', $category->getDescription()); + $this->assertEquals(2, $data->getId()); + $this->assertEquals('Linux server', $data->getDescription()); // Se comprueba que el hash generado es el mismo en para el nombre 'Web' - $category = self::$repository->getByName(' web. '); + $result = self::$repository->getByName(' web. '); + $data = $result->getData(); - $this->assertEquals(1, $category->getId()); - $this->assertEquals('Web sites', $category->getDescription()); + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Web sites', $data->getDescription()); } /** @@ -133,17 +136,19 @@ class CategoryRepositoryTest extends DatabaseTestCase */ public function testGetById() { - $this->assertNull(self::$repository->getById(10)); + $this->assertEquals(0, self::$repository->getById(10)->getNumRows()); - $category = self::$repository->getById(1); + $result = self::$repository->getById(1); + $data = $result->getData(); - $this->assertEquals('Web', $category->getName()); - $this->assertEquals('Web sites', $category->getDescription()); + $this->assertEquals('Web', $data->getName()); + $this->assertEquals('Web sites', $data->getDescription()); - $category = self::$repository->getById(2); + $result = self::$repository->getById(2); + $data = $result->getData(); - $this->assertEquals('Linux', $category->getName()); - $this->assertEquals('Linux server', $category->getDescription()); + $this->assertEquals('Linux', $data->getName()); + $this->assertEquals('Linux server', $data->getDescription()); } /** @@ -156,18 +161,21 @@ class CategoryRepositoryTest extends DatabaseTestCase { $count = $this->conn->getRowCount('Category'); - $results = self::$repository->getAll(); + $result = self::$repository->getAll(); + $this->assertEquals($count, $result->getNumRows()); - $this->assertCount($count, $results); + /** @var CategoryData[] $data */ + $data = $result->getDataAsArray(); + $this->assertCount($count, $data); - $this->assertInstanceOf(CategoryData::class, $results[0]); - $this->assertEquals('Linux', $results[0]->getName()); + $this->assertInstanceOf(CategoryData::class, $data[0]); + $this->assertEquals('Linux', $data[0]->getName()); - $this->assertInstanceOf(CategoryData::class, $results[1]); - $this->assertEquals('SSH', $results[1]->getName()); + $this->assertInstanceOf(CategoryData::class, $data[1]); + $this->assertEquals('SSH', $data[1]->getName()); - $this->assertInstanceOf(CategoryData::class, $results[2]); - $this->assertEquals('Web', $results[2]->getName()); + $this->assertInstanceOf(CategoryData::class, $data[2]); + $this->assertEquals('Web', $data[2]->getName()); } /** @@ -189,10 +197,11 @@ class CategoryRepositoryTest extends DatabaseTestCase self::$repository->update($categoryData); - $category = self::$repository->getById(1); + $result = self::$repository->getById(1); + $data = $result->getData(); - $this->assertEquals($category->getName(), $categoryData->name); - $this->assertEquals($category->getDescription(), $categoryData->description); + $this->assertEquals($categoryData->name, $data->getName()); + $this->assertEquals($categoryData->description, $data->getDescription()); // Comprobar la a actualización con un nombre duplicado comprobando su hash $categoryData = new CategoryData(); @@ -245,9 +254,10 @@ class CategoryRepositoryTest extends DatabaseTestCase $id = self::$repository->create($categoryData); // Comprobar que el Id devuelto corresponde con la categoría creada - $category = self::$repository->getById($id); + $result = self::$repository->getById($id); + $data = $result->getData(); - $this->assertEquals($categoryData->name, $category->getName()); + $this->assertEquals($categoryData->name, $data->getName()); $countAfter = $this->conn->getRowCount('Category'); @@ -284,8 +294,8 @@ class CategoryRepositoryTest extends DatabaseTestCase */ public function testGetByIdBatch() { - $this->assertCount(3, self::$repository->getByIdBatch([1, 2, 3])); - $this->assertCount(3, self::$repository->getByIdBatch([1, 2, 3, 4, 5])); - $this->assertCount(0, self::$repository->getByIdBatch([])); + $this->assertCount(3, self::$repository->getByIdBatch([1, 2, 3])->getDataAsArray()); + $this->assertCount(3, self::$repository->getByIdBatch([1, 2, 3, 4, 5])->getDataAsArray()); + $this->assertCount(0, self::$repository->getByIdBatch([])->getDataAsArray()); } } diff --git a/tests/Repositories/ClientRepositoryTest.php b/tests/Repositories/ClientRepositoryTest.php index 237aab39..e8d54f92 100644 --- a/tests/Repositories/ClientRepositoryTest.php +++ b/tests/Repositories/ClientRepositoryTest.php @@ -75,23 +75,23 @@ class ClientRepositoryTest extends DatabaseTestCase */ public function testGetByName() { - $this->assertNull(self::$repository->getByName('Amazon')); + $this->assertNull(self::$repository->getByName('Amazon')->getData()); - $client = self::$repository->getByName('Google'); + $data = self::$repository->getByName('Google')->getData(); - $this->assertEquals(1, $client->getId()); - $this->assertEquals('Google Inc.', $client->getDescription()); + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Google Inc.', $data->getDescription()); - $client = self::$repository->getByName('Apple'); + $data = self::$repository->getByName('Apple')->getData(); - $this->assertEquals(2, $client->getId()); - $this->assertEquals('Apple Inc.', $client->getDescription()); + $this->assertEquals(2, $data->getId()); + $this->assertEquals('Apple Inc.', $data->getDescription()); // Se comprueba que el hash generado es el mismo en para el nombre 'Web' - $client = self::$repository->getByName(' google. '); + $data = self::$repository->getByName(' google. ')->getData(); - $this->assertEquals(1, $client->getId()); - $this->assertEquals('Google Inc.', $client->getDescription()); + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Google Inc.', $data->getDescription()); } /** @@ -133,17 +133,17 @@ class ClientRepositoryTest extends DatabaseTestCase */ public function testGetById() { - $this->assertNull(self::$repository->getById(10)); + $this->assertNull(self::$repository->getById(10)->getData()); - $client = self::$repository->getById(1); + $data = self::$repository->getById(1)->getData(); - $this->assertEquals('Google', $client->getName()); - $this->assertEquals('Google Inc.', $client->getDescription()); + $this->assertEquals('Google', $data->getName()); + $this->assertEquals('Google Inc.', $data->getDescription()); - $client = self::$repository->getById(2); + $data = self::$repository->getById(2)->getData(); - $this->assertEquals('Apple', $client->getName()); - $this->assertEquals('Apple Inc.', $client->getDescription()); + $this->assertEquals('Apple', $data->getName()); + $this->assertEquals('Apple Inc.', $data->getDescription()); } /** @@ -157,17 +157,19 @@ class ClientRepositoryTest extends DatabaseTestCase $count = $this->conn->getRowCount('Client'); $results = self::$repository->getAll(); + /** @var ClientData[] $data */ + $data = $results->getDataAsArray(); - $this->assertCount($count, $results); + $this->assertCount($count, $data); - $this->assertInstanceOf(ClientData::class, $results[0]); - $this->assertEquals('Apple', $results[0]->getName()); + $this->assertInstanceOf(ClientData::class, $data[0]); + $this->assertEquals('Apple', $data[0]->getName()); - $this->assertInstanceOf(ClientData::class, $results[1]); - $this->assertEquals('Google', $results[1]->getName()); + $this->assertInstanceOf(ClientData::class, $data[1]); + $this->assertEquals('Google', $data[1]->getName()); - $this->assertInstanceOf(ClientData::class, $results[2]); - $this->assertEquals('Microsoft', $results[2]->getName()); + $this->assertInstanceOf(ClientData::class, $data[2]); + $this->assertEquals('Microsoft', $data[2]->getName()); } /** @@ -182,26 +184,26 @@ class ClientRepositoryTest extends DatabaseTestCase */ public function testUpdate() { - $clientData = new ClientData(); - $clientData->id = 1; - $clientData->name = 'Cliente prueba'; - $clientData->description = 'Descripción cliente prueba'; + $data = new ClientData(); + $data->id = 1; + $data->name = 'Cliente prueba'; + $data->description = 'Descripción cliente prueba'; - self::$repository->update($clientData); + self::$repository->update($data); - $category = self::$repository->getById(1); + $result = self::$repository->getById(1)->getData(); - $this->assertEquals($category->getName(), $clientData->name); - $this->assertEquals($category->getDescription(), $clientData->description); + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->description, $result->getDescription()); // Comprobar la a actualización con un nombre duplicado comprobando su hash - $clientData = new ClientData(); - $clientData->id = 1; - $clientData->name = ' apple.'; + $data = new ClientData(); + $data->id = 1; + $data->name = ' apple.'; $this->expectException(DuplicatedItemException::class); - self::$repository->update($clientData); + self::$repository->update($data); } /** @@ -238,22 +240,27 @@ class ClientRepositoryTest extends DatabaseTestCase { $countBefore = $this->conn->getRowCount('Client'); - $clientData = new ClientData(); - $clientData->name = 'Cliente prueba'; - $clientData->description = 'Descripción prueba'; - $clientData->isGlobal = 1; + $data = new ClientData(); + $data->name = 'Cliente prueba'; + $data->description = 'Descripción prueba'; + $data->isGlobal = 1; - $id = self::$repository->create($clientData); + $id = self::$repository->create($data); // Comprobar que el Id devuelto corresponde con el cliente creado - $client = self::$repository->getById($id); + /** @var ClientData $result */ + $result = self::$repository->getById($id)->getData(); - $this->assertEquals($clientData->name, $client->getName()); - $this->assertEquals($clientData->isGlobal, $client->getIsGlobal()); + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->isGlobal, $result->getIsGlobal()); $countAfter = $this->conn->getRowCount('Client'); $this->assertEquals($countBefore + 1, $countAfter); + + $this->expectException(DuplicatedItemException::class); + + self::$repository->create($data); } /** @@ -300,6 +307,6 @@ class ClientRepositoryTest extends DatabaseTestCase $filter = new QueryCondition(); $filter->addFilter('Account.isPrivate = 0'); - $this->assertCount(3, self::$repository->getAllForFilter($filter)); + $this->assertEquals(3, self::$repository->getAllForFilter($filter)->getNumRows()); } } diff --git a/tests/Services/Account/AccountSearchServiceTest.php b/tests/Services/Account/AccountSearchServiceTest.php index bfc22f8b..c6159fb6 100644 --- a/tests/Services/Account/AccountSearchServiceTest.php +++ b/tests/Services/Account/AccountSearchServiceTest.php @@ -50,7 +50,7 @@ class AccountSearchServiceTest extends DatabaseTestCase /** * @var \Closure */ - private static $setUpUser; + private static $setupUser; /** * @throws \DI\NotFoundException @@ -71,7 +71,7 @@ class AccountSearchServiceTest extends DatabaseTestCase $context = $dic->get(ContextInterface::class); - self::$setUpUser = function (UserLoginResponse $response) use ($context) { + self::$setupUser = function (UserLoginResponse $response) use ($context) { $response->setLastUpdate(time()); $context->setUserData($response); @@ -91,7 +91,7 @@ class AccountSearchServiceTest extends DatabaseTestCase $userData->setIsAdminApp(1); $userData->setPreferences(new UserPreferencesData()); - self::$setUpUser->call($this, $userData); + self::$setupUser->call($this, $userData); $this->checkCategoryById(1, [1]); $this->checkNonExistantCategory(); @@ -366,7 +366,7 @@ class AccountSearchServiceTest extends DatabaseTestCase $userData->setUserGroupId(2); $userData->setPreferences(new UserPreferencesData()); - self::$setUpUser->call($this, $userData); + self::$setupUser->call($this, $userData); $this->checkCategoryById(1, [1]); $this->checkNonExistantCategory(); @@ -413,7 +413,7 @@ class AccountSearchServiceTest extends DatabaseTestCase $userData->setUserGroupId(3); $userData->setPreferences(new UserPreferencesData()); - self::$setUpUser->call($this, $userData); + self::$setupUser->call($this, $userData); $this->checkCategoryById(1, [1]); $this->checkNonExistantCategory(); @@ -459,7 +459,7 @@ class AccountSearchServiceTest extends DatabaseTestCase $userData->setUserGroupId(3); $userData->setPreferences(new UserPreferencesData()); - self::$setUpUser->call($this, $userData); + self::$setupUser->call($this, $userData); $this->checkCategoryById(1); $this->checkNonExistantCategory(); diff --git a/tests/Services/Category/CategoryServiceTest.php b/tests/Services/Category/CategoryServiceTest.php new file mode 100644 index 00000000..788bdd83 --- /dev/null +++ b/tests/Services/Category/CategoryServiceTest.php @@ -0,0 +1,272 @@ +. + */ + +namespace SP\Tests\Services\Category; + +use SP\Core\Exceptions\ConstraintException; +use SP\DataModel\CategoryData; +use SP\DataModel\ItemSearchData; +use SP\Repositories\DuplicatedItemException; +use SP\Repositories\NoSuchItemException; +use SP\Services\Category\CategoryService; +use SP\Storage\Database\DatabaseConnectionData; +use SP\Tests\DatabaseTestCase; +use function SP\Tests\setupContext; + +/** + * Class CategoryServiceTest + * + * @package SP\Tests\Services\Category + */ +class CategoryServiceTest extends DatabaseTestCase +{ + /** + * @var CategoryService + */ + private static $service; + + /** + * @throws \DI\NotFoundException + * @throws \SP\Core\Context\ContextException + * @throws \DI\DependencyException + */ + public static function setUpBeforeClass() + { + $dic = setupContext(); + + self::$dataset = 'syspass.xml'; + + // Datos de conexión a la BBDD + self::$databaseConnectionData = $dic->get(DatabaseConnectionData::class); + + // Inicializar el repositorio + self::$service = $dic->get(CategoryService::class); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testSearch() + { + $itemSearchData = new ItemSearchData(); + $itemSearchData->setLimitCount(10); + $itemSearchData->setSeachString('linux'); + + $result = self::$service->search($itemSearchData); + + $data = $result->getDataAsArray(); + + $this->assertCount(1, $data); + $this->assertInstanceOf(\stdClass::class, $data[0]); + $this->assertEquals(2, $data[0]->id); + $this->assertEquals('Linux server', $data[0]->description); + + $itemSearchData = new ItemSearchData(); + $itemSearchData->setLimitCount(10); + $itemSearchData->setSeachString('prueba'); + + $this->assertEquals(0, self::$service->search($itemSearchData)->getNumRows()); + } + + /** + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetByName() + { + $data = self::$service->getByName('Web'); + + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Web sites', $data->getDescription()); + + $data = self::$service->getByName('Linux'); + + $this->assertEquals(2, $data->getId()); + $this->assertEquals('Linux server', $data->getDescription()); + + // Se comprueba que el hash generado es el mismo en para el nombre 'Web' + $data = self::$service->getByName(' web. '); + + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Web sites', $data->getDescription()); + + $this->expectException(NoSuchItemException::class); + + self::$service->getByName('Prueba'); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetAllBasic() + { + $count = $this->conn->getRowCount('Category'); + + $data = self::$service->getAllBasic(); + + $this->assertCount($count, $data); + + $this->assertInstanceOf(CategoryData::class, $data[0]); + $this->assertEquals('Linux', $data[0]->getName()); + + $this->assertInstanceOf(CategoryData::class, $data[1]); + $this->assertEquals('SSH', $data[1]->getName()); + + $this->assertInstanceOf(CategoryData::class, $data[2]); + $this->assertEquals('Web', $data[2]->getName()); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Services\ServiceException + */ + public function testDeleteByIdBatch() + { + $countBefore = $this->conn->getRowCount('Category'); + + $this->assertEquals(1, self::$service->deleteByIdBatch([3])); + + $countAfter = $this->conn->getRowCount('Category'); + + $this->assertEquals($countBefore - 1, $countAfter); + + // Comprobar que se produce una excepción al tratar de eliminar categorías usadas + $this->expectException(ConstraintException::class); + + $this->assertEquals(1, self::$service->deleteByIdBatch([1, 2, 3])); + } + + /** + * @throws ConstraintException + * @throws DuplicatedItemException + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Core\Exceptions\SPException + */ + public function testCreate() + { + $countBefore = $this->conn->getRowCount('Category'); + + $data = new CategoryData(); + $data->name = 'Categoría prueba'; + $data->description = 'Descripción prueba'; + + $id = self::$service->create($data); + + // Comprobar que el Id devuelto corresponde con la categoría creada + $result = self::$service->getById($id); + + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->description, $result->getDescription()); + + $countAfter = $this->conn->getRowCount('Category'); + + $this->assertEquals($countBefore + 1, $countAfter); + + $this->expectException(DuplicatedItemException::class); + + self::$service->create($data); + } + + /** + * @throws ConstraintException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Core\Exceptions\SPException + * @throws \SP\Services\ServiceException + */ + public function testUpdate() + { + $data = new CategoryData(); + $data->id = 1; + $data->name = 'Web prueba'; + $data->description = 'Descripción web prueba'; + + self::$service->update($data); + + $result = self::$service->getById(1); + + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->description, $result->getDescription()); + + // Comprobar la a actualización con un nombre duplicado comprobando su hash + $data = new CategoryData(); + $data->id = 1; + $data->name = ' linux.'; + + $this->expectException(DuplicatedItemException::class); + + self::$service->update($data); + } + + /** + * @throws ConstraintException + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetById() + { + $data = self::$service->getById(1); + + $this->assertEquals('Web', $data->getName()); + $this->assertEquals('Web sites', $data->getDescription()); + + $data = self::$service->getById(2); + + $this->assertEquals('Linux', $data->getName()); + $this->assertEquals('Linux server', $data->getDescription()); + + $this->expectException(NoSuchItemException::class); + + self::$service->getById(10); + } + + /** + * @throws ConstraintException + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testDelete() + { + $countBefore = $this->conn->getRowCount('Category'); + + self::$service->delete(3); + + $countAfter = $this->conn->getRowCount('Category'); + + $this->assertEquals($countBefore - 1, $countAfter); + + // Comprobar que se produce una excepción al tratar de eliminar categorías usadas + $this->expectException(ConstraintException::class); + + self::$service->delete(2); + + $this->expectException(NoSuchItemException::class); + + self::$service->delete(10); + } +} diff --git a/tests/Services/Client/ClientServiceTest.php b/tests/Services/Client/ClientServiceTest.php new file mode 100644 index 00000000..265ff169 --- /dev/null +++ b/tests/Services/Client/ClientServiceTest.php @@ -0,0 +1,305 @@ +. + */ + +namespace SP\Tests\Services\Client; + +use SP\Core\Context\ContextInterface; +use SP\Core\Exceptions\ConstraintException; +use SP\DataModel\ClientData; +use SP\DataModel\ItemSearchData; +use SP\Repositories\DuplicatedItemException; +use SP\Repositories\NoSuchItemException; +use SP\Services\Client\ClientService; +use SP\Services\ServiceException; +use SP\Services\User\UserLoginResponse; +use SP\Storage\Database\DatabaseConnectionData; +use SP\Tests\DatabaseTestCase; +use function SP\Tests\setupContext; + +/** + * Class ClientServiceTest + * + * @package SP\Tests\Services\Client + */ +class ClientServiceTest extends DatabaseTestCase +{ + /** + * @var \Closure + */ + private static $setupUser; + /** + * @var ClientService + */ + private static $service; + + /** + * @throws \DI\NotFoundException + * @throws \SP\Core\Context\ContextException + * @throws \DI\DependencyException + */ + public static function setUpBeforeClass() + { + $dic = setupContext(); + + self::$dataset = 'syspass.xml'; + + // Datos de conexión a la BBDD + self::$databaseConnectionData = $dic->get(DatabaseConnectionData::class); + + // Inicializar el repositorio + self::$service = $dic->get(ClientService::class); + + self::$setupUser = function (UserLoginResponse $response) use ($dic) { + $response->setLastUpdate(time()); + + $dic->get(ContextInterface::class)->setUserData($response); + }; + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testSearch() + { + $itemSearchData = new ItemSearchData(); + $itemSearchData->setLimitCount(10); + $itemSearchData->setSeachString('google'); + + $result = self::$service->search($itemSearchData); + $data = $result->getDataAsArray(); + + $this->assertEquals(1, $result->getNumRows()); + $this->assertCount(1, $data); + $this->assertInstanceOf(ClientData::class, $data[0]); + $this->assertEquals(1, $data[0]->id); + $this->assertEquals('Google Inc.', $data[0]->description); + + $itemSearchData = new ItemSearchData(); + $itemSearchData->setLimitCount(10); + $itemSearchData->setSeachString('prueba'); + + $result = self::$service->search($itemSearchData); + + $this->assertEquals(0, $result->getNumRows()); + $this->assertCount(0, $result->getDataAsArray()); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetAllBasic() + { + $count = $this->conn->getRowCount('Client'); + + $results = self::$service->getAllBasic(); + + $this->assertCount($count, $results); + + $this->assertInstanceOf(ClientData::class, $results[0]); + $this->assertEquals('Apple', $results[0]->getName()); + + $this->assertInstanceOf(ClientData::class, $results[1]); + $this->assertEquals('Google', $results[1]->getName()); + + $this->assertInstanceOf(ClientData::class, $results[2]); + $this->assertEquals('Microsoft', $results[2]->getName()); + } + + /** + * @throws ConstraintException + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetById() + { + $client = self::$service->getById(1); + + $this->assertEquals('Google', $client->getName()); + $this->assertEquals('Google Inc.', $client->getDescription()); + + $client = self::$service->getById(2); + + $this->assertEquals('Apple', $client->getName()); + $this->assertEquals('Apple Inc.', $client->getDescription()); + + $this->expectException(NoSuchItemException::class); + + self::$service->getById(10); + } + + /** + * @throws ConstraintException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetAllForUser() + { + $this->assertCount(3, self::$service->getAllForUser()); + + $userData = new UserLoginResponse(); + $userData->setId(4); + + self::$setupUser->call($this, $userData); + + $this->assertCount(1, self::$service->getAllForUser()); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Core\Exceptions\SPException + * @throws \SP\Repositories\DuplicatedItemException + */ + public function testCreate() + { + $countBefore = $this->conn->getRowCount('Client'); + + $data = new ClientData(); + $data->name = 'Cliente prueba'; + $data->description = 'Descripción prueba'; + $data->isGlobal = 1; + + $id = self::$service->create($data); + + // Comprobar que el Id devuelto corresponde con el cliente creado + $result = self::$service->getById($id); + + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->isGlobal, $result->getIsGlobal()); + + $countAfter = $this->conn->getRowCount('Client'); + + $this->assertEquals($countBefore + 1, $countAfter); + + $this->expectException(DuplicatedItemException::class); + + self::$service->create($data); + } + + /** + * @throws \SP\Core\Exceptions\ConstraintException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Services\ServiceException + */ + public function testDeleteByIdBatch() + { + $countBefore = $this->conn->getRowCount('Client'); + + self::$service->deleteByIdBatch([3]); + + $countAfter = $this->conn->getRowCount('Client'); + + $this->assertEquals($countBefore - 1, $countAfter); + + // Comprobar que se produce una excepción al tratar de eliminar clientes usados + $this->expectException(ConstraintException::class); + + self::$service->deleteByIdBatch([1, 2]); + + $this->expectException(ServiceException::class); + + self::$service->deleteByIdBatch([10]); + } + + /** + * @throws ConstraintException + * @throws NoSuchItemException + * @throws \SP\Core\Exceptions\QueryException + */ + public function testGetByName() + { + $data = self::$service->getByName('Google'); + + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Google Inc.', $data->getDescription()); + + $data = self::$service->getByName('Apple'); + + $this->assertEquals(2, $data->getId()); + $this->assertEquals('Apple Inc.', $data->getDescription()); + + // Se comprueba que el hash generado es el mismo en para el nombre 'Web' + $data = self::$service->getByName(' google. '); + + $this->assertEquals(1, $data->getId()); + $this->assertEquals('Google Inc.', $data->getDescription()); + + $this->expectException(NoSuchItemException::class); + + self::$service->getByName('Amazon'); + } + + /** + * @throws \SP\Core\Exceptions\SPException + */ + public function testDelete() + { + $countBefore = $this->conn->getRowCount('Client'); + + self::$service->delete(3); + + $countAfter = $this->conn->getRowCount('Client'); + + $this->assertEquals($countBefore - 1, $countAfter); + + // Comprobar que se produce una excepción al tratar de eliminar clientes usados + $this->expectException(ConstraintException::class); + + self::$service->delete(2); + + $this->expectException(NoSuchItemException::class); + + self::$service->delete(10); + } + + /** + * @throws ConstraintException + * @throws \SP\Core\Exceptions\QueryException + * @throws \SP\Core\Exceptions\SPException + */ + public function testUpdate() + { + $data = new ClientData(); + $data->id = 1; + $data->name = 'Cliente prueba'; + $data->description = 'Descripción cliente prueba'; + + self::$service->update($data); + + $result = self::$service->getById(1); + + $this->assertEquals($data->name, $result->getName()); + $this->assertEquals($data->description, $result->getDescription()); + + // Comprobar la a actualización con un nombre duplicado comprobando su hash + $data = new ClientData(); + $data->id = 1; + $data->name = ' apple.'; + + $this->expectException(DuplicatedItemException::class); + + self::$service->update($data); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 26c56020..10acaa5b 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -48,7 +48,7 @@ require APP_ROOT . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'BaseFunc /** * Función para llamadas a gettext */ -if (!function_exists('gettext')) { +if (!function_exists('\gettext')) { /** * @param $str *