mirror of
https://github.com/flarum/framework.git
synced 2025-03-25 08:17:29 +08:00
Extension Tests (#9)
This commit is contained in:
parent
5cef9ad52c
commit
a9ff884231
extensions/package-manager
5
extensions/package-manager/.gitattributes
vendored
Normal file
5
extensions/package-manager/.gitattributes
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
js/src export-ignore
|
||||||
|
.git* export-ignore
|
||||||
|
|
||||||
|
js/dist/*.js -diff
|
||||||
|
tests/*
|
@ -71,6 +71,7 @@ jobs:
|
|||||||
DB_PORT: 13306
|
DB_PORT: 13306
|
||||||
DB_PASSWORD: root
|
DB_PASSWORD: root
|
||||||
DB_PREFIX: ${{ matrix.prefix }}
|
DB_PREFIX: ${{ matrix.prefix }}
|
||||||
|
FLARUM_TEST_TMP_DIR_LOCAL: tests/tmp
|
||||||
|
|
||||||
- name: Run Composer tests
|
- name: Run Composer tests
|
||||||
run: composer test
|
run: composer test
|
||||||
|
@ -22,7 +22,8 @@
|
|||||||
"composer/composer": "^2.0"
|
"composer/composer": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"flarum/testing": "^1.0.0"
|
"flarum/testing": "^1.0.0",
|
||||||
|
"flarum/tags": "*"
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"flarum-extension": {
|
"flarum-extension": {
|
||||||
|
1001
extensions/package-manager/js/dist/admin.js
vendored
1001
extensions/package-manager/js/dist/admin.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -13,7 +13,7 @@ use Flarum\Foundation\ErrorHandling\HandledError;
|
|||||||
|
|
||||||
class ComposerCommandFailedExceptionHandler
|
class ComposerCommandFailedExceptionHandler
|
||||||
{
|
{
|
||||||
protected const INCOMPATIBLE_REGEX = '/ +- {PACKAGE_NAME} v[0-9.]+ requires flarum\/core/m';
|
protected const INCOMPATIBLE_REGEX = '/(?:(?: +- {PACKAGE_NAME} v[0-9A-z.-]+ requires flarum\/core)|(?:Could not find a version of package {PACKAGE_NAME} matching your minim))/m';
|
||||||
|
|
||||||
public function handle(ComposerCommandFailedException $e): HandledError
|
public function handle(ComposerCommandFailedException $e): HandledError
|
||||||
{
|
{
|
||||||
|
0
extensions/package-manager/tests/fixtures/.gitkeep
vendored
Normal file
0
extensions/package-manager/tests/fixtures/.gitkeep
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Flarum\PackageManager\Tests\integration;
|
||||||
|
|
||||||
|
trait RefreshComposerSetup
|
||||||
|
{
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
$composerSetup = new SetupComposer();
|
||||||
|
@unlink($this->tmpDir().'/composer.lock');
|
||||||
|
|
||||||
|
$composerSetup->run();
|
||||||
|
|
||||||
|
$this->composer('install');
|
||||||
|
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
<?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\PackageManager\Tests\integration;
|
||||||
|
|
||||||
|
use Flarum\Testing\integration\UsesTmpDir;
|
||||||
|
|
||||||
|
class SetupComposer
|
||||||
|
{
|
||||||
|
use UsesTmpDir;
|
||||||
|
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
$filePath = $this->tmpDir().'/composer.json';
|
||||||
|
|
||||||
|
file_put_contents($filePath, json_encode([
|
||||||
|
'require' => [
|
||||||
|
'flarum/core' => '1.0.0',
|
||||||
|
'flarum/tags' => '1.0.3',
|
||||||
|
'flarum/lang-english' => '*',
|
||||||
|
],
|
||||||
|
'config' => [
|
||||||
|
'preferred-install' => 'dist',
|
||||||
|
'sort-packages' => true,
|
||||||
|
],
|
||||||
|
], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
|
||||||
|
}
|
||||||
|
}
|
96
extensions/package-manager/tests/integration/TestCase.php
Normal file
96
extensions/package-manager/tests/integration/TestCase.php
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<?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\PackageManager\Tests\integration;
|
||||||
|
|
||||||
|
use Composer\Config;
|
||||||
|
use Composer\Console\Application;
|
||||||
|
use Flarum\Extension\ExtensionManager;
|
||||||
|
use Flarum\Foundation\Paths;
|
||||||
|
use Flarum\PackageManager\Extension\ExtensionUtils;
|
||||||
|
use Flarum\Testing\integration\RetrievesAuthorizedUsers;
|
||||||
|
use Illuminate\Contracts\Container\Container;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
|
use Symfony\Component\Console\Input\StringInput;
|
||||||
|
use Symfony\Component\Console\Output\NullOutput;
|
||||||
|
|
||||||
|
class TestCase extends \Flarum\Testing\integration\TestCase
|
||||||
|
{
|
||||||
|
use RetrievesAuthorizedUsers;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->extension('flarum-package-manager', 'flarum-tags');
|
||||||
|
|
||||||
|
$tmp = $this->tmpDir();
|
||||||
|
|
||||||
|
$this->app()->getContainer()->instance('flarum.paths', new Paths([
|
||||||
|
'base' => $tmp,
|
||||||
|
'public' => "$tmp/public",
|
||||||
|
'storage' => "$tmp/storage",
|
||||||
|
'vendor' => "$tmp/vendor",
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assertExtension(string $id, bool $exists)
|
||||||
|
{
|
||||||
|
$installed = json_decode(file_get_contents($this->app()->getContainer()->make(Paths::class)->vendor.'/composer/installed.json'), true);
|
||||||
|
$installedExtensions = Arr::where($installed['packages'] ?? $installed, function (array $package) {
|
||||||
|
return $package['type'] === 'flarum-extension';
|
||||||
|
});
|
||||||
|
$installedExtensionIds = array_map(function (string $name) {
|
||||||
|
return ExtensionUtils::nameToId($name);
|
||||||
|
}, Arr::pluck($installedExtensions, 'name'));
|
||||||
|
|
||||||
|
if ($exists) {
|
||||||
|
$this->assertTrue(in_array($id, $installedExtensionIds), "Failed asserting that extension $id is installed");
|
||||||
|
} else {
|
||||||
|
$this->assertFalse(in_array($id, $installedExtensionIds), "Failed asserting that extension $id is not installed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assertExtensionExists(string $id)
|
||||||
|
{
|
||||||
|
$this->assertExtension($id, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assertExtensionNotExists(string $id)
|
||||||
|
{
|
||||||
|
$this->assertExtension($id, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function requireExtension(string $package)
|
||||||
|
{
|
||||||
|
$this->composer("require $package");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function removeExtension(string $package)
|
||||||
|
{
|
||||||
|
$this->composer("remove $package");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function composer(string $command): void
|
||||||
|
{
|
||||||
|
/** @var Application $composer */
|
||||||
|
$composer = $this->app()->getContainer()->make(Application::class);
|
||||||
|
$output = new NullOutput();
|
||||||
|
$composer->run(new StringInput($command), $output);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function guessedCause(ResponseInterface $response): ?string
|
||||||
|
{
|
||||||
|
$json = json_decode($response->getBody()->getContents(), true);
|
||||||
|
|
||||||
|
return $json['errors'] ? ($json['errors'][0]['guessed_cause'] ?? null) : null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
<?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\PackageManager\Tests\integration\api\extensions;
|
||||||
|
|
||||||
|
use Flarum\PackageManager\Tests\integration\RefreshComposerSetup;
|
||||||
|
use Flarum\PackageManager\Tests\integration\TestCase;
|
||||||
|
|
||||||
|
class RemoveExtensionTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshComposerSetup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function extension_installed_by_default()
|
||||||
|
{
|
||||||
|
$this->assertExtensionExists('flarum-tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function removing_an_extension_works()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('DELETE', '/api/package-manager/extensions/flarum-tags', [
|
||||||
|
'authenticatedAs' => 1
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(204, $response->getStatusCode());
|
||||||
|
$this->assertExtensionNotExists('flarum-tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function removing_a_non_existant_extension_fails()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('DELETE', '/api/package-manager/extensions/flarum-potato', [
|
||||||
|
'authenticatedAs' => 1
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(409, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
<?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\PackageManager\Tests\integration\api\extensions;
|
||||||
|
|
||||||
|
use Flarum\PackageManager\Tests\integration\RefreshComposerSetup;
|
||||||
|
use Flarum\PackageManager\Tests\integration\TestCase;
|
||||||
|
|
||||||
|
class RequireExtensionTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshComposerSetup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function extension_uninstalled_by_default()
|
||||||
|
{
|
||||||
|
$this->assertExtensionNotExists('v17development-blog');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function requiring_an_existing_extension_fails()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('POST', '/api/package-manager/extensions', [
|
||||||
|
'authenticatedAs' => 1,
|
||||||
|
'json' => [
|
||||||
|
'data' => [
|
||||||
|
'package' => 'flarum/tags'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(409, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function requiring_a_compatible_extension_works()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('POST', '/api/package-manager/extensions', [
|
||||||
|
'authenticatedAs' => 1,
|
||||||
|
'json' => [
|
||||||
|
'data' => [
|
||||||
|
'package' => 'v17development/flarum-blog'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response->getStatusCode());
|
||||||
|
$this->assertExtensionExists('v17development-blog');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function requiring_an_uncompatible_extension_fails()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('POST', '/api/package-manager/extensions', [
|
||||||
|
'authenticatedAs' => 1,
|
||||||
|
'json' => [
|
||||||
|
'data' => [
|
||||||
|
'package' => 'flarum/auth-github'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(409, $response->getStatusCode());
|
||||||
|
$this->assertEquals('extension_incompatible_with_instance', $this->guessedCause($response));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
<?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\PackageManager\Tests\integration\api\extensions;
|
||||||
|
|
||||||
|
use Flarum\PackageManager\Tests\integration\RefreshComposerSetup;
|
||||||
|
use Flarum\PackageManager\Tests\integration\TestCase;
|
||||||
|
|
||||||
|
class UpdateExtensionTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshComposerSetup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function extension_installed_by_default()
|
||||||
|
{
|
||||||
|
$this->assertExtensionExists('flarum-tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function updating_an_existing_extension_works()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('PATCH', '/api/package-manager/extensions/flarum-tags', [
|
||||||
|
'authenticatedAs' => 1,
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(204, $response->getStatusCode());
|
||||||
|
$this->assertExtensionExists('flarum-tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function updating_a_non_existing_extension_fails()
|
||||||
|
{
|
||||||
|
$response = $this->send(
|
||||||
|
$this->request('PATCH', '/api/package-manager/extensions/flarum-potato', [
|
||||||
|
'authenticatedAs' => 1,
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(409, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
}
|
21
extensions/package-manager/tests/integration/setup.php
Normal file
21
extensions/package-manager/tests/integration/setup.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Flarum\Testing\integration\Setup\SetupScript;
|
||||||
|
use Flarum\PackageManager\Tests\integration\SetupComposer;
|
||||||
|
|
||||||
|
require __DIR__.'/../../vendor/autoload.php';
|
||||||
|
|
||||||
|
$setup = new SetupScript();
|
||||||
|
|
||||||
|
$setup->run();
|
||||||
|
|
||||||
|
$setupComposer = new SetupComposer();
|
||||||
|
|
||||||
|
$setupComposer->run();
|
27
extensions/package-manager/tests/phpunit.integration.xml
Normal file
27
extensions/package-manager/tests/phpunit.integration.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
|
||||||
|
backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="true"
|
||||||
|
stopOnFailure="false"
|
||||||
|
>
|
||||||
|
<coverage processUncoveredFiles="true">
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">../src/</directory>
|
||||||
|
</include>
|
||||||
|
</coverage>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Flarum Integration Tests">
|
||||||
|
<directory suffix="Test.php">./integration</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<php>
|
||||||
|
<env name="FLARUM_TEST_TMP_DIR_LOCAL" value="tests/tmp" force="true" />
|
||||||
|
</php>
|
||||||
|
</phpunit>
|
27
extensions/package-manager/tests/phpunit.unit.xml
Normal file
27
extensions/package-manager/tests/phpunit.unit.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
|
||||||
|
backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
>
|
||||||
|
<coverage processUncoveredFiles="true">
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">../src/</directory>
|
||||||
|
</include>
|
||||||
|
</coverage>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Flarum Unit Tests">
|
||||||
|
<directory suffix="Test.php">./unit</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<listeners>
|
||||||
|
<listener class="\Mockery\Adapter\Phpunit\TestListener" />
|
||||||
|
</listeners>
|
||||||
|
</phpunit>
|
0
extensions/package-manager/tests/unit/.gitkeep
Normal file
0
extensions/package-manager/tests/unit/.gitkeep
Normal file
Loading…
x
Reference in New Issue
Block a user