From fb58f21f1c5e24d1ec9f89b3de5da786d0fcdd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Thu, 19 Sep 2019 18:38:40 +0200 Subject: [PATCH] Get Redis tests to pass --- src/StorageDrivers/RedisStorageDriver.php | 60 ++++++++++++++--------- tests/TenantAssetTest.php | 14 +++--- tests/TenantManagerTest.php | 7 +++ 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/StorageDrivers/RedisStorageDriver.php b/src/StorageDrivers/RedisStorageDriver.php index cbfb8e1a..0248f21b 100644 --- a/src/StorageDrivers/RedisStorageDriver.php +++ b/src/StorageDrivers/RedisStorageDriver.php @@ -59,26 +59,12 @@ class RedisStorageDriver implements StorageDriver throw new TenantCouldNotBeIdentifiedException($domain); } - return $this->find($id); + return $this->findById($id); } public function findById(string $id): Tenant { - $data = $this->redis->hgetall("tenants:$id"); - $keys = []; - $values = []; - foreach ($data as $i => $value) { - if ($i & 1) { // is odd - $values[] = $value; - } else { - $keys[] = $value; - } - } - - $data = array_combine($keys, $values); - $domains = []; // todo2 - - return Tenant::fromStorage($data)->withDomains($domains); + return $this->makeTenant($this->redis->hgetall("tenants:$id")); } public function getTenantIdByDomain(string $domain): ?string @@ -89,19 +75,23 @@ class RedisStorageDriver implements StorageDriver public function createTenant(Tenant $tenant): void { $this->redis->pipeline(function ($pipe) use ($tenant) { - $id = $tenant->id; - foreach ($tenant->domains as $domain) { - $pipe->hmset("domains:$domain", 'tenant_id', $id); + $pipe->hmset("domains:$domain", ['tenant_id' => $tenant->id]); } - $pipe->hmset("tenants:$id", 'id', json_encode($id), 'domain', json_encode($domain)); + + $data = []; + foreach ($tenant->data as $key => $value) { + $data[$key] = json_encode($value); + } + + $pipe->hmset("tenants:{$tenant->id}", array_merge($data, ['_tenancy_domains' => json_encode($tenant->domains)])); }); } public function updateTenant(Tenant $tenant): void { $this->redis->pipeline(function ($pipe) use ($tenant) { - $pipe->hmset("tenants:{$tenant->id}", $tenant->data); + $pipe->hmset("tenants:{$tenant->id}", $tenant->data); // todo domains foreach ($tenant->domains as $domain) { $pipe->hmset("domains:$domain", 'tenant_id', $tenant->id); @@ -122,6 +112,12 @@ class RedisStorageDriver implements StorageDriver }); } + /** + * Return a list of all tenants. + * + * @param string[] $ids + * @return Tenant[] + */ public function all(array $ids = []): array { // todo2 $this->redis->pipeline() @@ -143,10 +139,28 @@ class RedisStorageDriver implements StorageDriver } return array_map(function ($tenant) { - return $this->redis->hgetall($tenant); + return $this->makeTenant($this->redis->hgetall($tenant)); }, $hashes); } + /** + * Make a Tenant instance from low-level array data. + * + * @param array $data + * @return Tenant + */ + protected function makeTenant(array $data): Tenant + { + foreach ($data as $key => $value) { + $data[$key] = json_decode($value, true); + } + + $domains = $data['_tenancy_domains']; + unset($data['_tenancy_domains']); + + return Tenant::fromStorage($data)->withDomains($domains); + } + public function get(string $key, Tenant $tenant = null) { $tenant = $tenant ?? $this->tenant(); @@ -161,7 +175,7 @@ class RedisStorageDriver implements StorageDriver $result = []; $values = $this->redis->hmget("tenants:{$tenant->id}", $keys); foreach ($keys as $i => $key) { - $result[$key] = $values[$i]; + $result[$key] = json_decode($values[$i], true); } return $result; diff --git a/tests/TenantAssetTest.php b/tests/TenantAssetTest.php index 967877e4..c545364e 100644 --- a/tests/TenantAssetTest.php +++ b/tests/TenantAssetTest.php @@ -15,14 +15,14 @@ class TenantAssetTest extends TestCase // response()->file() returns BinaryFileResponse whose content is // inaccessible via getContent, so ->assertSee() can't be used - // $this->get(tenant_asset($filename))->assertSuccessful(); // TODO2 COMMENTED ASSERTIONS - // $this->assertFileExists($path); // TODO2 COMMENTED ASSERTIONS + // $this->get(tenant_asset($filename))->assertSuccessful(); // todo commented assertions + // $this->assertFileExists($path); // todo commented assertions - $f = \fopen($path, 'r'); - $content = \fread($f, \filesize($path)); - \fclose($f); + $f = fopen($path, 'r'); + $content = fread($f, filesize($path)); + fclose($f); - // $this->assertSame('bar', $content); // TODO2 COMMENTED ASSERTIONS - $this->assertTrue(true); // TODO2 COMMENTED ASSERTIONS + // $this->assertSame('bar', $content); // todo commented assertions + $this->assertTrue(true); } } diff --git a/tests/TenantManagerTest.php b/tests/TenantManagerTest.php index a27d037c..ac53263c 100644 --- a/tests/TenantManagerTest.php +++ b/tests/TenantManagerTest.php @@ -187,4 +187,11 @@ class TenantManagerTest extends TestCase $this->expectException(\Stancl\Tenancy\Exceptions\TenantStorageException::class); $tenant2->put('id', 'foo'); } + + /** @test */ + public function all_returns_a_collection_of_tenant_objects() + { + Tenant::create('foo.localhost'); + $this->assertSame('Tenant', class_basename(tenancy()->all()[0])); + } }