mautic / app /bundles /DashboardBundle /Tests /Controller /DashboardControllerFunctionalTest.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
declare(strict_types=1);
namespace Mautic\DashboardBundle\Tests\Controller;
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
use Mautic\DashboardBundle\Entity\Widget;
use Mautic\LeadBundle\Entity\LeadList;
use Mautic\ReportBundle\Entity\Report;
use Mautic\UserBundle\Entity\User;
use PHPUnit\Framework\Assert;
use Symfony\Component\DomCrawler\Crawler;
class DashboardControllerFunctionalTest extends MauticMysqlTestCase
{
public function testWidgetWithReport(): void
{
$user = $this->em->getRepository(User::class)->findOneBy([]);
$report = new Report();
$report->setName('Lead and points');
$report->setSource('lead.pointlog');
$this->em->persist($report);
$this->em->flush();
$widget = new Widget();
$widget->setName('Line graph report');
$widget->setType('report');
$widget->setParams(['graph' => sprintf('%s:mautic.lead.graph.line.leads', $report->getId())]);
$widget->setWidth(100);
$widget->setHeight(200);
$widget->setCreatedBy($user);
$this->em->persist($widget);
$this->em->flush();
$this->em->detach($widget);
$this->client->request('GET', sprintf('/s/dashboard/widget/%s', $widget->getId()), [], [], [
'HTTP_X-Requested-With' => 'XMLHttpRequest',
]);
$response = $this->client->getResponse();
Assert::assertSame(200, $response->getStatusCode());
$content = $response->getContent();
Assert::assertJson($content);
$data = json_decode($content, true);
Assert::assertIsArray($data);
Assert::assertArrayHasKey('success', $data);
Assert::assertSame(1, $data['success']);
Assert::assertArrayHasKey('widgetId', $data);
Assert::assertSame((string) $widget->getId(), $data['widgetId']);
Assert::assertArrayHasKey('widgetWidth', $data);
Assert::assertSame($widget->getWidth(), $data['widgetWidth']);
Assert::assertArrayHasKey('widgetHeight', $data);
Assert::assertSame($widget->getHeight(), $data['widgetHeight']);
Assert::assertArrayHasKey('widgetHtml', $data);
Assert::assertStringContainsString('View Full Report', $data['widgetHtml']);
}
public function testWidgetWithSegmentBuildTime(): void
{
$user = $this->em->getRepository(User::class)->findOneBy([]);
$this->createSegment('A', 'a', 3, $user);
$this->createSegment('B', 'b', 60, $user);
$this->createSegment('C', 'c', 66, $user);
$this->createSegment('D', 'd', 0.4, $user);
$widget = new Widget();
$widget->setName('Segments build time');
$widget->setType('segments.build.time');
$widget->setParams(['order' => 'DESC', 'segments' => []]);
$widget->setWidth(100);
$widget->setHeight(300);
$widget->setCreatedBy($user);
$this->em->persist($widget);
$this->em->flush();
$this->em->detach($widget);
$this->client->request('GET', sprintf('/s/dashboard/widget/%s', $widget->getId()), [], [], [
'HTTP_X-Requested-With' => 'XMLHttpRequest',
]);
$response = $this->client->getResponse();
Assert::assertSame(200, $response->getStatusCode());
$content = $response->getContent();
Assert::assertJson($content);
$data = json_decode($content, true);
Assert::assertIsArray($data);
Assert::assertArrayHasKey('success', $data);
Assert::assertSame(1, $data['success']);
Assert::assertArrayHasKey('widgetHtml', $data);
$tableArray = $this->widgetHtmlWithTableToArray($data['widgetHtml']);
$this->assertSame([
['C', 'Admin User', '1 minute 6 seconds'],
['B', 'Admin User', '1 minute'],
['A', 'Admin User', '3 seconds'],
['D', 'Admin User', 'Less than 1 second'],
], $tableArray);
}
private function createSegment(string $name, string $alias, float $lastBuildTime = 0, ?User $user = null): LeadList
{
$segment = new LeadList();
$segment->setName($name);
$segment->setPublicName($name);
$segment->setAlias($alias);
$segment->setLastBuiltTime($lastBuildTime);
if ($user) {
$segment->setCreatedBy($user);
$segment->setCreatedByUser($user->getName());
}
$this->em->persist($segment);
return $segment;
}
/**
* @return array<int,array<int,string>>
*/
private function widgetHtmlWithTableToArray(string $widgetHtml): array
{
$doc = new \DOMDocument();
$doc->loadHTML($widgetHtml);
$crawler = new Crawler($doc);
$crawlerTable = $crawler->filter('table')->first();
return array_slice($crawlerTable->filter('tr')->each(fn ($tr) => $tr->filter('td')->each(fn ($td) => trim($td->text()))), 1);
}
}