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/MessageRepositoryTest.php

578 lines
19 KiB

<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\Tests\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Message;
use Chamilo\CoreBundle\Entity\MessageAttachment;
use Chamilo\CoreBundle\Entity\MessageRelUser;
use Chamilo\CoreBundle\Entity\MessageTag;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Repository\MessageRepository;
use Chamilo\CoreBundle\Repository\MessageTagRepository;
use Chamilo\CoreBundle\Repository\Node\MessageAttachmentRepository;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use Symfony\Component\HttpFoundation\Response;
class MessageRepositoryTest extends AbstractApiTest
{
use ChamiloTestTrait;
public function testCreateMessage(): void
{
$this->createUser('from');
$senderUserIri = $this->findIriBy(User::class, ['username' => 'from']);
$fromUserToken = $this->getUserToken(['username' => 'from', 'password' => 'from']);
$this->createUser('to');
$receiverUserIri = $this->findIriBy(User::class, ['username' => 'to']);
$receiverUserToken = $this->getUserToken(['username' => 'to', 'password' => 'to']);
$this->createUser('cc');
$receiverCopyUserIri = $this->findIriBy(User::class, ['username' => 'cc']);
$receiverCopyUserToken = $this->getUserToken(['username' => 'cc', 'password' => 'cc']);
$response = $this
->createClientWithCredentials($fromUserToken)
->request(
'POST',
'/api/messages',
[
'json' => [
'title' => 'hello',
'content' => 'content of hello',
'msgType' => Message::MESSAGE_TYPE_INBOX,
'sender' => $senderUserIri,
'receivers' => [
[
'receiver' => $receiverUserIri,
'receiverType' => MessageRelUser::TYPE_TO,
],
[
'receiver' => $receiverCopyUserIri,
'receiverType' => MessageRelUser::TYPE_CC,
],
],
],
]
)
;
$this->assertResponseIsSuccessful();
$this->assertResponseStatusCodeSame(Response::HTTP_CREATED);
$this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
$this->assertJsonContains(
[
'@context' => '/api/contexts/Message',
'@type' => 'Message',
'sender' => [
'@id' => $senderUserIri,
],
'msgType' => Message::MESSAGE_TYPE_INBOX,
'receiversTo' => [
0 => [
'@type' => 'MessageRelUser',
'receiver' => [
'@id' => $receiverUserIri,
],
'receiverType' => MessageRelUser::TYPE_TO,
],
],
'receiversCc' => [
0 => [
'@type' => 'MessageRelUser',
'receiver' => [
'@id' => $receiverCopyUserIri,
],
'receiverType' => MessageRelUser::TYPE_CC,
],
],
]
);
$this->assertEmailCount(2);
$messageArray = $response->toArray();
$messageRelUserIri = $messageArray['firstReceiver']['@id'];
$this
->createClientWithCredentials($receiverUserToken)
->request(
'PUT',
$messageRelUserIri,
[
'json' => [
'read' => true,
'starred' => true,
],
]
)
;
$this->assertResponseIsSuccessful();
$this->assertResponseStatusCodeSame(Response::HTTP_OK);
$this->assertJsonContains(
[
'@type' => 'MessageRelUser',
'read' => true,
'starred' => true,
]
);
}
public function testCreateMessageWithTags(): Message
{
$em = $this->getEntityManager();
$messageTagRepo = self::getContainer()->get(MessageTagRepository::class);
$messageRepo = self::getContainer()->get(MessageRepository::class);
$userRepo = self::getContainer()->get(UserRepository::class);
$messageRelUserRepo = $em->getRepository(MessageRelUser::class);
$admin = $this->getUser('admin');
$testUser = $this->createUser('test');
$message = (new Message())
->setTitle('hello')
->setContent('content')
->setMsgType(Message::MESSAGE_TYPE_INBOX)
->setSender($admin)
->addReceiverTo($testUser)
;
$this->assertHasNoEntityViolations($message);
$messageRepo->update($message);
// 1. Message exists in the inbox.
$count = $messageRepo->count(['msgType' => Message::MESSAGE_TYPE_INBOX]);
$this->assertSame(1, $count);
$em->clear();
/** @var User $testUser */
$testUser = $userRepo->find($testUser->getId());
// Getting message sent.
/** @var MessageRelUser $receivedMessage */
$receivedMessage = $testUser->getReceivedMessages()->first();
// Add tags to the same message.
$tag = (new MessageTag())
->setTag('my tag')
->setUser($testUser)
->addMessage($receivedMessage)
;
$this->assertHasNoEntityViolations($tag);
$messageTagRepo->update($tag);
// 1 tag created.
$this->assertSame(1, $messageTagRepo->count([]));
// MessageRelUser has 1 tag
$this->assertSame(1, $receivedMessage->getTags()->count());
// Add same tag again, should appear an invalid entity.
$tag = (new MessageTag())
->setTag('my tag')
->setUser($testUser)
->addMessage($receivedMessage)
;
$this->assertSame(1, $this->getViolations($tag)->count());
$em->clear();
/** @var User $testUser */
$testUser = $userRepo->find($testUser->getId());
/** @var MessageRelUser $receivedMessage */
$receivedMessage = $testUser->getReceivedMessages()->first();
// Add second tag.
$tag = (new MessageTag())
->setTag('my tag 2')
->setUser($testUser)
->addMessage($receivedMessage)
;
$this->assertHasNoEntityViolations($tag);
$messageTagRepo->update($tag);
$this->assertSame(2, $receivedMessage->getTags()->count());
$this->assertSame(1, $messageRepo->count([]));
$this->assertSame(1, $messageRelUserRepo->count([]));
$this->assertSame(2, $messageTagRepo->count([]));
return $message;
}
public function testDeleteMessageTag(): void
{
$em = $this->getEntityManager();
$messageTagRepo = self::getContainer()->get(MessageTagRepository::class);
$messageRepo = self::getContainer()->get(MessageRepository::class);
$messageRelUserRepo = $em->getRepository(MessageRelUser::class);
$message = $this->testCreateMessageWithTags();
/** @var Message $message */
$message = $messageRepo->find($message->getId());
$this->assertSame(1, $message->getReceivers()->count());
/** @var MessageRelUser $messageRelUser */
$messageRelUser = $message->getReceivers()->first();
$tag = $messageTagRepo->find($messageRelUser->getTags()->first());
$messageTagRepo->delete($tag);
/** @var Message $message */
$message = $messageRepo->find($message->getId());
$this->assertSame(1, $message->getReceivers()->count());
$this->assertSame(1, $messageRepo->count([]));
$this->assertSame(1, $messageRelUserRepo->count([]));
$this->assertSame(1, $messageTagRepo->count([]));
}
public function testDeleteMessageWithTag(): void
{
$em = $this->getEntityManager();
$userRepo = self::getContainer()->get(UserRepository::class);
$messageTagRepo = self::getContainer()->get(MessageTagRepository::class);
$messageRepo = self::getContainer()->get(MessageRepository::class);
$messageRelUserRepo = $em->getRepository(MessageRelUser::class);
$message = $this->testCreateMessageWithTags();
/** @var Message $message */
$message = $messageRepo->find($message->getId());
$messageRepo->delete($message);
$this->assertSame(0, $messageRepo->count([]));
$this->assertSame(0, $messageRelUserRepo->count([]));
$this->assertSame(0, $messageTagRepo->count([]));
$this->assertNotNull($this->getUser('admin'));
$this->assertNotNull($this->getUser('test'));
}
public function testCreateMessageWithAttachment(): void
{
$user1 = $this->getUser('admin');
$user2 = $this->createUser('user2');
$user1Token = $this->getUserTokenFromUser($user1);
$client = $this->createClientWithCredentials($user1Token);
$file = $this->getUploadedFile();
$resourceFile = $client->request(
'POST',
'/api/resource_files',
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'extra' => [
'files' => [
'file' => $file,
],
],
]
);
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
$this->assertJsonContains(
[
'@context' => '/api/contexts/ResourceFile',
'@type' => 'http://schema.org/MediaObject',
]
);
$resourceFileId = $resourceFile->toArray()['@id'];
$client->request(
'POST',
'/api/messages',
[
'json' => [
'msgType' => Message::MESSAGE_TYPE_INBOX,
'title' => 'Message title',
'content' => 'Message content',
'receivers' => [
[
'receiver' => "/api/users/{$user2->getId()}",
'receiverType' => MessageRelUser::TYPE_TO,
],
],
'sender' => "/api/users/{$user1->getId()}",
'attachments' => [
[
'resourceFileToAttach' => $resourceFileId,
],
],
],
]
);
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
$this->assertJsonContains(
[
'@context' => '/api/contexts/Message',
'@type' => 'Message',
'sender' => [
'@id' => "/api/users/{$user1->getId()}",
],
'receiversTo' => [
[
'@type' => 'MessageRelUser',
'receiver' => [
'@id' => "/api/users/{$user2->getId()}",
],
'receiverType' => MessageRelUser::TYPE_TO,
],
],
'msgType' => Message::MESSAGE_TYPE_INBOX,
'title' => 'Message title',
'content' => 'Message content',
'attachments' => [
[
'@type' => 'http://schema.org/MediaObject',
'resourceNode' => [
'@type' => 'ResourceNode',
'resourceFiles' => [
[
'@type' => 'http://schema.org/MediaObject',
'@id' => $resourceFileId,
],
],
],
],
],
]
);
}
public function testDeleteMessage(): void
{
$em = $this->getEntityManager();
$messageAttachmentRepo = self::getContainer()->get(MessageAttachmentRepository::class);
$messageTagRepo = self::getContainer()->get(MessageTagRepository::class);
$messageRepo = self::getContainer()->get(MessageRepository::class);
$userRepo = self::getContainer()->get(UserRepository::class);
$messageRelUserRepo = $em->getRepository(MessageRelUser::class);
$admin = $this->getUser('admin');
$testUser = $this->createUser('test');
// 1. Create message.
$message = (new Message())
->setTitle('hello')
->setContent('content')
->setMsgType(Message::MESSAGE_TYPE_INBOX)
->setSender($admin)
->addReceiverTo($testUser)
;
$this->assertHasNoEntityViolations($message);
$messageRepo->update($message);
$file = $this->getUploadedFile();
// 2. Create attachment.
$attachment = (new MessageAttachment())
->setFilename($file->getFilename())
->setMessage($message)
->setParent($message->getSender())
->setCreator($message->getSender())
;
$em->persist($attachment);
$messageAttachmentRepo->addFile($attachment, $file);
$em->flush();
$em->clear();
$url = $messageAttachmentRepo->getResourceFileUrl($attachment);
$this->assertNotEmpty($url);
// Create tag.
/** @var User $testUser */
$testUser = $userRepo->find($testUser->getId());
/** @var MessageRelUser $receivedMessage */
$receivedMessage = $testUser->getReceivedMessages()->first();
$tag = (new MessageTag())
->setTag('my tag')
->setUser($testUser)
->addMessage($receivedMessage)
;
$this->assertHasNoEntityViolations($tag);
$messageTagRepo->update($tag);
$em->clear();
// Delete message.
$message = $messageRepo->find($message->getId());
$messageRepo->delete($message);
// No messages.
$this->assertSame(0, $messageRepo->count([]));
// No message_rel_user.
$this->assertSame(0, $messageRelUserRepo->count([]));
// No attachments.
$this->assertSame(0, $messageAttachmentRepo->count([]));
// 2 tags still exists.
$this->assertSame(0, $messageTagRepo->count([]));
}
public function testCreateMessageWithApiAsOtherUser(): void
{
$fromUser = $this->createUser('from');
$toUser = $this->createUser('to');
// Try to send a message as another user.
$this->createUser('bad');
$tokenFromBadUser = $this->getUserToken(
[
'username' => 'bad',
'password' => 'bad',
],
true
);
$this->createClientWithCredentials($tokenFromBadUser)->request(
'POST',
'/api/messages',
[
'json' => [
'title' => 'hello',
'content' => 'content of hello',
'msgType' => Message::MESSAGE_TYPE_INBOX,
'sender' => $fromUser->getIri(),
'receiversTo' => [
[
'receiver' => $toUser->getIri(),
],
],
],
]
);
$this->assertResponseStatusCodeSame(403);
// Try to send a message as another user.
$this->createClientWithCredentials($tokenFromBadUser)->request(
'POST',
'/api/messages',
[
'json' => [
'title' => 'hello',
'content' => 'content of hello',
'msgType' => Message::MESSAGE_TYPE_INBOX,
'sender' => $toUser->getIri(),
'receivers' => [
[
'receiver' => $fromUser->getIri(),
],
],
],
]
);
$this->assertResponseStatusCodeSame(403);
}
public function testDeleteMessageWithApi(): void
{
$messageRepo = self::getContainer()->get(MessageRepository::class);
$fromUser = $this->createUser('from');
$toUser = $this->createUser('to');
$tokenFrom = $this->getUserToken(
[
'username' => 'from',
'password' => 'from',
]
);
$response = $this->createClientWithCredentials($tokenFrom)->request(
'POST',
'/api/messages',
[
'json' => [
'title' => 'hello',
'content' => 'content of hello',
'msgType' => Message::MESSAGE_TYPE_INBOX,
'sender' => $fromUser->getIri(),
'receivers' => [
[
'receiver' => $toUser->getIri(),
],
],
],
]
);
$this->assertResponseIsSuccessful();
$this->assertResponseStatusCodeSame(201);
$id = $response->toArray()['@id'];
$messageId = $response->toArray()['id'];
// Sender cannot delete a message already sent.
$this->createClientWithCredentials($tokenFrom)->request(
'DELETE',
$id,
);
$this->assertResponseStatusCodeSame(403);
/** @var Message $message */
$message = $messageRepo->find($messageId);
$this->assertSame(1, $message->getReceivers()->count());
// Receiver deletes the message.
$tokenTo = $this->getUserToken(
[
'username' => 'to',
'password' => 'to',
],
true
);
$this->createClientWithCredentials($tokenTo)->request(
'DELETE',
$id,
);
$this->assertResponseStatusCodeSame(403);
}
public function testGetMessageByUser(): void
{
$messageRepo = self::getContainer()->get(MessageRepository::class);
$admin = $this->getUser('admin');
$testUser = $this->createUser('test');
$message = (new Message())
->setTitle('hello')
->setContent('content')
->setMsgType(Message::MESSAGE_TYPE_INBOX)
->setSender($admin)
->addReceiverTo($testUser)
;
$this->assertHasNoEntityViolations($message);
$messageRepo->update($message);
$messages = $messageRepo->getMessageByUser($testUser, Message::MESSAGE_TYPE_INBOX);
$this->assertSame(1, \count($messages));
}
}