Minor - add tests

pull/4020/head^2
Julio 5 years ago
parent 02d00a035b
commit 239825ace7
  1. 1
      src/CoreBundle/Entity/Listener/MessageListener.php
  2. 94
      src/CoreBundle/Settings/SettingsManager.php
  3. 8
      tests/CoreBundle/Repository/SkillRepositoryTest.php
  4. 85
      tests/CoreBundle/Settings/SettingsManagerTest.php

@ -6,7 +6,6 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Entity\Listener;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Message;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\Messenger\MessageBusInterface;

@ -68,10 +68,7 @@ class SettingsManager implements SettingsManagerInterface
$this->schemaList = [];
}
/**
* @return AccessUrl
*/
public function getUrl()
public function getUrl(): ?AccessUrl
{
return $this->url;
}
@ -119,35 +116,35 @@ class SettingsManager implements SettingsManagerInterface
return str_replace('chamilo_core.settings.', '', $category);
}
/**
* @throws InvalidArgumentException
*/
public function getSetting(string $name)
public function updateSetting(string $name, $value): void
{
if (!str_contains($name, '.')) {
//throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name));
$name = $this->validateSetting($name);
// This code allows the possibility of calling
// api_get_setting('allow_skills_tool') instead of
// the "correct" way api_get_setting('platform.allow_skills_tool')
$items = $this->getVariablesAndCategories();
[$category, $name] = explode('.', $name);
$settings = $this->load($category);
if (isset($items[$name])) {
$originalName = $name;
$name = $this->renameVariable($name);
$category = $this->fixCategory(
strtolower($name),
strtolower($items[$originalName])
);
$name = $category.'.'.$name;
} else {
$message = sprintf('Parameter must be in format "category.name", "%s" given.', $name);
if (!$settings->has($name)) {
$message = sprintf("Parameter %s doesn't exists.", $name);
throw new InvalidArgumentException($message);
}
throw new InvalidArgumentException($message);
}
$settings->set($name, $value);
$this->update($settings);
}
public function getSetting(string $name, bool $loadFromDb = false)
{
$name = $this->validateSetting($name);
[$category, $name] = explode('.', $name);
if ($loadFromDb) {
$settings = $this->load($category, $name);
return $settings->get($name);
}
$this->loadAll();
if (!empty($this->schemaList)) {
@ -172,7 +169,6 @@ class SettingsManager implements SettingsManagerInterface
public function loadAll(): void
{
//$loadFromSession = true;
$session = null;
if ($this->request->getCurrentRequest()) {
$session = $this->request->getCurrentRequest()->getSession();
@ -185,13 +181,15 @@ class SettingsManager implements SettingsManagerInterface
$schemaList = [];
$settingsBuilder = new SettingsBuilder();
$all = $this->getAllParametersByCategory();
foreach ($schemas as $schema) {
$schemaRegister = $this->schemaRegistry->get($schema);
$schemaRegister->buildSettings($settingsBuilder);
$name = $this->convertServiceToNameSpace($schema);
$settings = new Settings();
$parameters = isset($all[$name]) ? $all[$name] : [];
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
$parameters = $all[$name] ?? [];
$transformers = $settingsBuilder->getTransformers();
foreach ($transformers as $parameter => $transformer) {
if (\array_key_exists($parameter, $parameters)) {
if ('course_creation_use_template' === $parameter) {
if (empty($parameters[$parameter])) {
@ -279,6 +277,7 @@ class SettingsManager implements SettingsManagerInterface
$parameters[$parameter] = $transformer->transform($parameters[$parameter]);
}
}
$settings->setParameters($parameters);
$category = $this->convertServiceToNameSpace($settings->getSchemaAlias());
$persistedParameters = $this->repository->findBy([
@ -457,10 +456,8 @@ class SettingsManager implements SettingsManagerInterface
/**
* @param string $keyword
*
* @return array
*/
public function getParametersFromKeywordOrderedByCategory($keyword)
public function getParametersFromKeywordOrderedByCategory($keyword): array
{
$query = $this->repository->createQueryBuilder('s')
->where('s.variable LIKE :keyword OR s.title LIKE :keyword')
@ -510,6 +507,34 @@ class SettingsManager implements SettingsManagerInterface
return $parameters;
}
private function validateSetting(string $name): string
{
if (!str_contains($name, '.')) {
//throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name));
// This code allows the possibility of calling
// api_get_setting('allow_skills_tool') instead of
// the "correct" way api_get_setting('platform.allow_skills_tool')
$items = $this->getVariablesAndCategories();
if (isset($items[$name])) {
$originalName = $name;
$name = $this->renameVariable($name);
$category = $this->fixCategory(
strtolower($name),
strtolower($items[$originalName])
);
$name = $category.'.'.$name;
} else {
$message = sprintf('Parameter must be in format "category.name", "%s" given.', $name);
throw new InvalidArgumentException($message);
}
}
return $name;
}
/**
* Load parameter from database.
*
@ -520,10 +545,9 @@ class SettingsManager implements SettingsManagerInterface
private function getParameters($namespace)
{
$parameters = [];
$category = $this->repository->findBy(['category' => $namespace]);
/** @var SettingsCurrent $parameter */
foreach ($this->repository->findBy([
'category' => $namespace,
]) as $parameter) {
foreach ($category as $parameter) {
$parameters[$parameter->getVariable()] = $parameter->getSelectedValue();
}

@ -20,6 +20,7 @@ use Chamilo\CoreBundle\Entity\SkillRelSkill;
use Chamilo\CoreBundle\Entity\SkillRelUser;
use Chamilo\CoreBundle\Repository\AssetRepository;
use Chamilo\CoreBundle\Repository\SkillRepository;
use Chamilo\CoreBundle\Settings\SettingsManager;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use DateTime;
@ -196,6 +197,8 @@ class SkillRepositoryTest extends AbstractApiTest
public function testGetLastByUser(): void
{
$skillRepo = self::getContainer()->get(SkillRepository::class);
$settingsManager = self::getContainer()->get(SettingsManager::class);
$settingsManager->updateSetting('skill.badge_assignation_notification', 'true');
$accessUrl = $this->getAccessUrl();
@ -238,6 +241,9 @@ class SkillRepositoryTest extends AbstractApiTest
$skillRepo = self::getContainer()->get(SkillRepository::class);
$accessUrl = $this->getAccessUrl();
// Root skill.
$this->assertSame(1, $skillRepo->count([]));
$skill = (new Skill())
->setName('php')
->setShortCode('php')
@ -245,6 +251,8 @@ class SkillRepositoryTest extends AbstractApiTest
;
$skillRepo->update($skill);
$this->assertSame(2, $skillRepo->count([]));
$skillRepo->delete($skill);
$this->assertSame(1, $skillRepo->count([]));

@ -6,10 +6,13 @@ declare(strict_types=1);
namespace Chamilo\Tests\CoreBundle\Settings;
use Chamilo\CoreBundle\Entity\SettingsCurrent;
use Chamilo\CoreBundle\Repository\SettingsCurrentRepository;
use Chamilo\CoreBundle\Settings\SettingsManager;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use InvalidArgumentException;
use Sylius\Bundle\SettingsBundle\Model\SettingsInterface;
class SettingsManagerTest extends AbstractApiTest
{
@ -17,8 +20,6 @@ class SettingsManagerTest extends AbstractApiTest
public function testCreate(): void
{
self::bootKernel();
$settingsManager = self::getContainer()->get(SettingsManager::class);
$this->expectException(InvalidArgumentException::class);
@ -28,4 +29,84 @@ class SettingsManagerTest extends AbstractApiTest
$this->assertNotEmpty($platform);
$this->assertTrue(\count($settingsManager->getSchemas()) > 0);
}
public function testGetSetting(): void
{
$settingsManager = self::getContainer()->get(SettingsManager::class);
$this->expectException(InvalidArgumentException::class);
$settingsManager->getSetting('platform.new_setting_aaa');
$this->expectException(InvalidArgumentException::class);
$settingsManager->getSetting('platform2222.institution');
}
public function testUpdate(): void
{
$settingsManager = self::getContainer()->get(SettingsManager::class);
$oldPlatform = $settingsManager->getSetting('platform.institution');
$settings = $settingsManager->load('platform');
$this->assertInstanceOf(SettingsInterface::class, $settings);
$this->assertSame('chamilo_core.settings.platform', $settings->getSchemaAlias());
$this->assertNotEmpty($settings->getParameters()['institution']);
$this->assertTrue($settings->has('institution'));
$this->assertSame($oldPlatform, $settings->get('institution'));
}
public function testUpdateSetting(): void
{
$settingsManager = static::getContainer()->get(SettingsManager::class);
$settingsManager->setUrl($this->getAccessUrl());
$repo = self::getContainer()->get(SettingsCurrentRepository::class);
/** @var SettingsCurrent $settingEntity */
$settingEntity = $repo->findOneBy(['variable' => 'badge_assignation_notification']);
$this->assertSame('false', $settingEntity->getSelectedValue());
$badgeSetting = $settingsManager->getSetting('skill.badge_assignation_notification');
$this->assertSame('false', $badgeSetting);
// Update
$settingsManager->updateSetting('skill.badge_assignation_notification', 'true');
$badgeSetting = $settingsManager->getSetting('skill.badge_assignation_notification');
$this->assertSame('false', $badgeSetting);
$settingEntity = $repo->findOneBy(['variable' => 'badge_assignation_notification']);
$this->assertSame('true', $settingEntity->getSelectedValue());
$badgeSetting = $settingsManager->getSetting('skill.badge_assignation_notification', true);
$this->assertSame('true', $badgeSetting);
$this->expectException(InvalidArgumentException::class);
$settingsManager->updateSetting('haha', 'true');
$this->expectException(InvalidArgumentException::class);
$settingsManager->updateSetting('skill.hoho', 'true');
}
public function testGetParametersFromKeyword(): void
{
$settingsManager = self::getContainer()->get(SettingsManager::class);
$parameters = $settingsManager->getParametersFromKeyword('platform', 'institution');
$this->assertCount(3, $parameters);
$this->assertTrue(isset($parameters['institution']));
$settingsManager = self::getContainer()->get(SettingsManager::class);
$settings = $settingsManager->load('platform');
$settingsCount = \count($settings);
$parameters = $settingsManager->getParametersFromKeyword('platform');
$this->assertCount($settingsCount, $parameters);
$this->assertTrue(isset($parameters['institution']));
}
public function testGetParametersFromKeywordOrderedByCategory(): void
{
$settingsManager = self::getContainer()->get(SettingsManager::class);
$parameters = $settingsManager->getParametersFromKeywordOrderedByCategory('institution');
$this->assertTrue(isset($parameters['platform']));
}
}

Loading…
Cancel
Save