mirror of
https://github.com/archtechx/tenancy.git
synced 2026-02-05 20:14:04 +00:00
Merge branch '3.x' into 3.x
This commit is contained in:
commit
3a4cd1bde2
15 changed files with 115 additions and 67 deletions
9
.github/workflows/ci.yml
vendored
9
.github/workflows/ci.yml
vendored
|
|
@ -16,7 +16,10 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
php: ["7.4", "8.0"]
|
php: ["7.4", "8.0"]
|
||||||
laravel: ["^6.0", "^8.0"]
|
laravel: ["^6.0", "^8.0", "^9.0"]
|
||||||
|
exclude:
|
||||||
|
- laravel: "^9.0"
|
||||||
|
php: "7.4"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
@ -26,7 +29,3 @@ jobs:
|
||||||
run: docker-compose exec -T test composer require --no-interaction "laravel/framework:${{ matrix.laravel }}"
|
run: docker-compose exec -T test composer require --no-interaction "laravel/framework:${{ matrix.laravel }}"
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: ./test
|
run: ./test
|
||||||
- name: Send code coverage to codecov
|
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: 24382d15-84e7-4a55-bea4-c4df96a24a9b
|
|
||||||
run: bash <(curl -s https://codecov.io/bash)
|
|
||||||
|
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -8,3 +8,4 @@ psysh
|
||||||
phpunit_var_*.xml
|
phpunit_var_*.xml
|
||||||
coverage/
|
coverage/
|
||||||
clover.xml
|
clover.xml
|
||||||
|
tests/Etc/tmp/queuetest.json
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
<a href="https://laravel.com"><img alt="Laravel 6.x/7.x/8.x" src="https://img.shields.io/badge/laravel-6.x/7.x/8.x-red.svg"></a>
|
<a href="https://laravel.com"><img alt="Laravel 6.x/7.x/8.x" src="https://img.shields.io/badge/laravel-6.x/7.x/8.x-red.svg"></a>
|
||||||
<a href="https://packagist.org/packages/stancl/tenancy"><img alt="Latest Stable Version" src="https://poser.pugx.org/stancl/tenancy/version"></a>
|
<a href="https://packagist.org/packages/stancl/tenancy"><img alt="Latest Stable Version" src="https://poser.pugx.org/stancl/tenancy/version"></a>
|
||||||
<a href="https://github.com/stancl/tenancy/actions"><img alt="GitHub Actions CI status" src="https://github.com/stancl/tenancy/workflows/CI/badge.svg"></a>
|
<a href="https://github.com/stancl/tenancy/actions"><img alt="GitHub Actions CI status" src="https://github.com/stancl/tenancy/workflows/CI/badge.svg"></a>
|
||||||
<a href="https://codecov.io/gh/stancl/tenancy"><img alt="codecov" src="https://codecov.io/gh/stancl/tenancy/branch/3.x/graph/badge.svg"></a>
|
|
||||||
<a href="https://github.com/stancl/tenancy/blob/3.x/DONATIONS.md"><img alt="Donate" src="https://img.shields.io/badge/Donate-%3C3-red"></a>
|
<a href="https://github.com/stancl/tenancy/blob/3.x/DONATIONS.md"><img alt="Donate" src="https://img.shields.io/badge/Donate-%3C3-red"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,17 +11,16 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"illuminate/support": "^6.0|^7.0|^8.0",
|
"illuminate/support": "^6.0|^7.0|^8.0|^9.0",
|
||||||
"facade/ignition-contracts": "^1.0",
|
"facade/ignition-contracts": "^1.0",
|
||||||
"ramsey/uuid": "^3.7|^4.0",
|
"ramsey/uuid": "^3.7|^4.0",
|
||||||
"stancl/jobpipeline": "^1.0",
|
"stancl/jobpipeline": "^1.0",
|
||||||
"stancl/virtualcolumn": "^1.0"
|
"stancl/virtualcolumn": "^1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"vlucas/phpdotenv": "^3.3|^4.0|^5.0",
|
"laravel/framework": "^6.0|^7.0|^8.0|^9.0",
|
||||||
"laravel/framework": "^6.0|^7.0|^8.0",
|
"orchestra/testbench": "^4.0|^5.0|^6.0|^7.0",
|
||||||
"orchestra/testbench-browser-kit": "^4.0|^5.0|^6.0",
|
"league/flysystem-aws-s3-v3": "^1.0|^3.0",
|
||||||
"league/flysystem-aws-s3-v3": "~1.0",
|
|
||||||
"doctrine/dbal": "^2.10",
|
"doctrine/dbal": "^2.10",
|
||||||
"spatie/valuestore": "^1.2.5"
|
"spatie/valuestore": "^1.2.5"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -54,20 +54,20 @@ class FilesystemTenancyBootstrapper implements TenancyBootstrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
// Storage facade
|
// Storage facade
|
||||||
foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
|
Storage::forgetDisk($this->app['config']['tenancy.filesystem.disks']);
|
||||||
/** @var FilesystemAdapter $filesystemDisk */
|
|
||||||
$filesystemDisk = Storage::disk($disk);
|
|
||||||
$this->originalPaths['disks'][$disk] = $filesystemDisk->getAdapter()->getPathPrefix();
|
|
||||||
|
|
||||||
if ($root = str_replace(
|
foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
|
||||||
|
$originalRoot = $this->app['config']["filesystems.disks.{$disk}.root"];
|
||||||
|
$this->originalPaths['disks'][$disk] = $originalRoot;
|
||||||
|
|
||||||
|
$finalPrefix = str_replace(
|
||||||
'%storage_path%',
|
'%storage_path%',
|
||||||
storage_path(),
|
storage_path(),
|
||||||
$this->app['config']["tenancy.filesystem.root_override.{$disk}"] ?? ''
|
$this->app['config']["tenancy.filesystem.root_override.{$disk}"] ?? '',
|
||||||
)) {
|
);
|
||||||
$filesystemDisk->getAdapter()->setPathPrefix($finalPrefix = $root);
|
|
||||||
} else {
|
if (! $finalPrefix) {
|
||||||
$root = $this->app['config']["filesystems.disks.{$disk}.root"];
|
$finalPrefix = $originalRoot . '/'. $suffix;
|
||||||
$filesystemDisk->getAdapter()->setPathPrefix($finalPrefix = $root . "/{$suffix}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->app['config']["filesystems.disks.{$disk}.root"] = $finalPrefix;
|
$this->app['config']["filesystems.disks.{$disk}.root"] = $finalPrefix;
|
||||||
|
|
@ -84,14 +84,9 @@ class FilesystemTenancyBootstrapper implements TenancyBootstrapper
|
||||||
$this->app['url']->setAssetRoot($this->app['config']['app.asset_url']);
|
$this->app['url']->setAssetRoot($this->app['config']['app.asset_url']);
|
||||||
|
|
||||||
// Storage facade
|
// Storage facade
|
||||||
|
Storage::forgetDisk($this->app['config']['tenancy.filesystem.disks']);
|
||||||
foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
|
foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
|
||||||
/** @var FilesystemAdapter $filesystemDisk */
|
$this->app['config']["filesystems.disks.{$disk}.root"] = $this->originalPaths['disks'][$disk];
|
||||||
$filesystemDisk = Storage::disk($disk);
|
|
||||||
|
|
||||||
$root = $this->originalPaths['disks'][$disk];
|
|
||||||
|
|
||||||
$filesystemDisk->getAdapter()->setPathPrefix($root);
|
|
||||||
$this->app['config']["filesystems.disks.{$disk}.root"] = $root;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,14 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper
|
||||||
/** @var QueueManager */
|
/** @var QueueManager */
|
||||||
protected $queue;
|
protected $queue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Don't persist the same tenant across multiple jobs even if they have the same tenant ID.
|
||||||
|
*
|
||||||
|
* This is useful when you're changing the tenant's state (e.g. properties in the `data` column) and want the next job to initialize tenancy again
|
||||||
|
* with the new data. Features like the Tenant Config are only executed when tenancy is initialized, so the re-initialization is needed in some cases.
|
||||||
|
*/
|
||||||
|
public static bool $forceRefresh = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The normal constructor is only executed after tenancy is bootstrapped.
|
* The normal constructor is only executed after tenancy is bootstrapped.
|
||||||
* However, we're registering a hook to initialize tenancy. Therefore,
|
* However, we're registering a hook to initialize tenancy. Therefore,
|
||||||
|
|
@ -75,14 +83,31 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper
|
||||||
|
|
||||||
protected static function initializeTenancyForQueue($tenantId)
|
protected static function initializeTenancyForQueue($tenantId)
|
||||||
{
|
{
|
||||||
// The job is not tenant-aware
|
|
||||||
if (! $tenantId) {
|
if (! $tenantId) {
|
||||||
|
// The job is not tenant-aware
|
||||||
|
if (tenancy()->initialized) {
|
||||||
|
// Tenancy was initialized, so we revert back to the central context
|
||||||
|
tenancy()->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (static::$forceRefresh) {
|
||||||
|
// Re-initialize tenancy between all jobs
|
||||||
|
if (tenancy()->initialized) {
|
||||||
|
tenancy()->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
tenancy()->initialize(tenancy()->find($tenantId));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tenancy()->initialized) {
|
if (tenancy()->initialized) {
|
||||||
|
// Tenancy is already initialized
|
||||||
if (tenant()->getTenantKey() === $tenantId) {
|
if (tenant()->getTenantKey() === $tenantId) {
|
||||||
// Tenancy is already initialized for the tenant (e.g. dispatchNow was used)
|
// It's initialized for the same tenant (e.g. dispatchNow was used, or the previous job also ran for this tenant)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ namespace Stancl\Tenancy\Commands;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Stancl\Tenancy\Concerns\DealsWithMigrations;
|
use Stancl\Tenancy\Concerns\DealsWithMigrations;
|
||||||
use Stancl\Tenancy\Concerns\HasATenantsOption;
|
use Stancl\Tenancy\Concerns\HasATenantsOption;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
|
||||||
final class MigrateFresh extends Command
|
final class MigrateFresh extends Command
|
||||||
{
|
{
|
||||||
|
|
@ -22,6 +23,8 @@ final class MigrateFresh extends Command
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->addOption('--drop-views', null, InputOption::VALUE_NONE, 'Drop views along with tenant tables.', null);
|
||||||
|
|
||||||
$this->setName('tenants:migrate-fresh');
|
$this->setName('tenants:migrate-fresh');
|
||||||
}
|
}
|
||||||
|
|
@ -37,6 +40,7 @@ final class MigrateFresh extends Command
|
||||||
$this->info('Dropping tables.');
|
$this->info('Dropping tables.');
|
||||||
$this->call('db:wipe', array_filter([
|
$this->call('db:wipe', array_filter([
|
||||||
'--database' => 'tenant',
|
'--database' => 'tenant',
|
||||||
|
'--drop-views' => $this->option('drop-views'),
|
||||||
'--force' => true,
|
'--force' => true,
|
||||||
]));
|
]));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ class Run extends Command
|
||||||
{
|
{
|
||||||
tenancy()->runForMultiple($this->option('tenants'), function ($tenant) {
|
tenancy()->runForMultiple($this->option('tenants'), function ($tenant) {
|
||||||
$this->line("Tenant: {$tenant->getTenantKey()}");
|
$this->line("Tenant: {$tenant->getTenantKey()}");
|
||||||
tenancy()->initialize($tenant);
|
|
||||||
|
|
||||||
$callback = function ($prefix = '') {
|
$callback = function ($prefix = '') {
|
||||||
return function ($arguments, $argument) use ($prefix) {
|
return function ($arguments, $argument) use ($prefix) {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||||
namespace Stancl\Tenancy\Middleware;
|
namespace Stancl\Tenancy\Middleware;
|
||||||
|
|
||||||
use Closure;
|
use Closure;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||||
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
|
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
|
||||||
use Stancl\Tenancy\Exceptions\TenancyNotInitializedException;
|
use Stancl\Tenancy\Exceptions\TenancyNotInitializedException;
|
||||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||||
|
|
|
||||||
|
|
@ -4,23 +4,27 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Stancl\Tenancy\Tests;
|
namespace Stancl\Tenancy\Tests;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Filesystem\FilesystemAdapter;
|
||||||
|
use ReflectionObject;
|
||||||
|
use ReflectionProperty;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Stancl\JobPipeline\JobPipeline;
|
||||||
|
use Stancl\Tenancy\Tests\Etc\Tenant;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\Event;
|
use Illuminate\Support\Facades\Event;
|
||||||
use Illuminate\Support\Facades\Redis;
|
use Illuminate\Support\Facades\Redis;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Stancl\JobPipeline\JobPipeline;
|
|
||||||
use Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper;
|
|
||||||
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
|
|
||||||
use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper;
|
|
||||||
use Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper;
|
|
||||||
use Stancl\Tenancy\Events\TenancyEnded;
|
use Stancl\Tenancy\Events\TenancyEnded;
|
||||||
use Stancl\Tenancy\Events\TenancyInitialized;
|
|
||||||
use Stancl\Tenancy\Events\TenantCreated;
|
|
||||||
use Stancl\Tenancy\Jobs\CreateDatabase;
|
use Stancl\Tenancy\Jobs\CreateDatabase;
|
||||||
|
use Stancl\Tenancy\Events\TenantCreated;
|
||||||
|
use Stancl\Tenancy\Events\TenancyInitialized;
|
||||||
use Stancl\Tenancy\Listeners\BootstrapTenancy;
|
use Stancl\Tenancy\Listeners\BootstrapTenancy;
|
||||||
use Stancl\Tenancy\Listeners\RevertToCentralContext;
|
use Stancl\Tenancy\Listeners\RevertToCentralContext;
|
||||||
use Stancl\Tenancy\Tests\Etc\Tenant;
|
use Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper;
|
||||||
|
use Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper;
|
||||||
|
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
|
||||||
|
use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper;
|
||||||
|
|
||||||
class BootstrapperTest extends TestCase
|
class BootstrapperTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
@ -165,6 +169,7 @@ class BootstrapperTest extends TestCase
|
||||||
$tenant2 = Tenant::create();
|
$tenant2 = Tenant::create();
|
||||||
|
|
||||||
tenancy()->initialize($tenant1);
|
tenancy()->initialize($tenant1);
|
||||||
|
|
||||||
Storage::disk('public')->put('foo', 'bar');
|
Storage::disk('public')->put('foo', 'bar');
|
||||||
$this->assertSame('bar', Storage::disk('public')->get('foo'));
|
$this->assertSame('bar', Storage::disk('public')->get('foo'));
|
||||||
|
|
||||||
|
|
@ -184,30 +189,38 @@ class BootstrapperTest extends TestCase
|
||||||
$this->assertFalse(Storage::disk('public')->exists('foo'));
|
$this->assertFalse(Storage::disk('public')->exists('foo'));
|
||||||
$this->assertFalse(Storage::disk('public')->exists('abc'));
|
$this->assertFalse(Storage::disk('public')->exists('abc'));
|
||||||
|
|
||||||
|
$expected_storage_path = $old_storage_path . '/tenant' . tenant('id'); // /tenant = suffix base
|
||||||
|
|
||||||
|
// Check that disk prefixes respect the root_override logic
|
||||||
|
$this->assertSame($expected_storage_path . '/app/', $this->getDiskPrefix('local'));
|
||||||
|
$this->assertSame($expected_storage_path . '/app/public/', $this->getDiskPrefix('public'));
|
||||||
|
$this->assertSame('tenant' . tenant('id') . '/', ltrim($this->getDiskPrefix('s3'), '/'));
|
||||||
|
|
||||||
// Check suffixing logic
|
// Check suffixing logic
|
||||||
$new_storage_path = storage_path();
|
$new_storage_path = storage_path();
|
||||||
$this->assertEquals($old_storage_path . '/' . config('tenancy.filesystem.suffix_base') . tenant('id'), $new_storage_path);
|
$this->assertEquals($expected_storage_path, $new_storage_path);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (config('tenancy.filesystem.disks') as $disk) {
|
protected function getDiskPrefix(string $disk): string
|
||||||
$suffix = config('tenancy.filesystem.suffix_base') . tenant('id');
|
{
|
||||||
|
/** @var FilesystemAdapter $disk */
|
||||||
|
$disk = Storage::disk($disk);
|
||||||
|
$adapter = $disk->getAdapter();
|
||||||
|
|
||||||
/** @var FilesystemAdapter $filesystemDisk */
|
if (! Str::startsWith(app()->version(), '9.')) {
|
||||||
$filesystemDisk = Storage::disk($disk);
|
return $adapter->getPathPrefix();
|
||||||
|
|
||||||
$current_path_prefix = $filesystemDisk->getAdapter()->getPathPrefix();
|
|
||||||
|
|
||||||
if ($override = config("tenancy.filesystem.root_override.{$disk}")) {
|
|
||||||
$correct_path_prefix = str_replace('%storage_path%', storage_path(), $override);
|
|
||||||
} else {
|
|
||||||
if ($base = $old_storage_facade_roots[$disk]) {
|
|
||||||
$correct_path_prefix = $base . "/$suffix/";
|
|
||||||
} else {
|
|
||||||
$correct_path_prefix = "$suffix/";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assertSame($correct_path_prefix, $current_path_prefix);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$prefixer = (new ReflectionObject($adapter))->getProperty('prefixer');
|
||||||
|
$prefixer->setAccessible(true);
|
||||||
|
|
||||||
|
// reflection -> instance
|
||||||
|
$prefixer = $prefixer->getValue($adapter);
|
||||||
|
|
||||||
|
$prefix = (new ReflectionProperty($prefixer, 'prefix'));
|
||||||
|
$prefix->setAccessible(true);
|
||||||
|
|
||||||
|
return $prefix->getValue($prefixer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// for queues see QueueTest
|
// for queues see QueueTest
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Stancl\Tenancy\Tests\Etc;
|
namespace Stancl\Tenancy\Tests\Etc;
|
||||||
|
|
||||||
use Orchestra\Testbench\Console\Kernel;
|
use Orchestra\Testbench\Foundation\Console\Kernel;
|
||||||
|
|
||||||
class ConsoleKernel extends Kernel
|
class ConsoleKernel extends Kernel
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
{"userName":"Bar","shouldFail":false,"tenant_id":"The current tenant id is: a7f73c10-9879-40ae-b7b0-1ded7c1f7b1b"}
|
|
||||||
|
|
@ -5,11 +5,13 @@ declare(strict_types=1);
|
||||||
namespace Stancl\Tenancy\Tests;
|
namespace Stancl\Tenancy\Tests;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Artisan;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use Stancl\Tenancy\Database\Concerns\MaintenanceMode;
|
use Stancl\Tenancy\Database\Concerns\MaintenanceMode;
|
||||||
use Stancl\Tenancy\Middleware\CheckTenantForMaintenanceMode;
|
use Stancl\Tenancy\Middleware\CheckTenantForMaintenanceMode;
|
||||||
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
|
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
|
||||||
use Stancl\Tenancy\Tests\Etc\Tenant;
|
use Stancl\Tenancy\Tests\Etc\Tenant;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
|
||||||
|
|
||||||
class MaintenanceModeTest extends TestCase
|
class MaintenanceModeTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
@ -32,8 +34,9 @@ class MaintenanceModeTest extends TestCase
|
||||||
|
|
||||||
$tenant->putDownForMaintenance();
|
$tenant->putDownForMaintenance();
|
||||||
|
|
||||||
$this->get('http://acme.localhost/foo')
|
$this->expectException(HttpException::class);
|
||||||
->assertStatus(503);
|
$this->withoutExceptionHandling()
|
||||||
|
->get('http://acme.localhost/foo');
|
||||||
|
|
||||||
tenancy()->end();
|
tenancy()->end();
|
||||||
|
|
||||||
|
|
@ -65,8 +68,9 @@ class MaintenanceModeTest extends TestCase
|
||||||
|
|
||||||
Artisan::call('tenancy:down');
|
Artisan::call('tenancy:down');
|
||||||
|
|
||||||
$this->get('http://acme.localhost/foo')
|
$this->expectException(HttpException::class);
|
||||||
->assertStatus(503);
|
$this->withoutExceptionHandling()
|
||||||
|
->get('http://acme.localhost/foo');
|
||||||
|
|
||||||
tenancy()->end();
|
tenancy()->end();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,11 @@ class QueueTest extends TestCase
|
||||||
$this->valuestore = Valuestore::make(__DIR__ . '/Etc/tmp/queuetest.json')->flush();
|
$this->valuestore = Valuestore::make(__DIR__ . '/Etc/tmp/queuetest.json')->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
$this->valuestore->flush();
|
||||||
|
}
|
||||||
|
|
||||||
protected function withFailedJobs()
|
protected function withFailedJobs()
|
||||||
{
|
{
|
||||||
Schema::connection('central')->create('failed_jobs', function (Blueprint $table) {
|
Schema::connection('central')->create('failed_jobs', function (Blueprint $table) {
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,11 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
protected function getEnvironmentSetUp($app)
|
protected function getEnvironmentSetUp($app)
|
||||||
{
|
{
|
||||||
if (file_exists(__DIR__ . '/../.env')) {
|
if (file_exists(__DIR__ . '/../.env')) {
|
||||||
\Dotenv\Dotenv::create(__DIR__ . '/..')->load();
|
if (method_exists(\Dotenv\Dotenv::class, 'createImmutable')) {
|
||||||
|
\Dotenv\Dotenv::createImmutable(__DIR__ . '/..')->load();
|
||||||
|
} else {
|
||||||
|
\Dotenv\Dotenv::create(__DIR__ . '/..')->load();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$app['config']->set([
|
$app['config']->set([
|
||||||
|
|
@ -83,6 +87,7 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
'public',
|
'public',
|
||||||
's3',
|
's3',
|
||||||
],
|
],
|
||||||
|
'filesystems.disks.s3.bucket' => 'foo',
|
||||||
'tenancy.redis.tenancy' => env('TENANCY_TEST_REDIS_TENANCY', true),
|
'tenancy.redis.tenancy' => env('TENANCY_TEST_REDIS_TENANCY', true),
|
||||||
'database.redis.client' => env('TENANCY_TEST_REDIS_CLIENT', 'phpredis'),
|
'database.redis.client' => env('TENANCY_TEST_REDIS_CLIENT', 'phpredis'),
|
||||||
'tenancy.redis.prefixed_connections' => ['default'],
|
'tenancy.redis.prefixed_connections' => ['default'],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue