From 12c05c0af6e5337ff119065a711a8eb5ac37565a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Wed, 18 Sep 2019 19:48:15 +0200 Subject: [PATCH] Fix some tests --- assets/config.php | 2 + .../Database/DatabaseStorageDriver.php | 23 +++--- src/StorageDrivers/Database/TenantModel.php | 6 +- src/Tenant.php | 7 +- tests/TenantManagerTest.php | 40 +++-------- tests/TenantStorageTest.php | 70 +++++-------------- 6 files changed, 53 insertions(+), 95 deletions(-) diff --git a/assets/config.php b/assets/config.php index 2e92e3d6..ff2fad22 100644 --- a/assets/config.php +++ b/assets/config.php @@ -56,6 +56,8 @@ return [ 'pgsql' => 'Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager', ], 'bootstrappers' => [ + // Tenancy bootstrappers are executed when tenancy is initialized. + // Their responsibility is making Laravel features tenant-aware. 'database' => 'Stancl\Tenancy\TenancyBootstrappers\DatabaseTenancyBootstrapper', 'cache' => 'Stancl\Tenancy\TenancyBootstrappers\CacheTenancyBootstrapper', 'filesystem' => 'Stancl\Tenancy\TenancyBootstrappers\FilesystemTenancyBootstrapper', diff --git a/src/StorageDrivers/Database/DatabaseStorageDriver.php b/src/StorageDrivers/Database/DatabaseStorageDriver.php index bff892a7..c61bf226 100644 --- a/src/StorageDrivers/Database/DatabaseStorageDriver.php +++ b/src/StorageDrivers/Database/DatabaseStorageDriver.php @@ -42,7 +42,14 @@ class DatabaseStorageDriver implements StorageDriver public function findById(string $id): Tenant { return Tenant::fromStorage(Tenants::find($id)->decoded()) - ->withDomains(Domains::where('tenant_id', $id)->get()->only('domain')->toArray()); + ->withDomains($this->getTenantDomains($id)); + } + + protected function getTenantDomains($id) + { + return Domains::where('tenant_id', $id)->get()->map(function ($model) { + return $model->domain; + })->toArray(); } public function ensureTenantCanBeCreated(Tenant $tenant): void @@ -107,8 +114,8 @@ class DatabaseStorageDriver implements StorageDriver */ public function all(array $ids = []): array { - return Tenants::getAllTenants($ids)->map(function ($array) { - return Tenant::fromStorage($array)->withDomains([]); // todo domains + return Tenants::getAllTenants($ids)->map(function ($data) { + return Tenant::fromStorage($data)->withDomains($this->getTenantDomains($data['id'])); })->toArray(); } @@ -117,34 +124,34 @@ class DatabaseStorageDriver implements StorageDriver * * @return Tenant */ - protected function tenant() + protected function currentTenant() { return $this->tenant ?? $this->app[Tenant::class]; } public function get(string $key, Tenant $tenant = null) { - $tenant = $tenant ?? $this->tenant(); + $tenant = $tenant ?? $this->currentTenant(); return Tenants::find($tenant->id)->get($key); } public function getMany(array $keys, Tenant $tenant = null): array { - $tenant = $tenant ?? $this->tenant(); + $tenant = $tenant ?? $this->currentTenant(); return Tenants::find($tenant->id)->getMany($keys); } public function put(string $key, $value, Tenant $tenant = null): void { - $tenant = $tenant ?? $this->tenant(); + $tenant = $tenant ?? $this->currentTenant(); Tenants::find($tenant->id)->put($key, $value); } public function putMany(array $kvPairs, Tenant $tenant = null): void { - $tenant = $tenant ?? $this->tenant(); + $tenant = $tenant ?? $this->currentTenant(); Tenants::find($tenant->id)->putMany($kvPairs); } } diff --git a/src/StorageDrivers/Database/TenantModel.php b/src/StorageDrivers/Database/TenantModel.php index f1360b63..1f962e3a 100644 --- a/src/StorageDrivers/Database/TenantModel.php +++ b/src/StorageDrivers/Database/TenantModel.php @@ -81,8 +81,8 @@ class TenantModel extends Model public function getMany(array $keys): array { - return array_reduce($keys, function ($result, $key) { - $result[$key] = $this->get[$key]; + return array_reduce($keys, function ($result, $key) { // todo2 performance + $result[$key] = $this->get($key); return $result; }, []); @@ -105,7 +105,7 @@ class TenantModel extends Model public function putMany(array $kvPairs) { $customColumns = []; - $jsonObj = json_decode($this->{$this->customColumns()}); + $jsonObj = json_decode($this->{$this->dataColumn()}); foreach ($kvPairs as $key => $value) { if (in_array($key, $this->customColumns())) { diff --git a/src/Tenant.php b/src/Tenant.php index 882e4e42..0da28d08 100644 --- a/src/Tenant.php +++ b/src/Tenant.php @@ -85,7 +85,7 @@ class Tenant implements ArrayAccess protected function persisted($persisted = null) { - if (gettype($persisted) === 'bool') { + if (gettype($persisted) === 'boolean') { $this->persisted = $persisted; return $this; @@ -94,6 +94,11 @@ class Tenant implements ArrayAccess return $this; } + public function isPersisted(): bool + { + return $this->persisted; + } + /** * Assign domains to the tenant. * diff --git a/tests/TenantManagerTest.php b/tests/TenantManagerTest.php index e0b2d6dc..da0119fe 100644 --- a/tests/TenantManagerTest.php +++ b/tests/TenantManagerTest.php @@ -16,20 +16,11 @@ class TenantManagerTest extends TestCase /** @test */ public function current_tenant_can_be_retrieved_using_getTenant() { - $tenant = Tenant::new()->withDomains(['localhost'])->save(); + $tenant = Tenant::new()->withDomains(['test2.localhost'])->save(); - tenancy()->init('test.localhost'); + tenancy()->init('test2.localhost'); - $this->assertSame($tenant, tenancy()->getTenant()); - } - - /** @test */ - public function invoke_works() - { - Tenant::new()->withDomains(['foo.localhost'])->save(); - tenancy()->init('foo.localhost'); - - $this->assertSame(tenant('id'), tenant()('id')); + $this->assertEquals($tenant, tenancy()->getTenant()); } /** @test */ @@ -37,11 +28,11 @@ class TenantManagerTest extends TestCase { $tenant = Tenant::new()->withDomains(['foo.localhost'])->save(); - $this->assertNotSame($tenant, tenancy()->getTenant()); + $this->assertNotEquals($tenant, tenancy()->getTenant()); tenancy()->initById($tenant['id']); - $this->assertSame($tenant, tenancy()->getTenant()); + $this->assertEquals($tenant, tenancy()->getTenant()); } /** @test */ @@ -49,14 +40,7 @@ class TenantManagerTest extends TestCase { $tenant = Tenant::new()->withDomains(['foo.localhost'])->save(); - $this->assertSame($tenant, tenancy()->findByDomain('foo.localhost')); - } - - /** @test */ - public function getIdByDomain_works() - { - $tenant = Tenant::new()->withDomains(['foo.localhost'])->save(); - $this->assertSame(tenant()->getTenantIdByDomain('foo.localhost'), tenancy()->getIdByDomain('foo.localhost')); + $this->assertEquals($tenant, tenancy()->findByDomain('foo.localhost')); } /** @test */ @@ -65,7 +49,7 @@ class TenantManagerTest extends TestCase Tenant::new()->withDomains(['dev.localhost'])->save(); tenancy()->init('dev.localhost'); - $this->assertSame(tenant(), tenancy()->find(tenant('id'))); + $this->assertEquals(tenant(), tenancy()->find(tenant('id'))); } /** @test */ @@ -161,11 +145,9 @@ class TenantManagerTest extends TestCase public function tenant_can_be_deleted() { $tenant = Tenant::new()->withDomains(['foo.localhost'])->save(); - tenant()->delete($tenant['id']); - $this->assertSame([], tenancy()->all()->toArray()); - - $tenant = Tenant::new()->withDomains(['foo.localhost'])->save(); - $this->assertSame([$tenant], tenancy()->all()->toArray()); + $this->assertEquals([$tenant], tenancy()->all()->toArray()); + $tenant->delete(); + $this->assertEquals([], tenancy()->all()->toArray()); } /** @test */ @@ -173,7 +155,7 @@ class TenantManagerTest extends TestCase { $tenant1 = Tenant::new()->withDomains(['foo.localhost'])->save(); $tenant2 = Tenant::new()->withDomains(['bar.localhost'])->save(); - $this->assertEqualsCanonicalizing([$tenant1, $tenant2], tenancy()->all()->toArray()); + $this->assertEquals([$tenant1, $tenant2], tenancy()->all()->toArray()); } /** @test */ diff --git a/tests/TenantStorageTest.php b/tests/TenantStorageTest.php index e17b2abd..4ae7e814 100644 --- a/tests/TenantStorageTest.php +++ b/tests/TenantStorageTest.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Tests; use Stancl\Tenancy\StorageDrivers\Database\TenantModel; -use Stancl\Tenancy\StorageDrivers\DatabaseStorageDriver; +use Stancl\Tenancy\StorageDrivers\Database\DatabaseStorageDriver; use Stancl\Tenancy\StorageDrivers\RedisStorageDriver; use Stancl\Tenancy\Tenant; @@ -15,12 +15,17 @@ class TenantStorageTest extends TestCase public function deleting_a_tenant_works() { $abc = Tenant::new()->withDomains(['abc.localhost'])->save(); + $exists = function () use ($abc) { + return tenancy()->all()->reduce(function ($result, $tenant) use ($abc) { + return $result ?: $tenant->id === $abc->id; + }, false); + }; - $this->assertTrue(tenancy()->all()->contains($abc)); + $this->assertTrue($exists()); $abc->delete(); - $this->assertFalse(tenancy()->all()->contains($abc)); + $this->assertFalse($exists()); } /** @test */ @@ -44,11 +49,11 @@ class TenantStorageTest extends TestCase { $keys = ['foo', 'abc']; $vals = ['bar', 'xyz']; - $data = \array_combine($keys, $vals); + $data = array_combine($keys, $vals); tenant()->put($data); - $this->assertSame($vals, tenant()->get($keys)); + $this->assertSame($data, tenant()->get($keys)); } /** @test */ @@ -59,35 +64,6 @@ class TenantStorageTest extends TestCase $this->assertSame('bar', tenancy()->getTenant('foo')); } - /** @test */ - public function put_works_on_a_tenant_different_than_the_current_one_when_two_args_are_used() - { - $tenant = Tenant::new()->withDomains(['second.localhost'])->save(); - $id = $tenant['id']; - - tenant()->put('foo', 'bar', $id); - - $this->assertSame('bar', tenant()->get('foo', $id)); - $this->assertNotSame('bar', tenant('foo')); - } - - /** @test */ - public function put_works_on_a_tenant_different_than_the_current_one_when_a_single_arg_is_used() - { - $tenant = Tenant::new()->withDomains(['second.localhost'])->save(); - $id = $tenant['id']; - - $keys = ['foo', 'abc']; - $vals = ['bar', 'xyz']; - $data = \array_combine($keys, $vals); - - tenant()->put($data, null, $id); - - $this->assertSame($vals, tenant()->get($keys, $id)); - $this->assertNotSame($vals, tenant()->get($keys)); - $this->assertFalse(\array_intersect($data, tenant()->tenant) == $data); // assert array not subset - } - /** @test */ public function arrays_can_be_stored() { @@ -105,20 +81,6 @@ class TenantStorageTest extends TestCase $this->assertSame($data, tenant()->get('foo')); } - /** @test */ - public function put_returns_the_value_when_two_arguments_are_used() - { - $this->assertSame('bar', tenant()->put('foo', 'bar')); - } - - /** @test */ - public function put_returns_the_key_value_pairs_when_a_single_argument_is_used() - { - $value = ['foo' => 'bar', 'abc' => 'xyz']; - - $this->assertSame($value, tenant()->put($value)); - } - /** @test */ public function correct_storage_driver_is_used() { @@ -134,19 +96,19 @@ class TenantStorageTest extends TestCase { tenant()->put('someBool', false); $this->assertSame('boolean', \gettype(tenant()->get('someBool'))); - $this->assertSame('boolean', \gettype(tenant()->get(['someBool'])[0])); + $this->assertSame('boolean', \gettype(tenant()->get(['someBool'])['someBool'])); tenant()->put('someInt', 5); $this->assertSame('integer', \gettype(tenant()->get('someInt'))); - $this->assertSame('integer', \gettype(tenant()->get(['someInt'])[0])); + $this->assertSame('integer', \gettype(tenant()->get(['someInt'])['someInt'])); tenant()->put('someDouble', 11.40); $this->assertSame('double', \gettype(tenant()->get('someDouble'))); - $this->assertSame('double', \gettype(tenant()->get(['someDouble'])[0])); + $this->assertSame('double', \gettype(tenant()->get(['someDouble'])['someDouble'])); tenant()->put('string', 'foo'); $this->assertSame('string', \gettype(tenant()->get('string'))); - $this->assertSame('string', \gettype(tenant()->get(['string'])[0])); + $this->assertSame('string', \gettype(tenant()->get(['string'])['string'])); } /** @test */ @@ -164,12 +126,12 @@ class TenantStorageTest extends TestCase tenant()->put('foo', 'bar'); $this->assertSame('bar', tenant()->get('foo')); - $this->assertSame(['bar'], tenant()->get(['foo'])); + $this->assertSame(['foo' => 'bar'], tenant()->get(['foo'])); tenancy()->endTenancy(); tenancy()->init('foo.localhost'); $this->assertSame('bar', tenant()->get('foo')); - $this->assertSame(['bar'], tenant()->get(['foo'])); + $this->assertSame(['foo' => 'bar'], tenant()->get(['foo'])); } /** @test */