Files
vivespos-landing/modules/system/tests/bootstrap/PluginManagerTestCase.php
avives 1f72193a64
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run
feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
- Base: wintercms/winter branch 1.2 (full framework)
- Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS
- Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication
- Partials: hero (offline-first), features, modes (offline/nube toggle),
  screenshots, pricing (3 planes), comparison, FAQ, CTA
- Plugin VivesPOS.Site with ContactForm
- Dockerfile: PHP 8.2 Apache, port 80, healthcheck
- Added winter/wn-pages, blog, sitemap, seo plugins
- Active theme set to vivespos
2026-08-21 19:29:00 -06:00

117 lines
3.1 KiB
PHP

<?php
namespace System\Tests\Bootstrap;
use System\Classes\UpdateManager;
use System\Classes\VersionManager;
use System\Classes\PluginManager;
use ReflectionClass;
use Winter\Storm\Database\Model as ActiveRecord;
class PluginManagerTestCase extends TestCase
{
public ?PluginManager $manager = null;
protected $output;
/**
* Creates the application.
* @return Symfony\Component\HttpKernel\HttpKernelInterface
*/
public function createApplication()
{
$app = parent::createApplication();
/*
* Store database in memory by default unless specified otherwise
*/
if (!file_exists(base_path('config/testing/database.php'))) {
$app['config']->set('database.connections.testing', [
'driver' => 'sqlite',
'database' => ':memory:',
]);
$app['config']->set('database.default', 'testing');
}
return $app;
}
/**
* Perform test case set up.
* @return void
*/
public function setUp() : void
{
/*
* Force reload of Winter singletons
*/
PluginManager::forgetInstance();
UpdateManager::forgetInstance();
// Forces plugin migrations to be run again on every test
VersionManager::forgetInstance();
$this->output = new \Symfony\Component\Console\Output\BufferedOutput();
parent::setUp();
/*
* Ensure system is up to date
*/
$this->runWinterUpCommand();
$manager = PluginManager::instance();
self::callProtectedMethod($manager, 'init');
$this->manager = $manager;
}
/**
* Flush event listeners and collect garbage.
* @return void
*/
public function tearDown() : void
{
$this->flushModelEventListeners();
parent::tearDown();
unset($this->app);
}
/**
* Migrate database using winter:up command.
* @return void
*/
protected function runWinterUpCommand()
{
UpdateManager::instance()
->setNotesOutput($this->output)
->update();
}
/**
* The models in Winter use a static property to store their events, these
* will need to be targeted and reset ready for a new test cycle.
* Pivot models are an exception since they are internally managed.
* @return void
*/
protected function flushModelEventListeners()
{
foreach (get_declared_classes() as $class) {
if ($class === 'Winter\Storm\Database\Pivot' || strtolower($class) === 'october\rain\database\pivot') {
continue;
}
$reflectClass = new ReflectionClass($class);
if (
!$reflectClass->isInstantiable() ||
!$reflectClass->isSubclassOf('Winter\Storm\Database\Model') ||
$reflectClass->isSubclassOf('Winter\Storm\Database\Pivot')
) {
continue;
}
$class::flushEventListeners();
}
ActiveRecord::flushEventListeners();
}
}