Initial commit: CloudOps infrastructure platform

This commit is contained in:
root
2026-04-09 19:58:57 +02:00
commit 1166a52f26
7762 changed files with 839452 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace MauticPlugin\MauticFocusBundle\Tests\Functional\Controller;
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
use Mautic\ProjectBundle\Entity\Project;
use MauticPlugin\MauticFocusBundle\Entity\Focus;
use PHPUnit\Framework\Assert;
class FocusControllerTest extends MauticMysqlTestCase
{
public function testFocusWithProject(): void
{
$focus = new Focus();
$focus->setName('Test Focus');
$focus->setType('notice');
$focus->setStyle('bar');
$this->em->persist($focus);
$project = new Project();
$project->setName('Test Project');
$this->em->persist($project);
$this->em->flush();
$this->em->clear();
$crawler = $this->client->request('GET', '/s/focus/edit/'.$focus->getId());
$form = $crawler->selectButton('Save')->form();
$form['focus[projects]']->setValue((string) $project->getId());
$this->client->submit($form);
$this->assertResponseIsSuccessful();
$savedFocus = $this->em->find(Focus::class, $focus->getId());
Assert::assertSame($project->getId(), $savedFocus->getProjects()->first()->getId());
}
}

View File

@@ -0,0 +1,99 @@
<?php
declare(strict_types=1);
namespace MauticPlugin\MauticFocusBundle\Tests\Functional\Controller;
use Mautic\ProjectBundle\Tests\Functional\AbstractProjectSearchTestCase;
use MauticPlugin\MauticFocusBundle\Entity\Focus;
final class FocusProjectSearchFunctionalTest extends AbstractProjectSearchTestCase
{
#[\PHPUnit\Framework\Attributes\DataProvider('searchDataProvider')]
public function testProjectSearch(string $searchTerm, array $expectedEntities, array $unexpectedEntities): void
{
$projectOne = $this->createProject('Project One');
$projectTwo = $this->createProject('Project Two');
$projectThree = $this->createProject('Project Three');
$focusAlpha = $this->createFocus('Focus Alpha');
$focusBeta = $this->createFocus('Focus Beta');
$this->createFocus('Focus Gamma');
$this->createFocus('Focus Delta');
$focusAlpha->addProject($projectOne);
$focusAlpha->addProject($projectTwo);
$focusBeta->addProject($projectTwo);
$focusBeta->addProject($projectThree);
$this->em->flush();
$this->em->clear();
$this->searchAndAssert($searchTerm, $expectedEntities, $unexpectedEntities, ['/api/focus', '/s/focus']);
}
/**
* @return \Generator<string, array{searchTerm: string, expectedEntities: array<string>, unexpectedEntities: array<string>}>
*/
public static function searchDataProvider(): \Generator
{
yield 'search by one project' => [
'searchTerm' => 'project:"Project Two"',
'expectedEntities' => ['Focus Alpha', 'Focus Beta'],
'unexpectedEntities' => ['Focus Gamma', 'Focus Delta'],
];
yield 'search by one project AND focus name' => [
'searchTerm' => 'project:"Project Two" AND Beta',
'expectedEntities' => ['Focus Beta'],
'unexpectedEntities' => ['Focus Alpha', 'Focus Gamma', 'Focus Delta'],
];
yield 'search by one project OR focus name' => [
'searchTerm' => 'project:"Project Two" OR Gamma',
'expectedEntities' => ['Focus Alpha', 'Focus Beta', 'Focus Gamma'],
'unexpectedEntities' => ['Focus Delta'],
];
yield 'search by NOT one project' => [
'searchTerm' => '!project:"Project Two"',
'expectedEntities' => ['Focus Gamma', 'Focus Delta'],
'unexpectedEntities' => ['Focus Alpha', 'Focus Beta'],
];
yield 'search by two projects with AND' => [
'searchTerm' => 'project:"Project Two" AND project:"Project Three"',
'expectedEntities' => ['Focus Beta'],
'unexpectedEntities' => ['Focus Alpha', 'Focus Gamma', 'Focus Delta'],
];
yield 'search by two projects with NOT AND' => [
'searchTerm' => '!project:"Project Two" AND !project:"Project Three"',
'expectedEntities' => ['Focus Gamma', 'Focus Delta'],
'unexpectedEntities' => ['Focus Alpha', 'Focus Beta'],
];
yield 'search by two projects with OR' => [
'searchTerm' => 'project:"Project Two" OR project:"Project Three"',
'expectedEntities' => ['Focus Alpha', 'Focus Beta'],
'unexpectedEntities' => ['Focus Gamma', 'Focus Delta'],
];
yield 'search by two projects with NOT OR' => [
'searchTerm' => '!project:"Project Two" OR !project:"Project Three"',
'expectedEntities' => ['Focus Alpha', 'Focus Gamma', 'Focus Delta'],
'unexpectedEntities' => ['Focus Beta'],
];
}
private function createFocus(string $name): Focus
{
$focus = new Focus();
$focus->setName($name);
$focus->setType('notice');
$focus->setStyle('bar');
$this->em->persist($focus);
return $focus;
}
}

View File

@@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
namespace MauticPlugin\MauticFocusBundle\Tests\Functional\Controller;
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
use Mautic\PageBundle\Entity\Redirect;
use MauticPlugin\MauticFocusBundle\Entity\Focus;
use PHPUnit\Framework\Assert;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PublicControllerTest extends MauticMysqlTestCase
{
#[\PHPUnit\Framework\Attributes\PreserveGlobalState(false)]
#[\PHPUnit\Framework\Attributes\RunInSeparateProcess]
public function testGenerateActionWithContactTokenInLinkUrl(): void
{
$linkUrl = 'https://{contactfield=site_url}/tour';
$focus = new Focus();
$focus->setName('Test');
$focus->setType('link');
$focus->setStyle('modal');
$focus->setProperties([
'content' => [
'headline' => '',
'link_text' => 'Link text',
'link_url' => $linkUrl,
'font' => 'Arial, Helvetica, sans-serif',
'link_new_window' => 1,
],
'when' => 'immediately',
'modal' => [
'placement' => 'top',
],
'frequency' => 'everypage',
'colors' => [
'primary' => '#4e5d9d',
'text' => '#000000',
'button' => '#fdb933',
'button_text' => '#ffffff',
],
]);
$this->em->persist($focus);
$this->em->flush();
$this->em->clear();
$this->client->request(Request::METHOD_GET, sprintf('/focus/%s.js', $focus->getId()));
$content = $this->client->getResponse()->getContent();
$redirects = $this->em->getRepository(Redirect::class)->findAll();
Assert::assertCount(1, $redirects);
/** @var Redirect $redirect */
$redirect = reset($redirects);
Assert::assertSame($linkUrl, $redirect->getUrl());
$url = $this->router->generate('mautic_url_redirect', ['redirectId' => $redirect->getRedirectId()], UrlGeneratorInterface::ABSOLUTE_URL);
$twig = $this->getContainer()->get('twig');
if (!$twig->hasExtension(\Twig\Extension\EscaperExtension::class)) {
$twig->addExtension(new \Twig\Extension\EscaperExtension());
}
$url = $twig->getRuntime(\Twig\Runtime\EscaperRuntime::class)->escape($url, 'js');
Assert::assertStringContainsString($url, $content);
}
}