Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/tests/ChamiloTestTrait.php

272 lines
8.2 KiB

<?php
namespace Chamilo\Tests;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Entity\Usergroup;
use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository;
use Chamilo\CoreBundle\Repository\Node\CourseRepository;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\CoreBundle\Repository\SessionRepository;
use Chamilo\CoreBundle\ServiceHelper\ContainerHelper;
use Chamilo\CourseBundle\Entity\CGroup;
use Doctrine\ORM\EntityManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session as SymfonySession;
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\Validator\ValidatorInterface;
trait ChamiloTestTrait
{
public function createUser(string $username, string $password = '', string $email = '', string $role = ''): ?User
{
/** @var UserRepository $repo */
$repo = static::getContainer()->get(UserRepository::class);
$admin = $this->getUser('admin');
if (empty($email)) {
$email = "$username@example.com";
}
if (empty($password)) {
$password = $username;
}
$user = $repo->createUser()
->setLastname($username)
->setFirstname($username)
->setUsername($username)
->setStatus(1)
->setPlainPassword($password)
->setEmail($email)
->setCreator($admin)
->setCurrentUrl($this->getAccessUrl())
;
if (!empty($role)) {
$user->addRole($role);
}
$repo->updateUser($user);
return $user;
}
public function createCourse(string $title): ?Course
{
/* @var CourseRepository $repo */
$repo = static::getContainer()->get(CourseRepository::class);
$course = (new Course())
->setTitle($title)
->addAccessUrl($this->getAccessUrl())
->setCreator($this->getUser('admin'))
->setVisibility(Course::OPEN_PLATFORM)
;
$repo->create($course);
return $course;
}
public function createSession(string $title): ?Session
{
$repo = static::getContainer()->get(SessionRepository::class);
$session = (new Session())
->setTitle($title)
->addGeneralCoach($this->getUser('admin'))
->addAccessUrl($this->getAccessUrl())
;
$repo->update($session);
return $session;
}
public function createGroup(string $title, Course $course): ?CGroup
{
$em = $this->getEntityManager();
$group = (new CGroup())
->setTitle($title)
->setParent($course)
->setCreator($this->getUser('admin'))
->setMaxStudent(100)
;
$em->persist($group);
$em->flush();
return $group;
}
public function createUserGroup(string $title): ?Usergroup
{
$em = $this->getEntityManager();
$creator = $this->createUser('usergroup_creator');
$group = (new Usergroup())
->setTitle($title)
->setDescription('desc')
->setCreator($creator)
->addAccessUrl($this->getAccessUrl())
;
$em->persist($group);
$em->flush();
return $group;
}
/**
* 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);
return $repo->findByUsername($username);
}
public function getAdmin(): User
{
return $this->getUser('admin');
}
public function getCourse($courseId): ?Course
{
$repo = static::getContainer()->get(CourseRepository::class);
return $repo->find($courseId);
}
public function getAccessUrl(string $url = ''): ?AccessUrl
{
if (empty($url)) {
$url = AccessUrl::DEFAULT_ACCESS_URL;
}
/** @var AccessUrlRepository $repo */
$repo = static::getContainer()->get(AccessUrlRepository::class);
return $repo->findOneBy(['url' => $url]);
}
public function assertHasNoEntityViolations($entity)
{
/** @var ConstraintViolationList $errors */
$errors = $this->getViolations($entity);
$message = [];
foreach ($errors as $error) {
$message[] = $error->getPropertyPath().': '.$error->getMessage();
}
$this->assertEquals(0, $errors->count(), implode(', ', $message));
}
public function getUploadedFileArray(): array
{
return [
'tmp_name' => $this->getUploadedFile()->getRealPath(),
'name' => $this->getUploadedFile()->getFilename(),
'type' => $this->getUploadedFile()->getMimeType(),
'size' => $this->getUploadedFile()->getSize(),
'error' => UPLOAD_ERR_OK,
];
}
public function getUploadedFile(): UploadedFile
{
$path = $this->getContainer()->get('kernel')->getProjectDir();
$filePath = $path.'/tests/fixtures/logo.png';
$fileName = basename($filePath);
return new UploadedFile(
$filePath,
$fileName,
'image/png',
);
}
public function getUploadedZipFile(): UploadedFile
{
$path = $this->getContainer()->get('kernel')->getProjectDir();
$filePath = $path.'/tests/fixtures/logo.zip';
$fileName = basename($filePath);
return new UploadedFile(
$filePath,
$fileName,
'image/png',
);
}
public function getViolations($entity)
{
/** @var ContainerHelper $containerHelper */
$containerHelper = static::$kernel->getContainer()->get(ContainerHelper::class);
$validator = $containerHelper->getValidator();
/** @var ConstraintViolationList $errors */
return $validator->validate($entity);
}
public function convertToUTCAndFormat(\DateTime $localTime) : string
{
return $localTime->setTimezone(new \DateTimeZone('UTC'))->format('c');
}
public function getEntityManager(): EntityManager
{
return static::getContainer()->get('doctrine')->getManager();
}
/**
* Helper to mock a request stack with a given current request.
*
* Builds a request based on parameters, and adds it to the returned
* request stack.
*
* @param array $data
* A map where keys can be the following:
* - <request_parameter>: A parameter following symfony http foundation
* Request constructor.
* - 'session': and array with session data to set.
*
* @see \Symfony\Component\HttpFoundation\Request::__construct()
*/
public function getMockedRequestStack(array $data = []) : RequestStack
{
$request_keys = ['query', 'request', 'attributes', 'cookies', 'files', 'server', 'content'];
$request_parameters = [];
foreach ($request_keys as $request_key) {
$request_parameter_default = ($request_key == 'content') ? null : [];
$request_parameter = !empty($data[$request_key]) ? $data[$request_key] : $request_parameter_default;
$request_parameters[] = $request_parameter;
}
$request = new Request();
call_user_func_array(array($request, 'initialize'), $request_parameters);
if (!empty($data['session'])) {
$session = new SymfonySession(new MockFileSessionStorage);
foreach ($data['session'] as $session_key => $session_value) {
$session->set($session_key, $session_value);
}
$request->setSession($session);
}
$request_stack = $this->createMock(RequestStack::class);
$request_stack
->method('getCurrentRequest')
->willReturn($request)
;
return $request_stack;
}
}