From f48fe093c8bc2dbb35a75ef6ca098478d6a2b374 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Mon, 7 Jun 2021 16:28:00 +0200 Subject: [PATCH] Courses: Refactor course test, fix course code when setting only title --- public/main/inc/lib/add_course.lib.inc.php | 2 +- src/CoreBundle/Entity/Course.php | 2 + .../Entity/Listener/ResourceListener.php | 38 +++++++++++++++-- tests/ChamiloTestTrait.php | 41 ++++++++++++------- .../Repository/Node/CourseRepositoryTest.php | 36 ++++++++++++---- 5 files changed, 93 insertions(+), 26 deletions(-) diff --git a/public/main/inc/lib/add_course.lib.inc.php b/public/main/inc/lib/add_course.lib.inc.php index 8d0228a114..6e6571d27d 100644 --- a/public/main/inc/lib/add_course.lib.inc.php +++ b/public/main/inc/lib/add_course.lib.inc.php @@ -754,9 +754,9 @@ class AddCourse $course = new Course(); $course + ->setTitle($title) ->setCode($code) ->setCourseLanguage($course_language) - ->setTitle($title) ->setDescription(get_lang('Course Description')) ->setVisibility($visibility) ->setShowScore(1) diff --git a/src/CoreBundle/Entity/Course.php b/src/CoreBundle/Entity/Course.php index 449a81ce64..c01970c877 100644 --- a/src/CoreBundle/Entity/Course.php +++ b/src/CoreBundle/Entity/Course.php @@ -628,6 +628,8 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith { $this->title = $title; + $this->setCode($title); + return $this; } diff --git a/src/CoreBundle/Entity/Listener/ResourceListener.php b/src/CoreBundle/Entity/Listener/ResourceListener.php index cb61c9f262..6baa62f399 100644 --- a/src/CoreBundle/Entity/Listener/ResourceListener.php +++ b/src/CoreBundle/Entity/Listener/ResourceListener.php @@ -14,7 +14,6 @@ use Chamilo\CoreBundle\Entity\ResourceFile; use Chamilo\CoreBundle\Entity\ResourceLink; use Chamilo\CoreBundle\Entity\ResourceNode; use Chamilo\CoreBundle\Entity\ResourceRight; -use Chamilo\CoreBundle\Entity\ResourceToRootInterface; use Chamilo\CoreBundle\Entity\ResourceType; use Chamilo\CoreBundle\Entity\ResourceWithAccessUrlInterface; use Chamilo\CoreBundle\Entity\Session; @@ -54,6 +53,33 @@ class ResourceListener $this->accessUrl = null; } + public function getAccessUrl($em): ?AccessUrl + { + if (null === $this->accessUrl) { + $request = $this->request->getCurrentRequest(); + if (null === $request) { + return null; + } + + $sessionRequest = $request->getSession(); + $id = (int) $sessionRequest->get('access_url_id'); + if (0 !== $id) { + /** @var AccessUrl $url */ + $url = $em->getRepository(AccessUrl::class)->find($id); + + if (null !== $url) { + $this->accessUrl = $url; + + return $url; + } + } + + return null; + } + + return $this->accessUrl; + } + /** * Only in creation. */ @@ -65,7 +91,13 @@ class ResourceListener if ($resource instanceof ResourceWithAccessUrlInterface) { if (0 === $resource->getUrls()->count()) { - throw new Exception('This resource needs an AccessUrl use $resource->addAccessUrl();'); + // The AccessUrl was not added using $resource->addAccessUrl(), + // try getting the URL from the session if possible. + $accessUrl = $this->getAccessUrl($em); + if (null === $accessUrl) { + throw new Exception('This resource needs an AccessUrl use $resource->addAccessUrl();'); + } + $resource->addAccessUrl($accessUrl); } } @@ -84,7 +116,7 @@ class ResourceListener $creator = $resource->getResourceNodeCreator(); if (null === $creator) { - /** @var User|null $creator */ + /** @var User|null $defaultCreator */ $defaultCreator = $this->security->getUser(); if (null !== $defaultCreator) { $creator = $defaultCreator; diff --git a/tests/ChamiloTestTrait.php b/tests/ChamiloTestTrait.php index f9381e5957..3c822cd965 100644 --- a/tests/ChamiloTestTrait.php +++ b/tests/ChamiloTestTrait.php @@ -3,26 +3,16 @@ namespace Chamilo\Tests; use Chamilo\CoreBundle\Entity\AccessUrl; +use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository; +use Chamilo\CoreBundle\Repository\Node\CourseRepository; use Chamilo\CoreBundle\Repository\Node\UserRepository; use Symfony\Component\Validator\ConstraintViolationList; use Symfony\Component\Validator\Validator\ValidatorInterface; trait ChamiloTestTrait { - /** - * Finds a user registered in the test DB, added by the DataFixtures classes. - */ - public function getUser(string $username): ?User - { - /** @var UserRepository $repo */ - $repo = static::getContainer()->get(UserRepository::class); - - // retrieve user - return $repo->findByUsername($username); - } - public function createUser(string $username, string $password, string $email): ?User { /** @var UserRepository $repo */ @@ -37,14 +27,37 @@ trait ChamiloTestTrait ->setStatus(1) ->setPlainPassword($password) ->setEmail($email) - ->setCreator($admin) - ; + ->setCreator($admin); $repo->updateUser($user); return $user; } + /** + * Finds a user registered in the test DB, added by the DataFixtures classes. + */ + public function getUser(string $username): ?User + { + /** @var UserRepository $repo */ + $repo = static::getContainer()->get(UserRepository::class); + + // retrieve user + return $repo->findByUsername($username); + } + + public function createCourse($title): ?Course + { + $courseRepo = self::getContainer()->get(CourseRepository::class); + $course = (new Course()) + ->setTitle($title) + ->addAccessUrl($this->getAccessUrl()) + ->setCreator($this->getUser('admin')); + $courseRepo->create($course); + + return $course; + } + public function getAccessUrl(string $url = ''): ?AccessUrl { if (empty($url)) { diff --git a/tests/CoreBundle/Repository/Node/CourseRepositoryTest.php b/tests/CoreBundle/Repository/Node/CourseRepositoryTest.php index 32867cf75d..7ba149a56a 100644 --- a/tests/CoreBundle/Repository/Node/CourseRepositoryTest.php +++ b/tests/CoreBundle/Repository/Node/CourseRepositoryTest.php @@ -9,6 +9,7 @@ use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository; use Chamilo\CoreBundle\Repository\Node\CourseRepository; use Chamilo\CoreBundle\Repository\Node\UserRepository; +use Chamilo\CoreBundle\ToolChain; use Chamilo\Tests\ChamiloTestTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; @@ -40,16 +41,35 @@ class CourseRepositoryTest extends WebTestCase public function testCreate() { $courseRepo = self::getContainer()->get(CourseRepository::class); - - $course = (new Course()) - ->setTitle('Test course') - ->setCode('test_course') - ->addAccessUrl($this->getAccessUrl()) - ->setCreator($this->getUser('admin')) - ; - $courseRepo->create($course); + $course = $this->createCourse('Test course'); $count = $courseRepo->count([]); $this->assertEquals(1, $count); + + // Check tools. + $this->assertEquals(25, count($course->getTools())); + + // Check course code. + $this->assertEquals('TEST-COURSE', $course->getCode()); + + // The course should connected with a Access URL + $this->assertEquals(1, $course->getUrls()->count()); + } + + public function testCourseAccess() + { + self::bootKernel(); + /** @var CourseRepository $courseRepo */ + $courseRepo = self::getContainer()->get(CourseRepository::class); + //$toolChain = self::getContainer()->get(ToolChain::class); + $course = $this->createCourse('Test course'); + + $student = $this->createUser('student', 'student', 'student@student.com'); + + $course->addUser($student,0, null, 5); + + $courseRepo->update($course); + + $this->assertEquals(1, $course->getUsers()->count()); } }