Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 9 additions & 22 deletions extensions/package-manager/src/Listener/ReCheckForUpdates.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use Flarum\ExtensionManager\Command\CheckForUpdates;
use Flarum\ExtensionManager\Event\FlarumUpdated;
use Flarum\ExtensionManager\Extension\Event\Updated;
use Flarum\ExtensionManager\Settings\LastUpdateCheck;
use Flarum\ExtensionManager\Settings\LastUpdateRun;

class ReCheckForUpdates
Expand All @@ -22,20 +21,14 @@ class ReCheckForUpdates
* @var LastUpdateRun
*/
private $lastUpdateRun;
/**
* @var LastUpdateCheck
*/
private $lastUpdateCheck;

/**
* @var Dispatcher
*/
private $bus;

public function __construct(LastUpdateRun $lastUpdateRun, LastUpdateCheck $lastUpdateCheck, Dispatcher $bus)
public function __construct(LastUpdateRun $lastUpdateRun, Dispatcher $bus)
{
$this->lastUpdateRun = $lastUpdateRun;
$this->lastUpdateCheck = $lastUpdateCheck;
$this->bus = $bus;
}

Expand All @@ -44,25 +37,19 @@ public function __construct(LastUpdateRun $lastUpdateRun, LastUpdateCheck $lastU
*/
public function handle($event): void
{
$previousUpdateCheck = $this->lastUpdateCheck->get();

$lastUpdateCheck = $this->bus->dispatch(
new CheckForUpdates($event->actor)
);

if ($event instanceof FlarumUpdated) {
$mapPackageName = function (array $package) {
return $package['name'];
};

$previousPackages = array_map($mapPackageName, $previousUpdateCheck['updates']['installed']);
$lastPackages = array_map($mapPackageName, $lastUpdateCheck['updates']['installed']);

// Composer replaced vendor files, so this process's stale autoloader cannot safely load new dependency classes.
$this->lastUpdateRun
->for($event->type)
->with('status', LastUpdateRun::SUCCESS)
->with('limitedPackages', array_intersect($previousPackages, $lastPackages))
->with('limitedPackages', [])
->save();

return;
}

$this->bus->dispatch(
new CheckForUpdates($event->actor)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,12 @@ public function can_update_with_latest_ext_incompatible_with_latest_core()

/** @var LastUpdateRun $lastUpdateRun */
$lastUpdateRun = $this->app()->getContainer()->make(LastUpdateRun::class);
$lastMinorUpdateRun = $lastUpdateRun->for(FlarumUpdated::MINOR)->get();

$this->assertEquals(201, $response->getStatusCode());
$this->assertPackageVersion('flarum/tags', '*');
$this->assertPackageVersion('flarum/dummy-extension', '*');
$this->assertEquals([
'flarum/core',
'flarum/lang-english',
'flarum/tags'
], $lastUpdateRun->for(FlarumUpdated::MINOR)->get()['limitedPackages']);
$this->assertEquals(LastUpdateRun::SUCCESS, $lastMinorUpdateRun['status']);
$this->assertEquals([], $lastMinorUpdateRun['limitedPackages']);
}
}
75 changes: 75 additions & 0 deletions extensions/package-manager/tests/unit/ReCheckForUpdatesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/

namespace Flarum\ExtensionManager\Tests\unit;

use Flarum\Bus\Dispatcher;
use Flarum\Extension\Extension;
use Flarum\ExtensionManager\Command\CheckForUpdates;
use Flarum\ExtensionManager\Event\FlarumUpdated;
use Flarum\ExtensionManager\Extension\Event\Updated;
use Flarum\ExtensionManager\Listener\ReCheckForUpdates;
use Flarum\ExtensionManager\Settings\LastUpdateRun;
use Flarum\Settings\SettingsRepositoryInterface;
use Flarum\User\User;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;

class ReCheckForUpdatesTest extends TestCase
{
#[Test]
#[DataProvider('coreUpdateTypes')]
public function core_update_records_success_without_rechecking_for_updates(string $updateType): void
{
$settings = $this->createMock(SettingsRepositoryInterface::class);
$settings->expects($this->once())
->method('set')
->with(LastUpdateRun::key(), $this->callback(function (string $value) use ($updateType): bool {
$lastUpdateRun = json_decode($value, true)[$updateType];

return $lastUpdateRun['status'] === LastUpdateRun::SUCCESS
&& $lastUpdateRun['limitedPackages'] === [];
}));

$bus = $this->createMock(Dispatcher::class);
$bus->expects($this->never())->method('dispatch');

$listener = new ReCheckForUpdates(new LastUpdateRun($settings), $bus);
$listener->handle(new FlarumUpdated(new User(), $updateType));
}

public static function coreUpdateTypes(): array
{
return [
'global update' => [FlarumUpdated::GLOBAL],
'minor update' => [FlarumUpdated::MINOR],
'major update' => [FlarumUpdated::MAJOR],
];
}

#[Test]
public function extension_update_still_rechecks_for_updates(): void
{
$actor = new User();
$bus = $this->createMock(Dispatcher::class);
$bus->expects($this->once())
->method('dispatch')
->with($this->callback(function (CheckForUpdates $command) use ($actor): bool {
return $command->actor === $actor;
}))
->willReturn([]);

$listener = new ReCheckForUpdates(
$this->createStub(LastUpdateRun::class),
$bus
);
$listener->handle(new Updated($actor, new Extension(__DIR__, ['name' => 'acme/example'])));
}
}