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/CoreBundle/Repository/PageRepositoryTest.php

328 lines
10 KiB

<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\Tests\CoreBundle\Repository;
use Chamilo\CoreBundle\Component\Utils\CreateDefaultPages;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\Page;
use Chamilo\CoreBundle\Entity\PageCategory;
use Chamilo\CoreBundle\Repository\PageCategoryRepository;
use Chamilo\CoreBundle\Repository\PageRepository;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
class PageRepositoryTest extends AbstractApiTest
{
use ChamiloTestTrait;
public function testCreate(): Page
{
$em = $this->getEntityManager();
$pageRepo = self::getContainer()->get(PageRepository::class);
$defaultCount = $pageRepo->count([]);
$user = $this->getAdmin();
$url = $this->getAccessUrl();
$category = (new PageCategory())
->setCreator($user)
->setTitle('category1')
->setType('simple')
->setCreatedAt(new DateTime())
->setUpdatedAt(new DateTime())
;
$this->assertHasNoEntityViolations($category);
$em->persist($category);
$page = (new Page())
->setTitle('page1')
->setContent('page1 content')
->setCreator($user)
->setUrl($url)
->setPosition(0)
->setCategory($category)
->setSlug('english')
->setLocale('en')
->setEnabled(true)
->setCreatedAt(new DateTime())
->setUpdatedAt(new DateTime())
;
$this->assertHasNoEntityViolations($page);
$em->persist($page);
$collection = new ArrayCollection();
$collection->add($page);
$category->setPages($collection);
$em->persist($category);
$em->flush();
$this->assertSame(0, $page->getPosition());
// 2 pages are already created during installation.
$this->assertSame($defaultCount + 1, $pageRepo->count([]));
$category2 = (new PageCategory())
->setCreator($user)
->setTitle('category2')
->setType('simple')
->setCreatedAt(new DateTime())
->setUpdatedAt(new DateTime())
;
$this->assertHasNoEntityViolations($category2);
$em->persist($category2);
$pageFrench = (new Page())
->setTitle("l'êtê")
->setContent('french content')
->setCreator($user)
->setUrl($url)
->setCategory($category2)
->setLocale('fr')
->setEnabled(true)
->setCreatedAt(new DateTime())
->setUpdatedAt(new DateTime())
;
$this->assertHasNoEntityViolations($pageFrench);
$em->persist($pageFrench);
$em->flush();
$this->assertSame(0, $pageFrench->getPosition());
$this->assertSame('fr', $pageFrench->getLocale());
$this->assertSame('lete', $pageFrench->getSlug());
$this->assertSame($defaultCount + 2, $pageRepo->count([]));
return $page;
}
public function testAddAnotherPage(): void
{
$page = $this->testCreate();
$em = $this->getEntityManager();
$pageRepo = self::getContainer()->get(PageRepository::class);
$defaultCount = $pageRepo->count([]);
/** @var Page $page */
$page = $pageRepo->find($page->getId());
$url = $this->getAccessUrl();
$user = $this->getAdmin();
$anotherPage = (new Page())
->setTitle('page2')
->setContent('page2 content')
->setUrl($url)
->setCreator($user)
->setLocale('en')
->setEnabled(true)
->setCategory($page->getCategory())
;
$this->assertHasNoEntityViolations($anotherPage);
$em->persist($anotherPage);
$em->flush();
$this->assertSame($defaultCount + 1, $pageRepo->count([]));
$this->assertSame(1, $anotherPage->getPosition());
$this->assertNotNull($anotherPage->getCategory());
}
public function testUpdate(): void
{
$page = $this->testCreate();
$pageRepo = self::getContainer()->get(PageRepository::class);
$defaultCount = $pageRepo->count([]);
$page->setLocale('fr');
$pageRepo->update($page);
$this->assertSame('fr', $page->getLocale());
$this->assertSame($defaultCount, $pageRepo->count([]));
}
public function testDelete(): void
{
$page = $this->testCreate();
$pageRepo = self::getContainer()->get(PageRepository::class);
$defaultCount = $pageRepo->count([]);
$pageRepo->delete($page);
$this->assertSame($defaultCount - 1, $pageRepo->count([]));
}
public function testGetPages(): void
{
$this->testAddAnotherPage();
$token = $this->getUserToken([]);
$this->createClientWithCredentials($token)->request('GET', '/api/pages');
$this->assertResponseIsSuccessful();
$response = $this->createClientWithCredentials($token)->request(
'GET',
'/api/pages',
[
'query' => [
'locale' => 'en',
],
]
);
$this->assertResponseIsSuccessful();
// Asserts that the returned content type is JSON-LD (the default)
$this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
// Asserts that the returned JSON is a superset of this one
$this->assertJsonContains([
'@context' => '/api/contexts/Page',
'@id' => '/api/pages',
'@type' => 'hydra:Collection',
'hydra:totalItems' => 2,
]);
$this->assertCount(2, $response->toArray()['hydra:member']);
$this->assertMatchesResourceCollectionJsonSchema(Page::class);
$response = $this->createClientWithCredentials($token)->request(
'GET',
'/api/pages',
[
'query' => [
'locale' => 'en',
'category.title' => 'category1',
],
]
);
$this->assertCount(2, $response->toArray()['hydra:member']);
$this->assertJsonContains([
'@context' => '/api/contexts/Page',
'@id' => '/api/pages',
'@type' => 'hydra:Collection',
'hydra:member' => [
[
'@type' => 'Page',
'title' => 'page1',
],
[
'@type' => 'Page',
'title' => 'page2',
],
],
]);
$response = $this->createClientWithCredentials($token)->request(
'GET',
'/api/pages',
[
'query' => [
'locale' => 'fr',
],
]
);
$this->assertCount(1, $response->toArray()['hydra:member']);
}
public function testAddPage(): void
{
$user = $this->getAdmin();
$url = $this->getAccessUrl();
$url = $this->findIriBy(AccessUrl::class, ['id' => $url->getId()]);
$token = $this->getUserToken([]);
$this->createClientWithCredentials($token)->request(
'POST',
'/api/pages',
[
'json' => [
'creator' => $user->getIri(),
'url' => $url,
'locale' => 'en',
'title' => 'my post',
'content' => 'hello',
],
]
);
$this->assertResponseStatusCodeSame(201);
}
public function testGetPage(): void
{
$page = $this->testCreate();
$iri = $this->findIriBy(Page::class, ['id' => $page->getId()]);
$token = $this->getUserToken([]);
$this->createClientWithCredentials($token)->request('GET', $iri);
$this->assertResponseIsSuccessful();
$this->assertJsonContains([
'@id' => $iri,
'@type' => 'Page',
'title' => 'page1',
'content' => 'page1 content',
'@context' => '/api/contexts/Page',
]);
}
public function testDeletePage(): void
{
$page = $this->testCreate();
$iri = $this->findIriBy(Page::class, ['id' => $page->getId()]);
$token = $this->getUserToken([]);
$this->createClientWithCredentials($token)->request(
'DELETE',
$iri
);
$this->assertResponseStatusCodeSame(204);
$iri = $this->findIriBy(Page::class, ['id' => $page->getId()]);
$this->assertNull($iri);
}
public function testDeleteAll(): void
{
$pageRepo = self::getContainer()->get(PageRepository::class);
$pageCategoryRepo = self::getContainer()->get(PageCategoryRepository::class);
foreach ($pageRepo->findAll() as $page) {
$pageRepo->delete($page);
}
foreach ($pageCategoryRepo->findAll() as $pageCategory) {
$pageCategoryRepo->delete($pageCategory);
}
$this->assertSame(0, $pageRepo->count([]));
$this->assertSame(0, $pageCategoryRepo->count([]));
}
public function testCreateDefaultPages(): void
{
$this->testDeleteAll();
/** @var PageCategoryRepository $pageCategoryRepo */
$pageCategoryRepo = self::getContainer()->get(PageCategoryRepository::class);
/** @var PageRepository $pageRepo */
$pageRepo = self::getContainer()->get(PageRepository::class);
/** @var CreateDefaultPages $createDefaultPages */
$createDefaultPages = self::getContainer()->get(CreateDefaultPages::class);
$admin = $this->getAdmin();
$result = $createDefaultPages->createDefaultPages($admin, $this->getAccessUrl(), 'en_US');
$this->assertTrue($result);
$this->assertSame(2, $pageRepo->count([]));
$this->assertSame(
7 + \count(CreateDefaultPages::getCategoriesForAdminBlocks()),
$pageCategoryRepo->count([])
);
$result = $createDefaultPages->createDefaultPages($admin, $this->getAccessUrl(), 'en_US');
$this->assertFalse($result);
}
}