diff --git a/phpunit.xml b/phpunit.xml index 8ba994793..2a0531cfd 100755 --- a/phpunit.xml +++ b/phpunit.xml @@ -7,7 +7,8 @@ convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" - stopOnFailure="false"> + stopOnFailure="false" +> ./tests/unit diff --git a/tests/e2e/Adapter/Scopes/AttributeTests.php b/tests/e2e/Adapter/Scopes/AttributeTests.php index 18876766d..e5bb021ff 100644 --- a/tests/e2e/Adapter/Scopes/AttributeTests.php +++ b/tests/e2e/Adapter/Scopes/AttributeTests.php @@ -58,115 +58,118 @@ public function invalidDefaultValues(): array public function testCreateDeleteAttribute(): void { - static::getDatabase()->createCollection('attributes'); - - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string1', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string2', Database::VAR_STRING, 16382 + 1, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string3', Database::VAR_STRING, 65535 + 1, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string4', Database::VAR_STRING, 16777215 + 1, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'integer', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'bigint', Database::VAR_INTEGER, 8, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'float', Database::VAR_FLOAT, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'boolean', Database::VAR_BOOLEAN, 0, true)); - - $this->assertEquals(true, static::getDatabase()->createIndex('attributes', 'string1_index', Database::INDEX_KEY, ['string1'])); - $this->assertEquals(true, static::getDatabase()->createIndex('attributes', 'string2_index', Database::INDEX_KEY, ['string2'], [255])); - $this->assertEquals(true, static::getDatabase()->createIndex('attributes', 'multi_index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128])); - - $collection = static::getDatabase()->getCollection('attributes'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('attributes'); + + $this->assertEquals(true, $database->createAttribute('attributes', 'string1', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'string2', Database::VAR_STRING, 16382 + 1, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'string3', Database::VAR_STRING, 65535 + 1, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'string4', Database::VAR_STRING, 16777215 + 1, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'integer', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'bigint', Database::VAR_INTEGER, 8, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'float', Database::VAR_FLOAT, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'boolean', Database::VAR_BOOLEAN, 0, true)); + + $this->assertEquals(true, $database->createIndex('attributes', 'string1_index', Database::INDEX_KEY, ['string1'])); + $this->assertEquals(true, $database->createIndex('attributes', 'string2_index', Database::INDEX_KEY, ['string2'], [255])); + $this->assertEquals(true, $database->createIndex('attributes', 'multi_index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128])); + + $collection = $database->getCollection('attributes'); $this->assertCount(8, $collection->getAttribute('attributes')); $this->assertCount(3, $collection->getAttribute('indexes')); // Array - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string_list', Database::VAR_STRING, 128, true, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'integer_list', Database::VAR_INTEGER, 0, true, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'float_list', Database::VAR_FLOAT, 0, true, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'boolean_list', Database::VAR_BOOLEAN, 0, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'string_list', Database::VAR_STRING, 128, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'integer_list', Database::VAR_INTEGER, 0, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'float_list', Database::VAR_FLOAT, 0, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'boolean_list', Database::VAR_BOOLEAN, 0, true, null, true, true)); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $this->assertCount(12, $collection->getAttribute('attributes')); // Default values - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string_default', Database::VAR_STRING, 256, false, 'test')); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'integer_default', Database::VAR_INTEGER, 0, false, 1)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'float_default', Database::VAR_FLOAT, 0, false, 1.5)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'boolean_default', Database::VAR_BOOLEAN, 0, false, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'datetime_default', Database::VAR_DATETIME, 0, false, '2000-06-12T14:12:55.000+00:00', true, false, null, [], ['datetime'])); + $this->assertEquals(true, $database->createAttribute('attributes', 'string_default', Database::VAR_STRING, 256, false, 'test')); + $this->assertEquals(true, $database->createAttribute('attributes', 'integer_default', Database::VAR_INTEGER, 0, false, 1)); + $this->assertEquals(true, $database->createAttribute('attributes', 'float_default', Database::VAR_FLOAT, 0, false, 1.5)); + $this->assertEquals(true, $database->createAttribute('attributes', 'boolean_default', Database::VAR_BOOLEAN, 0, false, false)); + $this->assertEquals(true, $database->createAttribute('attributes', 'datetime_default', Database::VAR_DATETIME, 0, false, '2000-06-12T14:12:55.000+00:00', true, false, null, [], ['datetime'])); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $this->assertCount(17, $collection->getAttribute('attributes')); // Delete - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string1')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string2')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string3')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string4')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'integer')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'bigint')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'float')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'boolean')); - - $collection = static::getDatabase()->getCollection('attributes'); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string1')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string2')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string3')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string4')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'integer')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'bigint')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'float')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'boolean')); + + $collection = $database->getCollection('attributes'); $this->assertCount(9, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); // Delete Array - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string_list')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'integer_list')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'float_list')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'boolean_list')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string_list')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'integer_list')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'float_list')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'boolean_list')); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $this->assertCount(5, $collection->getAttribute('attributes')); // Delete default - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string_default')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'integer_default')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'float_default')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'boolean_default')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'datetime_default')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string_default')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'integer_default')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'float_default')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'boolean_default')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'datetime_default')); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $this->assertCount(0, $collection->getAttribute('attributes')); // Test for custom chars in ID - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'as_5dasdasdas', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'as5dasdasdas_', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', '.as5dasdasdas', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', '-as5dasdasdas', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'as-5dasdasdas', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'as5dasdasdas-', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'socialAccountForYoutubeSubscribersss', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', '5f058a89258075f058a89258075f058t9214', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'as_5dasdasdas', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'as5dasdasdas_', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', '.as5dasdasdas', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', '-as5dasdasdas', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'as-5dasdasdas', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'as5dasdasdas-', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'socialAccountForYoutubeSubscribersss', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('attributes', '5f058a89258075f058a89258075f058t9214', Database::VAR_BOOLEAN, 0, true)); // Test non-shared tables duplicates throw duplicate - static::getDatabase()->createAttribute('attributes', 'duplicate', Database::VAR_STRING, 128, true); + $database->createAttribute('attributes', 'duplicate', Database::VAR_STRING, 128, true); try { - static::getDatabase()->createAttribute('attributes', 'duplicate', Database::VAR_STRING, 128, true); + $database->createAttribute('attributes', 'duplicate', Database::VAR_STRING, 128, true); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(DuplicateException::class, $e); } // Test delete attribute when column does not exist - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'string1', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'string1', Database::VAR_STRING, 128, true)); sleep(1); $this->assertEquals(true, static::deleteColumn('attributes', 'string1')); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $attributes = $collection->getAttribute('attributes'); $attribute = end($attributes); $this->assertEquals('string1', $attribute->getId()); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('attributes', 'string1')); + $this->assertEquals(true, $database->deleteAttribute('attributes', 'string1')); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); $attributes = $collection->getAttribute('attributes'); $attribute = end($attributes); $this->assertNotEquals('string1', $attribute->getId()); - $collection = static::getDatabase()->getCollection('attributes'); + $collection = $database->getCollection('attributes'); } /** * @depends testCreateDeleteAttribute @@ -174,27 +177,35 @@ public function testCreateDeleteAttribute(): void */ public function testInvalidDefaultValues(string $type, mixed $default): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(\Exception::class); - $this->assertEquals(false, static::getDatabase()->createAttribute('attributes', 'bad_default', $type, 256, true, $default)); + $this->assertEquals(false, $database->createAttribute('attributes', 'bad_default', $type, 256, true, $default)); } /** * @depends testInvalidDefaultValues */ public function testAttributeCaseInsensitivity(): void { + /** @var Database $database */ + $database = static::getDatabase(); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'caseSensitive', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'caseSensitive', Database::VAR_STRING, 128, true)); $this->expectException(DuplicateException::class); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributes', 'CaseSensitive', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('attributes', 'CaseSensitive', Database::VAR_STRING, 128, true)); } public function testAttributeKeyWithSymbols(): void { - static::getDatabase()->createCollection('attributesWithKeys'); + /** @var Database $database */ + $database = static::getDatabase(); - $this->assertEquals(true, static::getDatabase()->createAttribute('attributesWithKeys', 'key_with.sym$bols', Database::VAR_STRING, 128, true)); + $database->createCollection('attributesWithKeys'); - $document = static::getDatabase()->createDocument('attributesWithKeys', new Document([ + $this->assertEquals(true, $database->createAttribute('attributesWithKeys', 'key_with.sym$bols', Database::VAR_STRING, 128, true)); + + $document = $database->createDocument('attributesWithKeys', new Document([ 'key_with.sym$bols' => 'value', '$permissions' => [ Permission::read(Role::any()), @@ -203,16 +214,19 @@ public function testAttributeKeyWithSymbols(): void $this->assertEquals('value', $document->getAttribute('key_with.sym$bols')); - $document = static::getDatabase()->getDocument('attributesWithKeys', $document->getId()); + $document = $database->getDocument('attributesWithKeys', $document->getId()); $this->assertEquals('value', $document->getAttribute('key_with.sym$bols')); } public function testAttributeNamesWithDots(): void { - static::getDatabase()->createCollection('dots.parent'); + /** @var Database $database */ + $database = static::getDatabase(); - $this->assertTrue(static::getDatabase()->createAttribute( + $database->createCollection('dots.parent'); + + $this->assertTrue($database->createAttribute( collection: 'dots.parent', id: 'dots.name', type: Database::VAR_STRING, @@ -220,14 +234,14 @@ public function testAttributeNamesWithDots(): void required: false )); - $document = static::getDatabase()->find('dots.parent', [ + $document = $database->find('dots.parent', [ Query::select(['dots.name']), ]); $this->assertEmpty($document); - static::getDatabase()->createCollection('dots'); + $database->createCollection('dots'); - $this->assertTrue(static::getDatabase()->createAttribute( + $this->assertTrue($database->createAttribute( collection: 'dots', id: 'name', type: Database::VAR_STRING, @@ -235,13 +249,13 @@ public function testAttributeNamesWithDots(): void required: false )); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'dots.parent', relatedCollection: 'dots', type: Database::RELATION_ONE_TO_ONE ); - static::getDatabase()->createDocument('dots.parent', new Document([ + $database->createDocument('dots.parent', new Document([ '$id' => ID::custom('father'), 'dots.name' => 'Bill clinton', '$permissions' => [ @@ -261,7 +275,7 @@ public function testAttributeNamesWithDots(): void ] ])); - $documents = static::getDatabase()->find('dots.parent', [ + $documents = $database->find('dots.parent', [ Query::select(['*']), ]); @@ -271,6 +285,7 @@ public function testAttributeNamesWithDots(): void public function testUpdateAttributeDefault(): void { + /** @var Database $database */ $database = static::getDatabase(); $flowers = $database->createCollection('flowers'); @@ -324,6 +339,7 @@ public function testUpdateAttributeDefault(): void public function testRenameAttribute(): void { + /** @var Database $database */ $database = static::getDatabase(); $colors = $database->createCollection('colors'); @@ -370,6 +386,7 @@ public function testRenameAttribute(): void */ public function testUpdateAttributeRequired(): void { + /** @var Database $database */ $database = static::getDatabase(); $database->updateAttributeRequired('flowers', 'inStock', true); @@ -392,6 +409,7 @@ public function testUpdateAttributeRequired(): void */ public function testUpdateAttributeFilter(): void { + /** @var Database $database */ $database = static::getDatabase(); $database->createAttribute('flowers', 'cartModel', Database::VAR_STRING, 2000, false); @@ -425,6 +443,7 @@ public function testUpdateAttributeFilter(): void */ public function testUpdateAttributeFormat(): void { + /** @var Database $database */ $database = static::getDatabase(); $database->createAttribute('flowers', 'price', Database::VAR_INTEGER, 0, false); @@ -486,6 +505,7 @@ public function testUpdateAttributeStructure(): void return new Range($min, $max); }, Database::VAR_INTEGER); + /** @var Database $database */ $database = static::getDatabase(); // price attribute @@ -623,11 +643,14 @@ public function testUpdateAttributeStructure(): void public function testUpdateAttributeRename(): void { - static::getDatabase()->createCollection('rename_test'); + /** @var Database $database */ + $database = static::getDatabase(); - $this->assertEquals(true, static::getDatabase()->createAttribute('rename_test', 'rename_me', Database::VAR_STRING, 128, true)); + $database->createCollection('rename_test'); - $doc = static::getDatabase()->createDocument('rename_test', new Document([ + $this->assertEquals(true, $database->createAttribute('rename_test', 'rename_me', Database::VAR_STRING, 128, true)); + + $doc = $database->createDocument('rename_test', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -640,15 +663,15 @@ public function testUpdateAttributeRename(): void $this->assertEquals('string', $doc->getAttribute('rename_me')); // Create an index to check later - static::getDatabase()->createIndex('rename_test', 'renameIndexes', Database::INDEX_KEY, ['rename_me'], [], [Database::ORDER_DESC, Database::ORDER_DESC]); + $database->createIndex('rename_test', 'renameIndexes', Database::INDEX_KEY, ['rename_me'], [], [Database::ORDER_DESC, Database::ORDER_DESC]); - static::getDatabase()->updateAttribute( + $database->updateAttribute( collection: 'rename_test', id: 'rename_me', newKey: 'renamed', ); - $doc = static::getDatabase()->getDocument('rename_test', $doc->getId()); + $doc = $database->getDocument('rename_test', $doc->getId()); // Check the attribute was correctly renamed $this->assertEquals('string', $doc->getAttribute('renamed')); @@ -656,31 +679,31 @@ public function testUpdateAttributeRename(): void // Check we can update the document with the new key $doc->setAttribute('renamed', 'string2'); - static::getDatabase()->updateDocument('rename_test', $doc->getId(), $doc); + $database->updateDocument('rename_test', $doc->getId(), $doc); - $doc = static::getDatabase()->getDocument('rename_test', $doc->getId()); + $doc = $database->getDocument('rename_test', $doc->getId()); $this->assertEquals('string2', $doc->getAttribute('renamed')); // Check collection - $collection = static::getDatabase()->getCollection('rename_test'); + $collection = $database->getCollection('rename_test'); $this->assertEquals('renamed', $collection->getAttribute('attributes')[0]['key']); $this->assertEquals('renamed', $collection->getAttribute('attributes')[0]['$id']); $this->assertEquals('renamed', $collection->getAttribute('indexes')[0]['attributes'][0]); // Check empty newKey doesn't cause issues - static::getDatabase()->updateAttribute( + $database->updateAttribute( collection: 'rename_test', id: 'renamed', type: Database::VAR_STRING, ); - $collection = static::getDatabase()->getCollection('rename_test'); + $collection = $database->getCollection('rename_test'); $this->assertEquals('renamed', $collection->getAttribute('attributes')[0]['key']); $this->assertEquals('renamed', $collection->getAttribute('attributes')[0]['$id']); $this->assertEquals('renamed', $collection->getAttribute('indexes')[0]['attributes'][0]); - $doc = static::getDatabase()->getDocument('rename_test', $doc->getId()); + $doc = $database->getDocument('rename_test', $doc->getId()); $this->assertEquals('string2', $doc->getAttribute('renamed')); $this->assertArrayNotHasKey('rename_me', $doc->getAttributes()); @@ -696,7 +719,7 @@ public function testUpdateAttributeRename(): void $this->assertEquals(1, count($collection->getAttribute('indexes'))); // Try and create new document with new key - $doc = static::getDatabase()->createDocument('rename_test', new Document([ + $doc = $database->createDocument('rename_test', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -710,7 +733,7 @@ public function testUpdateAttributeRename(): void // Make sure we can't create a new attribute with the old key try { - $doc = static::getDatabase()->createDocument('rename_test', new Document([ + $doc = $database->createDocument('rename_test', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -725,13 +748,13 @@ public function testUpdateAttributeRename(): void } // Check new key filtering - static::getDatabase()->updateAttribute( + $database->updateAttribute( collection: 'rename_test', id: 'renamed', newKey: 'renamed-test', ); - $doc = static::getDatabase()->getDocument('rename_test', $doc->getId()); + $doc = $database->getDocument('rename_test', $doc->getId()); $this->assertEquals('string', $doc->getAttribute('renamed-test')); $this->assertArrayNotHasKey('renamed', $doc->getAttributes()); @@ -744,7 +767,9 @@ public function testUpdateAttributeRename(): void */ public function textRenameAttributeMissing(): void { + /** @var Database $database */ $database = static::getDatabase(); + $this->expectExceptionMessage('Attribute not found'); $database->renameAttribute('colors', 'name2', 'name3'); } @@ -755,21 +780,26 @@ public function textRenameAttributeMissing(): void */ public function testRenameAttributeExisting(): void { + /** @var Database $database */ $database = static::getDatabase(); + $this->expectExceptionMessage('Attribute name already used'); $database->renameAttribute('colors', 'verbose', 'hex'); } public function testWidthLimit(): void { - if (static::getDatabase()->getAdapter()->getDocumentSizeLimit() === 0) { + /** @var Database $database */ + $database = static::getDatabase(); + + if ($database->getAdapter()->getDocumentSizeLimit() === 0) { $this->expectNotToPerformAssertions(); return; } - $collection = static::getDatabase()->createCollection('width_limit'); + $collection = $database->createCollection('width_limit'); - $init = static::getDatabase()->getAdapter()->getAttributeWidth($collection); + $init = $database->getAdapter()->getAttributeWidth($collection); $this->assertEquals(1067, $init); $attribute = new Document([ @@ -782,7 +812,7 @@ public function testWidthLimit(): void 'array' => false, 'filters' => [], ]); - $res = static::getDatabase()->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); + $res = $database->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); $this->assertEquals(401, $res - $init); // 100 * 4 + 1 (length) $attribute = new Document([ @@ -795,7 +825,7 @@ public function testWidthLimit(): void 'array' => true, 'filters' => [], ]); - $res = static::getDatabase()->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); + $res = $database->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); $this->assertEquals(20, $res - $init); // Pointer of Json / Longtext (mariaDB) $attribute = new Document([ @@ -808,7 +838,7 @@ public function testWidthLimit(): void 'array' => false, 'filters' => [], ]); - $res = static::getDatabase()->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); + $res = $database->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); $this->assertEquals(20, $res - $init); $attribute = new Document([ @@ -821,7 +851,7 @@ public function testWidthLimit(): void 'array' => false, 'filters' => [], ]); - $res = static::getDatabase()->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); + $res = $database->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); $this->assertEquals(8, $res - $init); $attribute = new Document([ @@ -834,18 +864,21 @@ public function testWidthLimit(): void 'array' => false, 'filters' => [], ]); - $res = static::getDatabase()->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); + $res = $database->getAdapter()->getAttributeWidth($collection->setAttribute('attributes', [$attribute])); $this->assertEquals(7, $res - $init); } public function testExceptionAttributeLimit(): void { - if (static::getDatabase()->getAdapter()->getLimitForAttributes() === 0) { + /** @var Database $database */ + $database = static::getDatabase(); + + if ($database->getAdapter()->getLimitForAttributes() === 0) { $this->expectNotToPerformAssertions(); return; } - $limit = static::getDatabase()->getAdapter()->getLimitForAttributes() - static::getDatabase()->getAdapter()->getCountOfDefaultAttributes(); + $limit = $database->getAdapter()->getLimitForAttributes() - $database->getAdapter()->getCountOfDefaultAttributes(); $attributes = []; @@ -863,7 +896,7 @@ public function testExceptionAttributeLimit(): void } try { - static::getDatabase()->createCollection('attributes_limit', $attributes); + $database->createCollection('attributes_limit', $attributes); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -876,7 +909,7 @@ public function testExceptionAttributeLimit(): void array_pop($attributes); - $collection = static::getDatabase()->createCollection('attributes_limit', $attributes); + $collection = $database->createCollection('attributes_limit', $attributes); $attribute = new Document([ '$id' => ID::custom('breaking'), @@ -890,7 +923,7 @@ public function testExceptionAttributeLimit(): void ]); try { - static::getDatabase()->checkAttribute($collection, $attribute); + $database->checkAttribute($collection, $attribute); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -898,7 +931,7 @@ public function testExceptionAttributeLimit(): void } try { - static::getDatabase()->createAttribute($collection->getId(), 'breaking', Database::VAR_STRING, 100, true); + $database->createAttribute($collection->getId(), 'breaking', Database::VAR_STRING, 100, true); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -908,7 +941,10 @@ public function testExceptionAttributeLimit(): void public function testExceptionWidthLimit(): void { - if (static::getDatabase()->getAdapter()->getDocumentSizeLimit() === 0) { + /** @var Database $database */ + $database = static::getDatabase(); + + if ($database->getAdapter()->getDocumentSizeLimit() === 0) { $this->expectNotToPerformAssertions(); return; } @@ -938,7 +974,7 @@ public function testExceptionWidthLimit(): void ]); try { - static::getDatabase()->createCollection("attributes_row_size", $attributes); + $database->createCollection("attributes_row_size", $attributes); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -951,7 +987,7 @@ public function testExceptionWidthLimit(): void array_pop($attributes); - $collection = static::getDatabase()->createCollection("attributes_row_size", $attributes); + $collection = $database->createCollection("attributes_row_size", $attributes); $attribute = new Document([ '$id' => ID::custom('breaking'), @@ -965,7 +1001,7 @@ public function testExceptionWidthLimit(): void ]); try { - static::getDatabase()->checkAttribute($collection, $attribute); + $database->checkAttribute($collection, $attribute); $this->fail('Failed to throw exception'); } catch (\Exception $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -973,7 +1009,7 @@ public function testExceptionWidthLimit(): void } try { - static::getDatabase()->createAttribute($collection->getId(), 'breaking', Database::VAR_STRING, 200, true); + $database->createAttribute($collection->getId(), 'breaking', Database::VAR_STRING, 200, true); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -983,15 +1019,18 @@ public function testExceptionWidthLimit(): void public function testUpdateAttributeSize(): void { - if (!static::getDatabase()->getAdapter()->getSupportForAttributeResizing()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForAttributeResizing()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('resize_test'); + $database->createCollection('resize_test'); - $this->assertEquals(true, static::getDatabase()->createAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true)); - $document = static::getDatabase()->createDocument('resize_test', new Document([ + $this->assertEquals(true, $database->createAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true)); + $document = $database->createDocument('resize_test', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), @@ -1015,84 +1054,87 @@ public function testUpdateAttributeSize(): void // Test going down in size with data that is too big (Expect Failure) try { - static::getDatabase()->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); + $database->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); $this->fail('Succeeded updating attribute size to smaller size with data that is too big'); } catch (TruncateException $e) { } // Test going down in size when data isn't too big. - static::getDatabase()->updateDocument('resize_test', $document->getId(), $document->setAttribute('resize_me', $this->createRandomString(128))); - static::getDatabase()->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); + $database->updateDocument('resize_test', $document->getId(), $document->setAttribute('resize_me', $this->createRandomString(128))); + $database->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); // VARCHAR -> VARCHAR Truncation Test - static::getDatabase()->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 1000, true); - static::getDatabase()->updateDocument('resize_test', $document->getId(), $document->setAttribute('resize_me', $this->createRandomString(1000))); + $database->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 1000, true); + $database->updateDocument('resize_test', $document->getId(), $document->setAttribute('resize_me', $this->createRandomString(1000))); try { - static::getDatabase()->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); + $database->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, 128, true); $this->fail('Succeeded updating attribute size to smaller size with data that is too big'); } catch (TruncateException $e) { } - if (static::getDatabase()->getAdapter()->getMaxIndexLength() > 0) { - $length = intval(static::getDatabase()->getAdapter()->getMaxIndexLength() / 2); + if ($database->getAdapter()->getMaxIndexLength() > 0) { + $length = intval($database->getAdapter()->getMaxIndexLength() / 2); - $this->assertEquals(true, static::getDatabase()->createAttribute('resize_test', 'attr1', Database::VAR_STRING, $length, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('resize_test', 'attr2', Database::VAR_STRING, $length, true)); + $this->assertEquals(true, $database->createAttribute('resize_test', 'attr1', Database::VAR_STRING, $length, true)); + $this->assertEquals(true, $database->createAttribute('resize_test', 'attr2', Database::VAR_STRING, $length, true)); /** * No index length provided, we are able to validate */ - static::getDatabase()->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2']); + $database->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2']); try { - static::getDatabase()->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); + $database->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); $this->fail('Failed to throw exception'); } catch (Throwable $e) { - $this->assertEquals('Index length is longer than the maximum: '.static::getDatabase()->getAdapter()->getMaxIndexLength(), $e->getMessage()); + $this->assertEquals('Index length is longer than the maximum: '.$database->getAdapter()->getMaxIndexLength(), $e->getMessage()); } - static::getDatabase()->deleteIndex('resize_test', 'index1'); + $database->deleteIndex('resize_test', 'index1'); /** * Index lengths are provided, We are able to validate * Index $length === attr1, $length === attr2, so $length is removed, so we are able to validate */ - static::getDatabase()->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2'], [$length, $length]); + $database->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2'], [$length, $length]); - $collection = static::getDatabase()->getCollection('resize_test'); + $collection = $database->getCollection('resize_test'); $indexes = $collection->getAttribute('indexes', []); $this->assertEquals(null, $indexes[0]['lengths'][0]); $this->assertEquals(null, $indexes[0]['lengths'][1]); try { - static::getDatabase()->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); + $database->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); $this->fail('Failed to throw exception'); } catch (Throwable $e) { - $this->assertEquals('Index length is longer than the maximum: '.static::getDatabase()->getAdapter()->getMaxIndexLength(), $e->getMessage()); + $this->assertEquals('Index length is longer than the maximum: '.$database->getAdapter()->getMaxIndexLength(), $e->getMessage()); } - static::getDatabase()->deleteIndex('resize_test', 'index1'); + $database->deleteIndex('resize_test', 'index1'); /** * Index lengths are provided * We are able to increase size because index length remains 50 */ - static::getDatabase()->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2'], [50, 50]); + $database->createIndex('resize_test', 'index1', Database::INDEX_KEY, ['attr1', 'attr2'], [50, 50]); - $collection = static::getDatabase()->getCollection('resize_test'); + $collection = $database->getCollection('resize_test'); $indexes = $collection->getAttribute('indexes', []); $this->assertEquals(50, $indexes[0]['lengths'][0]); $this->assertEquals(50, $indexes[0]['lengths'][1]); - static::getDatabase()->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); + $database->updateAttribute('resize_test', 'attr1', Database::VAR_STRING, 5000); } } public function testEncryptAttributes(): void { + /** @var Database $database */ + $database = static::getDatabase(); + // Add custom encrypt filter - static::getDatabase()->addFilter( + $database->addFilter( 'encrypt', function (mixed $value) { return json_encode([ @@ -1110,20 +1152,20 @@ function (mixed $value) { } ); - $col = static::getDatabase()->createCollection(__FUNCTION__); + $col = $database->createCollection(__FUNCTION__); $this->assertNotNull($col->getId()); - static::getDatabase()->createAttribute($col->getId(), 'title', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute($col->getId(), 'encrypt', Database::VAR_STRING, 128, true, filters: ['encrypt']); + $database->createAttribute($col->getId(), 'title', Database::VAR_STRING, 255, true); + $database->createAttribute($col->getId(), 'encrypt', Database::VAR_STRING, 128, true, filters: ['encrypt']); - static::getDatabase()->createDocument($col->getId(), new Document([ + $database->createDocument($col->getId(), new Document([ 'title' => 'Sample Title', 'encrypt' => 'secret', ])); // query against encrypt try { $queries = [Query::equal('encrypt', ['test'])]; - $doc = static::getDatabase()->find($col->getId(), $queries); + $doc = $database->find($col->getId(), $queries); $this->fail('Queried against encrypt field. Failed to throw exeception.'); } catch (Throwable $e) { $this->assertTrue($e instanceof QueryException); @@ -1131,7 +1173,7 @@ function (mixed $value) { try { $queries = [Query::equal('title', ['test'])]; - static::getDatabase()->find($col->getId(), $queries); + $database->find($col->getId(), $queries); } catch (Throwable $e) { $this->fail('Should not have thrown error'); } @@ -1139,12 +1181,15 @@ function (mixed $value) { public function updateStringAttributeSize(int $size, Document $document): Document { - static::getDatabase()->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, $size, true); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->updateAttribute('resize_test', 'resize_me', Database::VAR_STRING, $size, true); $document = $document->setAttribute('resize_me', $this->createRandomString($size)); - static::getDatabase()->updateDocument('resize_test', $document->getId(), $document); - $checkDoc = static::getDatabase()->getDocument('resize_test', $document->getId()); + $database->updateDocument('resize_test', $document->getId(), $document); + $checkDoc = $database->getDocument('resize_test', $document->getId()); $this->assertEquals($document->getAttribute('resize_me'), $checkDoc->getAttribute('resize_me')); $this->assertEquals($size, strlen($checkDoc->getAttribute('resize_me'))); @@ -1157,10 +1202,13 @@ public function updateStringAttributeSize(int $size, Document $document): Docume */ public function testIndexCaseInsensitivity(): void { - $this->assertEquals(true, static::getDatabase()->createIndex('attributes', 'key_caseSensitive', Database::INDEX_KEY, ['caseSensitive'], [128])); + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertEquals(true, $database->createIndex('attributes', 'key_caseSensitive', Database::INDEX_KEY, ['caseSensitive'], [128])); try { - $this->assertEquals(true, static::getDatabase()->createIndex('attributes', 'key_CaseSensitive', Database::INDEX_KEY, ['caseSensitive'], [128])); + $this->assertEquals(true, $database->createIndex('attributes', 'key_CaseSensitive', Database::INDEX_KEY, ['caseSensitive'], [128])); } catch (Throwable $e) { self::assertTrue($e instanceof DuplicateException); } @@ -1173,7 +1221,10 @@ public function testIndexCaseInsensitivity(): void */ public function testCleanupAttributeTests(): void { - static::getDatabase()->deleteCollection('attributes'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->deleteCollection('attributes'); $this->assertEquals(1, 1); } @@ -1188,7 +1239,9 @@ public function testArrayAttribute(): void { Authorization::setRole(Role::any()->toString()); + /** @var Database $database */ $database = static::getDatabase(); + $collection = 'json'; $permissions = [Permission::read(Role::any())]; @@ -1497,13 +1550,16 @@ public function testArrayAttribute(): void public function testCreateDatetime(): void { - static::getDatabase()->createCollection('datetime'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('datetime'); - $this->assertEquals(true, static::getDatabase()->createAttribute('datetime', 'date', Database::VAR_DATETIME, 0, true, null, true, false, null, [], ['datetime'])); - $this->assertEquals(true, static::getDatabase()->createAttribute('datetime', 'date2', Database::VAR_DATETIME, 0, false, null, true, false, null, [], ['datetime'])); + $this->assertEquals(true, $database->createAttribute('datetime', 'date', Database::VAR_DATETIME, 0, true, null, true, false, null, [], ['datetime'])); + $this->assertEquals(true, $database->createAttribute('datetime', 'date2', Database::VAR_DATETIME, 0, false, null, true, false, null, [], ['datetime'])); try { - static::getDatabase()->createDocument('datetime', new Document([ + $database->createDocument('datetime', new Document([ 'date' => ['2020-01-01'], // array ])); $this->fail('Failed to throw exception'); @@ -1511,7 +1567,7 @@ public function testCreateDatetime(): void $this->assertInstanceOf(StructureException::class, $e); } - $doc = static::getDatabase()->createDocument('datetime', new Document([ + $doc = $database->createDocument('datetime', new Document([ '$id' => ID::custom('id1234'), '$permissions' => [ Permission::read(Role::any()), @@ -1529,28 +1585,28 @@ public function testCreateDatetime(): void $this->assertGreaterThan('2020-08-16T19:30:08.363+00:00', $doc->getCreatedAt()); $this->assertGreaterThan('2020-08-16T19:30:08.363+00:00', $doc->getUpdatedAt()); - $document = static::getDatabase()->getDocument('datetime', 'id1234'); + $document = $database->getDocument('datetime', 'id1234'); - $min = static::getDatabase()->getAdapter()->getMinDateTime(); - $max = static::getDatabase()->getAdapter()->getMaxDateTime(); + $min = $database->getAdapter()->getMinDateTime(); + $max = $database->getAdapter()->getMaxDateTime(); $dateValidator = new DatetimeValidator($min, $max); $this->assertEquals(null, $document->getAttribute('date2')); $this->assertEquals(true, $dateValidator->isValid($document->getAttribute('date'))); $this->assertEquals(false, $dateValidator->isValid($document->getAttribute('date2'))); - $documents = static::getDatabase()->find('datetime', [ + $documents = $database->find('datetime', [ Query::greaterThan('date', '1975-12-06 10:00:00+01:00'), Query::lessThan('date', '2030-12-06 10:00:00-01:00'), ]); $this->assertEquals(1, count($documents)); - $documents = static::getDatabase()->find('datetime', [ + $documents = $database->find('datetime', [ Query::greaterThan('$createdAt', '1975-12-06 11:00:00.000'), ]); $this->assertCount(1, $documents); try { - static::getDatabase()->createDocument('datetime', new Document([ + $database->createDocument('datetime', new Document([ 'date' => "1975-12-06 00:00:61" // 61 seconds is invalid ])); $this->fail('Failed to throw exception'); @@ -1559,7 +1615,7 @@ public function testCreateDatetime(): void } try { - static::getDatabase()->createDocument('datetime', new Document([ + $database->createDocument('datetime', new Document([ 'date' => '+055769-02-14T17:56:18.000Z' ])); $this->fail('Failed to throw exception'); @@ -1575,7 +1631,7 @@ public function testCreateDatetime(): void foreach ($invalidDates as $date) { try { - static::getDatabase()->find('datetime', [ + $database->find('datetime', [ Query::equal('$createdAt', [$date]) ]); $this->fail('Failed to throw exception'); @@ -1585,7 +1641,7 @@ public function testCreateDatetime(): void } try { - static::getDatabase()->find('datetime', [ + $database->find('datetime', [ Query::equal('date', [$date]) ]); $this->fail('Failed to throw exception'); @@ -1601,12 +1657,12 @@ public function testCreateDatetime(): void ]; foreach ($validDates as $date) { - $docs = static::getDatabase()->find('datetime', [ + $docs = $database->find('datetime', [ Query::equal('$createdAt', [$date]) ]); $this->assertCount(0, $docs); - $docs = static::getDatabase()->find('datetime', [ + $docs = $database->find('datetime', [ Query::equal('date', [$date]) ]); $this->assertCount(0, $docs); @@ -1615,11 +1671,14 @@ public function testCreateDatetime(): void public function testCreateDateTimeAttributeFailure(): void { - static::getDatabase()->createCollection('datetime_fail'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('datetime_fail'); /** Test for FAILURE */ $this->expectException(Exception::class); - static::getDatabase()->createAttribute('datetime_fail', 'date_fail', Database::VAR_DATETIME, 0, false); + $database->createAttribute('datetime_fail', 'date_fail', Database::VAR_DATETIME, 0, false); } /** * @depends testCreateDeleteAttribute @@ -1627,23 +1686,29 @@ public function testCreateDateTimeAttributeFailure(): void */ public function testUnknownFormat(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(\Exception::class); - $this->assertEquals(false, static::getDatabase()->createAttribute('attributes', 'bad_format', Database::VAR_STRING, 256, true, null, true, false, 'url')); + $this->assertEquals(false, $database->createAttribute('attributes', 'bad_format', Database::VAR_STRING, 256, true, null, true, false, 'url')); } // Bulk attribute creation tests public function testCreateAttributesEmpty(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); try { - static::getDatabase()->createAttributes(__FUNCTION__, []); + $database->createAttributes(__FUNCTION__, []); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1652,12 +1717,15 @@ public function testCreateAttributesEmpty(): void public function testCreateAttributesMissingId(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ 'type' => Database::VAR_STRING, @@ -1665,7 +1733,7 @@ public function testCreateAttributesMissingId(): void 'required' => false ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1674,12 +1742,15 @@ public function testCreateAttributesMissingId(): void public function testCreateAttributesMissingType(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1687,7 +1758,7 @@ public function testCreateAttributesMissingType(): void 'required' => false ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1696,12 +1767,15 @@ public function testCreateAttributesMissingType(): void public function testCreateAttributesMissingSize(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1709,7 +1783,7 @@ public function testCreateAttributesMissingSize(): void 'required' => false ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1718,12 +1792,15 @@ public function testCreateAttributesMissingSize(): void public function testCreateAttributesMissingRequired(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1731,7 +1808,7 @@ public function testCreateAttributesMissingRequired(): void 'size' => 10 ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1740,13 +1817,16 @@ public function testCreateAttributesMissingRequired(): void public function testCreateAttributesDuplicateMetadata(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); - static::getDatabase()->createAttribute(__FUNCTION__, 'dup', Database::VAR_STRING, 10, false); + $database->createCollection(__FUNCTION__); + $database->createAttribute(__FUNCTION__, 'dup', Database::VAR_STRING, 10, false); $attributes = [[ '$id' => 'dup', @@ -1756,7 +1836,7 @@ public function testCreateAttributesDuplicateMetadata(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DuplicateException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DuplicateException::class, $e); @@ -1765,12 +1845,15 @@ public function testCreateAttributesDuplicateMetadata(): void public function testCreateAttributesInvalidFilter(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'date', @@ -1780,7 +1863,7 @@ public function testCreateAttributesInvalidFilter(): void 'filters' => [] ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1789,12 +1872,15 @@ public function testCreateAttributesInvalidFilter(): void public function testCreateAttributesInvalidFormat(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1805,7 +1891,7 @@ public function testCreateAttributesInvalidFormat(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1814,12 +1900,15 @@ public function testCreateAttributesInvalidFormat(): void public function testCreateAttributesDefaultOnRequired(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1830,7 +1919,7 @@ public function testCreateAttributesDefaultOnRequired(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1839,12 +1928,15 @@ public function testCreateAttributesDefaultOnRequired(): void public function testCreateAttributesUnknownType(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [[ '$id' => 'foo', @@ -1854,7 +1946,7 @@ public function testCreateAttributesUnknownType(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1863,14 +1955,17 @@ public function testCreateAttributesUnknownType(): void public function testCreateAttributesStringSizeLimit(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); - $max = static::getDatabase()->getAdapter()->getLimitForString(); + $max = $database->getAdapter()->getLimitForString(); $attributes = [[ '$id' => 'foo', @@ -1880,7 +1975,7 @@ public function testCreateAttributesStringSizeLimit(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1889,14 +1984,17 @@ public function testCreateAttributesStringSizeLimit(): void public function testCreateAttributesIntegerSizeLimit(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); - $limit = static::getDatabase()->getAdapter()->getLimitForInt() / 2; + $limit = $database->getAdapter()->getLimitForInt() / 2; $attributes = [[ '$id' => 'foo', @@ -1906,7 +2004,7 @@ public function testCreateAttributesIntegerSizeLimit(): void ]]; try { - static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $database->createAttributes(__FUNCTION__, $attributes); $this->fail('Expected DatabaseException not thrown'); } catch (\Throwable $e) { $this->assertInstanceOf(DatabaseException::class, $e); @@ -1915,12 +2013,15 @@ public function testCreateAttributesIntegerSizeLimit(): void public function testCreateAttributesSuccessMultiple(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [ [ @@ -1937,16 +2038,16 @@ public function testCreateAttributesSuccessMultiple(): void ], ]; - $result = static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $result = $database->createAttributes(__FUNCTION__, $attributes); $this->assertTrue($result); - $collection = static::getDatabase()->getCollection(__FUNCTION__); + $collection = $database->getCollection(__FUNCTION__); $attrs = $collection->getAttribute('attributes'); $this->assertCount(2, $attrs); $this->assertEquals('a', $attrs[0]['$id']); $this->assertEquals('b', $attrs[1]['$id']); - $doc = static::getDatabase()->createDocument(__FUNCTION__, new Document([ + $doc = $database->createDocument(__FUNCTION__, new Document([ 'a' => 'foo', 'b' => 123, ])); @@ -1957,12 +2058,15 @@ public function testCreateAttributesSuccessMultiple(): void public function testCreateAttributesDelete(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchCreateAttributes()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchCreateAttributes()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); + $database->createCollection(__FUNCTION__); $attributes = [ [ @@ -1979,18 +2083,18 @@ public function testCreateAttributesDelete(): void ], ]; - $result = static::getDatabase()->createAttributes(__FUNCTION__, $attributes); + $result = $database->createAttributes(__FUNCTION__, $attributes); $this->assertTrue($result); - $collection = static::getDatabase()->getCollection(__FUNCTION__); + $collection = $database->getCollection(__FUNCTION__); $attrs = $collection->getAttribute('attributes'); $this->assertCount(2, $attrs); $this->assertEquals('a', $attrs[0]['$id']); $this->assertEquals('b', $attrs[1]['$id']); - static::getDatabase()->deleteAttribute(__FUNCTION__, 'a'); + $database->deleteAttribute(__FUNCTION__, 'a'); - $collection = static::getDatabase()->getCollection(__FUNCTION__); + $collection = $database->getCollection(__FUNCTION__); $attrs = $collection->getAttribute('attributes'); $this->assertCount(1, $attrs); $this->assertEquals('b', $attrs[0]['$id']); diff --git a/tests/e2e/Adapter/Scopes/CollectionTests.php b/tests/e2e/Adapter/Scopes/CollectionTests.php index 6c7244918..731525f81 100644 --- a/tests/e2e/Adapter/Scopes/CollectionTests.php +++ b/tests/e2e/Adapter/Scopes/CollectionTests.php @@ -22,15 +22,18 @@ trait CollectionTests { public function testCreateExistsDelete(): void { - if (!static::getDatabase()->getAdapter()->getSupportForSchemas()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForSchemas()) { $this->expectNotToPerformAssertions(); return; } - $this->assertEquals(true, static::getDatabase()->exists($this->testDatabase)); - $this->assertEquals(true, static::getDatabase()->delete($this->testDatabase)); - $this->assertEquals(false, static::getDatabase()->exists($this->testDatabase)); - $this->assertEquals(true, static::getDatabase()->create()); + $this->assertEquals(true, $database->exists($this->testDatabase)); + $this->assertEquals(true, $database->delete($this->testDatabase)); + $this->assertEquals(false, $database->exists($this->testDatabase)); + $this->assertEquals(true, $database->create()); } /** @@ -38,38 +41,44 @@ public function testCreateExistsDelete(): void */ public function testCreateListExistsDeleteCollection(): void { - $this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createCollection('actors', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertInstanceOf('Utopia\Database\Document', $database->createCollection('actors', permissions: [ Permission::create(Role::any()), Permission::read(Role::any()), ])); - $this->assertCount(1, static::getDatabase()->listCollections()); - $this->assertEquals(true, static::getDatabase()->exists($this->testDatabase, 'actors')); + $this->assertCount(1, $database->listCollections()); + $this->assertEquals(true, $database->exists($this->testDatabase, 'actors')); // Collection names should not be unique - $this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createCollection('actors2', permissions: [ + $this->assertInstanceOf('Utopia\Database\Document', $database->createCollection('actors2', permissions: [ Permission::create(Role::any()), Permission::read(Role::any()), ])); - $this->assertCount(2, static::getDatabase()->listCollections()); - $this->assertEquals(true, static::getDatabase()->exists($this->testDatabase, 'actors2')); - $collection = static::getDatabase()->getCollection('actors2'); + $this->assertCount(2, $database->listCollections()); + $this->assertEquals(true, $database->exists($this->testDatabase, 'actors2')); + $collection = $database->getCollection('actors2'); $collection->setAttribute('name', 'actors'); // change name to one that exists - $this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->updateDocument( + $this->assertInstanceOf('Utopia\Database\Document', $database->updateDocument( $collection->getCollection(), $collection->getId(), $collection )); - $this->assertEquals(true, static::getDatabase()->deleteCollection('actors2')); // Delete collection when finished - $this->assertCount(1, static::getDatabase()->listCollections()); + $this->assertEquals(true, $database->deleteCollection('actors2')); // Delete collection when finished + $this->assertCount(1, $database->listCollections()); - $this->assertEquals(false, static::getDatabase()->getCollection('actors')->isEmpty()); - $this->assertEquals(true, static::getDatabase()->deleteCollection('actors')); - $this->assertEquals(true, static::getDatabase()->getCollection('actors')->isEmpty()); - $this->assertEquals(false, static::getDatabase()->exists($this->testDatabase, 'actors')); + $this->assertEquals(false, $database->getCollection('actors')->isEmpty()); + $this->assertEquals(true, $database->deleteCollection('actors')); + $this->assertEquals(true, $database->getCollection('actors')->isEmpty()); + $this->assertEquals(false, $database->exists($this->testDatabase, 'actors')); } public function testCreateCollectionWithSchema(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $attributes = [ new Document([ '$id' => ID::custom('attribute1'), @@ -124,7 +133,7 @@ public function testCreateCollectionWithSchema(): void ]), ]; - $collection = static::getDatabase()->createCollection('withSchema', $attributes, $indexes); + $collection = $database->createCollection('withSchema', $attributes, $indexes); $this->assertEquals(false, $collection->isEmpty()); $this->assertEquals('withSchema', $collection->getId()); @@ -147,10 +156,10 @@ public function testCreateCollectionWithSchema(): void $this->assertEquals('index3', $collection->getAttribute('indexes')[2]['$id']); $this->assertEquals(Database::INDEX_KEY, $collection->getAttribute('indexes')[2]['type']); - static::getDatabase()->deleteCollection('withSchema'); + $database->deleteCollection('withSchema'); // Test collection with dash (+attribute +index) - $collection2 = static::getDatabase()->createCollection('with-dash', [ + $collection2 = $database->createCollection('with-dash', [ new Document([ '$id' => ID::custom('attribute-one'), 'type' => Database::VAR_STRING, @@ -180,7 +189,7 @@ public function testCreateCollectionWithSchema(): void $this->assertCount(1, $collection2->getAttribute('indexes')); $this->assertEquals('index-one', $collection2->getAttribute('indexes')[0]['$id']); $this->assertEquals(Database::INDEX_KEY, $collection2->getAttribute('indexes')[0]['type']); - static::getDatabase()->deleteCollection('with-dash'); + $database->deleteCollection('with-dash'); } public function testCreateCollectionValidator(): void @@ -278,8 +287,11 @@ public function testCreateCollectionValidator(): void ]), ]; + /** @var Database $database */ + $database = static::getDatabase(); + foreach ($collections as $id) { - $collection = static::getDatabase()->createCollection($id, $attributes, $indexes); + $collection = $database->createCollection($id, $attributes, $indexes); $this->assertEquals(false, $collection->isEmpty()); $this->assertEquals($id, $collection->getId()); @@ -306,15 +318,18 @@ public function testCreateCollectionValidator(): void $this->assertEquals('index.4', $collection->getAttribute('indexes')[3]['$id']); $this->assertEquals(Database::INDEX_KEY, $collection->getAttribute('indexes')[3]['type']); - static::getDatabase()->deleteCollection($id); + $database->deleteCollection($id); } } public function testCollectionNotFound(): void { + /** @var Database $database */ + $database = static::getDatabase(); + try { - static::getDatabase()->find('not_exist', []); + $database->find('not_exist', []); $this->fail('Failed to throw Exception'); } catch (Exception $e) { $this->assertEquals('Collection not found', $e->getMessage()); @@ -323,32 +338,35 @@ public function testCollectionNotFound(): void public function testSizeCollection(): void { - static::getDatabase()->createCollection('sizeTest1'); - static::getDatabase()->createCollection('sizeTest2'); + /** @var Database $database */ + $database = static::getDatabase(); - $size1 = static::getDatabase()->getSizeOfCollection('sizeTest1'); - $size2 = static::getDatabase()->getSizeOfCollection('sizeTest2'); + $database->createCollection('sizeTest1'); + $database->createCollection('sizeTest2'); + + $size1 = $database->getSizeOfCollection('sizeTest1'); + $size2 = $database->getSizeOfCollection('sizeTest2'); $sizeDifference = abs($size1 - $size2); // Size of an empty collection returns either 172032 or 167936 bytes randomly // Therefore asserting with a tolerance of 5000 bytes $byteDifference = 5000; - if (!static::getDatabase()->analyzeCollection('sizeTest2')) { + if (!$database->analyzeCollection('sizeTest2')) { $this->expectNotToPerformAssertions(); return; } $this->assertLessThan($byteDifference, $sizeDifference); - static::getDatabase()->createAttribute('sizeTest2', 'string1', Database::VAR_STRING, 20000, true); - static::getDatabase()->createAttribute('sizeTest2', 'string2', Database::VAR_STRING, 254 + 1, true); - static::getDatabase()->createAttribute('sizeTest2', 'string3', Database::VAR_STRING, 254 + 1, true); - static::getDatabase()->createIndex('sizeTest2', 'index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128]); + $database->createAttribute('sizeTest2', 'string1', Database::VAR_STRING, 20000, true); + $database->createAttribute('sizeTest2', 'string2', Database::VAR_STRING, 254 + 1, true); + $database->createAttribute('sizeTest2', 'string3', Database::VAR_STRING, 254 + 1, true); + $database->createIndex('sizeTest2', 'index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128]); $loopCount = 100; for ($i = 0; $i < $loopCount; $i++) { - static::getDatabase()->createDocument('sizeTest2', new Document([ + $database->createDocument('sizeTest2', new Document([ '$id' => 'doc' . $i, 'string1' => 'string1' . $i . str_repeat('A', 10000), 'string2' => 'string2', @@ -356,7 +374,7 @@ public function testSizeCollection(): void ])); } - static::getDatabase()->analyzeCollection('sizeTest2'); + $database->analyzeCollection('sizeTest2'); $size2 = $this->getDatabase()->getSizeOfCollection('sizeTest2'); @@ -370,7 +388,7 @@ public function testSizeCollection(): void sleep(5); - static::getDatabase()->analyzeCollection('sizeTest2'); + $database->analyzeCollection('sizeTest2'); $size3 = $this->getDatabase()->getSizeOfCollection('sizeTest2'); @@ -412,50 +430,56 @@ public function testSizeCollectionOnDisk(): void public function testSizeFullText(): void { + /** @var Database $database */ + $database = static::getDatabase(); + // SQLite does not support fulltext indexes - if (!static::getDatabase()->getAdapter()->getSupportForFulltextIndex()) { + if (!$database->getAdapter()->getSupportForFulltextIndex()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('fullTextSizeTest'); + $database->createCollection('fullTextSizeTest'); - $size1 = static::getDatabase()->getSizeOfCollection('fullTextSizeTest'); + $size1 = $database->getSizeOfCollection('fullTextSizeTest'); - static::getDatabase()->createAttribute('fullTextSizeTest', 'string1', Database::VAR_STRING, 128, true); - static::getDatabase()->createAttribute('fullTextSizeTest', 'string2', Database::VAR_STRING, 254, true); - static::getDatabase()->createAttribute('fullTextSizeTest', 'string3', Database::VAR_STRING, 254, true); - static::getDatabase()->createIndex('fullTextSizeTest', 'index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128]); + $database->createAttribute('fullTextSizeTest', 'string1', Database::VAR_STRING, 128, true); + $database->createAttribute('fullTextSizeTest', 'string2', Database::VAR_STRING, 254, true); + $database->createAttribute('fullTextSizeTest', 'string3', Database::VAR_STRING, 254, true); + $database->createIndex('fullTextSizeTest', 'index', Database::INDEX_KEY, ['string1', 'string2', 'string3'], [128, 128, 128]); $loopCount = 10; for ($i = 0; $i < $loopCount; $i++) { - static::getDatabase()->createDocument('fullTextSizeTest', new Document([ + $database->createDocument('fullTextSizeTest', new Document([ 'string1' => 'string1' . $i, 'string2' => 'string2' . $i, 'string3' => 'string3' . $i, ])); } - $size2 = static::getDatabase()->getSizeOfCollectionOnDisk('fullTextSizeTest'); + $size2 = $database->getSizeOfCollectionOnDisk('fullTextSizeTest'); $this->assertGreaterThan($size1, $size2); - static::getDatabase()->createIndex('fullTextSizeTest', 'fulltext_index', Database::INDEX_FULLTEXT, ['string1']); + $database->createIndex('fullTextSizeTest', 'fulltext_index', Database::INDEX_FULLTEXT, ['string1']); - $size3 = static::getDatabase()->getSizeOfCollectionOnDisk('fullTextSizeTest'); + $size3 = $database->getSizeOfCollectionOnDisk('fullTextSizeTest'); $this->assertGreaterThan($size2, $size3); } public function testPurgeCollectionCache(): void { - static::getDatabase()->createCollection('redis'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('redis'); - $this->assertEquals(true, static::getDatabase()->createAttribute('redis', 'name', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('redis', 'age', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('redis', 'name', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('redis', 'age', Database::VAR_INTEGER, 0, true)); - static::getDatabase()->createDocument('redis', new Document([ + $database->createDocument('redis', new Document([ '$id' => 'doc1', 'name' => 'Richard', 'age' => 15, @@ -464,20 +488,20 @@ public function testPurgeCollectionCache(): void ] ])); - $document = static::getDatabase()->getDocument('redis', 'doc1'); + $document = $database->getDocument('redis', 'doc1'); $this->assertEquals('Richard', $document->getAttribute('name')); $this->assertEquals(15, $document->getAttribute('age')); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('redis', 'age')); + $this->assertEquals(true, $database->deleteAttribute('redis', 'age')); - $document = static::getDatabase()->getDocument('redis', 'doc1'); + $document = $database->getDocument('redis', 'doc1'); $this->assertEquals('Richard', $document->getAttribute('name')); $this->assertArrayNotHasKey('age', $document); - $this->assertEquals(true, static::getDatabase()->createAttribute('redis', 'age', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('redis', 'age', Database::VAR_INTEGER, 0, true)); - $document = static::getDatabase()->getDocument('redis', 'doc1'); + $document = $database->getDocument('redis', 'doc1'); $this->assertEquals('Richard', $document->getAttribute('name')); $this->assertArrayHasKey('age', $document); } @@ -548,7 +572,10 @@ public function testSchemaAttributes(): void public function testRowSizeToLarge(): void { - if (static::getDatabase()->getAdapter()->getDocumentSizeLimit() === 0) { + /** @var Database $database */ + $database = static::getDatabase(); + + if ($database->getAdapter()->getDocumentSizeLimit() === 0) { $this->expectNotToPerformAssertions(); return; } @@ -556,13 +583,13 @@ public function testRowSizeToLarge(): void * getDocumentSizeLimit = 65535 * 65535 / 4 = 16383 MB4 */ - $collection_1 = static::getDatabase()->createCollection('row_size_1'); - $collection_2 = static::getDatabase()->createCollection('row_size_2'); + $collection_1 = $database->createCollection('row_size_1'); + $collection_2 = $database->createCollection('row_size_2'); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection_1->getId(), 'attr_1', Database::VAR_STRING, 16000, true)); + $this->assertEquals(true, $database->createAttribute($collection_1->getId(), 'attr_1', Database::VAR_STRING, 16000, true)); try { - static::getDatabase()->createAttribute($collection_1->getId(), 'attr_2', Database::VAR_STRING, Database::LENGTH_KEY, true); + $database->createAttribute($collection_1->getId(), 'attr_2', Database::VAR_STRING, Database::LENGTH_KEY, true); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(LimitException::class, $e); @@ -573,7 +600,7 @@ public function testRowSizeToLarge(): void */ try { - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $collection_2->getId(), relatedCollection: $collection_1->getId(), type: Database::RELATION_ONE_TO_ONE, @@ -586,7 +613,7 @@ public function testRowSizeToLarge(): void } try { - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $collection_1->getId(), relatedCollection: $collection_2->getId(), type: Database::RELATION_ONE_TO_ONE, @@ -669,7 +696,10 @@ public function testCreateCollectionWithSchemaIndexes(): void public function testCollectionUpdate(): Document { - $collection = static::getDatabase()->createCollection('collectionUpdate', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $collection = $database->createCollection('collectionUpdate', permissions: [ Permission::create(Role::users()), Permission::read(Role::users()), Permission::update(Role::users()), @@ -678,19 +708,19 @@ public function testCollectionUpdate(): Document $this->assertInstanceOf(Document::class, $collection); - $collection = static::getDatabase()->getCollection('collectionUpdate'); + $collection = $database->getCollection('collectionUpdate'); $this->assertFalse($collection->getAttribute('documentSecurity')); $this->assertIsArray($collection->getPermissions()); $this->assertCount(4, $collection->getPermissions()); - $collection = static::getDatabase()->updateCollection('collectionUpdate', [], true); + $collection = $database->updateCollection('collectionUpdate', [], true); $this->assertTrue($collection->getAttribute('documentSecurity')); $this->assertIsArray($collection->getPermissions()); $this->assertEmpty($collection->getPermissions()); - $collection = static::getDatabase()->getCollection('collectionUpdate'); + $collection = $database->getCollection('collectionUpdate'); $this->assertTrue($collection->getAttribute('documentSecurity')); $this->assertIsArray($collection->getPermissions()); @@ -701,15 +731,18 @@ public function testCollectionUpdate(): Document public function testUpdateDeleteCollectionNotFound(): void { + /** @var Database $database */ + $database = static::getDatabase(); + try { - static::getDatabase()->deleteCollection('not_found'); + $database->deleteCollection('not_found'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Collection not found', $e->getMessage()); } try { - static::getDatabase()->updateCollection('not_found', [], true); + $database->updateCollection('not_found', [], true); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Collection not found', $e->getMessage()); @@ -718,12 +751,15 @@ public function testUpdateDeleteCollectionNotFound(): void public function testGetCollectionId(): void { - if (!static::getDatabase()->getAdapter()->getSupportForGetConnectionId()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForGetConnectionId()) { $this->expectNotToPerformAssertions(); return; } - $this->assertIsString(static::getDatabase()->getConnectionId()); + $this->assertIsString($database->getConnectionId()); } public function testKeywords(): void @@ -790,7 +826,7 @@ public function testKeywords(): void $collection = $database->createCollection($collectionName); $this->assertEquals($collectionName, $collection->getId()); - $attribute = static::getDatabase()->createAttribute($collectionName, $keyword, Database::VAR_STRING, 128, true); + $attribute = $database->createAttribute($collectionName, $keyword, Database::VAR_STRING, 128, true); $this->assertEquals(true, $attribute); $document = new Document([ @@ -834,12 +870,15 @@ public function testKeywords(): void public function testLabels(): void { - $this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createCollection( + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertInstanceOf('Utopia\Database\Document', $database->createCollection( 'labels_test', )); - static::getDatabase()->createAttribute('labels_test', 'attr1', Database::VAR_STRING, 10, false); + $database->createAttribute('labels_test', 'attr1', Database::VAR_STRING, 10, false); - static::getDatabase()->createDocument('labels_test', new Document([ + $database->createDocument('labels_test', new Document([ '$id' => 'doc1', 'attr1' => 'value1', '$permissions' => [ @@ -847,40 +886,46 @@ public function testLabels(): void ], ])); - $documents = static::getDatabase()->find('labels_test'); + $documents = $database->find('labels_test'); $this->assertEmpty($documents); Authorization::setRole(Role::label('reader')->toString()); - $documents = static::getDatabase()->find('labels_test'); + $documents = $database->find('labels_test'); $this->assertCount(1, $documents); } public function testMetadata(): void { - static::getDatabase()->setMetadata('key', 'value'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->setMetadata('key', 'value'); - static::getDatabase()->createCollection('testers'); + $database->createCollection('testers'); - $this->assertEquals(['key' => 'value'], static::getDatabase()->getMetadata()); + $this->assertEquals(['key' => 'value'], $database->getMetadata()); - static::getDatabase()->resetMetadata(); + $database->resetMetadata(); - $this->assertEquals([], static::getDatabase()->getMetadata()); + $this->assertEquals([], $database->getMetadata()); } public function testDeleteCollectionDeletesRelationships(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('devices'); + $database->createCollection('devices'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'testers', relatedCollection: 'devices', type: Database::RELATION_ONE_TO_MANY, @@ -888,17 +933,17 @@ public function testDeleteCollectionDeletesRelationships(): void twoWayKey: 'tester' ); - $testers = static::getDatabase()->getCollection('testers'); - $devices = static::getDatabase()->getCollection('devices'); + $testers = $database->getCollection('testers'); + $devices = $database->getCollection('devices'); $this->assertEquals(1, \count($testers->getAttribute('attributes'))); $this->assertEquals(1, \count($devices->getAttribute('attributes'))); $this->assertEquals(1, \count($devices->getAttribute('indexes'))); - static::getDatabase()->deleteCollection('testers'); + $database->deleteCollection('testers'); - $testers = static::getDatabase()->getCollection('testers'); - $devices = static::getDatabase()->getCollection('devices'); + $testers = $database->getCollection('testers'); + $devices = $database->getCollection('devices'); $this->assertEquals(true, $testers->isEmpty()); $this->assertEquals(0, \count($devices->getAttribute('attributes'))); @@ -908,16 +953,19 @@ public function testDeleteCollectionDeletesRelationships(): void public function testCascadeMultiDelete(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('cascadeMultiDelete1'); - static::getDatabase()->createCollection('cascadeMultiDelete2'); - static::getDatabase()->createCollection('cascadeMultiDelete3'); + $database->createCollection('cascadeMultiDelete1'); + $database->createCollection('cascadeMultiDelete2'); + $database->createCollection('cascadeMultiDelete3'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'cascadeMultiDelete1', relatedCollection: 'cascadeMultiDelete2', type: Database::RELATION_ONE_TO_MANY, @@ -925,7 +973,7 @@ public function testCascadeMultiDelete(): void onDelete: Database::RELATION_MUTATE_CASCADE ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'cascadeMultiDelete2', relatedCollection: 'cascadeMultiDelete3', type: Database::RELATION_ONE_TO_MANY, @@ -933,7 +981,7 @@ public function testCascadeMultiDelete(): void onDelete: Database::RELATION_MUTATE_CASCADE ); - $root = static::getDatabase()->createDocument('cascadeMultiDelete1', new Document([ + $root = $database->createDocument('cascadeMultiDelete1', new Document([ '$id' => 'cascadeMultiDelete1', '$permissions' => [ Permission::read(Role::any()), @@ -962,12 +1010,12 @@ public function testCascadeMultiDelete(): void $this->assertCount(1, $root->getAttribute('cascadeMultiDelete2')); $this->assertCount(1, $root->getAttribute('cascadeMultiDelete2')[0]->getAttribute('cascadeMultiDelete3')); - $this->assertEquals(true, static::getDatabase()->deleteDocument('cascadeMultiDelete1', $root->getId())); + $this->assertEquals(true, $database->deleteDocument('cascadeMultiDelete1', $root->getId())); - $multi2 = static::getDatabase()->getDocument('cascadeMultiDelete2', 'cascadeMultiDelete2'); + $multi2 = $database->getDocument('cascadeMultiDelete2', 'cascadeMultiDelete2'); $this->assertEquals(true, $multi2->isEmpty()); - $multi3 = static::getDatabase()->getDocument('cascadeMultiDelete3', 'cascadeMultiDelete3'); + $multi3 = $database->getDocument('cascadeMultiDelete3', 'cascadeMultiDelete3'); $this->assertEquals(true, $multi3->isEmpty()); } @@ -1168,20 +1216,23 @@ public function testSharedTables(): void */ public function testCreateDuplicates(): void { - static::getDatabase()->createCollection('duplicates', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('duplicates', permissions: [ Permission::read(Role::any()) ]); try { - static::getDatabase()->createCollection('duplicates'); + $database->createCollection('duplicates'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(DuplicateException::class, $e); } - $this->assertNotEmpty(static::getDatabase()->listCollections()); + $this->assertNotEmpty($database->listCollections()); - static::getDatabase()->deleteCollection('duplicates'); + $database->deleteCollection('duplicates'); } public function testSharedTablesDuplicates(): void { @@ -1379,9 +1430,12 @@ public function testEvents(): void public function testCreatedAtUpdatedAt(): void { - $this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createCollection('created_at')); - static::getDatabase()->createAttribute('created_at', 'title', Database::VAR_STRING, 100, false); - $document = static::getDatabase()->createDocument('created_at', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertInstanceOf('Utopia\Database\Document', $database->createCollection('created_at')); + $database->createAttribute('created_at', 'title', Database::VAR_STRING, 100, false); + $document = $database->createDocument('created_at', new Document([ '$id' => ID::custom('uid123'), '$permissions' => [ @@ -1401,23 +1455,29 @@ public function testCreatedAtUpdatedAt(): void */ public function testCreatedAtUpdatedAtAssert(): void { - $document = static::getDatabase()->getDocument('created_at', 'uid123'); + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument('created_at', 'uid123'); $this->assertEquals(true, !$document->isEmpty()); sleep(1); $document->setAttribute('title', 'new title'); - static::getDatabase()->updateDocument('created_at', 'uid123', $document); - $document = static::getDatabase()->getDocument('created_at', 'uid123'); + $database->updateDocument('created_at', 'uid123', $document); + $document = $database->getDocument('created_at', 'uid123'); $this->assertGreaterThan($document->getCreatedAt(), $document->getUpdatedAt()); $this->expectException(DuplicateException::class); - static::getDatabase()->createCollection('created_at'); + $database->createCollection('created_at'); } public function testTransformations(): void { - static::getDatabase()->createCollection('docs', attributes: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('docs', attributes: [ new Document([ '$id' => 'name', 'type' => Database::VAR_STRING, @@ -1426,16 +1486,16 @@ public function testTransformations(): void ]) ]); - static::getDatabase()->createDocument('docs', new Document([ + $database->createDocument('docs', new Document([ '$id' => 'doc1', 'name' => 'value1', ])); - static::getDatabase()->before(Database::EVENT_DOCUMENT_READ, 'test', function (string $query) { + $database->before(Database::EVENT_DOCUMENT_READ, 'test', function (string $query) { return "SELECT 1"; }); - $result = static::getDatabase()->getDocument('docs', 'doc1'); + $result = $database->getDocument('docs', 'doc1'); $this->assertTrue($result->isEmpty()); } diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index 654b6b521..dffc209e3 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -22,21 +22,24 @@ trait DocumentTests { public function testCreateDocument(): Document { - static::getDatabase()->createCollection('documents'); - - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'string', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'integer_signed', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'integer_unsigned', Database::VAR_INTEGER, 4, true, signed: false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'bigint_signed', Database::VAR_INTEGER, 8, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'bigint_unsigned', Database::VAR_INTEGER, 9, true, signed: false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'float_signed', Database::VAR_FLOAT, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'float_unsigned', Database::VAR_FLOAT, 0, true, signed: false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'boolean', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'colors', Database::VAR_STRING, 32, true, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'empty', Database::VAR_STRING, 32, false, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents', 'with-dash', Database::VAR_STRING, 128, false, null)); - - $document = static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('documents'); + + $this->assertEquals(true, $database->createAttribute('documents', 'string', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'integer_signed', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'integer_unsigned', Database::VAR_INTEGER, 4, true, signed: false)); + $this->assertEquals(true, $database->createAttribute('documents', 'bigint_signed', Database::VAR_INTEGER, 8, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'bigint_unsigned', Database::VAR_INTEGER, 9, true, signed: false)); + $this->assertEquals(true, $database->createAttribute('documents', 'float_signed', Database::VAR_FLOAT, 0, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'float_unsigned', Database::VAR_FLOAT, 0, true, signed: false)); + $this->assertEquals(true, $database->createAttribute('documents', 'boolean', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'colors', Database::VAR_STRING, 32, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'empty', Database::VAR_STRING, 32, false, null, true, true)); + $this->assertEquals(true, $database->createAttribute('documents', 'with-dash', Database::VAR_STRING, 128, false, null)); + + $document = $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user(ID::custom('1'))), @@ -87,7 +90,7 @@ public function testCreateDocument(): Document $this->assertEquals('Works', $document->getAttribute('with-dash')); // Test create document with manual internal id - $manualIdDocument = static::getDatabase()->createDocument('documents', new Document([ + $manualIdDocument = $database->createDocument('documents', new Document([ '$id' => '56000', '$sequence' => '56000', '$permissions' => [ @@ -140,7 +143,7 @@ public function testCreateDocument(): Document $this->assertEquals([], $manualIdDocument->getAttribute('empty')); $this->assertEquals('Works', $manualIdDocument->getAttribute('with-dash')); - $manualIdDocument = static::getDatabase()->getDocument('documents', '56000'); + $manualIdDocument = $database->getDocument('documents', '56000'); $this->assertEquals('56000', $manualIdDocument->getSequence()); $this->assertNotEmpty(true, $manualIdDocument->getId()); @@ -166,7 +169,7 @@ public function testCreateDocument(): Document $this->assertEquals('Works', $manualIdDocument->getAttribute('with-dash')); try { - static::getDatabase()->createDocument('documents', new Document([ + $database->createDocument('documents', new Document([ 'string' => '', 'integer_signed' => 0, 'integer_unsigned' => 0, @@ -185,7 +188,7 @@ public function testCreateDocument(): Document } try { - static::getDatabase()->createDocument('documents', new Document([ + $database->createDocument('documents', new Document([ 'string' => '', 'integer_signed' => 0, 'integer_unsigned' => 0, @@ -213,11 +216,14 @@ public function testCreateDocuments(): array $count = 3; $collection = 'testCreateDocuments'; - static::getDatabase()->createCollection($collection); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection($collection); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'string', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'bigint', Database::VAR_INTEGER, 8, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'string', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'bigint', Database::VAR_INTEGER, 8, true)); // Create an array of documents with random attributes. Don't use the createDocument function $documents = []; @@ -236,7 +242,7 @@ public function testCreateDocuments(): array ]); } - $count = static::getDatabase()->createDocuments($collection, $documents, 3); + $count = $database->createDocuments($collection, $documents, 3); $this->assertEquals($count, \count($documents)); @@ -257,12 +263,15 @@ public function testCreateDocumentsWithDifferentAttributes(): void { $collection = 'testDiffAttributes'; - static::getDatabase()->createCollection($collection); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection($collection); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'string', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'bigint', Database::VAR_INTEGER, 8, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'string_default', Database::VAR_STRING, 128, false, 'default')); + $this->assertEquals(true, $database->createAttribute($collection, 'string', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, false)); + $this->assertEquals(true, $database->createAttribute($collection, 'bigint', Database::VAR_INTEGER, 8, false)); + $this->assertEquals(true, $database->createAttribute($collection, 'string_default', Database::VAR_STRING, 128, false, 'default')); $documents = [ new Document([ @@ -278,7 +287,7 @@ public function testCreateDocumentsWithDifferentAttributes(): void ]; $results = []; - $count = static::getDatabase()->createDocuments($collection, $documents, onNext: function ($doc) use (&$results) { + $count = $database->createDocuments($collection, $documents, onNext: function ($doc) use (&$results) { $results[] = $doc; }); @@ -307,32 +316,35 @@ public function testCreateDocumentsWithDifferentAttributes(): void ]; try { - static::getDatabase()->createDocuments($collection, $documents); + $database->createDocuments($collection, $documents); $this->fail('Failed to throw exception'); } catch (DatabaseException $e) { } $documents = array_reverse($documents); try { - static::getDatabase()->createDocuments($collection, $documents); + $database->createDocuments($collection, $documents); $this->fail('Failed to throw exception'); } catch (DatabaseException $e) { } - static::getDatabase()->deleteCollection($collection); + $database->deleteCollection($collection); } public function testCreateOrUpdateDocuments(): void { - if (!static::getDatabase()->getAdapter()->getSupportForUpserts()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForUpserts()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); - static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true); - static::getDatabase()->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createAttribute(__FUNCTION__, 'bigint', Database::VAR_INTEGER, 8, true); + $database->createCollection(__FUNCTION__); + $database->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true); + $database->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, true); + $database->createAttribute(__FUNCTION__, 'bigint', Database::VAR_INTEGER, 8, true); $documents = [ new Document([ @@ -362,7 +374,7 @@ public function testCreateOrUpdateDocuments(): void ]; $results = []; - $count = static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, $documents, onNext: function ($doc) use (&$results) { + $count = $database->createOrUpdateDocuments(__FUNCTION__, $documents, onNext: function ($doc) use (&$results) { $results[] = $doc; }); @@ -380,7 +392,7 @@ public function testCreateOrUpdateDocuments(): void $this->assertEquals(Database::BIG_INT_MAX, $document->getAttribute('bigint')); } - $documents = static::getDatabase()->find(__FUNCTION__); + $documents = $database->find(__FUNCTION__); $this->assertEquals(2, count($documents)); @@ -400,7 +412,7 @@ public function testCreateOrUpdateDocuments(): void $documents[1]->setAttribute('integer', 10); $results = []; - $count = static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, $documents, onNext: function ($doc) use (&$results) { + $count = $database->createOrUpdateDocuments(__FUNCTION__, $documents, onNext: function ($doc) use (&$results) { $results[] = $doc; }); @@ -416,7 +428,7 @@ public function testCreateOrUpdateDocuments(): void $this->assertEquals(Database::BIG_INT_MAX, $document->getAttribute('bigint')); } - $documents = static::getDatabase()->find(__FUNCTION__); + $documents = $database->find(__FUNCTION__); $this->assertEquals(2, count($documents)); @@ -434,14 +446,17 @@ public function testCreateOrUpdateDocuments(): void public function testCreateOrUpdateDocumentsInc(): void { - if (!static::getDatabase()->getAdapter()->getSupportForUpserts()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForUpserts()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); - static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, false); - static::getDatabase()->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, false); + $database->createCollection(__FUNCTION__); + $database->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, false); + $database->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, false); $documents = [ new Document([ @@ -468,18 +483,18 @@ public function testCreateOrUpdateDocumentsInc(): void ]), ]; - static::getDatabase()->createDocuments(__FUNCTION__, $documents); + $database->createDocuments(__FUNCTION__, $documents); $documents[0]->setAttribute('integer', 1); $documents[1]->setAttribute('integer', 1); - static::getDatabase()->createOrUpdateDocumentsWithIncrease( + $database->createOrUpdateDocumentsWithIncrease( collection: __FUNCTION__, attribute:'integer', documents: $documents ); - $documents = static::getDatabase()->find(__FUNCTION__); + $documents = $database->find(__FUNCTION__); foreach ($documents as $document) { $this->assertEquals(6, $document->getAttribute('integer')); @@ -488,13 +503,13 @@ public function testCreateOrUpdateDocumentsInc(): void $documents[0]->setAttribute('integer', -1); $documents[1]->setAttribute('integer', -1); - static::getDatabase()->createOrUpdateDocumentsWithIncrease( + $database->createOrUpdateDocumentsWithIncrease( collection: __FUNCTION__, attribute:'integer', documents: $documents ); - $documents = static::getDatabase()->find(__FUNCTION__); + $documents = $database->find(__FUNCTION__); foreach ($documents as $document) { $this->assertEquals(5, $document->getAttribute('integer')); @@ -503,13 +518,16 @@ public function testCreateOrUpdateDocumentsInc(): void public function testCreateOrUpdateDocumentsPermissions(): void { - if (!static::getDatabase()->getAdapter()->getSupportForUpserts()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForUpserts()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection(__FUNCTION__); - static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true); + $database->createCollection(__FUNCTION__); + $database->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true); $document = new Document([ '$id' => 'first', @@ -520,10 +538,10 @@ public function testCreateOrUpdateDocumentsPermissions(): void ], ]); - static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]); + $database->createOrUpdateDocuments(__FUNCTION__, [$document]); try { - static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document->setAttribute('string', 'updated')]); + $database->createOrUpdateDocuments(__FUNCTION__, [$document->setAttribute('string', 'updated')]); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(AuthorizationException::class, $e); @@ -538,10 +556,10 @@ public function testCreateOrUpdateDocumentsPermissions(): void ], ]); - static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]); + $database->createOrUpdateDocuments(__FUNCTION__, [$document]); $results = []; - $count = static::getDatabase()->createOrUpdateDocuments( + $count = $database->createOrUpdateDocuments( __FUNCTION__, [$document->setAttribute('string', 'updated')], onNext: function ($doc) use (&$results) { @@ -562,7 +580,7 @@ public function testCreateOrUpdateDocumentsPermissions(): void ], ]); - static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]); + $database->createOrUpdateDocuments(__FUNCTION__, [$document]); $newPermissions = [ Permission::read(Role::any()), @@ -571,7 +589,7 @@ public function testCreateOrUpdateDocumentsPermissions(): void ]; $results = []; - $count = static::getDatabase()->createOrUpdateDocuments( + $count = $database->createOrUpdateDocuments( __FUNCTION__, [$document->setAttribute('$permissions', $newPermissions)], onNext: function ($doc) use (&$results) { @@ -582,22 +600,25 @@ public function testCreateOrUpdateDocumentsPermissions(): void $this->assertEquals(1, $count); $this->assertEquals($newPermissions, $results[0]->getPermissions()); - $document = static::getDatabase()->getDocument(__FUNCTION__, 'third'); + $document = $database->getDocument(__FUNCTION__, 'third'); $this->assertEquals($newPermissions, $document->getPermissions()); } public function testRespectNulls(): Document { - static::getDatabase()->createCollection('documents_nulls'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('documents_nulls'); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents_nulls', 'string', Database::VAR_STRING, 128, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents_nulls', 'integer', Database::VAR_INTEGER, 0, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents_nulls', 'bigint', Database::VAR_INTEGER, 8, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents_nulls', 'float', Database::VAR_FLOAT, 0, false)); - $this->assertEquals(true, static::getDatabase()->createAttribute('documents_nulls', 'boolean', Database::VAR_BOOLEAN, 0, false)); + $this->assertEquals(true, $database->createAttribute('documents_nulls', 'string', Database::VAR_STRING, 128, false)); + $this->assertEquals(true, $database->createAttribute('documents_nulls', 'integer', Database::VAR_INTEGER, 0, false)); + $this->assertEquals(true, $database->createAttribute('documents_nulls', 'bigint', Database::VAR_INTEGER, 8, false)); + $this->assertEquals(true, $database->createAttribute('documents_nulls', 'float', Database::VAR_FLOAT, 0, false)); + $this->assertEquals(true, $database->createAttribute('documents_nulls', 'boolean', Database::VAR_BOOLEAN, 0, false)); - $document = static::getDatabase()->createDocument('documents_nulls', new Document([ + $document = $database->createDocument('documents_nulls', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -625,16 +646,19 @@ public function testRespectNulls(): Document public function testCreateDocumentDefaults(): void { - static::getDatabase()->createCollection('defaults'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('defaults'); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'string', Database::VAR_STRING, 128, false, 'default')); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'integer', Database::VAR_INTEGER, 0, false, 1)); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'float', Database::VAR_FLOAT, 0, false, 1.5)); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'boolean', Database::VAR_BOOLEAN, 0, false, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'colors', Database::VAR_STRING, 32, false, ['red', 'green', 'blue'], true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('defaults', 'datetime', Database::VAR_DATETIME, 0, false, '2000-06-12T14:12:55.000+00:00', true, false, null, [], ['datetime'])); + $this->assertEquals(true, $database->createAttribute('defaults', 'string', Database::VAR_STRING, 128, false, 'default')); + $this->assertEquals(true, $database->createAttribute('defaults', 'integer', Database::VAR_INTEGER, 0, false, 1)); + $this->assertEquals(true, $database->createAttribute('defaults', 'float', Database::VAR_FLOAT, 0, false, 1.5)); + $this->assertEquals(true, $database->createAttribute('defaults', 'boolean', Database::VAR_BOOLEAN, 0, false, true)); + $this->assertEquals(true, $database->createAttribute('defaults', 'colors', Database::VAR_STRING, 32, false, ['red', 'green', 'blue'], true, true)); + $this->assertEquals(true, $database->createAttribute('defaults', 'datetime', Database::VAR_DATETIME, 0, false, '2000-06-12T14:12:55.000+00:00', true, false, null, [], ['datetime'])); - $document = static::getDatabase()->createDocument('defaults', new Document([ + $document = $database->createDocument('defaults', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -643,7 +667,7 @@ public function testCreateDocumentDefaults(): void ], ])); - $document2 = static::getDatabase()->getDocument('defaults', $document->getId()); + $document2 = $database->getDocument('defaults', $document->getId()); $this->assertCount(4, $document2->getPermissions()); $this->assertEquals('read("any")', $document2->getPermissions()[0]); $this->assertEquals('create("any")', $document2->getPermissions()[1]); @@ -665,19 +689,22 @@ public function testCreateDocumentDefaults(): void $this->assertEquals('2000-06-12T14:12:55.000+00:00', $document->getAttribute('datetime')); // cleanup collection - static::getDatabase()->deleteCollection('defaults'); + $database->deleteCollection('defaults'); } public function testIncreaseDecrease(): Document { + /** @var Database $database */ + $database = static::getDatabase(); + $collection = 'increase_decrease'; - static::getDatabase()->createCollection($collection); + $database->createCollection($collection); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'increase', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'decrease', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'increase_text', Database::VAR_STRING, 255, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'increase_float', Database::VAR_FLOAT, 0, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'increase', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'decrease', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'increase_text', Database::VAR_STRING, 255, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'increase_float', Database::VAR_FLOAT, 0, true)); - $document = static::getDatabase()->createDocument($collection, new Document([ + $document = $database->createDocument($collection, new Document([ 'increase' => 100, 'decrease' => 100, 'increase_float' => 100, @@ -692,22 +719,22 @@ public function testIncreaseDecrease(): Document $updatedAt = $document->getUpdatedAt(); - $this->assertEquals(true, static::getDatabase()->increaseDocumentAttribute($collection, $document->getId(), 'increase', 1, 101)); + $this->assertEquals(true, $database->increaseDocumentAttribute($collection, $document->getId(), 'increase', 1, 101)); - $document = static::getDatabase()->getDocument($collection, $document->getId()); + $document = $database->getDocument($collection, $document->getId()); $this->assertEquals(101, $document->getAttribute('increase')); $this->assertNotEquals($updatedAt, $document->getUpdatedAt()); - $this->assertEquals(true, static::getDatabase()->decreaseDocumentAttribute($collection, $document->getId(), 'decrease', 1, 98)); - $document = static::getDatabase()->getDocument($collection, $document->getId()); + $this->assertEquals(true, $database->decreaseDocumentAttribute($collection, $document->getId(), 'decrease', 1, 98)); + $document = $database->getDocument($collection, $document->getId()); $this->assertEquals(99, $document->getAttribute('decrease')); - $this->assertEquals(true, static::getDatabase()->increaseDocumentAttribute($collection, $document->getId(), 'increase_float', 5.5, 110)); - $document = static::getDatabase()->getDocument($collection, $document->getId()); + $this->assertEquals(true, $database->increaseDocumentAttribute($collection, $document->getId(), 'increase_float', 5.5, 110)); + $document = $database->getDocument($collection, $document->getId()); $this->assertEquals(105.5, $document->getAttribute('increase_float')); - $this->assertEquals(true, static::getDatabase()->decreaseDocumentAttribute($collection, $document->getId(), 'increase_float', 1.1, 100)); - $document = static::getDatabase()->getDocument($collection, $document->getId()); + $this->assertEquals(true, $database->decreaseDocumentAttribute($collection, $document->getId(), 'increase_float', 1.1, 100)); + $document = $database->getDocument($collection, $document->getId()); $this->assertEquals(104.4, $document->getAttribute('increase_float')); return $document; @@ -717,8 +744,11 @@ public function testIncreaseDecrease(): Document */ public function testIncreaseLimitMax(Document $document): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(Exception::class); - $this->assertEquals(true, static::getDatabase()->increaseDocumentAttribute('increase_decrease', $document->getId(), 'increase', 10.5, 102.4)); + $this->assertEquals(true, $database->increaseDocumentAttribute('increase_decrease', $document->getId(), 'increase', 10.5, 102.4)); } /** @@ -726,8 +756,11 @@ public function testIncreaseLimitMax(Document $document): void */ public function testDecreaseLimitMin(Document $document): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(Exception::class); - $this->assertEquals(false, static::getDatabase()->decreaseDocumentAttribute('increase_decrease', $document->getId(), 'decrease', 10, 99)); + $this->assertEquals(false, $database->decreaseDocumentAttribute('increase_decrease', $document->getId(), 'decrease', 10, 99)); } @@ -736,8 +769,11 @@ public function testDecreaseLimitMin(Document $document): void */ public function testIncreaseTextAttribute(Document $document): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(Exception::class); - $this->assertEquals(false, static::getDatabase()->increaseDocumentAttribute('increase_decrease', $document->getId(), 'increase_text')); + $this->assertEquals(false, $database->increaseDocumentAttribute('increase_decrease', $document->getId(), 'increase_text')); } /** @@ -745,7 +781,10 @@ public function testIncreaseTextAttribute(Document $document): void */ public function testGetDocument(Document $document): Document { - $document = static::getDatabase()->getDocument('documents', $document->getId()); + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument('documents', $document->getId()); $this->assertNotEmpty(true, $document->getId()); $this->assertIsString($document->getAttribute('string')); @@ -774,7 +813,10 @@ public function testGetDocumentSelect(Document $document): Document { $documentId = $document->getId(); - $document = static::getDatabase()->getDocument('documents', $documentId, [ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument('documents', $documentId, [ Query::select(['string', 'integer_signed']), ]); @@ -794,7 +836,7 @@ public function testGetDocumentSelect(Document $document): Document $this->assertArrayHasKey('$permissions', $document); $this->assertArrayHasKey('$collection', $document); - $document = static::getDatabase()->getDocument('documents', $documentId, [ + $document = $database->getDocument('documents', $documentId, [ Query::select(['string', 'integer_signed', '$id']), ]); @@ -817,29 +859,32 @@ public function testFind(): array { Authorization::setRole(Role::any()->toString()); - static::getDatabase()->createCollection('movies', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('movies', permissions: [ Permission::create(Role::any()), Permission::update(Role::users()) ]); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'name', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'director', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'year', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'price', Database::VAR_FLOAT, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'active', Database::VAR_BOOLEAN, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'genres', Database::VAR_STRING, 32, true, null, true, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'with-dash', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'nullable', Database::VAR_STRING, 128, false)); + $this->assertEquals(true, $database->createAttribute('movies', 'name', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'director', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'year', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'price', Database::VAR_FLOAT, 0, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'active', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'genres', Database::VAR_STRING, 32, true, null, true, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'with-dash', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('movies', 'nullable', Database::VAR_STRING, 128, false)); try { - static::getDatabase()->createDocument('movies', new Document(['$id' => ['id_as_array']])); + $database->createDocument('movies', new Document(['$id' => ['id_as_array']])); $this->fail('Failed to throw exception'); } catch (Throwable $e) { $this->assertEquals('$id must be of type string', $e->getMessage()); $this->assertInstanceOf(StructureException::class, $e); } - $document = static::getDatabase()->createDocument('movies', new Document([ + $document = $database->createDocument('movies', new Document([ '$id' => ID::custom('frozen'), '$permissions' => [ Permission::read(Role::any()), @@ -864,7 +909,7 @@ public function testFind(): array 'with-dash' => 'Works' ])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -888,7 +933,7 @@ public function testFind(): array 'with-dash' => 'Works' ])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -912,7 +957,7 @@ public function testFind(): array 'with-dash' => 'Works2' ])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -936,7 +981,7 @@ public function testFind(): array 'with-dash' => 'Works2' ])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -960,7 +1005,7 @@ public function testFind(): array 'with-dash' => 'Works3' ])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::user('x')), Permission::create(Role::any()), @@ -993,7 +1038,10 @@ public function testFind(): array */ public function testFindOne(): void { - $document = static::getDatabase()->findOne('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->findOne('movies', [ Query::offset(2), Query::orderAsc('name') ]); @@ -1001,7 +1049,7 @@ public function testFindOne(): void $this->assertFalse($document->isEmpty()); $this->assertEquals('Frozen', $document->getAttribute('name')); - $document = static::getDatabase()->findOne('movies', [ + $document = $database->findOne('movies', [ Query::offset(10) ]); $this->assertTrue($document->isEmpty()); @@ -1009,7 +1057,10 @@ public function testFindOne(): void public function testFindBasicChecks(): void { - $documents = static::getDatabase()->find('movies'); + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies'); $movieDocuments = $documents; $this->assertEquals(5, count($documents)); @@ -1042,13 +1093,13 @@ public function testFindBasicChecks(): void /** * Check $id: Notice, this orders ID names alphabetically, not by internal numeric ID */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('$id'), ]); $this->assertEquals($lastDocumentId, $documents[0]->getId()); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderAsc('$id'), @@ -1058,13 +1109,13 @@ public function testFindBasicChecks(): void /** * Check internal numeric ID sorting */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc(''), ]); $this->assertEquals($movieDocuments[\count($movieDocuments) - 1]->getId(), $documents[0]->getId()); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderAsc(''), @@ -1074,27 +1125,33 @@ public function testFindBasicChecks(): void public function testFindCheckPermissions(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Check Permissions */ Authorization::setRole('user:x'); - $documents = static::getDatabase()->find('movies'); + $documents = $database->find('movies'); $this->assertEquals(6, count($documents)); } public function testFindCheckInteger(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Query with dash attribute */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('with-dash', ['Works']), ]); $this->assertEquals(2, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('with-dash', ['Works2', 'Works3']), ]); @@ -1103,7 +1160,7 @@ public function testFindCheckInteger(): void /** * Check an Integer condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('year', [2019]), ]); @@ -1114,10 +1171,13 @@ public function testFindCheckInteger(): void public function testFindBoolean(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Boolean condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('active', [true]), ]); @@ -1126,16 +1186,19 @@ public function testFindBoolean(): void public function testFindStringQueryEqual(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * String condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('director', ['TBD']), ]); $this->assertEquals(2, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('director', ['']), ]); @@ -1145,10 +1208,13 @@ public function testFindStringQueryEqual(): void public function testFindNotEqual(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Not Equal query */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::notEqual('director', 'TBD'), ]); @@ -1158,33 +1224,36 @@ public function testFindNotEqual(): void $this->assertTrue($document['director'] !== 'TBD'); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::notEqual('director', ''), ]); - $total = static::getDatabase()->count('movies'); + $total = $database->count('movies'); $this->assertEquals($total, count($documents)); } public function testFindBetween(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::between('price', 25.94, 25.99), ]); $this->assertEquals(2, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::between('price', 30, 35), ]); $this->assertEquals(0, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::between('$createdAt', '1975-12-06', '2050-12-06'), ]); $this->assertEquals(6, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::between('$updatedAt', '1975-12-06T07:08:49.733+02:00', '2050-02-05T10:15:21.825+00:00'), ]); $this->assertEquals(6, count($documents)); @@ -1192,10 +1261,13 @@ public function testFindBetween(): void public function testFindFloat(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Float condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::lessThan('price', 26.00), Query::greaterThan('price', 25.98), ]); @@ -1205,12 +1277,15 @@ public function testFindFloat(): void public function testFindContains(): void { - if (!$this->getDatabase()->getAdapter()->getSupportForQueryContains()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForQueryContains()) { $this->expectNotToPerformAssertions(); return; } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::contains('genres', ['comics']) ]); @@ -1219,20 +1294,20 @@ public function testFindContains(): void /** * Array contains OR condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::contains('genres', ['comics', 'kids']), ]); $this->assertEquals(4, count($documents)); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::contains('genres', ['non-existent']), ]); $this->assertEquals(0, count($documents)); try { - static::getDatabase()->find('movies', [ + $database->find('movies', [ Query::contains('price', [10.5]), ]); $this->fail('Failed to throw exception'); @@ -1244,14 +1319,17 @@ public function testFindContains(): void public function testFindFulltext(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Fulltext search */ if ($this->getDatabase()->getAdapter()->getSupportForFulltextIndex()) { - $success = static::getDatabase()->createIndex('movies', 'name', Database::INDEX_FULLTEXT, ['name']); + $success = $database->createIndex('movies', 'name', Database::INDEX_FULLTEXT, ['name']); $this->assertEquals(true, $success); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::search('name', 'captain'), ]); @@ -1265,7 +1343,7 @@ public function testFindFulltext(): void // TODO: I think this needs a changes? how do we distinguish between regular full text and wildcard? if ($this->getDatabase()->getAdapter()->getSupportForFulltextWildCardIndex()) { - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::search('name', 'cap'), ]); @@ -1277,62 +1355,65 @@ public function testFindFulltext(): void } public function testFindFulltextSpecialChars(): void { - if (!static::getDatabase()->getAdapter()->getSupportForFulltextIndex()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForFulltextIndex()) { $this->expectNotToPerformAssertions(); return; } $collection = 'full_text'; - static::getDatabase()->createCollection($collection, permissions: [ + $database->createCollection($collection, permissions: [ Permission::create(Role::any()), Permission::update(Role::users()) ]); - $this->assertTrue(static::getDatabase()->createAttribute($collection, 'ft', Database::VAR_STRING, 128, true)); - $this->assertTrue(static::getDatabase()->createIndex($collection, 'ft-index', Database::INDEX_FULLTEXT, ['ft'])); + $this->assertTrue($database->createAttribute($collection, 'ft', Database::VAR_STRING, 128, true)); + $this->assertTrue($database->createIndex($collection, 'ft-index', Database::INDEX_FULLTEXT, ['ft'])); - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$permissions' => [Permission::read(Role::any())], 'ft' => 'Alf: chapter_4@nasa.com' ])); - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::search('ft', 'chapter_4'), ]); $this->assertEquals(1, count($documents)); - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$permissions' => [Permission::read(Role::any())], 'ft' => 'al@ba.io +-*)(<>~' ])); - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::search('ft', 'al@ba.io'), // === al ba io* ]); - if (static::getDatabase()->getAdapter()->getSupportForFulltextWildcardIndex()) { + if ($database->getAdapter()->getSupportForFulltextWildcardIndex()) { $this->assertEquals(0, count($documents)); } else { $this->assertEquals(1, count($documents)); } - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$permissions' => [Permission::read(Role::any())], 'ft' => 'donald duck' ])); - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$permissions' => [Permission::read(Role::any())], 'ft' => 'donald trump' ])); - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::search('ft', 'donald trump'), Query::orderAsc('ft'), ]); $this->assertEquals(2, count($documents)); - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::search('ft', '"donald trump"'), // Exact match ]); @@ -1341,10 +1422,13 @@ public function testFindFulltextSpecialChars(): void public function testFindMultipleConditions(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Multiple conditions */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('director', ['TBD']), Query::equal('year', [2026]), ]); @@ -1354,7 +1438,7 @@ public function testFindMultipleConditions(): void /** * Multiple conditions and OR values */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('name', ['Frozen II', 'Captain Marvel']), ]); @@ -1365,10 +1449,13 @@ public function testFindMultipleConditions(): void public function testFindByID(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * $id condition */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('$id', ['frozen']), ]); @@ -1383,10 +1470,13 @@ public function testFindByID(): void */ public function testFindByInternalID(array $data): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Test that internal ID queries are handled correctly */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('$sequence', [$data['$sequence']]), ]); @@ -1395,10 +1485,13 @@ public function testFindByInternalID(array $data): void public function testFindOrderBy(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('price'), @@ -1415,14 +1508,17 @@ public function testFindOrderBy(): void } public function testFindOrderByNatural(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY natural */ - $base = array_reverse(static::getDatabase()->find('movies', [ + $base = array_reverse($database->find('movies', [ Query::limit(25), Query::offset(0), ])); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc(''), @@ -1438,10 +1534,13 @@ public function testFindOrderByNatural(): void } public function testFindOrderByMultipleAttributes(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Multiple attributes */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('price'), @@ -1459,15 +1558,18 @@ public function testFindOrderByMultipleAttributes(): void public function testFindOrderByCursorAfter(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - After */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorAfter($movies[1]) @@ -1476,7 +1578,7 @@ public function testFindOrderByCursorAfter(): void $this->assertEquals($movies[2]['name'], $documents[0]['name']); $this->assertEquals($movies[3]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorAfter($movies[3]) @@ -1485,7 +1587,7 @@ public function testFindOrderByCursorAfter(): void $this->assertEquals($movies[4]['name'], $documents[0]['name']); $this->assertEquals($movies[5]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorAfter($movies[4]) @@ -1493,7 +1595,7 @@ public function testFindOrderByCursorAfter(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[5]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorAfter($movies[5]) @@ -1504,15 +1606,18 @@ public function testFindOrderByCursorAfter(): void public function testFindOrderByCursorBefore(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Before */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorBefore($movies[5]) @@ -1521,7 +1626,7 @@ public function testFindOrderByCursorBefore(): void $this->assertEquals($movies[3]['name'], $documents[0]['name']); $this->assertEquals($movies[4]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorBefore($movies[3]) @@ -1530,7 +1635,7 @@ public function testFindOrderByCursorBefore(): void $this->assertEquals($movies[1]['name'], $documents[0]['name']); $this->assertEquals($movies[2]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorBefore($movies[2]) @@ -1539,7 +1644,7 @@ public function testFindOrderByCursorBefore(): void $this->assertEquals($movies[0]['name'], $documents[0]['name']); $this->assertEquals($movies[1]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorBefore($movies[1]) @@ -1547,7 +1652,7 @@ public function testFindOrderByCursorBefore(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[0]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorBefore($movies[0]) @@ -1557,15 +1662,18 @@ public function testFindOrderByCursorBefore(): void public function testFindOrderByAfterNaturalOrder(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - After by natural order */ - $movies = array_reverse(static::getDatabase()->find('movies', [ + $movies = array_reverse($database->find('movies', [ Query::limit(25), Query::offset(0), ])); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1575,7 +1683,7 @@ public function testFindOrderByAfterNaturalOrder(): void $this->assertEquals($movies[2]['name'], $documents[0]['name']); $this->assertEquals($movies[3]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1585,7 +1693,7 @@ public function testFindOrderByAfterNaturalOrder(): void $this->assertEquals($movies[4]['name'], $documents[0]['name']); $this->assertEquals($movies[5]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1594,7 +1702,7 @@ public function testFindOrderByAfterNaturalOrder(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[5]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1604,16 +1712,19 @@ public function testFindOrderByAfterNaturalOrder(): void } public function testFindOrderByBeforeNaturalOrder(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Before by natural order */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc(''), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1623,7 +1734,7 @@ public function testFindOrderByBeforeNaturalOrder(): void $this->assertEquals($movies[3]['name'], $documents[0]['name']); $this->assertEquals($movies[4]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1633,7 +1744,7 @@ public function testFindOrderByBeforeNaturalOrder(): void $this->assertEquals($movies[1]['name'], $documents[0]['name']); $this->assertEquals($movies[2]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1643,7 +1754,7 @@ public function testFindOrderByBeforeNaturalOrder(): void $this->assertEquals($movies[0]['name'], $documents[0]['name']); $this->assertEquals($movies[1]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1652,7 +1763,7 @@ public function testFindOrderByBeforeNaturalOrder(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[0]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc(''), @@ -1663,16 +1774,19 @@ public function testFindOrderByBeforeNaturalOrder(): void public function testFindOrderBySingleAttributeAfter(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Single Attribute After */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('year') ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1683,7 +1797,7 @@ public function testFindOrderBySingleAttributeAfter(): void $this->assertEquals($movies[2]['name'], $documents[0]['name']); $this->assertEquals($movies[3]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1693,7 +1807,7 @@ public function testFindOrderBySingleAttributeAfter(): void $this->assertEquals($movies[4]['name'], $documents[0]['name']); $this->assertEquals($movies[5]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1702,7 +1816,7 @@ public function testFindOrderBySingleAttributeAfter(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[5]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1714,16 +1828,19 @@ public function testFindOrderBySingleAttributeAfter(): void public function testFindOrderBySingleAttributeBefore(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Single Attribute Before */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('year') ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1733,7 +1850,7 @@ public function testFindOrderBySingleAttributeBefore(): void $this->assertEquals($movies[3]['name'], $documents[0]['name']); $this->assertEquals($movies[4]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1743,7 +1860,7 @@ public function testFindOrderBySingleAttributeBefore(): void $this->assertEquals($movies[1]['name'], $documents[0]['name']); $this->assertEquals($movies[2]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1753,7 +1870,7 @@ public function testFindOrderBySingleAttributeBefore(): void $this->assertEquals($movies[0]['name'], $documents[0]['name']); $this->assertEquals($movies[1]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1762,7 +1879,7 @@ public function testFindOrderBySingleAttributeBefore(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[0]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('year'), @@ -1773,17 +1890,20 @@ public function testFindOrderBySingleAttributeBefore(): void public function testFindOrderByMultipleAttributeAfter(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Multiple Attribute After */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('price'), Query::orderAsc('year') ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1794,7 +1914,7 @@ public function testFindOrderByMultipleAttributeAfter(): void $this->assertEquals($movies[2]['name'], $documents[0]['name']); $this->assertEquals($movies[3]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1805,7 +1925,7 @@ public function testFindOrderByMultipleAttributeAfter(): void $this->assertEquals($movies[4]['name'], $documents[0]['name']); $this->assertEquals($movies[5]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1815,7 +1935,7 @@ public function testFindOrderByMultipleAttributeAfter(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[5]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1827,17 +1947,20 @@ public function testFindOrderByMultipleAttributeAfter(): void public function testFindOrderByMultipleAttributeBefore(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY - Multiple Attribute Before */ - $movies = static::getDatabase()->find('movies', [ + $movies = $database->find('movies', [ Query::limit(25), Query::offset(0), Query::orderDesc('price'), Query::orderAsc('year') ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1849,7 +1972,7 @@ public function testFindOrderByMultipleAttributeBefore(): void $this->assertEquals($movies[3]['name'], $documents[0]['name']); $this->assertEquals($movies[4]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1860,7 +1983,7 @@ public function testFindOrderByMultipleAttributeBefore(): void $this->assertEquals($movies[2]['name'], $documents[0]['name']); $this->assertEquals($movies[3]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1871,7 +1994,7 @@ public function testFindOrderByMultipleAttributeBefore(): void $this->assertEquals($movies[0]['name'], $documents[0]['name']); $this->assertEquals($movies[1]['name'], $documents[1]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1881,7 +2004,7 @@ public function testFindOrderByMultipleAttributeBefore(): void $this->assertEquals(1, count($documents)); $this->assertEquals($movies[0]['name'], $documents[0]['name']); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), @@ -1892,15 +2015,18 @@ public function testFindOrderByMultipleAttributeBefore(): void } public function testFindOrderByAndCursor(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY + CURSOR */ - $documentsTest = static::getDatabase()->find('movies', [ + $documentsTest = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('price'), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(1), Query::offset(0), Query::orderDesc('price'), @@ -1911,15 +2037,18 @@ public function testFindOrderByAndCursor(): void } public function testFindOrderByIdAndCursor(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY ID + CURSOR */ - $documentsTest = static::getDatabase()->find('movies', [ + $documentsTest = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('$id'), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(1), Query::offset(0), Query::orderDesc('$id'), @@ -1931,16 +2060,19 @@ public function testFindOrderByIdAndCursor(): void public function testFindOrderByCreateDateAndCursor(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY CREATE DATE + CURSOR */ - $documentsTest = static::getDatabase()->find('movies', [ + $documentsTest = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('$createdAt'), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(1), Query::offset(0), Query::orderDesc('$createdAt'), @@ -1952,15 +2084,18 @@ public function testFindOrderByCreateDateAndCursor(): void public function testFindOrderByUpdateDateAndCursor(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * ORDER BY UPDATE DATE + CURSOR */ - $documentsTest = static::getDatabase()->find('movies', [ + $documentsTest = $database->find('movies', [ Query::limit(2), Query::offset(0), Query::orderDesc('$updatedAt'), ]); - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(1), Query::offset(0), Query::orderDesc('$updatedAt'), @@ -1972,10 +2107,13 @@ public function testFindOrderByUpdateDateAndCursor(): void public function testFindLimit(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Limit */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(4), Query::offset(0), Query::orderAsc('name') @@ -1991,10 +2129,13 @@ public function testFindLimit(): void public function testFindLimitAndOffset(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Limit + Offset */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::limit(4), Query::offset(2), Query::orderAsc('name') @@ -2009,10 +2150,13 @@ public function testFindLimitAndOffset(): void public function testFindOrQueries(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Test that OR queries are handled correctly */ - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::equal('director', ['TBD', 'Joe Johnston']), Query::equal('year', [2025]), ]); @@ -2024,11 +2168,14 @@ public function testFindOrQueries(): void */ public function testFindEdgeCases(Document $document): void { + /** @var Database $database */ + $database = static::getDatabase(); + $collection = 'edgeCases'; - static::getDatabase()->createCollection($collection); + $database->createCollection($collection); - $this->assertEquals(true, static::getDatabase()->createAttribute($collection, 'value', Database::VAR_STRING, 256, true)); + $this->assertEquals(true, $database->createAttribute($collection, 'value', Database::VAR_STRING, 256, true)); $values = [ 'NormalString', @@ -2047,7 +2194,7 @@ public function testFindEdgeCases(Document $document): void ]; foreach ($values as $value) { - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), @@ -2061,7 +2208,7 @@ public function testFindEdgeCases(Document $document): void /** * Check Basic */ - $documents = static::getDatabase()->find($collection); + $documents = $database->find($collection); $this->assertEquals(count($values), count($documents)); $this->assertNotEmpty($documents[0]->getId()); @@ -2075,7 +2222,7 @@ public function testFindEdgeCases(Document $document): void * Check `equals` query */ foreach ($values as $value) { - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::limit(25), Query::equal('value', [$value]) ]); @@ -2087,8 +2234,11 @@ public function testFindEdgeCases(Document $document): void public function testOrSingleQuery(): void { + /** @var Database $database */ + $database = static::getDatabase(); + try { - static::getDatabase()->find('movies', [ + $database->find('movies', [ Query::or([ Query::equal('active', [true]) ]) @@ -2101,14 +2251,17 @@ public function testOrSingleQuery(): void public function testOrMultipleQueries(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $queries = [ Query::or([ Query::equal('active', [true]), Query::equal('name', ['Frozen II']) ]) ]; - $this->assertCount(4, static::getDatabase()->find('movies', $queries)); - $this->assertEquals(4, static::getDatabase()->count('movies', $queries)); + $this->assertCount(4, $database->find('movies', $queries)); + $this->assertEquals(4, $database->count('movies', $queries)); $queries = [ Query::equal('active', [true]), @@ -2119,12 +2272,15 @@ public function testOrMultipleQueries(): void ]) ]; - $this->assertCount(3, static::getDatabase()->find('movies', $queries)); - $this->assertEquals(3, static::getDatabase()->count('movies', $queries)); + $this->assertCount(3, $database->find('movies', $queries)); + $this->assertEquals(3, $database->count('movies', $queries)); } public function testOrNested(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $queries = [ Query::select(['director']), Query::equal('director', ['Joe Johnston']), @@ -2137,18 +2293,21 @@ public function testOrNested(): void ]) ]; - $documents = static::getDatabase()->find('movies', $queries); + $documents = $database->find('movies', $queries); $this->assertCount(1, $documents); $this->assertArrayNotHasKey('name', $documents[0]); - $count = static::getDatabase()->count('movies', $queries); + $count = $database->count('movies', $queries); $this->assertEquals(1, $count); } public function testAndSingleQuery(): void { + /** @var Database $database */ + $database = static::getDatabase(); + try { - static::getDatabase()->find('movies', [ + $database->find('movies', [ Query::and([ Query::equal('active', [true]) ]) @@ -2161,18 +2320,24 @@ public function testAndSingleQuery(): void public function testAndMultipleQueries(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $queries = [ Query::and([ Query::equal('active', [true]), Query::equal('name', ['Frozen II']) ]) ]; - $this->assertCount(1, static::getDatabase()->find('movies', $queries)); - $this->assertEquals(1, static::getDatabase()->count('movies', $queries)); + $this->assertCount(1, $database->find('movies', $queries)); + $this->assertEquals(1, $database->count('movies', $queries)); } public function testAndNested(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $queries = [ Query::or([ Query::equal('active', [false]), @@ -2183,25 +2348,28 @@ public function testAndNested(): void ]) ]; - $documents = static::getDatabase()->find('movies', $queries); + $documents = $database->find('movies', $queries); $this->assertCount(3, $documents); - $count = static::getDatabase()->count('movies', $queries); + $count = $database->count('movies', $queries); $this->assertEquals(3, $count); } public function testNestedIDQueries(): void { + /** @var Database $database */ + $database = static::getDatabase(); + Authorization::setRole(Role::any()->toString()); - static::getDatabase()->createCollection('movies_nested_id', permissions: [ + $database->createCollection('movies_nested_id', permissions: [ Permission::create(Role::any()), Permission::update(Role::users()) ]); - $this->assertEquals(true, static::getDatabase()->createAttribute('movies_nested_id', 'name', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('movies_nested_id', 'name', Database::VAR_STRING, 128, true)); - static::getDatabase()->createDocument('movies_nested_id', new Document([ + $database->createDocument('movies_nested_id', new Document([ '$id' => ID::custom('1'), '$permissions' => [ Permission::read(Role::any()), @@ -2212,7 +2380,7 @@ public function testNestedIDQueries(): void 'name' => '1', ])); - static::getDatabase()->createDocument('movies_nested_id', new Document([ + $database->createDocument('movies_nested_id', new Document([ '$id' => ID::custom('2'), '$permissions' => [ Permission::read(Role::any()), @@ -2223,7 +2391,7 @@ public function testNestedIDQueries(): void 'name' => '2', ])); - static::getDatabase()->createDocument('movies_nested_id', new Document([ + $database->createDocument('movies_nested_id', new Document([ '$id' => ID::custom('3'), '$permissions' => [ Permission::read(Role::any()), @@ -2241,19 +2409,22 @@ public function testNestedIDQueries(): void ]) ]; - $documents = static::getDatabase()->find('movies_nested_id', $queries); + $documents = $database->find('movies_nested_id', $queries); $this->assertCount(2, $documents); // Make sure the query was not modified by reference $this->assertEquals($queries[0]->getValues()[0]->getAttribute(), '$id'); - $count = static::getDatabase()->count('movies_nested_id', $queries); + $count = $database->count('movies_nested_id', $queries); $this->assertEquals(2, $count); } public function testFindNull(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::isNull('nullable'), ]); @@ -2262,7 +2433,10 @@ public function testFindNull(): void public function testFindNotNull(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::isNotNull('nullable'), ]); @@ -2271,18 +2445,21 @@ public function testFindNotNull(): void public function testFindStartsWith(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::startsWith('name', 'Work'), ]); $this->assertEquals(2, count($documents)); if ($this->getDatabase()->getAdapter() instanceof SQL) { - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::startsWith('name', '%ork'), ]); } else { - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::startsWith('name', '.*ork'), ]); } @@ -2292,7 +2469,10 @@ public function testFindStartsWith(): void public function testFindStartsWithWords(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::startsWith('name', 'Work in Progress'), ]); @@ -2301,7 +2481,10 @@ public function testFindStartsWithWords(): void public function testFindEndsWith(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::endsWith('name', 'Marvel'), ]); @@ -2310,7 +2493,10 @@ public function testFindEndsWith(): void public function testFindSelect(): void { - $documents = static::getDatabase()->find('movies', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('movies', [ Query::select(['name', 'year']) ]); @@ -2328,7 +2514,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$id']) ]); @@ -2346,7 +2532,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$sequence']) ]); @@ -2364,7 +2550,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$collection']) ]); @@ -2382,7 +2568,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$createdAt']) ]); @@ -2400,7 +2586,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$updatedAt']) ]); @@ -2418,7 +2604,7 @@ public function testFindSelect(): void $this->assertArrayHasKey('$permissions', $document); } - $documents = static::getDatabase()->find('movies', [ + $documents = $database->find('movies', [ Query::select(['name', 'year', '$permissions']) ]); @@ -2440,11 +2626,14 @@ public function testFindSelect(): void /** @depends testFind */ public function testForeach(): void { + /** @var Database $database */ + $database = static::getDatabase(); + /** * Test, foreach goes through all the documents */ $documents = []; - static::getDatabase()->foreach('movies', queries: [Query::limit(2)], callback: function ($document) use (&$documents) { + $database->foreach('movies', queries: [Query::limit(2)], callback: function ($document) use (&$documents) { $documents[] = $document; }); $this->assertEquals(6, count($documents)); @@ -2455,7 +2644,7 @@ public function testForeach(): void $first = $documents[0]; $documents = []; - static::getDatabase()->foreach('movies', queries: [Query::limit(2), Query::cursorAfter($first)], callback: function ($document) use (&$documents) { + $database->foreach('movies', queries: [Query::limit(2), Query::cursorAfter($first)], callback: function ($document) use (&$documents) { $documents[] = $document; }); $this->assertEquals(5, count($documents)); @@ -2465,7 +2654,7 @@ public function testForeach(): void */ $documents = []; - static::getDatabase()->foreach('movies', queries: [Query::limit(2), Query::offset(2)], callback: function ($document) use (&$documents) { + $database->foreach('movies', queries: [Query::limit(2), Query::offset(2)], callback: function ($document) use (&$documents) { $documents[] = $document; }); $this->assertEquals(4, count($documents)); @@ -2474,7 +2663,7 @@ public function testForeach(): void * Test, cursor before throws error */ try { - static::getDatabase()->foreach('movies', queries: [Query::cursorBefore($documents[0]), Query::offset(2)], callback: function ($document) use (&$documents) { + $database->foreach('movies', queries: [Query::cursorBefore($documents[0]), Query::offset(2)], callback: function ($document) use (&$documents) { $documents[] = $document; }); @@ -2490,27 +2679,30 @@ public function testForeach(): void */ public function testCount(): void { - $count = static::getDatabase()->count('movies'); + /** @var Database $database */ + $database = static::getDatabase(); + + $count = $database->count('movies'); $this->assertEquals(6, $count); - $count = static::getDatabase()->count('movies', [Query::equal('year', [2019])]); + $count = $database->count('movies', [Query::equal('year', [2019])]); $this->assertEquals(2, $count); - $count = static::getDatabase()->count('movies', [Query::equal('with-dash', ['Works'])]); + $count = $database->count('movies', [Query::equal('with-dash', ['Works'])]); $this->assertEquals(2, $count); - $count = static::getDatabase()->count('movies', [Query::equal('with-dash', ['Works2', 'Works3'])]); + $count = $database->count('movies', [Query::equal('with-dash', ['Works2', 'Works3'])]); $this->assertEquals(4, $count); Authorization::unsetRole('user:x'); - $count = static::getDatabase()->count('movies'); + $count = $database->count('movies'); $this->assertEquals(5, $count); Authorization::disable(); - $count = static::getDatabase()->count('movies'); + $count = $database->count('movies'); $this->assertEquals(6, $count); Authorization::reset(); Authorization::disable(); - $count = static::getDatabase()->count('movies', [], 3); + $count = $database->count('movies', [], 3); $this->assertEquals(3, $count); Authorization::reset(); @@ -2518,7 +2710,7 @@ public function testCount(): void * Test that OR queries are handled correctly */ Authorization::disable(); - $count = static::getDatabase()->count('movies', [ + $count = $database->count('movies', [ Query::equal('director', ['TBD', 'Joe Johnston']), Query::equal('year', [2025]), ]); @@ -2531,29 +2723,32 @@ public function testCount(): void */ public function testSum(): void { + /** @var Database $database */ + $database = static::getDatabase(); + Authorization::setRole('user:x'); - $sum = static::getDatabase()->sum('movies', 'year', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'year', [Query::equal('year', [2019]),]); $this->assertEquals(2019 + 2019, $sum); - $sum = static::getDatabase()->sum('movies', 'year'); + $sum = $database->sum('movies', 'year'); $this->assertEquals(2013 + 2019 + 2011 + 2019 + 2025 + 2026, $sum); - $sum = static::getDatabase()->sum('movies', 'price', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'price', [Query::equal('year', [2019]),]); $this->assertEquals(round(39.50 + 25.99, 2), round($sum, 2)); - $sum = static::getDatabase()->sum('movies', 'price', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'price', [Query::equal('year', [2019]),]); $this->assertEquals(round(39.50 + 25.99, 2), round($sum, 2)); - $sum = static::getDatabase()->sum('movies', 'year', [Query::equal('year', [2019])], 1); + $sum = $database->sum('movies', 'year', [Query::equal('year', [2019])], 1); $this->assertEquals(2019, $sum); Authorization::unsetRole('user:x'); Authorization::unsetRole('userx'); - $sum = static::getDatabase()->sum('movies', 'year', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'year', [Query::equal('year', [2019]),]); $this->assertEquals(2019 + 2019, $sum); - $sum = static::getDatabase()->sum('movies', 'year'); + $sum = $database->sum('movies', 'year'); $this->assertEquals(2013 + 2019 + 2011 + 2019 + 2025, $sum); - $sum = static::getDatabase()->sum('movies', 'price', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'price', [Query::equal('year', [2019]),]); $this->assertEquals(round(39.50 + 25.99, 2), round($sum, 2)); - $sum = static::getDatabase()->sum('movies', 'price', [Query::equal('year', [2019]),]); + $sum = $database->sum('movies', 'price', [Query::equal('year', [2019]),]); $this->assertEquals(round(39.50 + 25.99, 2), round($sum, 2)); } @@ -2748,7 +2943,10 @@ public function testEncodeDecode(): void ], ]); - $result = static::getDatabase()->encode($collection, $document); + /** @var Database $database */ + $database = static::getDatabase(); + + $result = $database->encode($collection, $document); $this->assertEquals('608fdbe51361a', $result->getAttribute('$id')); $this->assertContains('read("any")', $result->getAttribute('$permissions')); @@ -2772,7 +2970,7 @@ public function testEncodeDecode(): void $this->assertEquals(['admin', 'developer', 'tester',], $result->getAttribute('roles')); $this->assertEquals(['{"$id":"1","label":"x"}', '{"$id":"2","label":"y"}', '{"$id":"3","label":"z"}',], $result->getAttribute('tags')); - $result = static::getDatabase()->decode($collection, $document); + $result = $database->decode($collection, $document); $this->assertEquals('608fdbe51361a', $result->getAttribute('$id')); $this->assertContains('read("any")', $result->getAttribute('$permissions')); @@ -2952,7 +3150,10 @@ public function testDeleteDocument(Document $document): void public function testUpdateDocuments(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } @@ -2961,7 +3162,7 @@ public function testUpdateDocuments(): void Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - static::getDatabase()->createCollection($collection, attributes: [ + $database->createCollection($collection, attributes: [ new Document([ '$id' => ID::custom('string'), 'type' => Database::VAR_STRING, @@ -2992,7 +3193,7 @@ public function testUpdateDocuments(): void ], documentSecurity: false); for ($i = 0; $i < 10; $i++) { - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$id' => 'doc' . $i, 'string' => 'text📝 ' . $i, 'integer' => $i @@ -3001,7 +3202,7 @@ public function testUpdateDocuments(): void // Test Update half of the documents $results = []; - $count = static::getDatabase()->updateDocuments($collection, new Document([ + $count = $database->updateDocuments($collection, new Document([ 'string' => 'text📝 updated', ]), [ Query::greaterThanEqual('integer', 5), @@ -3015,7 +3216,7 @@ public function testUpdateDocuments(): void $this->assertEquals('text📝 updated', $document->getAttribute('string')); } - $updatedDocuments = static::getDatabase()->find($collection, [ + $updatedDocuments = $database->find($collection, [ Query::greaterThanEqual('integer', 5), ]); @@ -3026,7 +3227,7 @@ public function testUpdateDocuments(): void $this->assertGreaterThanOrEqual(5, $document->getAttribute('integer')); } - $controlDocuments = static::getDatabase()->find($collection, [ + $controlDocuments = $database->find($collection, [ Query::lessThan('integer', 5), ]); @@ -3037,11 +3238,11 @@ public function testUpdateDocuments(): void } // Test Update all documents - $this->assertEquals(10, static::getDatabase()->updateDocuments($collection, new Document([ + $this->assertEquals(10, $database->updateDocuments($collection, new Document([ 'string' => 'text📝 updated all', ]))); - $updatedDocuments = static::getDatabase()->find($collection); + $updatedDocuments = $database->find($collection); $this->assertEquals(count($updatedDocuments), 10); @@ -3053,8 +3254,8 @@ public function testUpdateDocuments(): void $oneHourAgo = (new \DateTime())->sub(new \DateInterval('PT1H')); try { - $this->getDatabase()->withRequestTimestamp($oneHourAgo, function () use ($collection) { - static::getDatabase()->updateDocuments($collection, new Document([ + $this->getDatabase()->withRequestTimestamp($oneHourAgo, function () use ($collection, $database) { + $database->updateDocuments($collection, new Document([ 'string' => 'text📝 updated all', ])); }); @@ -3064,7 +3265,7 @@ public function testUpdateDocuments(): void } // Check collection level permissions - static::getDatabase()->updateCollection($collection, permissions: [ + $database->updateCollection($collection, permissions: [ Permission::read(Role::user('asd')), Permission::create(Role::user('asd')), Permission::update(Role::user('asd')), @@ -3072,7 +3273,7 @@ public function testUpdateDocuments(): void ], documentSecurity: false); try { - static::getDatabase()->updateDocuments($collection, new Document([ + $database->updateDocuments($collection, new Document([ 'string' => 'text📝 updated all', ])); $this->fail('Failed to throw exception'); @@ -3081,10 +3282,10 @@ public function testUpdateDocuments(): void } // Check document level permissions - static::getDatabase()->updateCollection($collection, permissions: [], documentSecurity: true); + $database->updateCollection($collection, permissions: [], documentSecurity: true); - Authorization::skip(function () use ($collection) { - static::getDatabase()->updateDocument($collection, 'doc0', new Document([ + Authorization::skip(function () use ($collection, $database) { + $database->updateDocument($collection, 'doc0', new Document([ 'string' => 'text📝 updated all', '$permissions' => [ Permission::read(Role::user('asd')), @@ -3097,26 +3298,26 @@ public function testUpdateDocuments(): void Authorization::setRole(Role::user('asd')->toString()); - static::getDatabase()->updateDocuments($collection, new Document([ + $database->updateDocuments($collection, new Document([ 'string' => 'permission text', ])); - $documents = static::getDatabase()->find($collection, [ + $documents = $database->find($collection, [ Query::equal('string', ['permission text']), ]); $this->assertCount(1, $documents); - Authorization::skip(function () use ($collection) { - $unmodifiedDocuments = static::getDatabase()->find($collection, [ + Authorization::skip(function () use ($collection, $database) { + $unmodifiedDocuments = $database->find($collection, [ Query::equal('string', ['text📝 updated all']), ]); $this->assertCount(9, $unmodifiedDocuments); }); - Authorization::skip(function () use ($collection) { - static::getDatabase()->updateDocuments($collection, new Document([ + Authorization::skip(function () use ($collection, $database) { + $database->updateDocuments($collection, new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -3127,11 +3328,11 @@ public function testUpdateDocuments(): void }); // Test we can update more documents than batchSize - $this->assertEquals(10, static::getDatabase()->updateDocuments($collection, new Document([ + $this->assertEquals(10, $database->updateDocuments($collection, new Document([ 'string' => 'batchSize Test' ]), batchSize: 2)); - $documents = static::getDatabase()->find($collection); + $documents = $database->find($collection); foreach ($documents as $document) { $this->assertEquals('batchSize Test', $document->getAttribute('string')); @@ -3148,7 +3349,10 @@ public function testReadPermissionsSuccess(Document $document): Document Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $document = static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -3170,7 +3374,7 @@ public function testReadPermissionsSuccess(Document $document): Document Authorization::cleanRoles(); - $document = static::getDatabase()->getDocument($document->getCollection(), $document->getId()); + $document = $database->getDocument($document->getCollection(), $document->getId()); $this->assertEquals(true, $document->isEmpty()); Authorization::setRole(Role::any()->toString()); @@ -3185,8 +3389,11 @@ public function testWritePermissionsSuccess(Document $document): void { Authorization::cleanRoles(); + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(AuthorizationException::class); - static::getDatabase()->createDocument('documents', new Document([ + $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -3215,7 +3422,10 @@ public function testWritePermissionsUpdateFailure(Document $document): Document Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $document = static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -3235,7 +3445,7 @@ public function testWritePermissionsUpdateFailure(Document $document): Document Authorization::cleanRoles(); - $document = static::getDatabase()->updateDocument('documents', $document->getId(), new Document([ + $document = $database->updateDocument('documents', $document->getId(), new Document([ '$id' => ID::custom($document->getId()), '$permissions' => [ Permission::read(Role::any()), @@ -3262,9 +3472,12 @@ public function testUniqueIndexDuplicate(): void { $this->expectException(DuplicateException::class); - $this->assertEquals(true, static::getDatabase()->createIndex('movies', 'uniqueIndex', Database::INDEX_UNIQUE, ['name'], [128], [Database::ORDER_ASC])); + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertEquals(true, $database->createIndex('movies', 'uniqueIndex', Database::INDEX_UNIQUE, ['name'], [128], [Database::ORDER_ASC])); - static::getDatabase()->createDocument('movies', new Document([ + $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -3293,9 +3506,12 @@ public function testUniqueIndexDuplicate(): void */ public function testUniqueIndexDuplicateUpdate(): void { + /** @var Database $database */ + $database = static::getDatabase(); + Authorization::setRole(Role::users()->toString()); // create document then update to conflict with index - $document = static::getDatabase()->createDocument('movies', new Document([ + $document = $database->createDocument('movies', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user('1')), @@ -3321,13 +3537,16 @@ public function testUniqueIndexDuplicateUpdate(): void $this->expectException(DuplicateException::class); - static::getDatabase()->updateDocument('movies', $document->getId(), $document->setAttribute('name', 'Frozen')); + $database->updateDocument('movies', $document->getId(), $document->setAttribute('name', 'Frozen')); } public function propagateBulkDocuments(string $collection, int $amount = 10, bool $documentSecurity = false): void { + /** @var Database $database */ + $database = static::getDatabase(); + for ($i = 0; $i < $amount; $i++) { - static::getDatabase()->createDocument($collection, new Document( + $database->createDocument($collection, new Document( array_merge([ '$id' => 'doc' . $i, 'text' => 'value' . $i, @@ -3344,12 +3563,15 @@ public function propagateBulkDocuments(string $collection, int $amount = 10, boo public function testDeleteBulkDocuments(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection( + $database->createCollection( 'bulk_delete', attributes: [ new Document([ @@ -3375,7 +3597,7 @@ public function testDeleteBulkDocuments(): void $this->propagateBulkDocuments('bulk_delete'); - $docs = static::getDatabase()->find('bulk_delete'); + $docs = $database->find('bulk_delete'); $this->assertCount(10, $docs); /** @@ -3383,7 +3605,7 @@ public function testDeleteBulkDocuments(): void */ $selects = ['$sequence', '$id', '$collection', '$permissions', '$updatedAt']; - $count = static::getDatabase()->deleteDocuments( + $count = $database->deleteDocuments( collection: 'bulk_delete', queries: [ Query::select([...$selects, '$createdAt']), @@ -3399,16 +3621,16 @@ public function testDeleteBulkDocuments(): void $this->assertEquals(2, $count); // TEST: Bulk Delete All Documents - $this->assertEquals(8, static::getDatabase()->deleteDocuments('bulk_delete')); + $this->assertEquals(8, $database->deleteDocuments('bulk_delete')); - $docs = static::getDatabase()->find('bulk_delete'); + $docs = $database->find('bulk_delete'); $this->assertCount(0, $docs); // TEST: Bulk delete documents with queries. $this->propagateBulkDocuments('bulk_delete'); $results = []; - $count = static::getDatabase()->deleteDocuments('bulk_delete', [ + $count = $database->deleteDocuments('bulk_delete', [ Query::greaterThanEqual('integer', 5) ], onNext: function ($doc) use (&$results) { $results[] = $doc; @@ -3420,7 +3642,7 @@ public function testDeleteBulkDocuments(): void $this->assertGreaterThanOrEqual(5, $document->getAttribute('integer')); } - $docs = static::getDatabase()->find('bulk_delete'); + $docs = $database->find('bulk_delete'); $this->assertEquals(5, \count($docs)); // TEST (FAIL): Can't delete documents in the past @@ -3436,58 +3658,61 @@ public function testDeleteBulkDocuments(): void } // TEST (FAIL): Bulk delete all documents with invalid collection permission - static::getDatabase()->updateCollection('bulk_delete', [], false); + $database->updateCollection('bulk_delete', [], false); try { - static::getDatabase()->deleteDocuments('bulk_delete'); + $database->deleteDocuments('bulk_delete'); $this->fail('Bulk deleted documents with invalid collection permission'); } catch (\Utopia\Database\Exception\Authorization) { } - static::getDatabase()->updateCollection('bulk_delete', [ + $database->updateCollection('bulk_delete', [ Permission::create(Role::any()), Permission::read(Role::any()), Permission::delete(Role::any()) ], false); - $this->assertEquals(5, static::getDatabase()->deleteDocuments('bulk_delete')); + $this->assertEquals(5, $database->deleteDocuments('bulk_delete')); $this->assertEquals(0, \count($this->getDatabase()->find('bulk_delete'))); // TEST: Make sure we can't delete documents we don't have permissions for - static::getDatabase()->updateCollection('bulk_delete', [ + $database->updateCollection('bulk_delete', [ Permission::create(Role::any()), ], true); $this->propagateBulkDocuments('bulk_delete', documentSecurity: true); - $this->assertEquals(0, static::getDatabase()->deleteDocuments('bulk_delete')); + $this->assertEquals(0, $database->deleteDocuments('bulk_delete')); - $documents = Authorization::skip(function () { - return static::getDatabase()->find('bulk_delete'); + $documents = Authorization::skip(function () use ($database) { + return $database->find('bulk_delete'); }); $this->assertEquals(10, \count($documents)); - static::getDatabase()->updateCollection('bulk_delete', [ + $database->updateCollection('bulk_delete', [ Permission::create(Role::any()), Permission::read(Role::any()), Permission::delete(Role::any()) ], false); - static::getDatabase()->deleteDocuments('bulk_delete'); + $database->deleteDocuments('bulk_delete'); $this->assertEquals(0, \count($this->getDatabase()->find('bulk_delete'))); // Teardown - static::getDatabase()->deleteCollection('bulk_delete'); + $database->deleteCollection('bulk_delete'); } public function testDeleteBulkDocumentsQueries(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection( + $database->createCollection( 'bulk_delete_queries', attributes: [ new Document([ @@ -3514,44 +3739,47 @@ public function testDeleteBulkDocumentsQueries(): void // Test limit $this->propagateBulkDocuments('bulk_delete_queries'); - $this->assertEquals(5, static::getDatabase()->deleteDocuments('bulk_delete_queries', [Query::limit(5)])); - $this->assertEquals(5, \count(static::getDatabase()->find('bulk_delete_queries'))); + $this->assertEquals(5, $database->deleteDocuments('bulk_delete_queries', [Query::limit(5)])); + $this->assertEquals(5, \count($database->find('bulk_delete_queries'))); - $this->assertEquals(5, static::getDatabase()->deleteDocuments('bulk_delete_queries', [Query::limit(5)])); - $this->assertEquals(0, \count(static::getDatabase()->find('bulk_delete_queries'))); + $this->assertEquals(5, $database->deleteDocuments('bulk_delete_queries', [Query::limit(5)])); + $this->assertEquals(0, \count($database->find('bulk_delete_queries'))); // Test Limit more than batchSize $this->propagateBulkDocuments('bulk_delete_queries', Database::DELETE_BATCH_SIZE * 2); - $this->assertEquals(Database::DELETE_BATCH_SIZE * 2, \count(static::getDatabase()->find('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE * 2)]))); - $this->assertEquals(Database::DELETE_BATCH_SIZE + 2, static::getDatabase()->deleteDocuments('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE + 2)])); - $this->assertEquals(Database::DELETE_BATCH_SIZE - 2, \count(static::getDatabase()->find('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE * 2)]))); + $this->assertEquals(Database::DELETE_BATCH_SIZE * 2, \count($database->find('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE * 2)]))); + $this->assertEquals(Database::DELETE_BATCH_SIZE + 2, $database->deleteDocuments('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE + 2)])); + $this->assertEquals(Database::DELETE_BATCH_SIZE - 2, \count($database->find('bulk_delete_queries', [Query::limit(Database::DELETE_BATCH_SIZE * 2)]))); $this->assertEquals(Database::DELETE_BATCH_SIZE - 2, $this->getDatabase()->deleteDocuments('bulk_delete_queries')); // Test Offset $this->propagateBulkDocuments('bulk_delete_queries', 100); - $this->assertEquals(50, static::getDatabase()->deleteDocuments('bulk_delete_queries', [Query::offset(50)])); + $this->assertEquals(50, $database->deleteDocuments('bulk_delete_queries', [Query::offset(50)])); - $docs = static::getDatabase()->find('bulk_delete_queries', [Query::limit(100)]); + $docs = $database->find('bulk_delete_queries', [Query::limit(100)]); $this->assertEquals(50, \count($docs)); $lastDoc = \end($docs); $this->assertNotEmpty($lastDoc); $this->assertEquals('doc49', $lastDoc->getId()); - $this->assertEquals(50, static::getDatabase()->deleteDocuments('bulk_delete_queries')); + $this->assertEquals(50, $database->deleteDocuments('bulk_delete_queries')); - static::getDatabase()->deleteCollection('bulk_delete_queries'); + $database->deleteCollection('bulk_delete_queries'); } public function testUpdateDocumentsQueries(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } $collection = 'testUpdateDocumentsQueries'; - static::getDatabase()->createCollection($collection, attributes: [ + $database->createCollection($collection, attributes: [ new Document([ '$id' => ID::custom('text'), 'type' => Database::VAR_STRING, @@ -3574,30 +3802,30 @@ public function testUpdateDocumentsQueries(): void // Test limit $this->propagateBulkDocuments($collection, 100); - $this->assertEquals(10, static::getDatabase()->updateDocuments($collection, new Document([ + $this->assertEquals(10, $database->updateDocuments($collection, new Document([ 'text' => 'text📝 updated', ]), [Query::limit(10)])); - $this->assertEquals(10, \count(static::getDatabase()->find($collection, [Query::equal('text', ['text📝 updated'])]))); - $this->assertEquals(100, static::getDatabase()->deleteDocuments($collection)); - $this->assertEquals(0, \count(static::getDatabase()->find($collection))); + $this->assertEquals(10, \count($database->find($collection, [Query::equal('text', ['text📝 updated'])]))); + $this->assertEquals(100, $database->deleteDocuments($collection)); + $this->assertEquals(0, \count($database->find($collection))); // Test Offset $this->propagateBulkDocuments($collection, 100); - $this->assertEquals(50, static::getDatabase()->updateDocuments($collection, new Document([ + $this->assertEquals(50, $database->updateDocuments($collection, new Document([ 'text' => 'text📝 updated', ]), [ Query::offset(50), ])); - $docs = static::getDatabase()->find($collection, [Query::equal('text', ['text📝 updated']), Query::limit(100)]); + $docs = $database->find($collection, [Query::equal('text', ['text📝 updated']), Query::limit(100)]); $this->assertCount(50, $docs); $lastDoc = end($docs); $this->assertNotEmpty($lastDoc); $this->assertEquals('doc99', $lastDoc->getId()); - $this->assertEquals(100, static::getDatabase()->deleteDocuments($collection)); + $this->assertEquals(100, $database->deleteDocuments($collection)); } /** @@ -3605,6 +3833,9 @@ public function testUpdateDocumentsQueries(): void */ public function testFulltextIndexWithInteger(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(Exception::class); if (!$this->getDatabase()->getAdapter()->getSupportForFulltextIndex()) { @@ -3613,7 +3844,7 @@ public function testFulltextIndexWithInteger(): void $this->expectExceptionMessage('Attribute "integer_signed" cannot be part of a FULLTEXT index, must be of type string'); } - static::getDatabase()->createIndex('documents', 'fulltext_integer', Database::INDEX_FULLTEXT, ['string','integer_signed']); + $database->createIndex('documents', 'fulltext_integer', Database::INDEX_FULLTEXT, ['string','integer_signed']); } public function testEnableDisableValidation(): void @@ -3680,10 +3911,13 @@ public function testEnableDisableValidation(): void */ public function testExceptionDuplicate(Document $document): void { + /** @var Database $database */ + $database = static::getDatabase(); + $document->setAttribute('$id', 'duplicated'); - static::getDatabase()->createDocument($document->getCollection(), $document); + $database->createDocument($document->getCollection(), $document); $this->expectException(DuplicateException::class); - static::getDatabase()->createDocument($document->getCollection(), $document); + $database->createDocument($document->getCollection(), $document); } /** @@ -3691,26 +3925,32 @@ public function testExceptionDuplicate(Document $document): void */ public function testExceptionCaseInsensitiveDuplicate(Document $document): Document { + /** @var Database $database */ + $database = static::getDatabase(); + $document->setAttribute('$id', 'caseSensitive'); $document->setAttribute('$sequence', '200'); - static::getDatabase()->createDocument($document->getCollection(), $document); + $database->createDocument($document->getCollection(), $document); $document->setAttribute('$id', 'CaseSensitive'); $this->expectException(DuplicateException::class); - static::getDatabase()->createDocument($document->getCollection(), $document); + $database->createDocument($document->getCollection(), $document); return $document; } public function testEmptyTenant(): void { - if (static::getDatabase()->getAdapter()->getSharedTables()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if ($database->getAdapter()->getSharedTables()) { $this->expectNotToPerformAssertions(); return; } - $documents = static::getDatabase()->find( + $documents = $database->find( 'documents', [Query::notEqual('$id', '56000')] // Mongo bug with Integer UID ); @@ -3719,19 +3959,22 @@ public function testEmptyTenant(): void $this->assertArrayHasKey('$id', $document); $this->assertArrayNotHasKey('$tenant', $document); - $document = static::getDatabase()->getDocument('documents', $document->getId()); + $document = $database->getDocument('documents', $document->getId()); $this->assertArrayHasKey('$id', $document); $this->assertArrayNotHasKey('$tenant', $document); - $document = static::getDatabase()->updateDocument('documents', $document->getId(), $document); + $document = $database->updateDocument('documents', $document->getId(), $document); $this->assertArrayHasKey('$id', $document); $this->assertArrayNotHasKey('$tenant', $document); } public function testEmptyOperatorValues(): void { + /** @var Database $database */ + $database = static::getDatabase(); + try { - static::getDatabase()->findOne('documents', [ + $database->findOne('documents', [ Query::equal('string', []), ]); $this->fail('Failed to throw exception'); @@ -3741,7 +3984,7 @@ public function testEmptyOperatorValues(): void } try { - static::getDatabase()->findOne('documents', [ + $database->findOne('documents', [ Query::contains('string', []), ]); $this->fail('Failed to throw exception'); diff --git a/tests/e2e/Adapter/Scopes/GeneralTests.php b/tests/e2e/Adapter/Scopes/GeneralTests.php index c6ae1d4f3..a5fc8f200 100644 --- a/tests/e2e/Adapter/Scopes/GeneralTests.php +++ b/tests/e2e/Adapter/Scopes/GeneralTests.php @@ -25,7 +25,10 @@ trait GeneralTests { public function testPing(): void { - $this->assertEquals(true, static::getDatabase()->ping()); + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertEquals(true, $database->ping()); } /** @@ -43,11 +46,14 @@ public function testQueryTimeout(): void return; } - static::getDatabase()->createCollection('global-timeouts'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('global-timeouts'); $this->assertEquals( true, - static::getDatabase()->createAttribute( + $database->createAttribute( collection: 'global-timeouts', id: 'longtext', type: Database::VAR_STRING, @@ -57,7 +63,7 @@ public function testQueryTimeout(): void ); for ($i = 0; $i < 20; $i++) { - static::getDatabase()->createDocument('global-timeouts', new Document([ + $database->createDocument('global-timeouts', new Document([ 'longtext' => file_get_contents(__DIR__ . '/../../../resources/longtext.txt'), '$permissions' => [ Permission::read(Role::any()), @@ -67,16 +73,16 @@ public function testQueryTimeout(): void ])); } - static::getDatabase()->setTimeout(1); + $database->setTimeout(1); try { - static::getDatabase()->find('global-timeouts', [ + $database->find('global-timeouts', [ Query::notEqual('longtext', 'appwrite'), ]); $this->fail('Failed to throw exception'); } catch (\Exception $e) { - static::getDatabase()->clearTimeout(); - static::getDatabase()->deleteCollection('global-timeouts'); + $database->clearTimeout(); + $database->deleteCollection('global-timeouts'); $this->assertInstanceOf(TimeoutException::class, $e); } } @@ -87,25 +93,28 @@ public function testPreserveDatesUpdate(): void { Authorization::disable(); - static::getDatabase()->setPreserveDates(true); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->setPreserveDates(true); - static::getDatabase()->createCollection('preserve_update_dates'); + $database->createCollection('preserve_update_dates'); - static::getDatabase()->createAttribute('preserve_update_dates', 'attr1', Database::VAR_STRING, 10, false); + $database->createAttribute('preserve_update_dates', 'attr1', Database::VAR_STRING, 10, false); - $doc1 = static::getDatabase()->createDocument('preserve_update_dates', new Document([ + $doc1 = $database->createDocument('preserve_update_dates', new Document([ '$id' => 'doc1', '$permissions' => [], 'attr1' => 'value1', ])); - $doc2 = static::getDatabase()->createDocument('preserve_update_dates', new Document([ + $doc2 = $database->createDocument('preserve_update_dates', new Document([ '$id' => 'doc2', '$permissions' => [], 'attr1' => 'value2', ])); - $doc3 = static::getDatabase()->createDocument('preserve_update_dates', new Document([ + $doc3 = $database->createDocument('preserve_update_dates', new Document([ '$id' => 'doc3', '$permissions' => [], 'attr1' => 'value3', @@ -114,9 +123,9 @@ public function testPreserveDatesUpdate(): void $newDate = '2000-01-01T10:00:00.000+00:00'; $doc1->setAttribute('$updatedAt', $newDate); - $doc1 = static::getDatabase()->updateDocument('preserve_update_dates', 'doc1', $doc1); + $doc1 = $database->updateDocument('preserve_update_dates', 'doc1', $doc1); $this->assertEquals($newDate, $doc1->getAttribute('$updatedAt')); - $doc1 = static::getDatabase()->getDocument('preserve_update_dates', 'doc1'); + $doc1 = $database->getDocument('preserve_update_dates', 'doc1'); $this->assertEquals($newDate, $doc1->getAttribute('$updatedAt')); $this->getDatabase()->updateDocuments( @@ -132,14 +141,14 @@ public function testPreserveDatesUpdate(): void ] ); - $doc2 = static::getDatabase()->getDocument('preserve_update_dates', 'doc2'); - $doc3 = static::getDatabase()->getDocument('preserve_update_dates', 'doc3'); + $doc2 = $database->getDocument('preserve_update_dates', 'doc2'); + $doc3 = $database->getDocument('preserve_update_dates', 'doc3'); $this->assertEquals($newDate, $doc2->getAttribute('$updatedAt')); $this->assertEquals($newDate, $doc3->getAttribute('$updatedAt')); - static::getDatabase()->deleteCollection('preserve_update_dates'); + $database->deleteCollection('preserve_update_dates'); - static::getDatabase()->setPreserveDates(false); + $database->setPreserveDates(false); Authorization::reset(); } @@ -148,22 +157,25 @@ public function testPreserveDatesCreate(): void { Authorization::disable(); - static::getDatabase()->setPreserveDates(true); + /** @var Database $database */ + $database = static::getDatabase(); - static::getDatabase()->createCollection('preserve_create_dates'); + $database->setPreserveDates(true); - static::getDatabase()->createAttribute('preserve_create_dates', 'attr1', Database::VAR_STRING, 10, false); + $database->createCollection('preserve_create_dates'); + + $database->createAttribute('preserve_create_dates', 'attr1', Database::VAR_STRING, 10, false); $date = '2000-01-01T10:00:00.000+00:00'; - static::getDatabase()->createDocument('preserve_create_dates', new Document([ + $database->createDocument('preserve_create_dates', new Document([ '$id' => 'doc1', '$permissions' => [], 'attr1' => 'value1', '$createdAt' => $date ])); - static::getDatabase()->createDocuments('preserve_create_dates', [ + $database->createDocuments('preserve_create_dates', [ new Document([ '$id' => 'doc2', '$permissions' => [], @@ -178,16 +190,16 @@ public function testPreserveDatesCreate(): void ]), ], batchSize: 2); - $doc1 = static::getDatabase()->getDocument('preserve_create_dates', 'doc1'); - $doc2 = static::getDatabase()->getDocument('preserve_create_dates', 'doc2'); - $doc3 = static::getDatabase()->getDocument('preserve_create_dates', 'doc3'); + $doc1 = $database->getDocument('preserve_create_dates', 'doc1'); + $doc2 = $database->getDocument('preserve_create_dates', 'doc2'); + $doc3 = $database->getDocument('preserve_create_dates', 'doc3'); $this->assertEquals($date, $doc1->getAttribute('$createdAt')); $this->assertEquals($date, $doc2->getAttribute('$createdAt')); $this->assertEquals($date, $doc3->getAttribute('$createdAt')); - static::getDatabase()->deleteCollection('preserve_create_dates'); + $database->deleteCollection('preserve_create_dates'); - static::getDatabase()->setPreserveDates(false); + $database->setPreserveDates(false); Authorization::reset(); } @@ -271,7 +283,11 @@ public function testFindOrderByAfterException(): void ]); $this->expectException(Exception::class); - static::getDatabase()->find('movies', [ + + /** @var Database $database */ + $database = static::getDatabase(); + + $database->find('movies', [ Query::limit(2), Query::offset(0), Query::cursorAfter($document) @@ -405,7 +421,7 @@ public function testSharedTablesTenantPerDocument(): void $this->assertEquals(1, \count($docs)); $this->assertEquals($doc1Id, $docs[0]->getId()); - if (static::getDatabase()->getAdapter()->getSupportForUpserts()) { + if ($database->getAdapter()->getSupportForUpserts()) { // Test upsert with tenant per doc $doc3Id = ID::unique(); $database @@ -521,7 +537,10 @@ public function testSharedTablesTenantPerDocument(): void public function testCacheFallback(): void { - if (!static::getDatabase()->getAdapter()->getSupportForCacheSkipOnFailure()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForCacheSkipOnFailure()) { $this->expectNotToPerformAssertions(); return; } diff --git a/tests/e2e/Adapter/Scopes/IndexTests.php b/tests/e2e/Adapter/Scopes/IndexTests.php index 6bb563379..f9ae46075 100644 --- a/tests/e2e/Adapter/Scopes/IndexTests.php +++ b/tests/e2e/Adapter/Scopes/IndexTests.php @@ -53,56 +53,59 @@ public function testCreateIndex(): void public function testCreateDeleteIndex(): void { - static::getDatabase()->createCollection('indexes'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('indexes'); - $this->assertEquals(true, static::getDatabase()->createAttribute('indexes', 'string', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('indexes', 'order', Database::VAR_STRING, 128, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('indexes', 'integer', Database::VAR_INTEGER, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('indexes', 'float', Database::VAR_FLOAT, 0, true)); - $this->assertEquals(true, static::getDatabase()->createAttribute('indexes', 'boolean', Database::VAR_BOOLEAN, 0, true)); + $this->assertEquals(true, $database->createAttribute('indexes', 'string', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('indexes', 'order', Database::VAR_STRING, 128, true)); + $this->assertEquals(true, $database->createAttribute('indexes', 'integer', Database::VAR_INTEGER, 0, true)); + $this->assertEquals(true, $database->createAttribute('indexes', 'float', Database::VAR_FLOAT, 0, true)); + $this->assertEquals(true, $database->createAttribute('indexes', 'boolean', Database::VAR_BOOLEAN, 0, true)); // Indexes - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index2', Database::INDEX_KEY, ['float', 'integer'], [], [Database::ORDER_ASC, Database::ORDER_DESC])); - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index3', Database::INDEX_KEY, ['integer', 'boolean'], [], [Database::ORDER_ASC, Database::ORDER_DESC, Database::ORDER_DESC])); - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index4', Database::INDEX_UNIQUE, ['string'], [128], [Database::ORDER_ASC])); - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index5', Database::INDEX_UNIQUE, ['$id', 'string'], [128], [Database::ORDER_ASC])); - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'order', Database::INDEX_UNIQUE, ['order'], [128], [Database::ORDER_ASC])); - - $collection = static::getDatabase()->getCollection('indexes'); + $this->assertEquals(true, $database->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); + $this->assertEquals(true, $database->createIndex('indexes', 'index2', Database::INDEX_KEY, ['float', 'integer'], [], [Database::ORDER_ASC, Database::ORDER_DESC])); + $this->assertEquals(true, $database->createIndex('indexes', 'index3', Database::INDEX_KEY, ['integer', 'boolean'], [], [Database::ORDER_ASC, Database::ORDER_DESC, Database::ORDER_DESC])); + $this->assertEquals(true, $database->createIndex('indexes', 'index4', Database::INDEX_UNIQUE, ['string'], [128], [Database::ORDER_ASC])); + $this->assertEquals(true, $database->createIndex('indexes', 'index5', Database::INDEX_UNIQUE, ['$id', 'string'], [128], [Database::ORDER_ASC])); + $this->assertEquals(true, $database->createIndex('indexes', 'order', Database::INDEX_UNIQUE, ['order'], [128], [Database::ORDER_ASC])); + + $collection = $database->getCollection('indexes'); $this->assertCount(6, $collection->getAttribute('indexes')); // Delete Indexes - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index1')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index2')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index3')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index4')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index5')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'order')); - - $collection = static::getDatabase()->getCollection('indexes'); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index1')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index2')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index3')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index4')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index5')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'order')); + + $collection = $database->getCollection('indexes'); $this->assertCount(0, $collection->getAttribute('indexes')); // Test non-shared tables duplicates throw duplicate - static::getDatabase()->createIndex('indexes', 'duplicate', Database::INDEX_KEY, ['string', 'boolean'], [128], [Database::ORDER_ASC]); + $database->createIndex('indexes', 'duplicate', Database::INDEX_KEY, ['string', 'boolean'], [128], [Database::ORDER_ASC]); try { - static::getDatabase()->createIndex('indexes', 'duplicate', Database::INDEX_KEY, ['string', 'boolean'], [128], [Database::ORDER_ASC]); + $database->createIndex('indexes', 'duplicate', Database::INDEX_KEY, ['string', 'boolean'], [128], [Database::ORDER_ASC]); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(DuplicateException::class, $e); } // Test delete index when index does not exist - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); + $this->assertEquals(true, $database->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); $this->assertEquals(true, static::deleteIndex('indexes', 'index1')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index1')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index1')); // Test delete index when attribute does not exist - $this->assertEquals(true, static::getDatabase()->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); - $this->assertEquals(true, static::getDatabase()->deleteAttribute('indexes', 'string')); - $this->assertEquals(true, static::getDatabase()->deleteIndex('indexes', 'index1')); + $this->assertEquals(true, $database->createIndex('indexes', 'index1', Database::INDEX_KEY, ['string', 'integer'], [128], [Database::ORDER_ASC])); + $this->assertEquals(true, $database->deleteAttribute('indexes', 'string')); + $this->assertEquals(true, $database->deleteIndex('indexes', 'index1')); - static::getDatabase()->deleteCollection('indexes'); + $database->deleteCollection('indexes'); } @@ -154,10 +157,13 @@ public function testIndexValidation(): void 'indexes' => $indexes ]); + /** @var Database $database */ + $database = static::getDatabase(); + $validator = new Index( $attributes, - static::getDatabase()->getAdapter()->getMaxIndexLength(), - static::getDatabase()->getAdapter()->getInternalIndexesKeys() + $database->getAdapter()->getMaxIndexLength(), + $database->getAdapter()->getInternalIndexesKeys() ); $errorMessage = 'Index length 701 is larger than the size for title1: 700"'; @@ -165,7 +171,7 @@ public function testIndexValidation(): void $this->assertEquals($errorMessage, $validator->getDescription()); try { - static::getDatabase()->createCollection($collection->getId(), $attributes, $indexes, [ + $database->createCollection($collection->getId(), $attributes, $indexes, [ Permission::read(Role::any()), Permission::create(Role::any()), ]); @@ -186,13 +192,13 @@ public function testIndexValidation(): void $collection->setAttribute('indexes', $indexes); - if (static::getDatabase()->getAdapter()->getMaxIndexLength() > 0) { - $errorMessage = 'Index length is longer than the maximum: ' . static::getDatabase()->getAdapter()->getMaxIndexLength(); + if ($database->getAdapter()->getMaxIndexLength() > 0) { + $errorMessage = 'Index length is longer than the maximum: ' . $database->getAdapter()->getMaxIndexLength(); $this->assertFalse($validator->isValid($indexes[0])); $this->assertEquals($errorMessage, $validator->getDescription()); try { - static::getDatabase()->createCollection($collection->getId(), $attributes, $indexes); + $database->createCollection($collection->getId(), $attributes, $indexes); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals($errorMessage, $e->getMessage()); @@ -230,15 +236,15 @@ public function testIndexValidation(): void $validator = new Index( $attributes, - static::getDatabase()->getAdapter()->getMaxIndexLength(), - static::getDatabase()->getAdapter()->getInternalIndexesKeys() + $database->getAdapter()->getMaxIndexLength(), + $database->getAdapter()->getInternalIndexesKeys() ); $errorMessage = 'Attribute "integer" cannot be part of a FULLTEXT index, must be of type string'; $this->assertFalse($validator->isValid($indexes[0])); $this->assertEquals($errorMessage, $validator->getDescription()); try { - static::getDatabase()->createCollection($collection->getId(), $attributes, $indexes); + $database->createCollection($collection->getId(), $attributes, $indexes); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals($errorMessage, $e->getMessage()); @@ -260,7 +266,7 @@ public function testIndexValidation(): void $this->assertEquals($errorMessage, $validator->getDescription()); try { - static::getDatabase()->createCollection(ID::unique(), $attributes, $indexes); + $database->createCollection(ID::unique(), $attributes, $indexes); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals($errorMessage, $e->getMessage()); @@ -281,7 +287,7 @@ public function testIndexValidation(): void $this->assertEquals($errorMessage, $validator->getDescription()); try { - static::getDatabase()->createCollection(ID::unique(), $attributes, $indexes); + $database->createCollection(ID::unique(), $attributes, $indexes); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals($errorMessage, $e->getMessage()); @@ -336,22 +342,25 @@ public function testRenameIndexExisting(): void public function testExceptionIndexLimit(): void { - static::getDatabase()->createCollection('indexLimit'); + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createCollection('indexLimit'); // add unique attributes for indexing for ($i = 0; $i < 64; $i++) { - $this->assertEquals(true, static::getDatabase()->createAttribute('indexLimit', "test{$i}", Database::VAR_STRING, 16, true)); + $this->assertEquals(true, $database->createAttribute('indexLimit', "test{$i}", Database::VAR_STRING, 16, true)); } // Testing for indexLimit // Add up to the limit, then check if the next index throws IndexLimitException for ($i = 0; $i < ($this->getDatabase()->getLimitForIndexes()); $i++) { - $this->assertEquals(true, static::getDatabase()->createIndex('indexLimit', "index{$i}", Database::INDEX_KEY, ["test{$i}"], [16])); + $this->assertEquals(true, $database->createIndex('indexLimit', "index{$i}", Database::INDEX_KEY, ["test{$i}"], [16])); } $this->expectException(LimitException::class); - $this->assertEquals(false, static::getDatabase()->createIndex('indexLimit', "index64", Database::INDEX_KEY, ["test64"], [16])); + $this->assertEquals(false, $database->createIndex('indexLimit', "index64", Database::INDEX_KEY, ["test64"], [16])); - static::getDatabase()->deleteCollection('indexLimit'); + $database->deleteCollection('indexLimit'); } public function testListDocumentSearch(): void @@ -362,8 +371,11 @@ public function testListDocumentSearch(): void return; } - static::getDatabase()->createIndex('documents', 'string', Database::INDEX_FULLTEXT, ['string']); - static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createIndex('documents', 'string', Database::INDEX_FULLTEXT, ['string']); + $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -385,7 +397,7 @@ public function testListDocumentSearch(): void /** * Allow reserved keywords for search */ - $documents = static::getDatabase()->find('documents', [ + $documents = $database->find('documents', [ Query::search('string', '*test+alias@email-provider.com'), ]); @@ -394,12 +406,15 @@ public function testListDocumentSearch(): void public function testMaxQueriesValues(): void { - $max = static::getDatabase()->getMaxQueryValues(); + /** @var Database $database */ + $database = static::getDatabase(); - static::getDatabase()->setMaxQueryValues(5); + $max = $database->getMaxQueryValues(); + + $database->setMaxQueryValues(5); try { - static::getDatabase()->find( + $database->find( 'documents', [Query::equal('$id', [1, 2, 3, 4, 5, 6])] ); @@ -409,7 +424,7 @@ public function testMaxQueriesValues(): void $this->assertEquals('Invalid query: Query on attribute has greater than 5 values: $id', $e->getMessage()); } - static::getDatabase()->setMaxQueryValues($max); + $database->setMaxQueryValues($max); } public function testEmptySearch(): void @@ -420,17 +435,20 @@ public function testEmptySearch(): void return; } - $documents = static::getDatabase()->find('documents', [ + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find('documents', [ Query::search('string', ''), ]); $this->assertEquals(0, count($documents)); - $documents = static::getDatabase()->find('documents', [ + $documents = $database->find('documents', [ Query::search('string', '*'), ]); $this->assertEquals(0, count($documents)); - $documents = static::getDatabase()->find('documents', [ + $documents = $database->find('documents', [ Query::search('string', '<>'), ]); $this->assertEquals(0, count($documents)); diff --git a/tests/e2e/Adapter/Scopes/PermissionTests.php b/tests/e2e/Adapter/Scopes/PermissionTests.php index 64ed5bb6b..e2c82600f 100644 --- a/tests/e2e/Adapter/Scopes/PermissionTests.php +++ b/tests/e2e/Adapter/Scopes/PermissionTests.php @@ -19,7 +19,10 @@ public function testReadPermissionsFailure(): Document Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $document = static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument('documents', new Document([ '$permissions' => [ Permission::read(Role::user('1')), Permission::create(Role::user('1')), @@ -39,7 +42,7 @@ public function testReadPermissionsFailure(): Document Authorization::cleanRoles(); - $document = static::getDatabase()->getDocument($document->getCollection(), $document->getId()); + $document = $database->getDocument($document->getCollection(), $document->getId()); $this->assertEquals(true, $document->isEmpty()); @@ -50,7 +53,10 @@ public function testReadPermissionsFailure(): Document public function testNoChangeUpdateDocumentWithoutPermission(): Document { - $document = static::getDatabase()->createDocument('documents', new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument('documents', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()) @@ -66,7 +72,7 @@ public function testNoChangeUpdateDocumentWithoutPermission(): Document 'colors' => ['pink', 'green', 'blue'], ])); - $updatedDocument = static::getDatabase()->updateDocument( + $updatedDocument = $database->updateDocument( 'documents', $document->getId(), $document @@ -76,7 +82,7 @@ public function testNoChangeUpdateDocumentWithoutPermission(): Document // It should also not throw any authorization exception without any permission because of no change. $this->assertEquals($updatedDocument->getUpdatedAt(), $document->getUpdatedAt()); - $document = static::getDatabase()->createDocument('documents', new Document([ + $document = $database->createDocument('documents', new Document([ '$id' => ID::unique(), '$permissions' => [], 'string' => 'text📝', @@ -92,7 +98,7 @@ public function testNoChangeUpdateDocumentWithoutPermission(): Document // Should throw exception, because nothing was updated, but there was no read permission try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'documents', $document->getId(), $document @@ -106,14 +112,17 @@ public function testNoChangeUpdateDocumentWithoutPermission(): Document public function testUpdateDocumentsPermissions(): void { - if (!static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } $collection = 'testUpdateDocumentsPerms'; - static::getDatabase()->createCollection($collection, attributes: [ + $database->createCollection($collection, attributes: [ new Document([ '$id' => ID::custom('string'), 'type' => Database::VAR_STRING, @@ -123,9 +132,9 @@ public function testUpdateDocumentsPermissions(): void ], permissions: [], documentSecurity: true); // Test we can bulk update permissions we have access to - Authorization::skip(function () use ($collection) { + Authorization::skip(function () use ($collection, $database) { for ($i = 0; $i < 10; $i++) { - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$id' => 'doc' . $i, 'string' => 'text📝 ' . $i, '$permissions' => [ @@ -137,7 +146,7 @@ public function testUpdateDocumentsPermissions(): void ])); } - static::getDatabase()->createDocument($collection, new Document([ + $database->createDocument($collection, new Document([ '$id' => 'doc' . $i, 'string' => 'text📝 ' . $i, '$permissions' => [ @@ -149,7 +158,7 @@ public function testUpdateDocumentsPermissions(): void ])); }); - $modified = static::getDatabase()->updateDocuments($collection, new Document([ + $modified = $database->updateDocuments($collection, new Document([ '$permissions' => [ Permission::read(Role::user('user2')), Permission::create(Role::user('user2')), @@ -158,8 +167,11 @@ public function testUpdateDocumentsPermissions(): void ], ])); - $documents = Authorization::skip(function () use ($collection) { - return static::getDatabase()->find($collection); + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = Authorization::skip(function () use ($collection, $database) { + return $database->find($collection); }); $this->assertEquals(10, $modified); @@ -190,7 +202,7 @@ public function testUpdateDocumentsPermissions(): void Authorization::setRole(Role::user('user2')->toString()); // Test Bulk permission update with data - $modified = static::getDatabase()->updateDocuments($collection, new Document([ + $modified = $database->updateDocuments($collection, new Document([ '$permissions' => [ Permission::read(Role::user('user3')), Permission::create(Role::user('user3')), @@ -224,7 +236,10 @@ public function testUpdateDocumentsPermissions(): void public function testCollectionPermissions(): Document { - $collection = static::getDatabase()->createCollection('collectionSecurity', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $collection = $database->createCollection('collectionSecurity', permissions: [ Permission::create(Role::users()), Permission::read(Role::users()), Permission::update(Role::users()), @@ -233,7 +248,7 @@ public function testCollectionPermissions(): Document $this->assertInstanceOf(Document::class, $collection); - $this->assertTrue(static::getDatabase()->createAttribute( + $this->assertTrue($database->createAttribute( collection: $collection->getId(), id: 'test', type: Database::VAR_STRING, @@ -255,7 +270,10 @@ public function testCollectionPermissionsCountThrowsException(array $data): void Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $count = static::getDatabase()->count( + /** @var Database $database */ + $database = static::getDatabase(); + + $count = $database->count( $collection->getId() ); $this->assertEmpty($count); @@ -273,7 +291,10 @@ public function testCollectionPermissionsCountWorks(array $data): array Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $count = static::getDatabase()->count( + /** @var Database $database */ + $database = static::getDatabase(); + + $count = $database->count( $collection->getId() ); @@ -291,7 +312,10 @@ public function testCollectionPermissionsCreateThrowsException(Document $collect Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - static::getDatabase()->createDocument($collection->getId(), new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createDocument($collection->getId(), new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), @@ -311,7 +335,10 @@ public function testCollectionPermissionsCreateWorks(Document $collection): arra Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $document = static::getDatabase()->createDocument($collection->getId(), new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument($collection->getId(), new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::user('random')), @@ -337,7 +364,11 @@ public function testCollectionPermissionsDeleteThrowsException(array $data): voi Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - static::getDatabase()->deleteDocument( + + /** @var Database $database */ + $database = static::getDatabase(); + + $database->deleteDocument( $collection->getId(), $document->getId() ); @@ -354,7 +385,10 @@ public function testCollectionPermissionsDeleteWorks(array $data): void Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $this->assertTrue(static::getDatabase()->deleteDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertTrue($database->deleteDocument( $collection->getId(), $document->getId() )); @@ -362,8 +396,11 @@ public function testCollectionPermissionsDeleteWorks(array $data): void public function testCollectionPermissionsExceptions(): void { + /** @var Database $database */ + $database = static::getDatabase(); + $this->expectException(DatabaseException::class); - static::getDatabase()->createCollection('collectionSecurity', permissions: [ + $database->createCollection('collectionSecurity', permissions: [ 'i dont work' ]); } @@ -380,7 +417,11 @@ public function testCollectionPermissionsFindThrowsException(array $data): void Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - static::getDatabase()->find($collection->getId()); + + /** @var Database $database */ + $database = static::getDatabase(); + + $database->find($collection->getId()); } /** @@ -395,14 +436,17 @@ public function testCollectionPermissionsFindWorks(array $data): array Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $documents = static::getDatabase()->find($collection->getId()); + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find($collection->getId()); $this->assertNotEmpty($documents); Authorization::cleanRoles(); Authorization::setRole(Role::user('random')->toString()); try { - static::getDatabase()->find($collection->getId()); + $database->find($collection->getId()); $this->fail('Failed to throw exception'); } catch (AuthorizationException) { } @@ -421,7 +465,10 @@ public function testCollectionPermissionsGetThrowsException(array $data): void Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $document = static::getDatabase()->getDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument( $collection->getId(), $document->getId(), ); @@ -441,7 +488,10 @@ public function testCollectionPermissionsGetWorks(array $data): array Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $document = static::getDatabase()->getDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument( $collection->getId(), $document->getId() ); @@ -456,7 +506,10 @@ public function testCollectionPermissionsGetWorks(array $data): array */ public function testCollectionPermissionsRelationships(): array { - $collection = static::getDatabase()->createCollection('collectionSecurity.Parent', permissions: [ + /** @var Database $database */ + $database = static::getDatabase(); + + $collection = $database->createCollection('collectionSecurity.Parent', permissions: [ Permission::create(Role::users()), Permission::read(Role::users()), Permission::update(Role::users()), @@ -465,7 +518,7 @@ public function testCollectionPermissionsRelationships(): array $this->assertInstanceOf(Document::class, $collection); - $this->assertTrue(static::getDatabase()->createAttribute( + $this->assertTrue($database->createAttribute( collection: $collection->getId(), id: 'test', type: Database::VAR_STRING, @@ -473,7 +526,7 @@ public function testCollectionPermissionsRelationships(): array required: false )); - $collectionOneToOne = static::getDatabase()->createCollection('collectionSecurity.OneToOne', permissions: [ + $collectionOneToOne = $database->createCollection('collectionSecurity.OneToOne', permissions: [ Permission::create(Role::users()), Permission::read(Role::users()), Permission::update(Role::users()), @@ -482,7 +535,7 @@ public function testCollectionPermissionsRelationships(): array $this->assertInstanceOf(Document::class, $collectionOneToOne); - $this->assertTrue(static::getDatabase()->createAttribute( + $this->assertTrue($database->createAttribute( collection: $collectionOneToOne->getId(), id: 'test', type: Database::VAR_STRING, @@ -490,7 +543,7 @@ public function testCollectionPermissionsRelationships(): array required: false )); - $this->assertTrue(static::getDatabase()->createRelationship( + $this->assertTrue($database->createRelationship( collection: $collection->getId(), relatedCollection: $collectionOneToOne->getId(), type: Database::RELATION_ONE_TO_ONE, @@ -498,7 +551,7 @@ public function testCollectionPermissionsRelationships(): array onDelete: Database::RELATION_MUTATE_CASCADE )); - $collectionOneToMany = static::getDatabase()->createCollection('collectionSecurity.OneToMany', permissions: [ + $collectionOneToMany = $database->createCollection('collectionSecurity.OneToMany', permissions: [ Permission::create(Role::users()), Permission::read(Role::users()), Permission::update(Role::users()), @@ -507,7 +560,7 @@ public function testCollectionPermissionsRelationships(): array $this->assertInstanceOf(Document::class, $collectionOneToMany); - $this->assertTrue(static::getDatabase()->createAttribute( + $this->assertTrue($database->createAttribute( collection: $collectionOneToMany->getId(), id: 'test', type: Database::VAR_STRING, @@ -515,7 +568,7 @@ public function testCollectionPermissionsRelationships(): array required: false )); - $this->assertTrue(static::getDatabase()->createRelationship( + $this->assertTrue($database->createRelationship( collection: $collection->getId(), relatedCollection: $collectionOneToMany->getId(), type: Database::RELATION_ONE_TO_MANY, @@ -537,7 +590,10 @@ public function testCollectionPermissionsRelationshipsCountWorks(array $data): v Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $documents = static::getDatabase()->count( + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->count( $collection->getId() ); @@ -546,7 +602,7 @@ public function testCollectionPermissionsRelationshipsCountWorks(array $data): v Authorization::cleanRoles(); Authorization::setRole(Role::user('random')->toString()); - $documents = static::getDatabase()->count( + $documents = $database->count( $collection->getId() ); @@ -555,7 +611,7 @@ public function testCollectionPermissionsRelationshipsCountWorks(array $data): v Authorization::cleanRoles(); Authorization::setRole(Role::user('unknown')->toString()); - $documents = static::getDatabase()->count( + $documents = $database->count( $collection->getId() ); @@ -574,7 +630,10 @@ public function testCollectionPermissionsRelationshipsCreateThrowsException(arra Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - static::getDatabase()->createDocument($collection->getId(), new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $database->createDocument($collection->getId(), new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), @@ -596,7 +655,11 @@ public function testCollectionPermissionsRelationshipsDeleteThrowsException(arra Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - $document = static::getDatabase()->deleteDocument( + + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->deleteDocument( $collection->getId(), $document->getId() ); @@ -613,7 +676,10 @@ public function testCollectionPermissionsRelationshipsCreateWorks(array $data): Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $document = static::getDatabase()->createDocument($collection->getId(), new Document([ + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->createDocument($collection->getId(), new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::user('random')), @@ -666,7 +732,10 @@ public function testCollectionPermissionsRelationshipsDeleteWorks(array $data): Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $this->assertTrue(static::getDatabase()->deleteDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertTrue($database->deleteDocument( $collection->getId(), $document->getId() )); @@ -683,7 +752,10 @@ public function testCollectionPermissionsRelationshipsFindWorks(array $data): vo Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $documents = static::getDatabase()->find( + /** @var Database $database */ + $database = static::getDatabase(); + + $documents = $database->find( $collection->getId() ); @@ -699,7 +771,7 @@ public function testCollectionPermissionsRelationshipsFindWorks(array $data): vo Authorization::cleanRoles(); Authorization::setRole(Role::user('random')->toString()); - $documents = static::getDatabase()->find( + $documents = $database->find( $collection->getId() ); @@ -715,7 +787,7 @@ public function testCollectionPermissionsRelationshipsFindWorks(array $data): vo Authorization::cleanRoles(); Authorization::setRole(Role::user('unknown')->toString()); - $documents = static::getDatabase()->find( + $documents = $database->find( $collection->getId() ); @@ -734,7 +806,10 @@ public function testCollectionPermissionsRelationshipsGetThrowsException(array $ Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $document = static::getDatabase()->getDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument( $collection->getId(), $document->getId(), ); @@ -754,7 +829,10 @@ public function testCollectionPermissionsRelationshipsGetWorks(array $data): arr Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $document = static::getDatabase()->getDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->getDocument( $collection->getId(), $document->getId() ); @@ -768,7 +846,7 @@ public function testCollectionPermissionsRelationshipsGetWorks(array $data): arr Authorization::cleanRoles(); Authorization::setRole(Role::user('random')->toString()); - $document = static::getDatabase()->getDocument( + $document = $database->getDocument( $collection->getId(), $document->getId() ); @@ -794,7 +872,11 @@ public function testCollectionPermissionsRelationshipsUpdateThrowsException(arra Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - $document = static::getDatabase()->updateDocument( + + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->updateDocument( $collection->getId(), $document->getId(), $document->setAttribute('test', $document->getAttribute('test').'new_value') @@ -812,7 +894,11 @@ public function testCollectionPermissionsRelationshipsUpdateWorks(array $data): Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - static::getDatabase()->updateDocument( + + /** @var Database $database */ + $database = static::getDatabase(); + + $database->updateDocument( $collection->getId(), $document->getId(), $document @@ -823,7 +909,7 @@ public function testCollectionPermissionsRelationshipsUpdateWorks(array $data): Authorization::cleanRoles(); Authorization::setRole(Role::user('random')->toString()); - static::getDatabase()->updateDocument( + $database->updateDocument( $collection->getId(), $document->getId(), $document->setAttribute('test', 'ipsum') @@ -845,7 +931,11 @@ public function testCollectionPermissionsUpdateThrowsException(array $data): voi Authorization::setRole(Role::any()->toString()); $this->expectException(AuthorizationException::class); - $document = static::getDatabase()->updateDocument( + + /** @var Database $database */ + $database = static::getDatabase(); + + $document = $database->updateDocument( $collection->getId(), $document->getId(), $document->setAttribute('test', 'lorem') @@ -864,7 +954,10 @@ public function testCollectionPermissionsUpdateWorks(array $data): array Authorization::cleanRoles(); Authorization::setRole(Role::users()->toString()); - $this->assertInstanceOf(Document::class, static::getDatabase()->updateDocument( + /** @var Database $database */ + $database = static::getDatabase(); + + $this->assertInstanceOf(Document::class, $database->updateDocument( $collection->getId(), $document->getId(), $document->setAttribute('test', 'ipsum') @@ -879,7 +972,11 @@ public function testCollectionPermissionsUpdateWorks(array $data): array public function testCollectionUpdatePermissionsThrowException(Document $collection): void { $this->expectException(DatabaseException::class); - static::getDatabase()->updateCollection($collection->getId(), permissions: [ + + /** @var Database $database */ + $database = static::getDatabase(); + + $database->updateCollection($collection->getId(), permissions: [ 'i dont work' ], documentSecurity: false); } @@ -960,7 +1057,10 @@ public function testWritePermissions(): void public function testCreateRelationDocumentWithoutUpdatePermission(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -968,20 +1068,20 @@ public function testCreateRelationDocumentWithoutUpdatePermission(): void Authorization::cleanRoles(); Authorization::setRole(Role::user('a')->toString()); - static::getDatabase()->createCollection('parentRelationTest', [], [], [ + $database->createCollection('parentRelationTest', [], [], [ Permission::read(Role::user('a')), Permission::create(Role::user('a')), Permission::update(Role::user('a')), Permission::delete(Role::user('a')) ]); - static::getDatabase()->createCollection('childRelationTest', [], [], [ + $database->createCollection('childRelationTest', [], [], [ Permission::create(Role::user('a')), Permission::read(Role::user('a')), ]); - static::getDatabase()->createAttribute('parentRelationTest', 'name', Database::VAR_STRING, 255, false); - static::getDatabase()->createAttribute('childRelationTest', 'name', Database::VAR_STRING, 255, false); + $database->createAttribute('parentRelationTest', 'name', Database::VAR_STRING, 255, false); + $database->createAttribute('childRelationTest', 'name', Database::VAR_STRING, 255, false); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'parentRelationTest', relatedCollection: 'childRelationTest', type: Database::RELATION_ONE_TO_MANY, @@ -989,7 +1089,7 @@ public function testCreateRelationDocumentWithoutUpdatePermission(): void ); // Create document with relationship with nested data - $parent = static::getDatabase()->createDocument('parentRelationTest', new Document([ + $parent = $database->createDocument('parentRelationTest', new Document([ '$id' => 'parent1', 'name' => 'Parent 1', 'children' => [ @@ -1005,12 +1105,12 @@ public function testCreateRelationDocumentWithoutUpdatePermission(): void '$id' => 'child2', ], ]); - $updatedParent = static::getDatabase()->updateDocument('parentRelationTest', 'parent1', $parent); + $updatedParent = $database->updateDocument('parentRelationTest', 'parent1', $parent); $this->assertEquals('child2', $updatedParent->getAttribute('children')[0]->getId()); - static::getDatabase()->deleteCollection('parentRelationTest'); - static::getDatabase()->deleteCollection('childRelationTest'); + $database->deleteCollection('parentRelationTest'); + $database->deleteCollection('childRelationTest'); } } diff --git a/tests/e2e/Adapter/Scopes/RelationshipTests.php b/tests/e2e/Adapter/Scopes/RelationshipTests.php index e952c502d..f7623db49 100644 --- a/tests/e2e/Adapter/Scopes/RelationshipTests.php +++ b/tests/e2e/Adapter/Scopes/RelationshipTests.php @@ -29,182 +29,188 @@ trait RelationshipTests public function testDeleteRelatedCollection(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createCollection('c2'); + $database->createCollection('c1'); + $database->createCollection('c2'); // ONE_TO_ONE - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_ONE, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_ONE, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c2'); - static::getDatabase()->createRelationship( + $database->createCollection('c2'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_ONE, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_ONE, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); // ONE_TO_MANY - static::getDatabase()->createCollection('c2'); - static::getDatabase()->createRelationship( + $database->createCollection('c2'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_MANY, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_MANY, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c2'); - static::getDatabase()->createRelationship( + $database->createCollection('c2'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_MANY, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_ONE_TO_MANY, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); // RELATION_MANY_TO_ONE - static::getDatabase()->createCollection('c2'); - static::getDatabase()->createRelationship( + $database->createCollection('c2'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_MANY_TO_ONE, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_MANY_TO_ONE, ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c2'); - static::getDatabase()->createRelationship( + $database->createCollection('c2'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_MANY_TO_ONE, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c1')); - $collection = static::getDatabase()->getCollection('c2'); + $this->assertEquals(true, $database->deleteCollection('c1')); + $collection = $database->getCollection('c2'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); - static::getDatabase()->createCollection('c1'); - static::getDatabase()->createRelationship( + $database->createCollection('c1'); + $database->createRelationship( collection: 'c1', relatedCollection: 'c2', type: Database::RELATION_MANY_TO_ONE, twoWay: true ); - $this->assertEquals(true, static::getDatabase()->deleteCollection('c2')); - $collection = static::getDatabase()->getCollection('c1'); + $this->assertEquals(true, $database->deleteCollection('c2')); + $collection = $database->getCollection('c1'); $this->assertCount(0, $collection->getAttribute('attributes')); $this->assertCount(0, $collection->getAttribute('indexes')); } public function testVirtualRelationsAttributes(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('v1'); - static::getDatabase()->createCollection('v2'); + $database->createCollection('v1'); + $database->createCollection('v2'); /** * RELATION_ONE_TO_ONE * TwoWay is false no attribute is created on v2 */ - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'v1', relatedCollection: 'v2', type: Database::RELATION_ONE_TO_ONE, @@ -212,7 +218,7 @@ public function testVirtualRelationsAttributes(): void ); try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$id' => 'doc1', '$permissions' => [], 'v1' => 'invalid_value', @@ -223,7 +229,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$id' => 'doc1', '$permissions' => [], 'v1' => [ @@ -237,7 +243,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->find('v2', [ + $database->find('v2', [ Query::equal('v1', ['virtual_attribute']), ]); $this->fail('Failed to throw exception'); @@ -248,7 +254,7 @@ public function testVirtualRelationsAttributes(): void /** * Success for later test update */ - $doc = static::getDatabase()->createDocument('v1', new Document([ + $doc = $database->createDocument('v1', new Document([ '$id' => 'man', '$permissions' => [ Permission::update(Role::any()), @@ -266,7 +272,7 @@ public function testVirtualRelationsAttributes(): void $this->assertEquals('man', $doc->getId()); try { - static::getDatabase()->updateDocument('v1', 'man', new Document([ + $database->updateDocument('v1', 'man', new Document([ '$permissions' => [], 'v2' => [[ '$id' => 'woman', @@ -278,13 +284,13 @@ public function testVirtualRelationsAttributes(): void $this->assertInstanceOf(RelationshipException::class, $e); } - static::getDatabase()->deleteRelationship('v1', 'v2'); + $database->deleteRelationship('v1', 'v2'); /** * RELATION_ONE_TO_MANY * No attribute is created in V1 collection */ - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'v1', relatedCollection: 'v2', type: Database::RELATION_ONE_TO_MANY, @@ -292,7 +298,7 @@ public function testVirtualRelationsAttributes(): void ); try { - static::getDatabase()->createDocument('v1', new Document([ + $database->createDocument('v1', new Document([ '$id' => 'doc1', '$permissions' => [], 'v2' => [ // Expecting Array of arrays or array of strings, object provided @@ -306,7 +312,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v1', new Document([ + $database->createDocument('v1', new Document([ '$permissions' => [], 'v2' => 'invalid_value', ])); @@ -316,7 +322,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$id' => 'doc1', '$permissions' => [], 'v1' => [[ // Expecting a string or an object ,array provided @@ -332,7 +338,7 @@ public function testVirtualRelationsAttributes(): void /** * Success for later test update */ - $doc = static::getDatabase()->createDocument('v2', new Document([ + $doc = $database->createDocument('v2', new Document([ '$id' => 'v2_uid', '$permissions' => [ Permission::update(Role::any()), @@ -352,7 +358,7 @@ public function testVirtualRelationsAttributes(): void */ try { - static::getDatabase()->updateDocument('v1', 'v1_uid', new Document([ + $database->updateDocument('v1', 'v1_uid', new Document([ '$permissions' => [], 'v2' => [ // Expecting array of arrays or array of strings, object given '$id' => 'v2_uid', @@ -365,7 +371,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->updateDocument('v1', 'v1_uid', new Document([ + $database->updateDocument('v1', 'v1_uid', new Document([ '$permissions' => [], 'v2' => 'v2_uid' ])); @@ -375,7 +381,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->updateDocument('v2', 'v2_uid', new Document([ + $database->updateDocument('v2', 'v2_uid', new Document([ '$permissions' => [], 'v1' => [ '$id' => null, // Invalid value @@ -392,7 +398,7 @@ public function testVirtualRelationsAttributes(): void * Added in Filter.php Text validator for relationship */ try { - static::getDatabase()->find('v2', [ + $database->find('v2', [ //@phpstan-ignore-next-line Query::equal('v1', [['doc1']]), ]); @@ -402,7 +408,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->find('v1', [ + $database->find('v1', [ Query::equal('v2', ['virtual_attribute']), ]); $this->fail('Failed to throw exception'); @@ -410,13 +416,13 @@ public function testVirtualRelationsAttributes(): void $this->assertTrue($e instanceof QueryException); } - static::getDatabase()->deleteRelationship('v1', 'v2'); + $database->deleteRelationship('v1', 'v2'); /** * RELATION_MANY_TO_ONE * No attribute is created in V2 collection */ - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'v1', relatedCollection: 'v2', type: Database::RELATION_MANY_TO_ONE, @@ -424,7 +430,7 @@ public function testVirtualRelationsAttributes(): void ); try { - static::getDatabase()->createDocument('v1', new Document([ + $database->createDocument('v1', new Document([ '$id' => 'doc', '$permissions' => [], 'v2' => [[ // Expecting an object or a string array provided @@ -438,7 +444,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$permissions' => [], 'v1' => 'invalid_value', ])); @@ -448,7 +454,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$id' => 'doc', '$permissions' => [], 'v1' => [ // Expecting an array, object provided @@ -462,7 +468,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->find('v2', [ + $database->find('v2', [ Query::equal('v1', ['virtual_attribute']), ]); $this->fail('Failed to throw exception'); @@ -473,7 +479,7 @@ public function testVirtualRelationsAttributes(): void /** * Success for later test update */ - $doc = static::getDatabase()->createDocument('v1', new Document([ + $doc = $database->createDocument('v1', new Document([ '$id' => 'doc1', '$permissions' => [ Permission::update(Role::any()), @@ -491,7 +497,7 @@ public function testVirtualRelationsAttributes(): void $this->assertEquals('doc1', $doc->getId()); try { - static::getDatabase()->updateDocument('v1', 'doc1', new Document([ + $database->updateDocument('v1', 'doc1', new Document([ '$permissions' => [ Permission::update(Role::any()), Permission::read(Role::any()), @@ -504,7 +510,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->updateDocument('v2', 'doc2', new Document([ + $database->updateDocument('v2', 'doc2', new Document([ '$permissions' => [], 'v1' => null ])); @@ -513,13 +519,13 @@ public function testVirtualRelationsAttributes(): void $this->assertTrue($e instanceof RelationshipException); } - static::getDatabase()->deleteRelationship('v1', 'v2'); + $database->deleteRelationship('v1', 'v2'); /** * RELATION_MANY_TO_MANY * No attribute on V1/v2 collections only on junction table */ - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'v1', relatedCollection: 'v2', type: Database::RELATION_MANY_TO_MANY, @@ -529,7 +535,7 @@ public function testVirtualRelationsAttributes(): void ); try { - static::getDatabase()->createDocument('v1', new Document([ + $database->createDocument('v1', new Document([ '$permissions' => [], 'students' => 'invalid_value', ])); @@ -539,7 +545,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$permissions' => [], 'classes' => 'invalid_value', ])); @@ -549,7 +555,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->createDocument('v2', new Document([ + $database->createDocument('v2', new Document([ '$id' => 'doc', '$permissions' => [], 'classes' => [ // Expected array, object provided @@ -563,7 +569,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->find('v1', [ + $database->find('v1', [ Query::equal('students', ['virtual_attribute']), ]); $this->fail('Failed to throw exception'); @@ -572,7 +578,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->find('v2', [ + $database->find('v2', [ Query::equal('classes', ['virtual_attribute']), ]); $this->fail('Failed to throw exception'); @@ -584,7 +590,7 @@ public function testVirtualRelationsAttributes(): void * Success for later test update */ - $doc = static::getDatabase()->createDocument('v1', new Document([ + $doc = $database->createDocument('v1', new Document([ '$id' => 'class1', '$permissions' => [ Permission::update(Role::any()), @@ -611,7 +617,7 @@ public function testVirtualRelationsAttributes(): void $this->assertEquals('class1', $doc->getId()); try { - static::getDatabase()->updateDocument('v1', 'class1', new Document([ + $database->updateDocument('v1', 'class1', new Document([ '$permissions' => [ Permission::update(Role::any()), Permission::read(Role::any()), @@ -630,7 +636,7 @@ public function testVirtualRelationsAttributes(): void } try { - static::getDatabase()->updateDocument('v1', 'class1', new Document([ + $database->updateDocument('v1', 'class1', new Document([ '$permissions' => [ Permission::update(Role::any()), Permission::read(Role::any()), @@ -645,22 +651,25 @@ public function testVirtualRelationsAttributes(): void public function testStructureValidationAfterRelationsAttribute(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection("structure_1", [], [], [Permission::create(Role::any())]); - static::getDatabase()->createCollection("structure_2", [], [], [Permission::create(Role::any())]); + $database->createCollection("structure_1", [], [], [Permission::create(Role::any())]); + $database->createCollection("structure_2", [], [], [Permission::create(Role::any())]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: "structure_1", relatedCollection: "structure_2", type: Database::RELATION_ONE_TO_ONE, ); try { - static::getDatabase()->createDocument('structure_1', new Document([ + $database->createDocument('structure_1', new Document([ '$permissions' => [ Permission::read(Role::any()), ], @@ -676,7 +685,10 @@ public function testStructureValidationAfterRelationsAttribute(): void public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -697,13 +709,13 @@ public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void Permission::delete(Role::any()), ]; for ($i = 1; $i < 6; $i++) { - static::getDatabase()->createCollection("level{$i}", [$attribute], [], $permissions); + $database->createCollection("level{$i}", [$attribute], [], $permissions); } for ($i = 1; $i < 5; $i++) { $collectionId = $i; $relatedCollectionId = $i + 1; - static::getDatabase()->createRelationship( + $database->createRelationship( collection: "level{$collectionId}", relatedCollection: "level{$relatedCollectionId}", type: Database::RELATION_ONE_TO_ONE, @@ -712,7 +724,7 @@ public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void } // Create document with relationship with nested data - $level1 = static::getDatabase()->createDocument('level1', new Document([ + $level1 = $database->createDocument('level1', new Document([ '$id' => 'level1', '$permissions' => [], 'name' => 'Level 1', @@ -737,18 +749,18 @@ public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void ], ], ])); - static::getDatabase()->updateDocument('level1', $level1->getId(), new Document($level1->getArrayCopy())); - $updatedLevel1 = static::getDatabase()->getDocument('level1', $level1->getId()); + $database->updateDocument('level1', $level1->getId(), new Document($level1->getArrayCopy())); + $updatedLevel1 = $database->getDocument('level1', $level1->getId()); $this->assertEquals($level1, $updatedLevel1); try { - static::getDatabase()->updateDocument('level1', $level1->getId(), $level1->setAttribute('name', 'haha')); + $database->updateDocument('level1', $level1->getId(), $level1->setAttribute('name', 'haha')); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(AuthorizationException::class, $e); } $level1->setAttribute('name', 'Level 1'); - static::getDatabase()->updateCollection('level3', [ + $database->updateCollection('level3', [ Permission::read(Role::any()), Permission::create(Role::any()), Permission::update(Role::any()), @@ -761,11 +773,11 @@ public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void $level2->setAttribute('level3', $level3); $level1->setAttribute('level2', $level2); - $level1 = static::getDatabase()->updateDocument('level1', $level1->getId(), $level1); + $level1 = $database->updateDocument('level1', $level1->getId(), $level1); $this->assertEquals('updated value', $level1['level2']['level3']['name']); for ($i = 1; $i < 6; $i++) { - static::getDatabase()->deleteCollection("level{$i}"); + $database->deleteCollection("level{$i}"); } } @@ -773,24 +785,27 @@ public function testNoChangeUpdateDocumentWithRelationWithoutPermission(): void public function testUpdateAttributeRenameRelationshipTwoWay(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('rn_rs_test_a'); - static::getDatabase()->createCollection('rn_rs_test_b'); + $database->createCollection('rn_rs_test_a'); + $database->createCollection('rn_rs_test_b'); - static::getDatabase()->createAttribute('rn_rs_test_b', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('rn_rs_test_b', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( 'rn_rs_test_a', 'rn_rs_test_b', Database::RELATION_ONE_TO_ONE, true ); - $docA = static::getDatabase()->createDocument('rn_rs_test_a', new Document([ + $docA = $database->createDocument('rn_rs_test_a', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -803,45 +818,48 @@ public function testUpdateAttributeRenameRelationshipTwoWay(): void ] ])); - $docB = static::getDatabase()->getDocument('rn_rs_test_b', 'b1'); + $docB = $database->getDocument('rn_rs_test_b', 'b1'); $this->assertArrayHasKey('rn_rs_test_a', $docB->getAttributes()); $this->assertEquals('B1', $docB->getAttribute('name')); // Rename attribute - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'rn_rs_test_a', id: 'rn_rs_test_b', newKey: 'rn_rs_test_b_renamed' ); // Rename again - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'rn_rs_test_a', id: 'rn_rs_test_b_renamed', newKey: 'rn_rs_test_b_renamed_2' ); // Check our data is OK - $docA = static::getDatabase()->getDocument('rn_rs_test_a', $docA->getId()); + $docA = $database->getDocument('rn_rs_test_a', $docA->getId()); $this->assertArrayHasKey('rn_rs_test_b_renamed_2', $docA->getAttributes()); $this->assertEquals($docB->getId(), $docA->getAttribute('rn_rs_test_b_renamed_2')['$id']); } public function testNoInvalidKeysWithRelationships(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('species'); - static::getDatabase()->createCollection('creatures'); - static::getDatabase()->createCollection('characteristics'); + $database->createCollection('species'); + $database->createCollection('creatures'); + $database->createCollection('characteristics'); - static::getDatabase()->createAttribute('species', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('creatures', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('characteristics', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('species', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('creatures', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('characteristics', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'species', relatedCollection: 'creatures', type: Database::RELATION_ONE_TO_ONE, @@ -849,7 +867,7 @@ public function testNoInvalidKeysWithRelationships(): void id: 'creature', twoWayKey:'species' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'creatures', relatedCollection: 'characteristics', type: Database::RELATION_ONE_TO_ONE, @@ -858,7 +876,7 @@ public function testNoInvalidKeysWithRelationships(): void twoWayKey:'creature' ); - $species = static::getDatabase()->createDocument('species', new Document([ + $species = $database->createDocument('species', new Document([ '$id' => ID::custom('1'), '$permissions' => [ Permission::read(Role::any()), @@ -880,7 +898,7 @@ public function testNoInvalidKeysWithRelationships(): void ] ] ])); - static::getDatabase()->updateDocument('species', $species->getId(), new Document([ + $database->updateDocument('species', $species->getId(), new Document([ '$id' => ID::custom('1'), '$collection' => 'species', 'creature' => [ @@ -894,33 +912,36 @@ public function testNoInvalidKeysWithRelationships(): void ] ])); - $updatedSpecies = static::getDatabase()->getDocument('species', $species->getId()); + $updatedSpecies = $database->getDocument('species', $species->getId()); $this->assertEquals($species, $updatedSpecies); } public function testSelectRelationshipAttributes(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('make'); - static::getDatabase()->createCollection('model'); + $database->createCollection('make'); + $database->createCollection('model'); - static::getDatabase()->createAttribute('make', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('model', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('model', 'year', Database::VAR_INTEGER, 0, true); + $database->createAttribute('make', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('model', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('model', 'year', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'make', relatedCollection: 'model', type: Database::RELATION_ONE_TO_MANY, id: 'models' ); - static::getDatabase()->createDocument('make', new Document([ + $database->createDocument('make', new Document([ '$id' => 'ford', '$permissions' => [ Permission::read(Role::any()), @@ -947,7 +968,7 @@ public function testSelectRelationshipAttributes(): void ])); // Select some parent attributes, some child attributes - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', 'models.name']), ]); @@ -969,7 +990,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); // Select internal attributes - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$id']), ]); @@ -985,7 +1006,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); $this->assertArrayHasKey('$permissions', $make); - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$sequence']), ]); @@ -1001,7 +1022,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); $this->assertArrayHasKey('$permissions', $make); - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$collection']), ]); @@ -1017,7 +1038,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); $this->assertArrayHasKey('$permissions', $make); - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$createdAt']), ]); @@ -1033,7 +1054,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); $this->assertArrayHasKey('$permissions', $make); - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$updatedAt']), ]); @@ -1049,7 +1070,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$updatedAt', $make); $this->assertArrayHasKey('$permissions', $make); - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name', '$permissions']), ]); @@ -1066,7 +1087,7 @@ public function testSelectRelationshipAttributes(): void $this->assertArrayHasKey('$permissions', $make); // Select all parent attributes, some child attributes - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['*', 'models.year']), ]); @@ -1082,7 +1103,7 @@ public function testSelectRelationshipAttributes(): void $this->assertEquals(2011, $make['models'][1]['year']); // Select all parent attributes, all child attributes - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['*', 'models.*']), ]); @@ -1099,7 +1120,7 @@ public function testSelectRelationshipAttributes(): void // Select all parent attributes, all child attributes // Must select parent if selecting children - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['models.*']), ]); @@ -1115,7 +1136,7 @@ public function testSelectRelationshipAttributes(): void $this->assertEquals(2011, $make['models'][1]['year']); // Select all parent attributes, no child attributes - $make = static::getDatabase()->findOne('make', [ + $make = $database->findOne('make', [ Query::select(['name']), ]); @@ -1129,20 +1150,23 @@ public function testSelectRelationshipAttributes(): void public function testInheritRelationshipPermissions(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('lawns', permissions: [Permission::create(Role::any())], documentSecurity: true); - static::getDatabase()->createCollection('trees', permissions: [Permission::create(Role::any())], documentSecurity: true); - static::getDatabase()->createCollection('birds', permissions: [Permission::create(Role::any())], documentSecurity: true); + $database->createCollection('lawns', permissions: [Permission::create(Role::any())], documentSecurity: true); + $database->createCollection('trees', permissions: [Permission::create(Role::any())], documentSecurity: true); + $database->createCollection('birds', permissions: [Permission::create(Role::any())], documentSecurity: true); - static::getDatabase()->createAttribute('lawns', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('trees', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('birds', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('lawns', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('trees', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('birds', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'lawns', relatedCollection: 'trees', type: Database::RELATION_ONE_TO_MANY, @@ -1150,7 +1174,7 @@ public function testInheritRelationshipPermissions(): void twoWayKey: 'lawn', onDelete: Database::RELATION_MUTATE_CASCADE, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'trees', relatedCollection: 'birds', type: Database::RELATION_MANY_TO_MANY, @@ -1165,7 +1189,7 @@ public function testInheritRelationshipPermissions(): void Permission::delete(Role::user('user2')), ]; - static::getDatabase()->createDocument('lawns', new Document([ + $database->createDocument('lawns', new Document([ '$id' => 'lawn1', '$permissions' => $permissions, 'name' => 'Lawn 1', @@ -1187,13 +1211,13 @@ public function testInheritRelationshipPermissions(): void ], ])); - $lawn1 = static::getDatabase()->getDocument('lawns', 'lawn1'); + $lawn1 = $database->getDocument('lawns', 'lawn1'); $this->assertEquals($permissions, $lawn1->getPermissions()); $this->assertEquals($permissions, $lawn1['trees'][0]->getPermissions()); $this->assertEquals($permissions, $lawn1['trees'][0]['birds'][0]->getPermissions()); $this->assertEquals($permissions, $lawn1['trees'][0]['birds'][1]->getPermissions()); - $tree1 = static::getDatabase()->getDocument('trees', 'tree1'); + $tree1 = $database->getDocument('trees', 'tree1'); $this->assertEquals($permissions, $tree1->getPermissions()); $this->assertEquals($permissions, $tree1['lawn']->getPermissions()); $this->assertEquals($permissions, $tree1['birds'][0]->getPermissions()); @@ -1205,18 +1229,21 @@ public function testInheritRelationshipPermissions(): void */ public function testEnforceRelationshipPermissions(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } Authorization::cleanRoles(); Authorization::setRole(Role::any()->toString()); - $lawn1 = static::getDatabase()->getDocument('lawns', 'lawn1'); + $lawn1 = $database->getDocument('lawns', 'lawn1'); $this->assertEquals('Lawn 1', $lawn1['name']); // Try update root document try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'lawns', $lawn1->getId(), $lawn1->setAttribute('name', 'Lawn 1 Updated') @@ -1228,7 +1255,7 @@ public function testEnforceRelationshipPermissions(): void // Try delete root document try { - static::getDatabase()->deleteDocument( + $database->deleteDocument( 'lawns', $lawn1->getId(), ); @@ -1237,11 +1264,11 @@ public function testEnforceRelationshipPermissions(): void $this->assertEquals('Missing "delete" permission for role "user:user2". Only "["any"]" scopes are allowed and "["user:user2"]" was given.', $e->getMessage()); } - $tree1 = static::getDatabase()->getDocument('trees', 'tree1'); + $tree1 = $database->getDocument('trees', 'tree1'); // Try update nested document try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'trees', $tree1->getId(), $tree1->setAttribute('name', 'Tree 1 Updated') @@ -1253,7 +1280,7 @@ public function testEnforceRelationshipPermissions(): void // Try delete nested document try { - static::getDatabase()->deleteDocument( + $database->deleteDocument( 'trees', $tree1->getId(), ); @@ -1262,11 +1289,11 @@ public function testEnforceRelationshipPermissions(): void $this->assertEquals('Missing "delete" permission for role "user:user2". Only "["any"]" scopes are allowed and "["user:user2"]" was given.', $e->getMessage()); } - $bird1 = static::getDatabase()->getDocument('birds', 'bird1'); + $bird1 = $database->getDocument('birds', 'bird1'); // Try update multi-level nested document try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'birds', $bird1->getId(), $bird1->setAttribute('name', 'Bird 1 Updated') @@ -1278,7 +1305,7 @@ public function testEnforceRelationshipPermissions(): void // Try delete multi-level nested document try { - static::getDatabase()->deleteDocument( + $database->deleteDocument( 'birds', $bird1->getId(), ); @@ -1289,10 +1316,10 @@ public function testEnforceRelationshipPermissions(): void Authorization::setRole(Role::user('user1')->toString()); - $bird1 = static::getDatabase()->getDocument('birds', 'bird1'); + $bird1 = $database->getDocument('birds', 'bird1'); // Try update multi-level nested document - $bird1 = static::getDatabase()->updateDocument( + $bird1 = $database->updateDocument( 'birds', $bird1->getId(), $bird1->setAttribute('name', 'Bird 1 Updated') @@ -1303,17 +1330,17 @@ public function testEnforceRelationshipPermissions(): void Authorization::setRole(Role::user('user2')->toString()); // Try delete multi-level nested document - $deleted = static::getDatabase()->deleteDocument( + $deleted = $database->deleteDocument( 'birds', $bird1->getId(), ); $this->assertEquals(true, $deleted); - $tree1 = static::getDatabase()->getDocument('trees', 'tree1'); + $tree1 = $database->getDocument('trees', 'tree1'); $this->assertEquals(1, count($tree1['birds'])); // Try update nested document - $tree1 = static::getDatabase()->updateDocument( + $tree1 = $database->updateDocument( 'trees', $tree1->getId(), $tree1->setAttribute('name', 'Tree 1 Updated') @@ -1322,17 +1349,17 @@ public function testEnforceRelationshipPermissions(): void $this->assertEquals('Tree 1 Updated', $tree1['name']); // Try delete nested document - $deleted = static::getDatabase()->deleteDocument( + $deleted = $database->deleteDocument( 'trees', $tree1->getId(), ); $this->assertEquals(true, $deleted); - $lawn1 = static::getDatabase()->getDocument('lawns', 'lawn1'); + $lawn1 = $database->getDocument('lawns', 'lawn1'); $this->assertEquals(0, count($lawn1['trees'])); // Create document with no permissions - static::getDatabase()->createDocument('lawns', new Document([ + $database->createDocument('lawns', new Document([ '$id' => 'lawn2', 'name' => 'Lawn 2', 'trees' => [ @@ -1349,19 +1376,22 @@ public function testEnforceRelationshipPermissions(): void ], ])); - $lawn2 = static::getDatabase()->getDocument('lawns', 'lawn2'); + $lawn2 = $database->getDocument('lawns', 'lawn2'); $this->assertEquals(true, $lawn2->isEmpty()); - $tree2 = static::getDatabase()->getDocument('trees', 'tree2'); + $tree2 = $database->getDocument('trees', 'tree2'); $this->assertEquals(true, $tree2->isEmpty()); - $bird3 = static::getDatabase()->getDocument('birds', 'bird3'); + $bird3 = $database->getDocument('birds', 'bird3'); $this->assertEquals(true, $bird3->isEmpty()); } public function testCreateRelationshipMissingCollection(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1369,7 +1399,7 @@ public function testCreateRelationshipMissingCollection(): void $this->expectException(Exception::class); $this->expectExceptionMessage('Collection not found'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'missing', relatedCollection: 'missing', type: Database::RELATION_ONE_TO_MANY, @@ -1379,17 +1409,20 @@ public function testCreateRelationshipMissingCollection(): void public function testCreateRelationshipMissingRelatedCollection(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('test'); + $database->createCollection('test'); $this->expectException(Exception::class); $this->expectExceptionMessage('Related collection not found'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'test', relatedCollection: 'missing', type: Database::RELATION_ONE_TO_MANY, @@ -1399,15 +1432,18 @@ public function testCreateRelationshipMissingRelatedCollection(): void public function testCreateDuplicateRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('test1'); - static::getDatabase()->createCollection('test2'); + $database->createCollection('test1'); + $database->createCollection('test2'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'test1', relatedCollection: 'test2', type: Database::RELATION_ONE_TO_MANY, @@ -1417,7 +1453,7 @@ public function testCreateDuplicateRelationship(): void $this->expectException(Exception::class); $this->expectExceptionMessage('Attribute already exists'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'test1', relatedCollection: 'test2', type: Database::RELATION_ONE_TO_MANY, @@ -1427,18 +1463,21 @@ public function testCreateDuplicateRelationship(): void public function testCreateInvalidRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('test3'); - static::getDatabase()->createCollection('test4'); + $database->createCollection('test3'); + $database->createCollection('test4'); $this->expectException(Exception::class); $this->expectExceptionMessage('Invalid relationship type'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'test3', relatedCollection: 'test4', type: 'invalid', @@ -1449,13 +1488,16 @@ public function testCreateInvalidRelationship(): void public function testDeleteMissingRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } try { - static::getDatabase()->deleteRelationship('test', 'test2'); + $database->deleteRelationship('test', 'test2'); $this->fail('Failed to throw exception'); } catch (\Throwable $e) { $this->assertEquals('Relationship not found', $e->getMessage()); @@ -1464,15 +1506,18 @@ public function testDeleteMissingRelationship(): void public function testCreateInvalidIntValueRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('invalid1'); - static::getDatabase()->createCollection('invalid2'); + $database->createCollection('invalid1'); + $database->createCollection('invalid2'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'invalid1', relatedCollection: 'invalid2', type: Database::RELATION_ONE_TO_ONE, @@ -1482,7 +1527,7 @@ public function testCreateInvalidIntValueRelationship(): void $this->expectException(RelationshipException::class); $this->expectExceptionMessage('Invalid relationship value. Must be either a document, document ID, or an array of documents or document IDs.'); - static::getDatabase()->createDocument('invalid1', new Document([ + $database->createDocument('invalid1', new Document([ '$id' => ID::unique(), 'invalid2' => 10, ])); @@ -1493,7 +1538,10 @@ public function testCreateInvalidIntValueRelationship(): void */ public function testCreateInvalidObjectValueRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1501,7 +1549,7 @@ public function testCreateInvalidObjectValueRelationship(): void $this->expectException(RelationshipException::class); $this->expectExceptionMessage('Invalid relationship value. Must be either a document, document ID, or an array of documents or document IDs.'); - static::getDatabase()->createDocument('invalid1', new Document([ + $database->createDocument('invalid1', new Document([ '$id' => ID::unique(), 'invalid2' => new \stdClass(), ])); @@ -1512,12 +1560,15 @@ public function testCreateInvalidObjectValueRelationship(): void */ public function testCreateInvalidArrayIntValueRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'invalid1', relatedCollection: 'invalid2', type: Database::RELATION_ONE_TO_MANY, @@ -1529,7 +1580,7 @@ public function testCreateInvalidArrayIntValueRelationship(): void $this->expectException(RelationshipException::class); $this->expectExceptionMessage('Invalid relationship value. Must be either a document, document ID, or an array of documents or document IDs.'); - static::getDatabase()->createDocument('invalid1', new Document([ + $database->createDocument('invalid1', new Document([ '$id' => ID::unique(), 'invalid3' => [10], ])); @@ -1537,21 +1588,24 @@ public function testCreateInvalidArrayIntValueRelationship(): void public function testCreateEmptyValueRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('null1'); - static::getDatabase()->createCollection('null2'); + $database->createCollection('null1'); + $database->createCollection('null2'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'null1', relatedCollection: 'null2', type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'null1', relatedCollection: 'null2', type: Database::RELATION_ONE_TO_MANY, @@ -1559,7 +1613,7 @@ public function testCreateEmptyValueRelationship(): void id: 'null3', twoWayKey: 'null4', ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'null1', relatedCollection: 'null2', type: Database::RELATION_MANY_TO_ONE, @@ -1567,7 +1621,7 @@ public function testCreateEmptyValueRelationship(): void id: 'null4', twoWayKey: 'null5', ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'null1', relatedCollection: 'null2', type: Database::RELATION_MANY_TO_MANY, @@ -1576,21 +1630,21 @@ public function testCreateEmptyValueRelationship(): void twoWayKey: 'null7', ); - $document = static::getDatabase()->createDocument('null1', new Document([ + $document = $database->createDocument('null1', new Document([ '$id' => ID::unique(), 'null2' => null, ])); $this->assertEquals(null, $document->getAttribute('null2')); - $document = static::getDatabase()->createDocument('null2', new Document([ + $document = $database->createDocument('null2', new Document([ '$id' => ID::unique(), 'null1' => null, ])); $this->assertEquals(null, $document->getAttribute('null1')); - $document = static::getDatabase()->createDocument('null1', new Document([ + $document = $database->createDocument('null1', new Document([ '$id' => ID::unique(), 'null3' => null, ])); @@ -1598,35 +1652,35 @@ public function testCreateEmptyValueRelationship(): void // One to many will be empty array instead of null $this->assertEquals([], $document->getAttribute('null3')); - $document = static::getDatabase()->createDocument('null2', new Document([ + $document = $database->createDocument('null2', new Document([ '$id' => ID::unique(), 'null4' => null, ])); $this->assertEquals(null, $document->getAttribute('null4')); - $document = static::getDatabase()->createDocument('null1', new Document([ + $document = $database->createDocument('null1', new Document([ '$id' => ID::unique(), 'null4' => null, ])); $this->assertEquals(null, $document->getAttribute('null4')); - $document = static::getDatabase()->createDocument('null2', new Document([ + $document = $database->createDocument('null2', new Document([ '$id' => ID::unique(), 'null5' => null, ])); $this->assertEquals([], $document->getAttribute('null5')); - $document = static::getDatabase()->createDocument('null1', new Document([ + $document = $database->createDocument('null1', new Document([ '$id' => ID::unique(), 'null6' => null, ])); $this->assertEquals([], $document->getAttribute('null6')); - $document = static::getDatabase()->createDocument('null2', new Document([ + $document = $database->createDocument('null2', new Document([ '$id' => ID::unique(), 'null7' => null, ])); @@ -1636,20 +1690,23 @@ public function testCreateEmptyValueRelationship(): void public function testUpdateRelationshipToExistingKey(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('ovens'); - static::getDatabase()->createCollection('cakes'); + $database->createCollection('ovens'); + $database->createCollection('cakes'); - static::getDatabase()->createAttribute('ovens', 'maxTemp', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createAttribute('ovens', 'owner', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('cakes', 'height', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createAttribute('cakes', 'colour', Database::VAR_STRING, 255, true); + $database->createAttribute('ovens', 'maxTemp', Database::VAR_INTEGER, 0, true); + $database->createAttribute('ovens', 'owner', Database::VAR_STRING, 255, true); + $database->createAttribute('cakes', 'height', Database::VAR_INTEGER, 0, true); + $database->createAttribute('cakes', 'colour', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'ovens', relatedCollection: 'cakes', type: Database::RELATION_ONE_TO_MANY, @@ -1659,14 +1716,14 @@ public function testUpdateRelationshipToExistingKey(): void ); try { - static::getDatabase()->updateRelationship('ovens', 'cakes', newKey: 'owner'); + $database->updateRelationship('ovens', 'cakes', newKey: 'owner'); $this->fail('Failed to throw exception'); } catch (DuplicateException $e) { $this->assertEquals('Relationship already exists', $e->getMessage()); } try { - static::getDatabase()->updateRelationship('ovens', 'cakes', newTwoWayKey: 'height'); + $database->updateRelationship('ovens', 'cakes', newTwoWayKey: 'height'); $this->fail('Failed to throw exception'); } catch (DuplicateException $e) { $this->assertEquals('Related attribute already exists', $e->getMessage()); @@ -1787,11 +1844,14 @@ public function testUpdateDocumentsRelationships(): void public function testUpdateDocumentWithRelationships(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('userProfiles', [ + $database->createCollection('userProfiles', [ new Document([ '$id' => ID::custom('username'), 'type' => Database::VAR_STRING, @@ -1809,7 +1869,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('links', [ + $database->createCollection('links', [ new Document([ '$id' => ID::custom('title'), 'type' => Database::VAR_STRING, @@ -1827,7 +1887,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('videos', [ + $database->createCollection('videos', [ new Document([ '$id' => ID::custom('title'), 'type' => Database::VAR_STRING, @@ -1845,7 +1905,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('products', [ + $database->createCollection('products', [ new Document([ '$id' => ID::custom('title'), 'type' => Database::VAR_STRING, @@ -1863,7 +1923,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('settings', [ + $database->createCollection('settings', [ new Document([ '$id' => ID::custom('metaTitle'), 'type' => Database::VAR_STRING, @@ -1881,7 +1941,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('appearance', [ + $database->createCollection('appearance', [ new Document([ '$id' => ID::custom('metaTitle'), 'type' => Database::VAR_STRING, @@ -1899,7 +1959,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('group', [ + $database->createCollection('group', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1917,7 +1977,7 @@ public function testUpdateDocumentWithRelationships(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('community', [ + $database->createCollection('community', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1936,21 +1996,21 @@ public function testUpdateDocumentWithRelationships(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'links', type: Database::RELATION_ONE_TO_MANY, id: 'links' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'videos', type: Database::RELATION_ONE_TO_MANY, id: 'videos' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'products', type: Database::RELATION_ONE_TO_MANY, @@ -1959,35 +2019,35 @@ public function testUpdateDocumentWithRelationships(): void twoWayKey: 'userProfile', ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'settings', type: Database::RELATION_ONE_TO_ONE, id: 'settings' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'appearance', type: Database::RELATION_ONE_TO_ONE, id: 'appearance' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'group', type: Database::RELATION_MANY_TO_ONE, id: 'group' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'userProfiles', relatedCollection: 'community', type: Database::RELATION_MANY_TO_ONE, id: 'community' ); - $profile = static::getDatabase()->createDocument('userProfiles', new Document([ + $profile = $database->createDocument('userProfiles', new Document([ '$id' => '1', 'username' => 'user1', 'links' => [ @@ -2050,7 +2110,7 @@ public function testUpdateDocumentWithRelationships(): void 'name' => 'New Group Name', ]); - $updatedProfile = static::getDatabase()->updateDocument('userProfiles', '1', $profile); + $updatedProfile = $database->updateDocument('userProfiles', '1', $profile); $this->assertEquals('New Link Value', $updatedProfile->getAttribute('links')[0]->getAttribute('title')); $this->assertEquals('New Meta Title', $updatedProfile->getAttribute('settings')->getAttribute('metaTitle')); @@ -2063,24 +2123,24 @@ public function testUpdateDocumentWithRelationships(): void $this->assertEquals('Community 1', $updatedProfile->getAttribute('community')->getAttribute('name')); // updating document using two way key in one to many relationship - $product = static::getDatabase()->getDocument('products', 'product1'); + $product = $database->getDocument('products', 'product1'); $product->setAttribute('userProfile', [ '$id' => '1', 'username' => 'updated user value', ]); - $updatedProduct = static::getDatabase()->updateDocument('products', 'product1', $product); + $updatedProduct = $database->updateDocument('products', 'product1', $product); $this->assertEquals('updated user value', $updatedProduct->getAttribute('userProfile')->getAttribute('username')); $this->assertEquals('Product 1', $updatedProduct->getAttribute('title')); $this->assertEquals('product1', $updatedProduct->getId()); $this->assertEquals('1', $updatedProduct->getAttribute('userProfile')->getId()); - static::getDatabase()->deleteCollection('userProfiles'); - static::getDatabase()->deleteCollection('links'); - static::getDatabase()->deleteCollection('settings'); - static::getDatabase()->deleteCollection('group'); - static::getDatabase()->deleteCollection('community'); - static::getDatabase()->deleteCollection('videos'); - static::getDatabase()->deleteCollection('products'); - static::getDatabase()->deleteCollection('appearance'); + $database->deleteCollection('userProfiles'); + $database->deleteCollection('links'); + $database->deleteCollection('settings'); + $database->deleteCollection('group'); + $database->deleteCollection('community'); + $database->deleteCollection('videos'); + $database->deleteCollection('products'); + $database->deleteCollection('appearance'); } } diff --git a/tests/e2e/Adapter/Scopes/Relationships/ManyToManyTests.php b/tests/e2e/Adapter/Scopes/Relationships/ManyToManyTests.php index 20f129718..81f6c9379 100644 --- a/tests/e2e/Adapter/Scopes/Relationships/ManyToManyTests.php +++ b/tests/e2e/Adapter/Scopes/Relationships/ManyToManyTests.php @@ -15,19 +15,22 @@ trait ManyToManyTests { public function testManyToManyOneWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('playlist'); - static::getDatabase()->createCollection('song'); + $database->createCollection('playlist'); + $database->createCollection('song'); - static::getDatabase()->createAttribute('playlist', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('song', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('song', 'length', Database::VAR_INTEGER, 0, true); + $database->createAttribute('playlist', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('song', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('song', 'length', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'playlist', relatedCollection: 'song', type: Database::RELATION_MANY_TO_MANY, @@ -35,7 +38,7 @@ public function testManyToManyOneWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('playlist'); + $collection = $database->getCollection('playlist'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { @@ -51,7 +54,7 @@ public function testManyToManyOneWayRelationship(): void } // Create document with relationship with nested data - $playlist1 = static::getDatabase()->createDocument('playlist', new Document([ + $playlist1 = $database->createDocument('playlist', new Document([ '$id' => 'playlist1', '$permissions' => [ Permission::read(Role::any()), @@ -74,7 +77,7 @@ public function testManyToManyOneWayRelationship(): void ])); // Create document with relationship with related ID - static::getDatabase()->createDocument('song', new Document([ + $database->createDocument('song', new Document([ '$id' => 'song2', '$permissions' => [ Permission::read(Role::any()), @@ -84,7 +87,7 @@ public function testManyToManyOneWayRelationship(): void 'name' => 'Song 2', 'length' => 140, ])); - static::getDatabase()->createDocument('playlist', new Document([ + $database->createDocument('playlist', new Document([ '$id' => 'playlist2', '$permissions' => [ Permission::read(Role::any()), @@ -98,13 +101,13 @@ public function testManyToManyOneWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('playlist', 'playlist1', $playlist1->setAttribute('songs', ['song1','no-song'])); + $database->updateDocument('playlist', 'playlist1', $playlist1->setAttribute('songs', ['song1','no-song'])); - $playlist1Document = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist1Document = $database->getDocument('playlist', 'playlist1'); // Assert document does not contain non existing relation document. $this->assertEquals(1, \count($playlist1Document->getAttribute('songs'))); - $documents = static::getDatabase()->find('playlist', [ + $documents = $database->find('playlist', [ Query::select(['name']), Query::limit(1) ]); @@ -112,29 +115,29 @@ public function testManyToManyOneWayRelationship(): void $this->assertArrayNotHasKey('songs', $documents[0]); // Get document with relationship - $playlist = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist = $database->getDocument('playlist', 'playlist1'); $songs = $playlist->getAttribute('songs', []); $this->assertEquals('song1', $songs[0]['$id']); $this->assertArrayNotHasKey('playlist', $songs[0]); - $playlist = static::getDatabase()->getDocument('playlist', 'playlist2'); + $playlist = $database->getDocument('playlist', 'playlist2'); $songs = $playlist->getAttribute('songs', []); $this->assertEquals('song2', $songs[0]['$id']); $this->assertArrayNotHasKey('playlist', $songs[0]); // Get related document - $library = static::getDatabase()->getDocument('song', 'song1'); + $library = $database->getDocument('song', 'song1'); $this->assertArrayNotHasKey('songs', $library); - $library = static::getDatabase()->getDocument('song', 'song2'); + $library = $database->getDocument('song', 'song2'); $this->assertArrayNotHasKey('songs', $library); - $playlists = static::getDatabase()->find('playlist'); + $playlists = $database->find('playlist'); $this->assertEquals(2, \count($playlists)); // Select related document attributes - $playlist = static::getDatabase()->findOne('playlist', [ + $playlist = $database->findOne('playlist', [ Query::select(['*', 'songs.name']) ]); @@ -145,7 +148,7 @@ public function testManyToManyOneWayRelationship(): void $this->assertEquals('Song 1', $playlist->getAttribute('songs')[0]->getAttribute('name')); $this->assertArrayNotHasKey('length', $playlist->getAttribute('songs')[0]); - $playlist = static::getDatabase()->getDocument('playlist', 'playlist1', [ + $playlist = $database->getDocument('playlist', 'playlist1', [ Query::select(['*', 'songs.name']) ]); @@ -153,32 +156,32 @@ public function testManyToManyOneWayRelationship(): void $this->assertArrayNotHasKey('length', $playlist->getAttribute('songs')[0]); // Update root document attribute without altering relationship - $playlist1 = static::getDatabase()->updateDocument( + $playlist1 = $database->updateDocument( 'playlist', $playlist1->getId(), $playlist1->setAttribute('name', 'Playlist 1 Updated') ); $this->assertEquals('Playlist 1 Updated', $playlist1->getAttribute('name')); - $playlist1 = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist1 = $database->getDocument('playlist', 'playlist1'); $this->assertEquals('Playlist 1 Updated', $playlist1->getAttribute('name')); // Update nested document attribute $songs = $playlist1->getAttribute('songs', []); $songs[0]->setAttribute('name', 'Song 1 Updated'); - $playlist1 = static::getDatabase()->updateDocument( + $playlist1 = $database->updateDocument( 'playlist', $playlist1->getId(), $playlist1->setAttribute('songs', $songs) ); $this->assertEquals('Song 1 Updated', $playlist1->getAttribute('songs')[0]->getAttribute('name')); - $playlist1 = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist1 = $database->getDocument('playlist', 'playlist1'); $this->assertEquals('Song 1 Updated', $playlist1->getAttribute('songs')[0]->getAttribute('name')); // Create new document with no relationship - $playlist5 = static::getDatabase()->createDocument('playlist', new Document([ + $playlist5 = $database->createDocument('playlist', new Document([ '$id' => 'playlist5', '$permissions' => [ Permission::read(Role::any()), @@ -189,7 +192,7 @@ public function testManyToManyOneWayRelationship(): void ])); // Update to relate to created document - $playlist5 = static::getDatabase()->updateDocument( + $playlist5 = $database->updateDocument( 'playlist', $playlist5->getId(), $playlist5->setAttribute('songs', [new Document([ @@ -205,7 +208,7 @@ public function testManyToManyOneWayRelationship(): void ); // Playlist relating to existing songs that belong to other playlists - static::getDatabase()->createDocument('playlist', new Document([ + $database->createDocument('playlist', new Document([ '$id' => 'playlist6', '$permissions' => [ Permission::read(Role::any()), @@ -221,30 +224,30 @@ public function testManyToManyOneWayRelationship(): void ])); $this->assertEquals('Song 5', $playlist5->getAttribute('songs')[0]->getAttribute('name')); - $playlist5 = static::getDatabase()->getDocument('playlist', 'playlist5'); + $playlist5 = $database->getDocument('playlist', 'playlist5'); $this->assertEquals('Song 5', $playlist5->getAttribute('songs')[0]->getAttribute('name')); // Update document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'playlist', $playlist1->getId(), $playlist1->setAttribute('songs', ['song2']) ); // Rename relationship key - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'playlist', 'songs', 'newSongs' ); // Get document with new relationship key - $playlist = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist = $database->getDocument('playlist', 'playlist1'); $songs = $playlist->getAttribute('newSongs'); $this->assertEquals('song2', $songs[0]['$id']); // Create new document with no relationship - static::getDatabase()->createDocument('playlist', new Document([ + $database->createDocument('playlist', new Document([ '$id' => 'playlist3', '$permissions' => [ Permission::read(Role::any()), @@ -255,87 +258,90 @@ public function testManyToManyOneWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('playlist', 'playlist3'); + $deleted = $database->deleteDocument('playlist', 'playlist3'); $this->assertEquals(true, $deleted); - $playlist3 = static::getDatabase()->getDocument('playlist', 'playlist3'); + $playlist3 = $database->getDocument('playlist', 'playlist3'); $this->assertEquals(true, $playlist3->isEmpty()); // Try to delete document while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('playlist', 'playlist1'); + $database->deleteDocument('playlist', 'playlist1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'playlist', id: 'newSongs', onDelete: Database::RELATION_MUTATE_SET_NULL ); - $playlist1 = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist1 = $database->getDocument('playlist', 'playlist1'); // Reset relationships - static::getDatabase()->updateDocument( + $database->updateDocument( 'playlist', $playlist1->getId(), $playlist1->setAttribute('newSongs', ['song1']) ); // Delete child, will delete junction - static::getDatabase()->deleteDocument('song', 'song1'); + $database->deleteDocument('song', 'song1'); // Check relation was set to null - $playlist1 = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist1 = $database->getDocument('playlist', 'playlist1'); $this->assertEquals(0, \count($playlist1->getAttribute('newSongs'))); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'playlist', id: 'newSongs', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('playlist', 'playlist2'); + $database->deleteDocument('playlist', 'playlist2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('playlist', 'playlist2'); + $library = $database->getDocument('playlist', 'playlist2'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('song', 'song2'); + $library = $database->getDocument('song', 'song2'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'playlist', 'newSongs' ); // Try to get document again - $playlist = static::getDatabase()->getDocument('playlist', 'playlist1'); + $playlist = $database->getDocument('playlist', 'playlist1'); $songs = $playlist->getAttribute('newSongs'); $this->assertEquals(null, $songs); } public function testManyToManyTwoWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('students'); - static::getDatabase()->createCollection('classes'); + $database->createCollection('students'); + $database->createCollection('classes'); - static::getDatabase()->createAttribute('students', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('classes', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('classes', 'number', Database::VAR_INTEGER, 0, true); + $database->createAttribute('students', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('classes', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('classes', 'number', Database::VAR_INTEGER, 0, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'students', relatedCollection: 'classes', type: Database::RELATION_MANY_TO_MANY, @@ -343,7 +349,7 @@ public function testManyToManyTwoWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('students'); + $collection = $database->getCollection('students'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'students') { @@ -358,7 +364,7 @@ public function testManyToManyTwoWayRelationship(): void } // Check metadata for related collection - $collection = static::getDatabase()->getCollection('classes'); + $collection = $database->getCollection('classes'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'classes') { @@ -373,7 +379,7 @@ public function testManyToManyTwoWayRelationship(): void } // Create document with relationship with nested data - $student1 = static::getDatabase()->createDocument('students', new Document([ + $student1 = $database->createDocument('students', new Document([ '$id' => 'student1', '$permissions' => [ Permission::read(Role::any()), @@ -396,14 +402,14 @@ public function testManyToManyTwoWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('students', 'student1', $student1->setAttribute('classes', ['class1', 'no-class'])); + $database->updateDocument('students', 'student1', $student1->setAttribute('classes', ['class1', 'no-class'])); - $student1Document = static::getDatabase()->getDocument('students', 'student1'); + $student1Document = $database->getDocument('students', 'student1'); // Assert document does not contain non existing relation document. $this->assertEquals(1, \count($student1Document->getAttribute('classes'))); // Create document with relationship with related ID - static::getDatabase()->createDocument('classes', new Document([ + $database->createDocument('classes', new Document([ '$id' => 'class2', '$permissions' => [ Permission::read(Role::any()), @@ -414,7 +420,7 @@ public function testManyToManyTwoWayRelationship(): void 'name' => 'Class 2', 'number' => 2, ])); - static::getDatabase()->createDocument('students', new Document([ + $database->createDocument('students', new Document([ '$id' => 'student2', '$permissions' => [ Permission::read(Role::any()), @@ -428,7 +434,7 @@ public function testManyToManyTwoWayRelationship(): void ])); // Create from child side - static::getDatabase()->createDocument('classes', new Document([ + $database->createDocument('classes', new Document([ '$id' => 'class3', '$permissions' => [ Permission::read(Role::any()), @@ -449,7 +455,7 @@ public function testManyToManyTwoWayRelationship(): void ] ], ])); - static::getDatabase()->createDocument('students', new Document([ + $database->createDocument('students', new Document([ '$id' => 'student4', '$permissions' => [ Permission::read(Role::any()), @@ -458,7 +464,7 @@ public function testManyToManyTwoWayRelationship(): void ], 'name' => 'Student 4' ])); - static::getDatabase()->createDocument('classes', new Document([ + $database->createDocument('classes', new Document([ '$id' => 'class4', '$permissions' => [ Permission::read(Role::any()), @@ -474,49 +480,49 @@ public function testManyToManyTwoWayRelationship(): void ])); // Get document with relationship - $student = static::getDatabase()->getDocument('students', 'student1'); + $student = $database->getDocument('students', 'student1'); $classes = $student->getAttribute('classes', []); $this->assertEquals('class1', $classes[0]['$id']); $this->assertArrayNotHasKey('students', $classes[0]); - $student = static::getDatabase()->getDocument('students', 'student2'); + $student = $database->getDocument('students', 'student2'); $classes = $student->getAttribute('classes', []); $this->assertEquals('class2', $classes[0]['$id']); $this->assertArrayNotHasKey('students', $classes[0]); - $student = static::getDatabase()->getDocument('students', 'student3'); + $student = $database->getDocument('students', 'student3'); $classes = $student->getAttribute('classes', []); $this->assertEquals('class3', $classes[0]['$id']); $this->assertArrayNotHasKey('students', $classes[0]); - $student = static::getDatabase()->getDocument('students', 'student4'); + $student = $database->getDocument('students', 'student4'); $classes = $student->getAttribute('classes', []); $this->assertEquals('class4', $classes[0]['$id']); $this->assertArrayNotHasKey('students', $classes[0]); // Get related document - $class = static::getDatabase()->getDocument('classes', 'class1'); + $class = $database->getDocument('classes', 'class1'); $student = $class->getAttribute('students'); $this->assertEquals('student1', $student[0]['$id']); $this->assertArrayNotHasKey('classes', $student[0]); - $class = static::getDatabase()->getDocument('classes', 'class2'); + $class = $database->getDocument('classes', 'class2'); $student = $class->getAttribute('students'); $this->assertEquals('student2', $student[0]['$id']); $this->assertArrayNotHasKey('classes', $student[0]); - $class = static::getDatabase()->getDocument('classes', 'class3'); + $class = $database->getDocument('classes', 'class3'); $student = $class->getAttribute('students'); $this->assertEquals('student3', $student[0]['$id']); $this->assertArrayNotHasKey('classes', $student[0]); - $class = static::getDatabase()->getDocument('classes', 'class4'); + $class = $database->getDocument('classes', 'class4'); $student = $class->getAttribute('students'); $this->assertEquals('student4', $student[0]['$id']); $this->assertArrayNotHasKey('classes', $student[0]); // Select related document attributes - $student = static::getDatabase()->findOne('students', [ + $student = $database->findOne('students', [ Query::select(['*', 'classes.name']) ]); @@ -527,7 +533,7 @@ public function testManyToManyTwoWayRelationship(): void $this->assertEquals('Class 1', $student->getAttribute('classes')[0]->getAttribute('name')); $this->assertArrayNotHasKey('number', $student->getAttribute('classes')[0]); - $student = static::getDatabase()->getDocument('students', 'student1', [ + $student = $database->getDocument('students', 'student1', [ Query::select(['*', 'classes.name']) ]); @@ -535,58 +541,58 @@ public function testManyToManyTwoWayRelationship(): void $this->assertArrayNotHasKey('number', $student->getAttribute('classes')[0]); // Update root document attribute without altering relationship - $student1 = static::getDatabase()->updateDocument( + $student1 = $database->updateDocument( 'students', $student1->getId(), $student1->setAttribute('name', 'Student 1 Updated') ); $this->assertEquals('Student 1 Updated', $student1->getAttribute('name')); - $student1 = static::getDatabase()->getDocument('students', 'student1'); + $student1 = $database->getDocument('students', 'student1'); $this->assertEquals('Student 1 Updated', $student1->getAttribute('name')); // Update inverse root document attribute without altering relationship - $class2 = static::getDatabase()->getDocument('classes', 'class2'); - $class2 = static::getDatabase()->updateDocument( + $class2 = $database->getDocument('classes', 'class2'); + $class2 = $database->updateDocument( 'classes', $class2->getId(), $class2->setAttribute('name', 'Class 2 Updated') ); $this->assertEquals('Class 2 Updated', $class2->getAttribute('name')); - $class2 = static::getDatabase()->getDocument('classes', 'class2'); + $class2 = $database->getDocument('classes', 'class2'); $this->assertEquals('Class 2 Updated', $class2->getAttribute('name')); // Update nested document attribute $classes = $student1->getAttribute('classes', []); $classes[0]->setAttribute('name', 'Class 1 Updated'); - $student1 = static::getDatabase()->updateDocument( + $student1 = $database->updateDocument( 'students', $student1->getId(), $student1->setAttribute('classes', $classes) ); $this->assertEquals('Class 1 Updated', $student1->getAttribute('classes')[0]->getAttribute('name')); - $student1 = static::getDatabase()->getDocument('students', 'student1'); + $student1 = $database->getDocument('students', 'student1'); $this->assertEquals('Class 1 Updated', $student1->getAttribute('classes')[0]->getAttribute('name')); // Update inverse nested document attribute $students = $class2->getAttribute('students', []); $students[0]->setAttribute('name', 'Student 2 Updated'); - $class2 = static::getDatabase()->updateDocument( + $class2 = $database->updateDocument( 'classes', $class2->getId(), $class2->setAttribute('students', $students) ); $this->assertEquals('Student 2 Updated', $class2->getAttribute('students')[0]->getAttribute('name')); - $class2 = static::getDatabase()->getDocument('classes', 'class2'); + $class2 = $database->getDocument('classes', 'class2'); $this->assertEquals('Student 2 Updated', $class2->getAttribute('students')[0]->getAttribute('name')); // Create new document with no relationship - $student5 = static::getDatabase()->createDocument('students', new Document([ + $student5 = $database->createDocument('students', new Document([ '$id' => 'student5', '$permissions' => [ Permission::read(Role::any()), @@ -597,7 +603,7 @@ public function testManyToManyTwoWayRelationship(): void ])); // Update to relate to created document - $student5 = static::getDatabase()->updateDocument( + $student5 = $database->updateDocument( 'students', $student5->getId(), $student5->setAttribute('classes', [new Document([ @@ -613,11 +619,11 @@ public function testManyToManyTwoWayRelationship(): void ); $this->assertEquals('Class 5', $student5->getAttribute('classes')[0]->getAttribute('name')); - $student5 = static::getDatabase()->getDocument('students', 'student5'); + $student5 = $database->getDocument('students', 'student5'); $this->assertEquals('Class 5', $student5->getAttribute('classes')[0]->getAttribute('name')); // Create child document with no relationship - $class6 = static::getDatabase()->createDocument('classes', new Document([ + $class6 = $database->createDocument('classes', new Document([ '$id' => 'class6', '$permissions' => [ Permission::read(Role::any()), @@ -629,7 +635,7 @@ public function testManyToManyTwoWayRelationship(): void ])); // Update to relate to created document - $class6 = static::getDatabase()->updateDocument( + $class6 = $database->updateDocument( 'classes', $class6->getId(), $class6->setAttribute('students', [new Document([ @@ -644,27 +650,27 @@ public function testManyToManyTwoWayRelationship(): void ); $this->assertEquals('Student 6', $class6->getAttribute('students')[0]->getAttribute('name')); - $class6 = static::getDatabase()->getDocument('classes', 'class6'); + $class6 = $database->getDocument('classes', 'class6'); $this->assertEquals('Student 6', $class6->getAttribute('students')[0]->getAttribute('name')); // Update document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'students', $student1->getId(), $student1->setAttribute('classes', ['class2']) ); - $class1 = static::getDatabase()->getDocument('classes', 'class1'); + $class1 = $database->getDocument('classes', 'class1'); // Update inverse document - static::getDatabase()->updateDocument( + $database->updateDocument( 'classes', $class1->getId(), $class1->setAttribute('students', ['student1']) ); // Rename relationship keys on both sides - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'students', 'classes', 'newClasses', @@ -672,17 +678,17 @@ public function testManyToManyTwoWayRelationship(): void ); // Get document with new relationship key - $students = static::getDatabase()->getDocument('students', 'student1'); + $students = $database->getDocument('students', 'student1'); $classes = $students->getAttribute('newClasses'); $this->assertEquals('class2', $classes[0]['$id']); // Get inverse document with new relationship key - $class = static::getDatabase()->getDocument('classes', 'class1'); + $class = $database->getDocument('classes', 'class1'); $students = $class->getAttribute('newStudents'); $this->assertEquals('student1', $students[0]['$id']); // Create new document with no relationship - static::getDatabase()->createDocument('students', new Document([ + $database->createDocument('students', new Document([ '$id' => 'student7', '$permissions' => [ Permission::read(Role::any()), @@ -693,107 +699,110 @@ public function testManyToManyTwoWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('students', 'student7'); + $deleted = $database->deleteDocument('students', 'student7'); $this->assertEquals(true, $deleted); - $student6 = static::getDatabase()->getDocument('students', 'student7'); + $student6 = $database->getDocument('students', 'student7'); $this->assertEquals(true, $student6->isEmpty()); // Try to delete document while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('students', 'student1'); + $database->deleteDocument('students', 'student1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'students', id: 'newClasses', onDelete: Database::RELATION_MUTATE_SET_NULL ); - $student1 = static::getDatabase()->getDocument('students', 'student1'); + $student1 = $database->getDocument('students', 'student1'); // Reset relationships - static::getDatabase()->updateDocument( + $database->updateDocument( 'students', $student1->getId(), $student1->setAttribute('newClasses', ['class1']) ); // Delete child, will delete junction - static::getDatabase()->deleteDocument('classes', 'class1'); + $database->deleteDocument('classes', 'class1'); // Check relation was set to null - $student1 = static::getDatabase()->getDocument('students', 'student1'); + $student1 = $database->getDocument('students', 'student1'); $this->assertEquals(0, \count($student1->getAttribute('newClasses'))); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'students', id: 'newClasses', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('students', 'student2'); + $database->deleteDocument('students', 'student2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('students', 'student2'); + $library = $database->getDocument('students', 'student2'); $this->assertEquals(true, $library->isEmpty()); // Delete child, should not delete parent - static::getDatabase()->deleteDocument('classes', 'class6'); + $database->deleteDocument('classes', 'class6'); // Check only child was deleted - $student6 = static::getDatabase()->getDocument('students', 'student6'); + $student6 = $database->getDocument('students', 'student6'); $this->assertEquals(false, $student6->isEmpty()); $this->assertEmpty($student6->getAttribute('newClasses')); - $library = static::getDatabase()->getDocument('classes', 'class2'); + $library = $database->getDocument('classes', 'class2'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'students', 'newClasses' ); // Try to get documents again - $student = static::getDatabase()->getDocument('students', 'student1'); + $student = $database->getDocument('students', 'student1'); $classes = $student->getAttribute('newClasses'); $this->assertEquals(null, $classes); // Try to get inverse documents again - $classes = static::getDatabase()->getDocument('classes', 'class1'); + $classes = $database->getDocument('classes', 'class1'); $students = $classes->getAttribute('newStudents'); $this->assertEquals(null, $students); } public function testNestedManyToMany_OneToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('stones'); - static::getDatabase()->createCollection('hearths'); - static::getDatabase()->createCollection('plots'); + $database->createCollection('stones'); + $database->createCollection('hearths'); + $database->createCollection('plots'); - static::getDatabase()->createAttribute('stones', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('hearths', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('plots', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('stones', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('hearths', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('plots', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'stones', relatedCollection: 'hearths', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'hearths', relatedCollection: 'plots', type: Database::RELATION_ONE_TO_ONE, @@ -802,7 +811,7 @@ public function testNestedManyToMany_OneToOneRelationship(): void twoWayKey: 'hearth' ); - static::getDatabase()->createDocument('stones', new Document([ + $database->createDocument('stones', new Document([ '$id' => 'stone1', '$permissions' => [ Permission::read(Role::any()), @@ -840,7 +849,7 @@ public function testNestedManyToMany_OneToOneRelationship(): void ], ])); - $stone1 = static::getDatabase()->getDocument('stones', 'stone1'); + $stone1 = $database->getDocument('stones', 'stone1'); $this->assertEquals(2, \count($stone1['hearths'])); $this->assertEquals('hearth1', $stone1['hearths'][0]['$id']); $this->assertEquals('hearth2', $stone1['hearths'][1]['$id']); @@ -849,7 +858,7 @@ public function testNestedManyToMany_OneToOneRelationship(): void $this->assertEquals('plot2', $stone1['hearths'][1]['plot']['$id']); $this->assertArrayNotHasKey('hearth', $stone1['hearths'][0]['plot']); - static::getDatabase()->createDocument('plots', new Document([ + $database->createDocument('plots', new Document([ '$id' => 'plot3', '$permissions' => [ Permission::read(Role::any()), @@ -873,7 +882,7 @@ public function testNestedManyToMany_OneToOneRelationship(): void ], ])); - $plot3 = static::getDatabase()->getDocument('plots', 'plot3'); + $plot3 = $database->getDocument('plots', 'plot3'); $this->assertEquals('hearth3', $plot3['hearth']['$id']); $this->assertArrayNotHasKey('plot', $plot3['hearth']); $this->assertEquals('stone2', $plot3['hearth']['stones'][0]['$id']); @@ -882,26 +891,29 @@ public function testNestedManyToMany_OneToOneRelationship(): void public function testNestedManyToMany_OneToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('groups'); - static::getDatabase()->createCollection('tounaments'); - static::getDatabase()->createCollection('prizes'); + $database->createCollection('groups'); + $database->createCollection('tounaments'); + $database->createCollection('prizes'); - static::getDatabase()->createAttribute('groups', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('tounaments', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('prizes', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('groups', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('tounaments', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('prizes', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'groups', relatedCollection: 'tounaments', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'tounaments', relatedCollection: 'prizes', type: Database::RELATION_ONE_TO_MANY, @@ -910,7 +922,7 @@ public function testNestedManyToMany_OneToManyRelationship(): void twoWayKey: 'tounament' ); - static::getDatabase()->createDocument('groups', new Document([ + $database->createDocument('groups', new Document([ '$id' => 'group1', '$permissions' => [ Permission::read(Role::any()), @@ -966,7 +978,7 @@ public function testNestedManyToMany_OneToManyRelationship(): void ], ])); - $group1 = static::getDatabase()->getDocument('groups', 'group1'); + $group1 = $database->getDocument('groups', 'group1'); $this->assertEquals(2, \count($group1['tounaments'])); $this->assertEquals('tounament1', $group1['tounaments'][0]['$id']); $this->assertEquals('tounament2', $group1['tounaments'][1]['$id']); @@ -979,26 +991,29 @@ public function testNestedManyToMany_OneToManyRelationship(): void public function testNestedManyToMany_ManyToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('platforms'); - static::getDatabase()->createCollection('games'); - static::getDatabase()->createCollection('publishers'); + $database->createCollection('platforms'); + $database->createCollection('games'); + $database->createCollection('publishers'); - static::getDatabase()->createAttribute('platforms', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('games', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('publishers', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('platforms', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('games', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('publishers', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'platforms', relatedCollection: 'games', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'games', relatedCollection: 'publishers', type: Database::RELATION_MANY_TO_ONE, @@ -1007,7 +1022,7 @@ public function testNestedManyToMany_ManyToOneRelationship(): void twoWayKey: 'games' ); - static::getDatabase()->createDocument('platforms', new Document([ + $database->createDocument('platforms', new Document([ '$id' => 'platform1', '$permissions' => [ Permission::read(Role::any()), @@ -1045,7 +1060,7 @@ public function testNestedManyToMany_ManyToOneRelationship(): void ] ])); - $platform1 = static::getDatabase()->getDocument('platforms', 'platform1'); + $platform1 = $database->getDocument('platforms', 'platform1'); $this->assertEquals(2, \count($platform1['games'])); $this->assertEquals('game1', $platform1['games'][0]['$id']); $this->assertEquals('game2', $platform1['games'][1]['$id']); @@ -1054,7 +1069,7 @@ public function testNestedManyToMany_ManyToOneRelationship(): void $this->assertEquals('publisher2', $platform1['games'][1]['publisher']['$id']); $this->assertArrayNotHasKey('games', $platform1['games'][0]['publisher']); - static::getDatabase()->createDocument('publishers', new Document([ + $database->createDocument('publishers', new Document([ '$id' => 'publisher3', '$permissions' => [ Permission::read(Role::any()), @@ -1080,7 +1095,7 @@ public function testNestedManyToMany_ManyToOneRelationship(): void ], ])); - $publisher3 = static::getDatabase()->getDocument('publishers', 'publisher3'); + $publisher3 = $database->getDocument('publishers', 'publisher3'); $this->assertEquals(1, \count($publisher3['games'])); $this->assertEquals('game3', $publisher3['games'][0]['$id']); $this->assertArrayNotHasKey('publisher', $publisher3['games'][0]); @@ -1090,26 +1105,29 @@ public function testNestedManyToMany_ManyToOneRelationship(): void public function testNestedManyToMany_ManyToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('sauces'); - static::getDatabase()->createCollection('pizzas'); - static::getDatabase()->createCollection('toppings'); + $database->createCollection('sauces'); + $database->createCollection('pizzas'); + $database->createCollection('toppings'); - static::getDatabase()->createAttribute('sauces', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('pizzas', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('toppings', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('sauces', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('pizzas', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('toppings', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'sauces', relatedCollection: 'pizzas', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'pizzas', relatedCollection: 'toppings', type: Database::RELATION_MANY_TO_MANY, @@ -1118,7 +1136,7 @@ public function testNestedManyToMany_ManyToManyRelationship(): void twoWayKey: 'pizzas' ); - static::getDatabase()->createDocument('sauces', new Document([ + $database->createDocument('sauces', new Document([ '$id' => 'sauce1', '$permissions' => [ Permission::read(Role::any()), @@ -1174,7 +1192,7 @@ public function testNestedManyToMany_ManyToManyRelationship(): void ] ])); - $sauce1 = static::getDatabase()->getDocument('sauces', 'sauce1'); + $sauce1 = $database->getDocument('sauces', 'sauce1'); $this->assertEquals(2, \count($sauce1['pizzas'])); $this->assertEquals('pizza1', $sauce1['pizzas'][0]['$id']); $this->assertEquals('pizza2', $sauce1['pizzas'][1]['$id']); @@ -1191,29 +1209,32 @@ public function testNestedManyToMany_ManyToManyRelationship(): void public function testManyToManyRelationshipKeyWithSymbols(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('$symbols_coll.ection7'); - static::getDatabase()->createCollection('$symbols_coll.ection8'); + $database->createCollection('$symbols_coll.ection7'); + $database->createCollection('$symbols_coll.ection8'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: '$symbols_coll.ection7', relatedCollection: '$symbols_coll.ection8', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - $doc1 = static::getDatabase()->createDocument('$symbols_coll.ection8', new Document([ + $doc1 = $database->createDocument('$symbols_coll.ection8', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()) ] ])); - $doc2 = static::getDatabase()->createDocument('$symbols_coll.ection7', new Document([ + $doc2 = $database->createDocument('$symbols_coll.ection7', new Document([ '$id' => ID::unique(), '$symbols_coll.ection8' => [$doc1->getId()], '$permissions' => [ @@ -1222,8 +1243,8 @@ public function testManyToManyRelationshipKeyWithSymbols(): void ] ])); - $doc1 = static::getDatabase()->getDocument('$symbols_coll.ection8', $doc1->getId()); - $doc2 = static::getDatabase()->getDocument('$symbols_coll.ection7', $doc2->getId()); + $doc1 = $database->getDocument('$symbols_coll.ection8', $doc1->getId()); + $doc2 = $database->getDocument('$symbols_coll.ection7', $doc2->getId()); $this->assertEquals($doc2->getId(), $doc1->getAttribute('$symbols_coll.ection7')[0]->getId()); $this->assertEquals($doc1->getId(), $doc2->getAttribute('$symbols_coll.ection8')[0]->getId()); @@ -1231,11 +1252,14 @@ public function testManyToManyRelationshipKeyWithSymbols(): void public function testRecreateManyToManyOneWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1253,7 +1277,7 @@ public function testRecreateManyToManyOneWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1272,15 +1296,15 @@ public function testRecreateManyToManyOneWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, @@ -1288,17 +1312,20 @@ public function testRecreateManyToManyOneWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToManyTwoWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1316,7 +1343,7 @@ public function testRecreateManyToManyTwoWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1335,16 +1362,16 @@ public function testRecreateManyToManyTwoWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, @@ -1353,17 +1380,20 @@ public function testRecreateManyToManyTwoWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToManyTwoWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1381,7 +1411,7 @@ public function testRecreateManyToManyTwoWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1400,16 +1430,16 @@ public function testRecreateManyToManyTwoWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, @@ -1418,17 +1448,20 @@ public function testRecreateManyToManyTwoWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToManyOneWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1446,7 +1479,7 @@ public function testRecreateManyToManyOneWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1465,15 +1498,15 @@ public function testRecreateManyToManyOneWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_MANY, @@ -1481,13 +1514,16 @@ public function testRecreateManyToManyOneWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testDeleteBulkDocumentsManyToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships() || !static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships() || !$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } diff --git a/tests/e2e/Adapter/Scopes/Relationships/ManyToOneTests.php b/tests/e2e/Adapter/Scopes/Relationships/ManyToOneTests.php index 9ea7d7085..9614b7a1e 100644 --- a/tests/e2e/Adapter/Scopes/Relationships/ManyToOneTests.php +++ b/tests/e2e/Adapter/Scopes/Relationships/ManyToOneTests.php @@ -15,20 +15,23 @@ trait ManyToOneTests { public function testManyToOneOneWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('review'); - static::getDatabase()->createCollection('movie'); + $database->createCollection('review'); + $database->createCollection('movie'); - static::getDatabase()->createAttribute('review', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('movie', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('movie', 'length', Database::VAR_INTEGER, 0, true, formatOptions: ['min' => 0, 'max' => 999]); - static::getDatabase()->createAttribute('movie', 'date', Database::VAR_DATETIME, 0, false, filters: ['datetime']); - static::getDatabase()->createAttribute('review', 'date', Database::VAR_DATETIME, 0, false, filters: ['datetime']); - static::getDatabase()->createRelationship( + $database->createAttribute('review', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('movie', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('movie', 'length', Database::VAR_INTEGER, 0, true, formatOptions: ['min' => 0, 'max' => 999]); + $database->createAttribute('movie', 'date', Database::VAR_DATETIME, 0, false, filters: ['datetime']); + $database->createAttribute('review', 'date', Database::VAR_DATETIME, 0, false, filters: ['datetime']); + $database->createRelationship( collection: 'review', relatedCollection: 'movie', type: Database::RELATION_MANY_TO_ONE, @@ -36,7 +39,7 @@ public function testManyToOneOneWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('review'); + $collection = $database->getCollection('review'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'movie') { @@ -51,7 +54,7 @@ public function testManyToOneOneWayRelationship(): void } // Check metadata for related collection - $collection = static::getDatabase()->getCollection('movie'); + $collection = $database->getCollection('movie'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'reviews') { @@ -66,7 +69,7 @@ public function testManyToOneOneWayRelationship(): void } // Create document with relationship with nested data - $review1 = static::getDatabase()->createDocument('review', new Document([ + $review1 = $database->createDocument('review', new Document([ '$id' => 'review1', '$permissions' => [ Permission::read(Role::any()), @@ -89,16 +92,16 @@ public function testManyToOneOneWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('review', 'review1', $review1->setAttribute('movie', 'no-movie')); + $database->updateDocument('review', 'review1', $review1->setAttribute('movie', 'no-movie')); - $review1Document = static::getDatabase()->getDocument('review', 'review1'); + $review1Document = $database->getDocument('review', 'review1'); // Assert document does not contain non existing relation document. $this->assertEquals(null, $review1Document->getAttribute('movie')); - static::getDatabase()->updateDocument('review', 'review1', $review1->setAttribute('movie', 'movie1')); + $database->updateDocument('review', 'review1', $review1->setAttribute('movie', 'movie1')); // Create document with relationship to existing document by ID - $review10 = static::getDatabase()->createDocument('review', new Document([ + $review10 = $database->createDocument('review', new Document([ '$id' => 'review10', '$permissions' => [ Permission::read(Role::any()), @@ -111,7 +114,7 @@ public function testManyToOneOneWayRelationship(): void ])); // Create document with relationship with related ID - static::getDatabase()->createDocument('movie', new Document([ + $database->createDocument('movie', new Document([ '$id' => 'movie2', '$permissions' => [ Permission::read(Role::any()), @@ -122,7 +125,7 @@ public function testManyToOneOneWayRelationship(): void 'length' => 90, 'date' => '2023-04-03 10:35:27.390', ])); - static::getDatabase()->createDocument('review', new Document([ + $database->createDocument('review', new Document([ '$id' => 'review2', '$permissions' => [ Permission::read(Role::any()), @@ -135,12 +138,12 @@ public function testManyToOneOneWayRelationship(): void ])); // Get document with relationship - $review = static::getDatabase()->getDocument('review', 'review1'); + $review = $database->getDocument('review', 'review1'); $movie = $review->getAttribute('movie', []); $this->assertEquals('movie1', $movie['$id']); $this->assertArrayNotHasKey('reviews', $movie); - $documents = static::getDatabase()->find('review', [ + $documents = $database->find('review', [ Query::select(['date', 'movie.date']) ]); @@ -154,24 +157,24 @@ public function testManyToOneOneWayRelationship(): void $this->assertEquals(29, strlen($document['date'])); // checks filter $this->assertEquals(29, strlen($document['movie']['date'])); - $review = static::getDatabase()->getDocument('review', 'review2'); + $review = $database->getDocument('review', 'review2'); $movie = $review->getAttribute('movie', []); $this->assertEquals('movie2', $movie['$id']); $this->assertArrayNotHasKey('reviews', $movie); // Get related document - $movie = static::getDatabase()->getDocument('movie', 'movie1'); + $movie = $database->getDocument('movie', 'movie1'); $this->assertArrayNotHasKey('reviews', $movie); - $movie = static::getDatabase()->getDocument('movie', 'movie2'); + $movie = $database->getDocument('movie', 'movie2'); $this->assertArrayNotHasKey('reviews', $movie); - $reviews = static::getDatabase()->find('review'); + $reviews = $database->find('review'); $this->assertEquals(3, \count($reviews)); // Select related document attributes - $review = static::getDatabase()->findOne('review', [ + $review = $database->findOne('review', [ Query::select(['*', 'movie.name']) ]); @@ -182,7 +185,7 @@ public function testManyToOneOneWayRelationship(): void $this->assertEquals('Movie 1', $review->getAttribute('movie')->getAttribute('name')); $this->assertArrayNotHasKey('length', $review->getAttribute('movie')); - $review = static::getDatabase()->getDocument('review', 'review1', [ + $review = $database->getDocument('review', 'review1', [ Query::select(['*', 'movie.name']) ]); @@ -190,32 +193,32 @@ public function testManyToOneOneWayRelationship(): void $this->assertArrayNotHasKey('length', $review->getAttribute('movie')); // Update root document attribute without altering relationship - $review1 = static::getDatabase()->updateDocument( + $review1 = $database->updateDocument( 'review', $review1->getId(), $review1->setAttribute('name', 'Review 1 Updated') ); $this->assertEquals('Review 1 Updated', $review1->getAttribute('name')); - $review1 = static::getDatabase()->getDocument('review', 'review1'); + $review1 = $database->getDocument('review', 'review1'); $this->assertEquals('Review 1 Updated', $review1->getAttribute('name')); // Update nested document attribute $movie = $review1->getAttribute('movie'); $movie->setAttribute('name', 'Movie 1 Updated'); - $review1 = static::getDatabase()->updateDocument( + $review1 = $database->updateDocument( 'review', $review1->getId(), $review1->setAttribute('movie', $movie) ); $this->assertEquals('Movie 1 Updated', $review1->getAttribute('movie')->getAttribute('name')); - $review1 = static::getDatabase()->getDocument('review', 'review1'); + $review1 = $database->getDocument('review', 'review1'); $this->assertEquals('Movie 1 Updated', $review1->getAttribute('movie')->getAttribute('name')); // Create new document with no relationship - $review5 = static::getDatabase()->createDocument('review', new Document([ + $review5 = $database->createDocument('review', new Document([ '$id' => 'review5', '$permissions' => [ Permission::read(Role::any()), @@ -226,7 +229,7 @@ public function testManyToOneOneWayRelationship(): void ])); // Update to relate to created document - $review5 = static::getDatabase()->updateDocument( + $review5 = $database->updateDocument( 'review', $review5->getId(), $review5->setAttribute('movie', new Document([ @@ -242,39 +245,39 @@ public function testManyToOneOneWayRelationship(): void ); $this->assertEquals('Movie 5', $review5->getAttribute('movie')->getAttribute('name')); - $review5 = static::getDatabase()->getDocument('review', 'review5'); + $review5 = $database->getDocument('review', 'review5'); $this->assertEquals('Movie 5', $review5->getAttribute('movie')->getAttribute('name')); // Update document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'review', $review1->getId(), $review1->setAttribute('movie', 'movie2') ); // Rename relationship keys on both sides - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'review', 'movie', 'newMovie', ); // Get document with new relationship key - $review = static::getDatabase()->getDocument('review', 'review1'); + $review = $database->getDocument('review', 'review1'); $movie = $review->getAttribute('newMovie'); $this->assertEquals('movie2', $movie['$id']); // Reset values - $review1 = static::getDatabase()->getDocument('review', 'review1'); + $review1 = $database->getDocument('review', 'review1'); - static::getDatabase()->updateDocument( + $database->updateDocument( 'review', $review1->getId(), $review1->setAttribute('newMovie', 'movie1') ); // Create new document with no relationship - static::getDatabase()->createDocument('movie', new Document([ + $database->createDocument('movie', new Document([ '$id' => 'movie3', '$permissions' => [ Permission::read(Role::any()), @@ -286,78 +289,81 @@ public function testManyToOneOneWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('movie', 'movie3'); + $deleted = $database->deleteDocument('movie', 'movie3'); $this->assertEquals(true, $deleted); - $movie3 = static::getDatabase()->getDocument('movie', 'movie3'); + $movie3 = $database->getDocument('movie', 'movie3'); $this->assertEquals(true, $movie3->isEmpty()); // Try to delete document while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('movie', 'movie1'); + $database->deleteDocument('movie', 'movie1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'review', id: 'newMovie', onDelete: Database::RELATION_MUTATE_SET_NULL ); // Delete child, set parent relationship to null - static::getDatabase()->deleteDocument('movie', 'movie1'); + $database->deleteDocument('movie', 'movie1'); // Check relation was set to null - $review1 = static::getDatabase()->getDocument('review', 'review1'); + $review1 = $database->getDocument('review', 'review1'); $this->assertEquals(null, $review1->getAttribute('newMovie')); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'review', id: 'newMovie', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete child, will delete parent - static::getDatabase()->deleteDocument('movie', 'movie2'); + $database->deleteDocument('movie', 'movie2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('movie', 'movie2'); + $library = $database->getDocument('movie', 'movie2'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('review', 'review2'); + $library = $database->getDocument('review', 'review2'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'review', 'newMovie' ); // Try to get document again - $review = static::getDatabase()->getDocument('review', 'review1'); + $review = $database->getDocument('review', 'review1'); $movie = $review->getAttribute('newMovie'); $this->assertEquals(null, $movie); } public function testManyToOneTwoWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('product'); - static::getDatabase()->createCollection('store'); + $database->createCollection('product'); + $database->createCollection('store'); - static::getDatabase()->createAttribute('store', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('store', 'opensAt', Database::VAR_STRING, 5, true); + $database->createAttribute('store', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('store', 'opensAt', Database::VAR_STRING, 5, true); - static::getDatabase()->createAttribute( + $database->createAttribute( collection: 'product', id: 'name', type: Database::VAR_STRING, @@ -365,7 +371,7 @@ public function testManyToOneTwoWayRelationship(): void required: true ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'product', relatedCollection: 'store', type: Database::RELATION_MANY_TO_ONE, @@ -374,7 +380,7 @@ public function testManyToOneTwoWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('product'); + $collection = $database->getCollection('product'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'store') { @@ -389,7 +395,7 @@ public function testManyToOneTwoWayRelationship(): void } // Check metadata for related collection - $collection = static::getDatabase()->getCollection('store'); + $collection = $database->getCollection('store'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'products') { @@ -404,7 +410,7 @@ public function testManyToOneTwoWayRelationship(): void } // Create document with relationship with nested data - $product1 = static::getDatabase()->createDocument('product', new Document([ + $product1 = $database->createDocument('product', new Document([ '$id' => 'product1', '$permissions' => [ Permission::read(Role::any()), @@ -425,16 +431,16 @@ public function testManyToOneTwoWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('product', 'product1', $product1->setAttribute('store', 'no-store')); + $database->updateDocument('product', 'product1', $product1->setAttribute('store', 'no-store')); - $product1Document = static::getDatabase()->getDocument('product', 'product1'); + $product1Document = $database->getDocument('product', 'product1'); // Assert document does not contain non existing relation document. $this->assertEquals(null, $product1Document->getAttribute('store')); - static::getDatabase()->updateDocument('product', 'product1', $product1->setAttribute('store', 'store1')); + $database->updateDocument('product', 'product1', $product1->setAttribute('store', 'store1')); // Create document with relationship with related ID - static::getDatabase()->createDocument('store', new Document([ + $database->createDocument('store', new Document([ '$id' => 'store2', '$permissions' => [ Permission::read(Role::any()), @@ -444,7 +450,7 @@ public function testManyToOneTwoWayRelationship(): void 'name' => 'Store 2', 'opensAt' => '09:30', ])); - static::getDatabase()->createDocument('product', new Document([ + $database->createDocument('product', new Document([ '$id' => 'product2', '$permissions' => [ Permission::read(Role::any()), @@ -456,7 +462,7 @@ public function testManyToOneTwoWayRelationship(): void ])); // Create from child side - static::getDatabase()->createDocument('store', new Document([ + $database->createDocument('store', new Document([ '$id' => 'store3', '$permissions' => [ Permission::read(Role::any()), @@ -478,7 +484,7 @@ public function testManyToOneTwoWayRelationship(): void ], ])); - static::getDatabase()->createDocument('product', new Document([ + $database->createDocument('product', new Document([ '$id' => 'product4', '$permissions' => [ Permission::read(Role::any()), @@ -487,7 +493,7 @@ public function testManyToOneTwoWayRelationship(): void ], 'name' => 'Product 4', ])); - static::getDatabase()->createDocument('store', new Document([ + $database->createDocument('store', new Document([ '$id' => 'store4', '$permissions' => [ Permission::read(Role::any()), @@ -502,53 +508,53 @@ public function testManyToOneTwoWayRelationship(): void ])); // Get document with relationship - $product = static::getDatabase()->getDocument('product', 'product1'); + $product = $database->getDocument('product', 'product1'); $store = $product->getAttribute('store', []); $this->assertEquals('store1', $store['$id']); $this->assertArrayNotHasKey('products', $store); - $product = static::getDatabase()->getDocument('product', 'product2'); + $product = $database->getDocument('product', 'product2'); $store = $product->getAttribute('store', []); $this->assertEquals('store2', $store['$id']); $this->assertArrayNotHasKey('products', $store); - $product = static::getDatabase()->getDocument('product', 'product3'); + $product = $database->getDocument('product', 'product3'); $store = $product->getAttribute('store', []); $this->assertEquals('store3', $store['$id']); $this->assertArrayNotHasKey('products', $store); - $product = static::getDatabase()->getDocument('product', 'product4'); + $product = $database->getDocument('product', 'product4'); $store = $product->getAttribute('store', []); $this->assertEquals('store4', $store['$id']); $this->assertArrayNotHasKey('products', $store); // Get related document - $store = static::getDatabase()->getDocument('store', 'store1'); + $store = $database->getDocument('store', 'store1'); $products = $store->getAttribute('products'); $this->assertEquals('product1', $products[0]['$id']); $this->assertArrayNotHasKey('store', $products[0]); - $store = static::getDatabase()->getDocument('store', 'store2'); + $store = $database->getDocument('store', 'store2'); $products = $store->getAttribute('products'); $this->assertEquals('product2', $products[0]['$id']); $this->assertArrayNotHasKey('store', $products[0]); - $store = static::getDatabase()->getDocument('store', 'store3'); + $store = $database->getDocument('store', 'store3'); $products = $store->getAttribute('products'); $this->assertEquals('product3', $products[0]['$id']); $this->assertArrayNotHasKey('store', $products[0]); - $store = static::getDatabase()->getDocument('store', 'store4'); + $store = $database->getDocument('store', 'store4'); $products = $store->getAttribute('products'); $this->assertEquals('product4', $products[0]['$id']); $this->assertArrayNotHasKey('store', $products[0]); - $products = static::getDatabase()->find('product'); + $products = $database->find('product'); $this->assertEquals(4, \count($products)); // Select related document attributes - $product = static::getDatabase()->findOne('product', [ + $product = $database->findOne('product', [ Query::select(['*', 'store.name']) ]); @@ -559,7 +565,7 @@ public function testManyToOneTwoWayRelationship(): void $this->assertEquals('Store 1', $product->getAttribute('store')->getAttribute('name')); $this->assertArrayNotHasKey('opensAt', $product->getAttribute('store')); - $product = static::getDatabase()->getDocument('product', 'product1', [ + $product = $database->getDocument('product', 'product1', [ Query::select(['*', 'store.name']) ]); @@ -567,58 +573,58 @@ public function testManyToOneTwoWayRelationship(): void $this->assertArrayNotHasKey('opensAt', $product->getAttribute('store')); // Update root document attribute without altering relationship - $product1 = static::getDatabase()->updateDocument( + $product1 = $database->updateDocument( 'product', $product1->getId(), $product1->setAttribute('name', 'Product 1 Updated') ); $this->assertEquals('Product 1 Updated', $product1->getAttribute('name')); - $product1 = static::getDatabase()->getDocument('product', 'product1'); + $product1 = $database->getDocument('product', 'product1'); $this->assertEquals('Product 1 Updated', $product1->getAttribute('name')); // Update inverse document attribute without altering relationship - $store1 = static::getDatabase()->getDocument('store', 'store1'); - $store1 = static::getDatabase()->updateDocument( + $store1 = $database->getDocument('store', 'store1'); + $store1 = $database->updateDocument( 'store', $store1->getId(), $store1->setAttribute('name', 'Store 1 Updated') ); $this->assertEquals('Store 1 Updated', $store1->getAttribute('name')); - $store1 = static::getDatabase()->getDocument('store', 'store1'); + $store1 = $database->getDocument('store', 'store1'); $this->assertEquals('Store 1 Updated', $store1->getAttribute('name')); // Update nested document attribute $store = $product1->getAttribute('store'); $store->setAttribute('name', 'Store 1 Updated'); - $product1 = static::getDatabase()->updateDocument( + $product1 = $database->updateDocument( 'product', $product1->getId(), $product1->setAttribute('store', $store) ); $this->assertEquals('Store 1 Updated', $product1->getAttribute('store')->getAttribute('name')); - $product1 = static::getDatabase()->getDocument('product', 'product1'); + $product1 = $database->getDocument('product', 'product1'); $this->assertEquals('Store 1 Updated', $product1->getAttribute('store')->getAttribute('name')); // Update inverse nested document attribute $product = $store1->getAttribute('products')[0]; $product->setAttribute('name', 'Product 1 Updated'); - $store1 = static::getDatabase()->updateDocument( + $store1 = $database->updateDocument( 'store', $store1->getId(), $store1->setAttribute('products', [$product]) ); $this->assertEquals('Product 1 Updated', $store1->getAttribute('products')[0]->getAttribute('name')); - $store1 = static::getDatabase()->getDocument('store', 'store1'); + $store1 = $database->getDocument('store', 'store1'); $this->assertEquals('Product 1 Updated', $store1->getAttribute('products')[0]->getAttribute('name')); // Create new document with no relationship - $product5 = static::getDatabase()->createDocument('product', new Document([ + $product5 = $database->createDocument('product', new Document([ '$id' => 'product5', '$permissions' => [ Permission::read(Role::any()), @@ -629,7 +635,7 @@ public function testManyToOneTwoWayRelationship(): void ])); // Update to relate to created document - $product5 = static::getDatabase()->updateDocument( + $product5 = $database->updateDocument( 'product', $product5->getId(), $product5->setAttribute('store', new Document([ @@ -645,11 +651,11 @@ public function testManyToOneTwoWayRelationship(): void ); $this->assertEquals('Store 5', $product5->getAttribute('store')->getAttribute('name')); - $product5 = static::getDatabase()->getDocument('product', 'product5'); + $product5 = $database->getDocument('product', 'product5'); $this->assertEquals('Store 5', $product5->getAttribute('store')->getAttribute('name')); // Create new child document with no relationship - $store6 = static::getDatabase()->createDocument('store', new Document([ + $store6 = $database->createDocument('store', new Document([ '$id' => 'store6', '$permissions' => [ Permission::read(Role::any()), @@ -661,7 +667,7 @@ public function testManyToOneTwoWayRelationship(): void ])); // Update inverse to related to newly created document - $store6 = static::getDatabase()->updateDocument( + $store6 = $database->updateDocument( 'store', $store6->getId(), $store6->setAttribute('products', [new Document([ @@ -676,36 +682,36 @@ public function testManyToOneTwoWayRelationship(): void ); $this->assertEquals('Product 6', $store6->getAttribute('products')[0]->getAttribute('name')); - $store6 = static::getDatabase()->getDocument('store', 'store6'); + $store6 = $database->getDocument('store', 'store6'); $this->assertEquals('Product 6', $store6->getAttribute('products')[0]->getAttribute('name')); // Update document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'product', $product1->getId(), $product1->setAttribute('store', 'store2') ); - $store1 = static::getDatabase()->getDocument('store', 'store1'); + $store1 = $database->getDocument('store', 'store1'); // Update inverse document - static::getDatabase()->updateDocument( + $database->updateDocument( 'store', $store1->getId(), $store1->setAttribute('products', ['product1']) ); - $store2 = static::getDatabase()->getDocument('store', 'store2'); + $store2 = $database->getDocument('store', 'store2'); // Update inverse document - static::getDatabase()->updateDocument( + $database->updateDocument( 'store', $store2->getId(), $store2->setAttribute('products', ['product1', 'product2']) ); // Rename relationship keys on both sides - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'product', 'store', 'newStore', @@ -713,25 +719,25 @@ public function testManyToOneTwoWayRelationship(): void ); // Get document with new relationship key - $store = static::getDatabase()->getDocument('store', 'store2'); + $store = $database->getDocument('store', 'store2'); $products = $store->getAttribute('newProducts'); $this->assertEquals('product1', $products[0]['$id']); // Get inverse document with new relationship key - $product = static::getDatabase()->getDocument('product', 'product1'); + $product = $database->getDocument('product', 'product1'); $store = $product->getAttribute('newStore'); $this->assertEquals('store2', $store['$id']); // Reset relationships - $store1 = static::getDatabase()->getDocument('store', 'store1'); - static::getDatabase()->updateDocument( + $store1 = $database->getDocument('store', 'store1'); + $database->updateDocument( 'store', $store1->getId(), $store1->setAttribute('newProducts', ['product1']) ); // Create new document with no relationship - static::getDatabase()->createDocument('store', new Document([ + $database->createDocument('store', new Document([ '$id' => 'store7', '$permissions' => [ Permission::read(Role::any()), @@ -743,95 +749,98 @@ public function testManyToOneTwoWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('store', 'store7'); + $deleted = $database->deleteDocument('store', 'store7'); $this->assertEquals(true, $deleted); - $store7 = static::getDatabase()->getDocument('store', 'store7'); + $store7 = $database->getDocument('store', 'store7'); $this->assertEquals(true, $store7->isEmpty()); // Try to delete child while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('store', 'store1'); + $database->deleteDocument('store', 'store1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Delete parent while still related to another with on delete: restrict - $result = static::getDatabase()->deleteDocument('product', 'product5'); + $result = $database->deleteDocument('product', 'product5'); $this->assertEquals(true, $result); // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'product', id: 'newStore', onDelete: Database::RELATION_MUTATE_SET_NULL ); // Delete child, set parent relationship to null - static::getDatabase()->deleteDocument('store', 'store1'); + $database->deleteDocument('store', 'store1'); // Check relation was set to null - static::getDatabase()->getDocument('product', 'product1'); + $database->getDocument('product', 'product1'); $this->assertEquals(null, $product1->getAttribute('newStore')); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'product', id: 'newStore', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete child, will delete parent - static::getDatabase()->deleteDocument('store', 'store2'); + $database->deleteDocument('store', 'store2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('store', 'store2'); + $library = $database->getDocument('store', 'store2'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('product', 'product2'); + $library = $database->getDocument('product', 'product2'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'product', 'newStore' ); // Try to get document again - $products = static::getDatabase()->getDocument('product', 'product1'); + $products = $database->getDocument('product', 'product1'); $store = $products->getAttribute('newStore'); $this->assertEquals(null, $store); // Try to get inverse document again - $store = static::getDatabase()->getDocument('store', 'store1'); + $store = $database->getDocument('store', 'store1'); $products = $store->getAttribute('newProducts'); $this->assertEquals(null, $products); } public function testNestedManyToOne_OneToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('towns'); - static::getDatabase()->createCollection('homelands'); - static::getDatabase()->createCollection('capitals'); + $database->createCollection('towns'); + $database->createCollection('homelands'); + $database->createCollection('capitals'); - static::getDatabase()->createAttribute('towns', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('homelands', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('capitals', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('towns', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('homelands', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('capitals', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'towns', relatedCollection: 'homelands', type: Database::RELATION_MANY_TO_ONE, twoWay: true, id: 'homeland' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'homelands', relatedCollection: 'capitals', type: Database::RELATION_ONE_TO_ONE, @@ -840,7 +849,7 @@ public function testNestedManyToOne_OneToOneRelationship(): void twoWayKey: 'homeland' ); - static::getDatabase()->createDocument('towns', new Document([ + $database->createDocument('towns', new Document([ '$id' => 'town1', '$permissions' => [ Permission::read(Role::any()), @@ -862,13 +871,13 @@ public function testNestedManyToOne_OneToOneRelationship(): void ], ])); - $town1 = static::getDatabase()->getDocument('towns', 'town1'); + $town1 = $database->getDocument('towns', 'town1'); $this->assertEquals('homeland1', $town1['homeland']['$id']); $this->assertArrayNotHasKey('towns', $town1['homeland']); $this->assertEquals('capital1', $town1['homeland']['capital']['$id']); $this->assertArrayNotHasKey('homeland', $town1['homeland']['capital']); - static::getDatabase()->createDocument('capitals', new Document([ + $database->createDocument('capitals', new Document([ '$id' => 'capital2', '$permissions' => [ Permission::read(Role::any()), @@ -899,7 +908,7 @@ public function testNestedManyToOne_OneToOneRelationship(): void ], ])); - $capital2 = static::getDatabase()->getDocument('capitals', 'capital2'); + $capital2 = $database->getDocument('capitals', 'capital2'); $this->assertEquals('homeland2', $capital2['homeland']['$id']); $this->assertArrayNotHasKey('capital', $capital2['homeland']); $this->assertEquals(2, \count($capital2['homeland']['towns'])); @@ -909,27 +918,30 @@ public function testNestedManyToOne_OneToOneRelationship(): void public function testNestedManyToOne_OneToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('players'); - static::getDatabase()->createCollection('teams'); - static::getDatabase()->createCollection('supporters'); + $database->createCollection('players'); + $database->createCollection('teams'); + $database->createCollection('supporters'); - static::getDatabase()->createAttribute('players', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('teams', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('supporters', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('players', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('teams', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('supporters', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'players', relatedCollection: 'teams', type: Database::RELATION_MANY_TO_ONE, twoWay: true, id: 'team' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'teams', relatedCollection: 'supporters', type: Database::RELATION_ONE_TO_MANY, @@ -938,7 +950,7 @@ public function testNestedManyToOne_OneToManyRelationship(): void twoWayKey: 'team' ); - static::getDatabase()->createDocument('players', new Document([ + $database->createDocument('players', new Document([ '$id' => 'player1', '$permissions' => [ Permission::read(Role::any()), @@ -969,14 +981,14 @@ public function testNestedManyToOne_OneToManyRelationship(): void ], ])); - $player1 = static::getDatabase()->getDocument('players', 'player1'); + $player1 = $database->getDocument('players', 'player1'); $this->assertEquals('team1', $player1['team']['$id']); $this->assertArrayNotHasKey('players', $player1['team']); $this->assertEquals(2, \count($player1['team']['supporters'])); $this->assertEquals('supporter1', $player1['team']['supporters'][0]['$id']); $this->assertEquals('supporter2', $player1['team']['supporters'][1]['$id']); - static::getDatabase()->createDocument('supporters', new Document([ + $database->createDocument('supporters', new Document([ '$id' => 'supporter3', '$permissions' => [ Permission::read(Role::any()), @@ -1007,7 +1019,7 @@ public function testNestedManyToOne_OneToManyRelationship(): void ], ])); - $supporter3 = static::getDatabase()->getDocument('supporters', 'supporter3'); + $supporter3 = $database->getDocument('supporters', 'supporter3'); $this->assertEquals('team2', $supporter3['team']['$id']); $this->assertArrayNotHasKey('supporters', $supporter3['team']); $this->assertEquals(2, \count($supporter3['team']['players'])); @@ -1017,27 +1029,30 @@ public function testNestedManyToOne_OneToManyRelationship(): void public function testNestedManyToOne_ManyToOne(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('cows'); - static::getDatabase()->createCollection('farms'); - static::getDatabase()->createCollection('farmer'); + $database->createCollection('cows'); + $database->createCollection('farms'); + $database->createCollection('farmer'); - static::getDatabase()->createAttribute('cows', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('farms', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('farmer', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('cows', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('farms', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('farmer', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'cows', relatedCollection: 'farms', type: Database::RELATION_MANY_TO_ONE, twoWay: true, id: 'farm' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'farms', relatedCollection: 'farmer', type: Database::RELATION_MANY_TO_ONE, @@ -1045,7 +1060,7 @@ public function testNestedManyToOne_ManyToOne(): void id: 'farmer' ); - static::getDatabase()->createDocument('cows', new Document([ + $database->createDocument('cows', new Document([ '$id' => 'cow1', '$permissions' => [ Permission::read(Role::any()), @@ -1067,13 +1082,13 @@ public function testNestedManyToOne_ManyToOne(): void ], ])); - $cow1 = static::getDatabase()->getDocument('cows', 'cow1'); + $cow1 = $database->getDocument('cows', 'cow1'); $this->assertEquals('farm1', $cow1['farm']['$id']); $this->assertArrayNotHasKey('cows', $cow1['farm']); $this->assertEquals('farmer1', $cow1['farm']['farmer']['$id']); $this->assertArrayNotHasKey('farms', $cow1['farm']['farmer']); - static::getDatabase()->createDocument('farmer', new Document([ + $database->createDocument('farmer', new Document([ '$id' => 'farmer2', '$permissions' => [ Permission::read(Role::any()), @@ -1106,7 +1121,7 @@ public function testNestedManyToOne_ManyToOne(): void ], ])); - $farmer2 = static::getDatabase()->getDocument('farmer', 'farmer2'); + $farmer2 = $database->getDocument('farmer', 'farmer2'); $this->assertEquals('farm2', $farmer2['farms'][0]['$id']); $this->assertArrayNotHasKey('farmer', $farmer2['farms'][0]); $this->assertEquals(2, \count($farmer2['farms'][0]['cows'])); @@ -1116,34 +1131,37 @@ public function testNestedManyToOne_ManyToOne(): void public function testNestedManyToOne_ManyToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('books'); - static::getDatabase()->createCollection('entrants'); - static::getDatabase()->createCollection('rooms'); + $database->createCollection('books'); + $database->createCollection('entrants'); + $database->createCollection('rooms'); - static::getDatabase()->createAttribute('books', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('entrants', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('rooms', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('books', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('entrants', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('rooms', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'books', relatedCollection: 'entrants', type: Database::RELATION_MANY_TO_ONE, twoWay: true, id: 'entrant' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'entrants', relatedCollection: 'rooms', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createDocument('books', new Document([ + $database->createDocument('books', new Document([ '$id' => 'book1', '$permissions' => [ Permission::read(Role::any()), @@ -1174,7 +1192,7 @@ public function testNestedManyToOne_ManyToManyRelationship(): void ], ])); - $book1 = static::getDatabase()->getDocument('books', 'book1'); + $book1 = $database->getDocument('books', 'book1'); $this->assertEquals('entrant1', $book1['entrant']['$id']); $this->assertArrayNotHasKey('books', $book1['entrant']); $this->assertEquals(2, \count($book1['entrant']['rooms'])); @@ -1184,7 +1202,10 @@ public function testNestedManyToOne_ManyToManyRelationship(): void public function testExceedMaxDepthManyToOneParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1194,31 +1215,31 @@ public function testExceedMaxDepthManyToOneParent(): void $level3Collection = 'level3ManyToOneParent'; $level4Collection = 'level4ManyToOneParent'; - static::getDatabase()->createCollection($level1Collection); - static::getDatabase()->createCollection($level2Collection); - static::getDatabase()->createCollection($level3Collection); - static::getDatabase()->createCollection($level4Collection); + $database->createCollection($level1Collection); + $database->createCollection($level2Collection); + $database->createCollection($level3Collection); + $database->createCollection($level4Collection); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level1Collection, relatedCollection: $level2Collection, type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level2Collection, relatedCollection: $level3Collection, type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level3Collection, relatedCollection: $level4Collection, type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - $level1 = static::getDatabase()->createDocument($level1Collection, new Document([ + $level1 = $database->createDocument($level1Collection, new Document([ '$id' => 'level1', '$permissions' => [ Permission::read(Role::any()), @@ -1241,20 +1262,20 @@ public function testExceedMaxDepthManyToOneParent(): void $this->assertArrayNotHasKey($level4Collection, $level1[$level2Collection][$level3Collection]); // Confirm the 4th level document does not exist - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertNull($level3[$level4Collection]); // Create level 4 document $level3->setAttribute($level4Collection, new Document([ '$id' => 'level4', ])); - $level3 = static::getDatabase()->updateDocument($level3Collection, $level3->getId(), $level3); + $level3 = $database->updateDocument($level3Collection, $level3->getId(), $level3); $this->assertEquals('level4', $level3[$level4Collection]->getId()); - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertEquals('level4', $level3[$level4Collection]->getId()); // Exceed fetch depth - $level1 = static::getDatabase()->getDocument($level1Collection, 'level1'); + $level1 = $database->getDocument($level1Collection, 'level1'); $this->assertArrayHasKey($level2Collection, $level1); $this->assertEquals('level2', $level1[$level2Collection]->getId()); $this->assertArrayHasKey($level3Collection, $level1[$level2Collection]); @@ -1264,29 +1285,32 @@ public function testExceedMaxDepthManyToOneParent(): void public function testManyToOneRelationshipKeyWithSymbols(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('$symbols_coll.ection5'); - static::getDatabase()->createCollection('$symbols_coll.ection6'); + $database->createCollection('$symbols_coll.ection5'); + $database->createCollection('$symbols_coll.ection6'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: '$symbols_coll.ection5', relatedCollection: '$symbols_coll.ection6', type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - $doc1 = static::getDatabase()->createDocument('$symbols_coll.ection6', new Document([ + $doc1 = $database->createDocument('$symbols_coll.ection6', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()) ] ])); - $doc2 = static::getDatabase()->createDocument('$symbols_coll.ection5', new Document([ + $doc2 = $database->createDocument('$symbols_coll.ection5', new Document([ '$id' => ID::unique(), '$symbols_coll.ection6' => $doc1->getId(), '$permissions' => [ @@ -1295,8 +1319,8 @@ public function testManyToOneRelationshipKeyWithSymbols(): void ] ])); - $doc1 = static::getDatabase()->getDocument('$symbols_coll.ection6', $doc1->getId()); - $doc2 = static::getDatabase()->getDocument('$symbols_coll.ection5', $doc2->getId()); + $doc1 = $database->getDocument('$symbols_coll.ection6', $doc1->getId()); + $doc2 = $database->getDocument('$symbols_coll.ection5', $doc2->getId()); $this->assertEquals($doc2->getId(), $doc1->getAttribute('$symbols_coll.ection5')[0]->getId()); $this->assertEquals($doc1->getId(), $doc2->getAttribute('$symbols_coll.ection6')->getId()); @@ -1305,11 +1329,14 @@ public function testManyToOneRelationshipKeyWithSymbols(): void public function testRecreateManyToOneOneWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1327,7 +1354,7 @@ public function testRecreateManyToOneOneWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1346,15 +1373,15 @@ public function testRecreateManyToOneOneWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, @@ -1362,17 +1389,20 @@ public function testRecreateManyToOneOneWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToOneOneWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1390,7 +1420,7 @@ public function testRecreateManyToOneOneWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1409,15 +1439,15 @@ public function testRecreateManyToOneOneWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, @@ -1425,17 +1455,20 @@ public function testRecreateManyToOneOneWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToOneTwoWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1453,7 +1486,7 @@ public function testRecreateManyToOneTwoWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1472,16 +1505,16 @@ public function testRecreateManyToOneTwoWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, @@ -1490,16 +1523,19 @@ public function testRecreateManyToOneTwoWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateManyToOneTwoWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1517,7 +1553,7 @@ public function testRecreateManyToOneTwoWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1536,16 +1572,16 @@ public function testRecreateManyToOneTwoWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, twoWay: true, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_MANY_TO_ONE, @@ -1554,13 +1590,16 @@ public function testRecreateManyToOneTwoWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testDeleteBulkDocumentsManyToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships() || !static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships() || !$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } diff --git a/tests/e2e/Adapter/Scopes/Relationships/OneToManyTests.php b/tests/e2e/Adapter/Scopes/Relationships/OneToManyTests.php index a37ec31db..926b30d6f 100644 --- a/tests/e2e/Adapter/Scopes/Relationships/OneToManyTests.php +++ b/tests/e2e/Adapter/Scopes/Relationships/OneToManyTests.php @@ -15,19 +15,22 @@ trait OneToManyTests { public function testOneToManyOneWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('artist'); - static::getDatabase()->createCollection('album'); + $database->createCollection('artist'); + $database->createCollection('album'); - static::getDatabase()->createAttribute('artist', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('album', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('album', 'price', Database::VAR_FLOAT, 0, true); + $database->createAttribute('artist', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('album', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('album', 'price', Database::VAR_FLOAT, 0, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'artist', relatedCollection: 'album', type: Database::RELATION_ONE_TO_MANY, @@ -35,7 +38,7 @@ public function testOneToManyOneWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('artist'); + $collection = $database->getCollection('artist'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { @@ -51,7 +54,7 @@ public function testOneToManyOneWayRelationship(): void } // Create document with relationship with nested data - $artist1 = static::getDatabase()->createDocument('artist', new Document([ + $artist1 = $database->createDocument('artist', new Document([ '$id' => 'artist1', '$permissions' => [ Permission::read(Role::any()), @@ -73,14 +76,14 @@ public function testOneToManyOneWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('artist', 'artist1', $artist1->setAttribute('albums', ['album1', 'no-album'])); + $database->updateDocument('artist', 'artist1', $artist1->setAttribute('albums', ['album1', 'no-album'])); - $artist1Document = static::getDatabase()->getDocument('artist', 'artist1'); + $artist1Document = $database->getDocument('artist', 'artist1'); // Assert document does not contain non existing relation document. $this->assertEquals(1, \count($artist1Document->getAttribute('albums'))); // Create document with relationship with related ID - static::getDatabase()->createDocument('album', new Document([ + $database->createDocument('album', new Document([ '$id' => 'album2', '$permissions' => [ Permission::read(Role::any()), @@ -90,7 +93,7 @@ public function testOneToManyOneWayRelationship(): void 'name' => 'Album 2', 'price' => 19.99, ])); - static::getDatabase()->createDocument('artist', new Document([ + $database->createDocument('artist', new Document([ '$id' => 'artist2', '$permissions' => [ Permission::read(Role::any()), @@ -112,19 +115,19 @@ public function testOneToManyOneWayRelationship(): void ] ])); - $documents = static::getDatabase()->find('artist', [ + $documents = $database->find('artist', [ Query::select(['name']), Query::limit(1) ]); $this->assertArrayNotHasKey('albums', $documents[0]); // Get document with relationship - $artist = static::getDatabase()->getDocument('artist', 'artist1'); + $artist = $database->getDocument('artist', 'artist1'); $albums = $artist->getAttribute('albums', []); $this->assertEquals('album1', $albums[0]['$id']); $this->assertArrayNotHasKey('artist', $albums[0]); - $artist = static::getDatabase()->getDocument('artist', 'artist2'); + $artist = $database->getDocument('artist', 'artist2'); $albums = $artist->getAttribute('albums', []); $this->assertEquals('album2', $albums[0]['$id']); $this->assertArrayNotHasKey('artist', $albums[0]); @@ -132,18 +135,18 @@ public function testOneToManyOneWayRelationship(): void $this->assertCount(2, $albums); // Get related document - $album = static::getDatabase()->getDocument('album', 'album1'); + $album = $database->getDocument('album', 'album1'); $this->assertArrayNotHasKey('artist', $album); - $album = static::getDatabase()->getDocument('album', 'album2'); + $album = $database->getDocument('album', 'album2'); $this->assertArrayNotHasKey('artist', $album); - $artists = static::getDatabase()->find('artist'); + $artists = $database->find('artist'); $this->assertEquals(2, \count($artists)); // Select related document attributes - $artist = static::getDatabase()->findOne('artist', [ + $artist = $database->findOne('artist', [ Query::select(['*', 'albums.name']) ]); @@ -154,7 +157,7 @@ public function testOneToManyOneWayRelationship(): void $this->assertEquals('Album 1', $artist->getAttribute('albums')[0]->getAttribute('name')); $this->assertArrayNotHasKey('price', $artist->getAttribute('albums')[0]); - $artist = static::getDatabase()->getDocument('artist', 'artist1', [ + $artist = $database->getDocument('artist', 'artist1', [ Query::select(['*', 'albums.name']) ]); @@ -162,43 +165,43 @@ public function testOneToManyOneWayRelationship(): void $this->assertArrayNotHasKey('price', $artist->getAttribute('albums')[0]); // Update root document attribute without altering relationship - $artist1 = static::getDatabase()->updateDocument( + $artist1 = $database->updateDocument( 'artist', $artist1->getId(), $artist1->setAttribute('name', 'Artist 1 Updated') ); $this->assertEquals('Artist 1 Updated', $artist1->getAttribute('name')); - $artist1 = static::getDatabase()->getDocument('artist', 'artist1'); + $artist1 = $database->getDocument('artist', 'artist1'); $this->assertEquals('Artist 1 Updated', $artist1->getAttribute('name')); // Update nested document attribute $albums = $artist1->getAttribute('albums', []); $albums[0]->setAttribute('name', 'Album 1 Updated'); - $artist1 = static::getDatabase()->updateDocument( + $artist1 = $database->updateDocument( 'artist', $artist1->getId(), $artist1->setAttribute('albums', $albums) ); $this->assertEquals('Album 1 Updated', $artist1->getAttribute('albums')[0]->getAttribute('name')); - $artist1 = static::getDatabase()->getDocument('artist', 'artist1'); + $artist1 = $database->getDocument('artist', 'artist1'); $this->assertEquals('Album 1 Updated', $artist1->getAttribute('albums')[0]->getAttribute('name')); $albumId = $artist1->getAttribute('albums')[0]->getAttribute('$id'); - $albumDocument = static::getDatabase()->getDocument('album', $albumId); + $albumDocument = $database->getDocument('album', $albumId); $albumDocument->setAttribute('name', 'Album 1 Updated!!!'); - static::getDatabase()->updateDocument('album', $albumDocument->getId(), $albumDocument); - $albumDocument = static::getDatabase()->getDocument('album', $albumDocument->getId()); - $artist1 = static::getDatabase()->getDocument('artist', $artist1->getId()); + $database->updateDocument('album', $albumDocument->getId(), $albumDocument); + $albumDocument = $database->getDocument('album', $albumDocument->getId()); + $artist1 = $database->getDocument('artist', $artist1->getId()); $this->assertEquals('Album 1 Updated!!!', $albumDocument['name']); $this->assertEquals($albumDocument->getId(), $artist1->getAttribute('albums')[0]->getId()); $this->assertEquals($albumDocument->getAttribute('name'), $artist1->getAttribute('albums')[0]->getAttribute('name')); // Create new document with no relationship - $artist3 = static::getDatabase()->createDocument('artist', new Document([ + $artist3 = $database->createDocument('artist', new Document([ '$id' => 'artist3', '$permissions' => [ Permission::read(Role::any()), @@ -209,7 +212,7 @@ public function testOneToManyOneWayRelationship(): void ])); // Update to relate to created document - $artist3 = static::getDatabase()->updateDocument( + $artist3 = $database->updateDocument( 'artist', $artist3->getId(), $artist3->setAttribute('albums', [new Document([ @@ -225,37 +228,37 @@ public function testOneToManyOneWayRelationship(): void ); $this->assertEquals('Album 3', $artist3->getAttribute('albums')[0]->getAttribute('name')); - $artist3 = static::getDatabase()->getDocument('artist', 'artist3'); + $artist3 = $database->getDocument('artist', 'artist3'); $this->assertEquals('Album 3', $artist3->getAttribute('albums')[0]->getAttribute('name')); // Update document with new related documents, will remove existing relations - static::getDatabase()->updateDocument( + $database->updateDocument( 'artist', $artist1->getId(), $artist1->setAttribute('albums', ['album2']) ); // Update document with new related documents, will remove existing relations - static::getDatabase()->updateDocument( + $database->updateDocument( 'artist', $artist1->getId(), $artist1->setAttribute('albums', ['album1', 'album2']) ); // Rename relationship key - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'artist', 'albums', 'newAlbums' ); // Get document with new relationship key - $artist = static::getDatabase()->getDocument('artist', 'artist1'); + $artist = $database->getDocument('artist', 'artist1'); $albums = $artist->getAttribute('newAlbums'); $this->assertEquals('album1', $albums[0]['$id']); // Create new document with no relationship - static::getDatabase()->createDocument('artist', new Document([ + $database->createDocument('artist', new Document([ '$id' => 'artist4', '$permissions' => [ Permission::read(Role::any()), @@ -266,56 +269,56 @@ public function testOneToManyOneWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('artist', 'artist4'); + $deleted = $database->deleteDocument('artist', 'artist4'); $this->assertEquals(true, $deleted); - $artist4 = static::getDatabase()->getDocument('artist', 'artist4'); + $artist4 = $database->getDocument('artist', 'artist4'); $this->assertEquals(true, $artist4->isEmpty()); // Try to delete document while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('artist', 'artist1'); + $database->deleteDocument('artist', 'artist1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'artist', id: 'newAlbums', onDelete: Database::RELATION_MUTATE_SET_NULL ); // Delete parent, set child relationship to null - static::getDatabase()->deleteDocument('artist', 'artist1'); + $database->deleteDocument('artist', 'artist1'); // Check relation was set to null - $album2 = static::getDatabase()->getDocument('album', 'album2'); + $album2 = $database->getDocument('album', 'album2'); $this->assertEquals(null, $album2->getAttribute('artist', '')); // Relate again - static::getDatabase()->updateDocument( + $database->updateDocument( 'album', $album2->getId(), $album2->setAttribute('artist', 'artist2') ); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'artist', id: 'newAlbums', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('artist', 'artist2'); + $database->deleteDocument('artist', 'artist2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('artist', 'artist2'); + $library = $database->getDocument('artist', 'artist2'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('album', 'album2'); + $library = $database->getDocument('album', 'album2'); $this->assertEquals(true, $library->isEmpty()); $albums = []; @@ -332,7 +335,7 @@ public function testOneToManyOneWayRelationship(): void ]; } - $artist = static::getDatabase()->createDocument('artist', new Document([ + $artist = $database->createDocument('artist', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::delete(Role::any()), @@ -341,29 +344,29 @@ public function testOneToManyOneWayRelationship(): void 'newAlbums' => $albums ])); - $artist = static::getDatabase()->getDocument('artist', $artist->getId()); + $artist = $database->getDocument('artist', $artist->getId()); $this->assertCount(50, $artist->getAttribute('newAlbums')); - $albums = static::getDatabase()->find('album', [ + $albums = $database->find('album', [ Query::equal('artist', [$artist->getId()]), Query::limit(999) ]); $this->assertCount(50, $albums); - $count = static::getDatabase()->count('album', [ + $count = $database->count('album', [ Query::equal('artist', [$artist->getId()]), ]); $this->assertEquals(50, $count); - static::getDatabase()->deleteDocument('album', 'album_1'); - $artist = static::getDatabase()->getDocument('artist', $artist->getId()); + $database->deleteDocument('album', 'album_1'); + $artist = $database->getDocument('artist', $artist->getId()); $this->assertCount(49, $artist->getAttribute('newAlbums')); - static::getDatabase()->deleteDocument('artist', $artist->getId()); + $database->deleteDocument('artist', $artist->getId()); - $albums = static::getDatabase()->find('album', [ + $albums = $database->find('album', [ Query::equal('artist', [$artist->getId()]), Query::limit(999) ]); @@ -371,32 +374,35 @@ public function testOneToManyOneWayRelationship(): void $this->assertCount(0, $albums); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'artist', 'newAlbums' ); // Try to get document again - $artist = static::getDatabase()->getDocument('artist', 'artist1'); + $artist = $database->getDocument('artist', 'artist1'); $albums = $artist->getAttribute('newAlbums', ''); $this->assertEquals(null, $albums); } public function testOneToManyTwoWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('customer'); - static::getDatabase()->createCollection('account'); + $database->createCollection('customer'); + $database->createCollection('account'); - static::getDatabase()->createAttribute('customer', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('account', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('account', 'number', Database::VAR_STRING, 255, true); + $database->createAttribute('customer', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('account', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('account', 'number', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'customer', relatedCollection: 'account', type: Database::RELATION_ONE_TO_MANY, @@ -405,7 +411,7 @@ public function testOneToManyTwoWayRelationship(): void ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('customer'); + $collection = $database->getCollection('customer'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'accounts') { @@ -420,7 +426,7 @@ public function testOneToManyTwoWayRelationship(): void } // Check metadata for related collection - $collection = static::getDatabase()->getCollection('account'); + $collection = $database->getCollection('account'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'customer') { @@ -435,7 +441,7 @@ public function testOneToManyTwoWayRelationship(): void } // Create document with relationship with nested data - $customer1 = static::getDatabase()->createDocument('customer', new Document([ + $customer1 = $database->createDocument('customer', new Document([ '$id' => 'customer1', '$permissions' => [ Permission::read(Role::any()), @@ -458,14 +464,14 @@ public function testOneToManyTwoWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('customer', 'customer1', $customer1->setAttribute('accounts', ['account1','no-account'])); + $database->updateDocument('customer', 'customer1', $customer1->setAttribute('accounts', ['account1','no-account'])); - $customer1Document = static::getDatabase()->getDocument('customer', 'customer1'); + $customer1Document = $database->getDocument('customer', 'customer1'); // Assert document does not contain non existing relation document. $this->assertEquals(1, \count($customer1Document->getAttribute('accounts'))); // Create document with relationship with related ID - $account2 = static::getDatabase()->createDocument('account', new Document([ + $account2 = $database->createDocument('account', new Document([ '$id' => 'account2', '$permissions' => [ Permission::read(Role::any()), @@ -475,7 +481,7 @@ public function testOneToManyTwoWayRelationship(): void 'name' => 'Account 2', 'number' => '987654321', ])); - static::getDatabase()->createDocument('customer', new Document([ + $database->createDocument('customer', new Document([ '$id' => 'customer2', '$permissions' => [ Permission::read(Role::any()), @@ -489,7 +495,7 @@ public function testOneToManyTwoWayRelationship(): void ])); // Create from child side - static::getDatabase()->createDocument('account', new Document([ + $database->createDocument('account', new Document([ '$id' => 'account3', '$permissions' => [ Permission::read(Role::any()), @@ -508,7 +514,7 @@ public function testOneToManyTwoWayRelationship(): void 'name' => 'Customer 3' ] ])); - static::getDatabase()->createDocument('customer', new Document([ + $database->createDocument('customer', new Document([ '$id' => 'customer4', '$permissions' => [ Permission::read(Role::any()), @@ -517,7 +523,7 @@ public function testOneToManyTwoWayRelationship(): void ], 'name' => 'Customer 4', ])); - static::getDatabase()->createDocument('account', new Document([ + $database->createDocument('account', new Document([ '$id' => 'account4', '$permissions' => [ Permission::read(Role::any()), @@ -530,53 +536,53 @@ public function testOneToManyTwoWayRelationship(): void ])); // Get documents with relationship - $customer = static::getDatabase()->getDocument('customer', 'customer1'); + $customer = $database->getDocument('customer', 'customer1'); $accounts = $customer->getAttribute('accounts', []); $this->assertEquals('account1', $accounts[0]['$id']); $this->assertArrayNotHasKey('customer', $accounts[0]); - $customer = static::getDatabase()->getDocument('customer', 'customer2'); + $customer = $database->getDocument('customer', 'customer2'); $accounts = $customer->getAttribute('accounts', []); $this->assertEquals('account2', $accounts[0]['$id']); $this->assertArrayNotHasKey('customer', $accounts[0]); - $customer = static::getDatabase()->getDocument('customer', 'customer3'); + $customer = $database->getDocument('customer', 'customer3'); $accounts = $customer->getAttribute('accounts', []); $this->assertEquals('account3', $accounts[0]['$id']); $this->assertArrayNotHasKey('customer', $accounts[0]); - $customer = static::getDatabase()->getDocument('customer', 'customer4'); + $customer = $database->getDocument('customer', 'customer4'); $accounts = $customer->getAttribute('accounts', []); $this->assertEquals('account4', $accounts[0]['$id']); $this->assertArrayNotHasKey('customer', $accounts[0]); // Get related documents - $account = static::getDatabase()->getDocument('account', 'account1'); + $account = $database->getDocument('account', 'account1'); $customer = $account->getAttribute('customer'); $this->assertEquals('customer1', $customer['$id']); $this->assertArrayNotHasKey('accounts', $customer); - $account = static::getDatabase()->getDocument('account', 'account2'); + $account = $database->getDocument('account', 'account2'); $customer = $account->getAttribute('customer'); $this->assertEquals('customer2', $customer['$id']); $this->assertArrayNotHasKey('accounts', $customer); - $account = static::getDatabase()->getDocument('account', 'account3'); + $account = $database->getDocument('account', 'account3'); $customer = $account->getAttribute('customer'); $this->assertEquals('customer3', $customer['$id']); $this->assertArrayNotHasKey('accounts', $customer); - $account = static::getDatabase()->getDocument('account', 'account4'); + $account = $database->getDocument('account', 'account4'); $customer = $account->getAttribute('customer'); $this->assertEquals('customer4', $customer['$id']); $this->assertArrayNotHasKey('accounts', $customer); - $customers = static::getDatabase()->find('customer'); + $customers = $database->find('customer'); $this->assertEquals(4, \count($customers)); // Select related document attributes - $customer = static::getDatabase()->findOne('customer', [ + $customer = $database->findOne('customer', [ Query::select(['*', 'accounts.name']) ]); @@ -587,7 +593,7 @@ public function testOneToManyTwoWayRelationship(): void $this->assertEquals('Account 1', $customer->getAttribute('accounts')[0]->getAttribute('name')); $this->assertArrayNotHasKey('number', $customer->getAttribute('accounts')[0]); - $customer = static::getDatabase()->getDocument('customer', 'customer1', [ + $customer = $database->getDocument('customer', 'customer1', [ Query::select(['*', 'accounts.name']) ]); @@ -595,45 +601,45 @@ public function testOneToManyTwoWayRelationship(): void $this->assertArrayNotHasKey('number', $customer->getAttribute('accounts')[0]); // Update root document attribute without altering relationship - $customer1 = static::getDatabase()->updateDocument( + $customer1 = $database->updateDocument( 'customer', $customer1->getId(), $customer1->setAttribute('name', 'Customer 1 Updated') ); $this->assertEquals('Customer 1 Updated', $customer1->getAttribute('name')); - $customer1 = static::getDatabase()->getDocument('customer', 'customer1'); + $customer1 = $database->getDocument('customer', 'customer1'); $this->assertEquals('Customer 1 Updated', $customer1->getAttribute('name')); - $account2 = static::getDatabase()->getDocument('account', 'account2'); + $account2 = $database->getDocument('account', 'account2'); // Update inverse root document attribute without altering relationship - $account2 = static::getDatabase()->updateDocument( + $account2 = $database->updateDocument( 'account', $account2->getId(), $account2->setAttribute('name', 'Account 2 Updated') ); $this->assertEquals('Account 2 Updated', $account2->getAttribute('name')); - $account2 = static::getDatabase()->getDocument('account', 'account2'); + $account2 = $database->getDocument('account', 'account2'); $this->assertEquals('Account 2 Updated', $account2->getAttribute('name')); // Update nested document attribute $accounts = $customer1->getAttribute('accounts', []); $accounts[0]->setAttribute('name', 'Account 1 Updated'); - $customer1 = static::getDatabase()->updateDocument( + $customer1 = $database->updateDocument( 'customer', $customer1->getId(), $customer1->setAttribute('accounts', $accounts) ); $this->assertEquals('Account 1 Updated', $customer1->getAttribute('accounts')[0]->getAttribute('name')); - $customer1 = static::getDatabase()->getDocument('customer', 'customer1'); + $customer1 = $database->getDocument('customer', 'customer1'); $this->assertEquals('Account 1 Updated', $customer1->getAttribute('accounts')[0]->getAttribute('name')); // Update inverse nested document attribute - $account2 = static::getDatabase()->updateDocument( + $account2 = $database->updateDocument( 'account', $account2->getId(), $account2->setAttribute( @@ -645,11 +651,11 @@ public function testOneToManyTwoWayRelationship(): void ); $this->assertEquals('Customer 2 Updated', $account2->getAttribute('customer')->getAttribute('name')); - $account2 = static::getDatabase()->getDocument('account', 'account2'); + $account2 = $database->getDocument('account', 'account2'); $this->assertEquals('Customer 2 Updated', $account2->getAttribute('customer')->getAttribute('name')); // Create new document with no relationship - $customer5 = static::getDatabase()->createDocument('customer', new Document([ + $customer5 = $database->createDocument('customer', new Document([ '$id' => 'customer5', '$permissions' => [ Permission::read(Role::any()), @@ -660,7 +666,7 @@ public function testOneToManyTwoWayRelationship(): void ])); // Update to relate to created document - $customer5 = static::getDatabase()->updateDocument( + $customer5 = $database->updateDocument( 'customer', $customer5->getId(), $customer5->setAttribute('accounts', [new Document([ @@ -676,11 +682,11 @@ public function testOneToManyTwoWayRelationship(): void ); $this->assertEquals('Account 5', $customer5->getAttribute('accounts')[0]->getAttribute('name')); - $customer5 = static::getDatabase()->getDocument('customer', 'customer5'); + $customer5 = $database->getDocument('customer', 'customer5'); $this->assertEquals('Account 5', $customer5->getAttribute('accounts')[0]->getAttribute('name')); // Create new child document with no relationship - $account6 = static::getDatabase()->createDocument('account', new Document([ + $account6 = $database->createDocument('account', new Document([ '$id' => 'account6', '$permissions' => [ Permission::read(Role::any()), @@ -692,7 +698,7 @@ public function testOneToManyTwoWayRelationship(): void ])); // Update inverse to relate to created document - $account6 = static::getDatabase()->updateDocument( + $account6 = $database->updateDocument( 'account', $account6->getId(), $account6->setAttribute('customer', new Document([ @@ -707,32 +713,32 @@ public function testOneToManyTwoWayRelationship(): void ); $this->assertEquals('Customer 6', $account6->getAttribute('customer')->getAttribute('name')); - $account6 = static::getDatabase()->getDocument('account', 'account6'); + $account6 = $database->getDocument('account', 'account6'); $this->assertEquals('Customer 6', $account6->getAttribute('customer')->getAttribute('name')); // Update document with new related document, will remove existing relations - static::getDatabase()->updateDocument( + $database->updateDocument( 'customer', $customer1->getId(), $customer1->setAttribute('accounts', ['account2']) ); // Update document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'customer', $customer1->getId(), $customer1->setAttribute('accounts', ['account1', 'account2']) ); // Update inverse document - static::getDatabase()->updateDocument( + $database->updateDocument( 'account', $account2->getId(), $account2->setAttribute('customer', 'customer2') ); // Rename relationship keys on both sides - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'customer', 'accounts', 'newAccounts', @@ -740,17 +746,17 @@ public function testOneToManyTwoWayRelationship(): void ); // Get document with new relationship key - $customer = static::getDatabase()->getDocument('customer', 'customer1'); + $customer = $database->getDocument('customer', 'customer1'); $accounts = $customer->getAttribute('newAccounts'); $this->assertEquals('account1', $accounts[0]['$id']); // Get inverse document with new relationship key - $account = static::getDatabase()->getDocument('account', 'account1'); + $account = $database->getDocument('account', 'account1'); $customer = $account->getAttribute('newCustomer'); $this->assertEquals('customer1', $customer['$id']); // Create new document with no relationship - static::getDatabase()->createDocument('customer', new Document([ + $database->createDocument('customer', new Document([ '$id' => 'customer7', '$permissions' => [ Permission::read(Role::any()), @@ -761,98 +767,101 @@ public function testOneToManyTwoWayRelationship(): void ])); // Can delete document with no relationship when on delete is set to restrict - $deleted = static::getDatabase()->deleteDocument('customer', 'customer7'); + $deleted = $database->deleteDocument('customer', 'customer7'); $this->assertEquals(true, $deleted); - $customer7 = static::getDatabase()->getDocument('customer', 'customer7'); + $customer7 = $database->getDocument('customer', 'customer7'); $this->assertEquals(true, $customer7->isEmpty()); // Try to delete document while still related to another with on delete: restrict try { - static::getDatabase()->deleteDocument('customer', 'customer1'); + $database->deleteDocument('customer', 'customer1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'customer', id: 'newAccounts', onDelete: Database::RELATION_MUTATE_SET_NULL ); // Delete parent, set child relationship to null - static::getDatabase()->deleteDocument('customer', 'customer1'); + $database->deleteDocument('customer', 'customer1'); // Check relation was set to null - $account1 = static::getDatabase()->getDocument('account', 'account1'); + $account1 = $database->getDocument('account', 'account1'); $this->assertEquals(null, $account2->getAttribute('newCustomer', '')); // Relate again - static::getDatabase()->updateDocument( + $database->updateDocument( 'account', $account1->getId(), $account1->setAttribute('newCustomer', 'customer2') ); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'customer', id: 'newAccounts', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('customer', 'customer2'); + $database->deleteDocument('customer', 'customer2'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('customer', 'customer2'); + $library = $database->getDocument('customer', 'customer2'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('account', 'account2'); + $library = $database->getDocument('account', 'account2'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'customer', 'newAccounts' ); // Try to get document again - $customer = static::getDatabase()->getDocument('customer', 'customer1'); + $customer = $database->getDocument('customer', 'customer1'); $accounts = $customer->getAttribute('newAccounts'); $this->assertEquals(null, $accounts); // Try to get inverse document again - $accounts = static::getDatabase()->getDocument('account', 'account1'); + $accounts = $database->getDocument('account', 'account1'); $customer = $accounts->getAttribute('newCustomer'); $this->assertEquals(null, $customer); } public function testNestedOneToMany_OneToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('countries'); - static::getDatabase()->createCollection('cities'); - static::getDatabase()->createCollection('mayors'); + $database->createCollection('countries'); + $database->createCollection('cities'); + $database->createCollection('mayors'); - static::getDatabase()->createAttribute('cities', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('countries', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('mayors', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('cities', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('countries', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('mayors', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'countries', relatedCollection: 'cities', type: Database::RELATION_ONE_TO_MANY, twoWay: true, twoWayKey: 'country' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'cities', relatedCollection: 'mayors', type: Database::RELATION_ONE_TO_ONE, @@ -861,7 +870,7 @@ public function testNestedOneToMany_OneToOneRelationship(): void twoWayKey: 'city' ); - static::getDatabase()->createDocument('countries', new Document([ + $database->createDocument('countries', new Document([ '$id' => 'country1', '$permissions' => [ Permission::read(Role::any()), @@ -902,26 +911,26 @@ public function testNestedOneToMany_OneToOneRelationship(): void ], ])); - $documents = static::getDatabase()->find('countries', [ + $documents = $database->find('countries', [ Query::limit(1) ]); $this->assertEquals('Mayor 1', $documents[0]['cities'][0]['mayor']['name']); - $documents = static::getDatabase()->find('countries', [ + $documents = $database->find('countries', [ Query::select(['name']), Query::limit(1) ]); $this->assertArrayHasKey('name', $documents[0]); $this->assertArrayNotHasKey('cities', $documents[0]); - $documents = static::getDatabase()->find('countries', [ + $documents = $database->find('countries', [ Query::select(['*']), Query::limit(1) ]); $this->assertArrayHasKey('name', $documents[0]); $this->assertArrayNotHasKey('cities', $documents[0]); - $documents = static::getDatabase()->find('countries', [ + $documents = $database->find('countries', [ Query::select(['*', 'cities.*', 'cities.mayor.*']), Query::limit(1) ]); @@ -929,12 +938,12 @@ public function testNestedOneToMany_OneToOneRelationship(): void $this->assertEquals('Mayor 1', $documents[0]['cities'][0]['mayor']['name']); // Insert docs to cache: - $country1 = static::getDatabase()->getDocument('countries', 'country1'); - $mayor1 = static::getDatabase()->getDocument('mayors', 'mayor1'); + $country1 = $database->getDocument('countries', 'country1'); + $mayor1 = $database->getDocument('mayors', 'mayor1'); $this->assertEquals('City 1', $mayor1['city']['name']); $this->assertEquals('City 1', $country1['cities'][0]['name']); - static::getDatabase()->updateDocument('cities', 'city1', new Document([ + $database->updateDocument('cities', 'city1', new Document([ '$id' => 'city1', '$collection' => 'cities', 'name' => 'City 1 updated', @@ -945,8 +954,8 @@ public function testNestedOneToMany_OneToOneRelationship(): void ], ])); - $mayor1 = static::getDatabase()->getDocument('mayors', 'mayor1'); - $country1 = static::getDatabase()->getDocument('countries', 'country1'); + $mayor1 = $database->getDocument('mayors', 'mayor1'); + $country1 = $database->getDocument('countries', 'country1'); $this->assertEquals('City 1 updated', $mayor1['city']['name']); $this->assertEquals('City 1 updated', $country1['cities'][0]['name']); @@ -957,7 +966,7 @@ public function testNestedOneToMany_OneToOneRelationship(): void $this->assertArrayNotHasKey('city', $country1['cities'][0]['mayor']); $this->assertArrayNotHasKey('city', $country1['cities'][1]['mayor']); - static::getDatabase()->createDocument('mayors', new Document([ + $database->createDocument('mayors', new Document([ '$id' => 'mayor3', '$permissions' => [ Permission::read(Role::any()), @@ -979,7 +988,7 @@ public function testNestedOneToMany_OneToOneRelationship(): void ], ])); - $country2 = static::getDatabase()->getDocument('countries', 'country2'); + $country2 = $database->getDocument('countries', 'country2'); $this->assertEquals('city3', $country2['cities'][0]['$id']); $this->assertEquals('mayor3', $country2['cities'][0]['mayor']['$id']); $this->assertArrayNotHasKey('country', $country2['cities'][0]); @@ -988,27 +997,30 @@ public function testNestedOneToMany_OneToOneRelationship(): void public function testNestedOneToMany_OneToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('dormitories'); - static::getDatabase()->createCollection('occupants'); - static::getDatabase()->createCollection('pets'); + $database->createCollection('dormitories'); + $database->createCollection('occupants'); + $database->createCollection('pets'); - static::getDatabase()->createAttribute('dormitories', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('occupants', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('pets', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('dormitories', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('occupants', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('pets', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'dormitories', relatedCollection: 'occupants', type: Database::RELATION_ONE_TO_MANY, twoWay: true, twoWayKey: 'dormitory' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'occupants', relatedCollection: 'pets', type: Database::RELATION_ONE_TO_MANY, @@ -1016,7 +1028,7 @@ public function testNestedOneToMany_OneToManyRelationship(): void twoWayKey: 'occupant' ); - static::getDatabase()->createDocument('dormitories', new Document([ + $database->createDocument('dormitories', new Document([ '$id' => 'dormitory1', '$permissions' => [ Permission::read(Role::any()), @@ -1072,7 +1084,7 @@ public function testNestedOneToMany_OneToManyRelationship(): void ], ])); - $dormitory1 = static::getDatabase()->getDocument('dormitories', 'dormitory1'); + $dormitory1 = $database->getDocument('dormitories', 'dormitory1'); $this->assertEquals('occupant1', $dormitory1['occupants'][0]['$id']); $this->assertEquals('occupant2', $dormitory1['occupants'][1]['$id']); $this->assertEquals('pet1', $dormitory1['occupants'][0]['pets'][0]['$id']); @@ -1086,7 +1098,7 @@ public function testNestedOneToMany_OneToManyRelationship(): void $this->assertArrayNotHasKey('occupant', $dormitory1['occupants'][1]['pets'][0]); $this->assertArrayNotHasKey('occupant', $dormitory1['occupants'][1]['pets'][1]); - static::getDatabase()->createDocument('pets', new Document([ + $database->createDocument('pets', new Document([ '$id' => 'pet5', '$permissions' => [ Permission::read(Role::any()), @@ -1108,7 +1120,7 @@ public function testNestedOneToMany_OneToManyRelationship(): void ], ])); - $pet5 = static::getDatabase()->getDocument('pets', 'pet5'); + $pet5 = $database->getDocument('pets', 'pet5'); $this->assertEquals('occupant3', $pet5['occupant']['$id']); $this->assertEquals('dormitory2', $pet5['occupant']['dormitory']['$id']); $this->assertArrayNotHasKey('pets', $pet5['occupant']); @@ -1117,26 +1129,29 @@ public function testNestedOneToMany_OneToManyRelationship(): void public function testNestedOneToMany_ManyToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('home'); - static::getDatabase()->createCollection('renters'); - static::getDatabase()->createCollection('floors'); + $database->createCollection('home'); + $database->createCollection('renters'); + $database->createCollection('floors'); - static::getDatabase()->createAttribute('home', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('renters', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('floors', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('home', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('renters', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('floors', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'home', relatedCollection: 'renters', type: Database::RELATION_ONE_TO_MANY, twoWay: true ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'renters', relatedCollection: 'floors', type: Database::RELATION_MANY_TO_ONE, @@ -1144,7 +1159,7 @@ public function testNestedOneToMany_ManyToOneRelationship(): void id: 'floor' ); - static::getDatabase()->createDocument('home', new Document([ + $database->createDocument('home', new Document([ '$id' => 'home1', '$permissions' => [ Permission::read(Role::any()), @@ -1168,13 +1183,13 @@ public function testNestedOneToMany_ManyToOneRelationship(): void ], ])); - $home1 = static::getDatabase()->getDocument('home', 'home1'); + $home1 = $database->getDocument('home', 'home1'); $this->assertEquals('renter1', $home1['renters'][0]['$id']); $this->assertEquals('floor1', $home1['renters'][0]['floor']['$id']); $this->assertArrayNotHasKey('home', $home1['renters'][0]); $this->assertArrayNotHasKey('renters', $home1['renters'][0]['floor']); - static::getDatabase()->createDocument('floors', new Document([ + $database->createDocument('floors', new Document([ '$id' => 'floor2', '$permissions' => [ Permission::read(Role::any()), @@ -1198,7 +1213,7 @@ public function testNestedOneToMany_ManyToOneRelationship(): void ], ])); - $floor2 = static::getDatabase()->getDocument('floors', 'floor2'); + $floor2 = $database->getDocument('floors', 'floor2'); $this->assertEquals('renter2', $floor2['renters'][0]['$id']); $this->assertArrayNotHasKey('floor', $floor2['renters'][0]); $this->assertEquals('home2', $floor2['renters'][0]['home']['$id']); @@ -1207,34 +1222,37 @@ public function testNestedOneToMany_ManyToOneRelationship(): void public function testNestedOneToMany_ManyToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('owners'); - static::getDatabase()->createCollection('cats'); - static::getDatabase()->createCollection('toys'); + $database->createCollection('owners'); + $database->createCollection('cats'); + $database->createCollection('toys'); - static::getDatabase()->createAttribute('owners', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('cats', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('toys', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('owners', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('cats', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('toys', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'owners', relatedCollection: 'cats', type: Database::RELATION_ONE_TO_MANY, twoWay: true, twoWayKey: 'owner' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'cats', relatedCollection: 'toys', type: Database::RELATION_MANY_TO_MANY, twoWay: true ); - static::getDatabase()->createDocument('owners', new Document([ + $database->createDocument('owners', new Document([ '$id' => 'owner1', '$permissions' => [ Permission::read(Role::any()), @@ -1260,13 +1278,13 @@ public function testNestedOneToMany_ManyToManyRelationship(): void ], ])); - $owner1 = static::getDatabase()->getDocument('owners', 'owner1'); + $owner1 = $database->getDocument('owners', 'owner1'); $this->assertEquals('cat1', $owner1['cats'][0]['$id']); $this->assertArrayNotHasKey('owner', $owner1['cats'][0]); $this->assertEquals('toy1', $owner1['cats'][0]['toys'][0]['$id']); $this->assertArrayNotHasKey('cats', $owner1['cats'][0]['toys'][0]); - static::getDatabase()->createDocument('toys', new Document([ + $database->createDocument('toys', new Document([ '$id' => 'toy2', '$permissions' => [ Permission::read(Role::any()), @@ -1290,7 +1308,7 @@ public function testNestedOneToMany_ManyToManyRelationship(): void ], ])); - $toy2 = static::getDatabase()->getDocument('toys', 'toy2'); + $toy2 = $database->getDocument('toys', 'toy2'); $this->assertEquals('cat2', $toy2['cats'][0]['$id']); $this->assertArrayNotHasKey('toys', $toy2['cats'][0]); $this->assertEquals('owner2', $toy2['cats'][0]['owner']['$id']); @@ -1299,7 +1317,10 @@ public function testNestedOneToMany_ManyToManyRelationship(): void public function testExceedMaxDepthOneToMany(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1309,24 +1330,24 @@ public function testExceedMaxDepthOneToMany(): void $level3Collection = 'level3OneToMany'; $level4Collection = 'level4OneToMany'; - static::getDatabase()->createCollection($level1Collection); - static::getDatabase()->createCollection($level2Collection); - static::getDatabase()->createCollection($level3Collection); - static::getDatabase()->createCollection($level4Collection); + $database->createCollection($level1Collection); + $database->createCollection($level2Collection); + $database->createCollection($level3Collection); + $database->createCollection($level4Collection); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level1Collection, relatedCollection: $level2Collection, type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level2Collection, relatedCollection: $level3Collection, type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level3Collection, relatedCollection: $level4Collection, type: Database::RELATION_ONE_TO_MANY, @@ -1334,7 +1355,7 @@ public function testExceedMaxDepthOneToMany(): void ); // Exceed create depth - $level1 = static::getDatabase()->createDocument($level1Collection, new Document([ + $level1 = $database->createDocument($level1Collection, new Document([ '$id' => 'level1', '$permissions' => [ Permission::read(Role::any()), @@ -1363,13 +1384,13 @@ public function testExceedMaxDepthOneToMany(): void $this->assertArrayNotHasKey('level4', $level1[$level2Collection][0][$level3Collection][0]); // Make sure level 4 document was not created - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertEquals(0, count($level3[$level4Collection])); - $level4 = static::getDatabase()->getDocument($level4Collection, 'level4'); + $level4 = $database->getDocument($level4Collection, 'level4'); $this->assertTrue($level4->isEmpty()); // Exceed fetch depth - $level1 = static::getDatabase()->getDocument($level1Collection, 'level1'); + $level1 = $database->getDocument($level1Collection, 'level1'); $this->assertEquals(1, count($level1[$level2Collection])); $this->assertEquals('level2', $level1[$level2Collection][0]->getId()); $this->assertEquals(1, count($level1[$level2Collection][0][$level3Collection])); @@ -1378,7 +1399,7 @@ public function testExceedMaxDepthOneToMany(): void // Exceed update depth - $level1 = static::getDatabase()->updateDocument( + $level1 = $database->updateDocument( $level1Collection, 'level1', $level1 @@ -1403,14 +1424,17 @@ public function testExceedMaxDepthOneToMany(): void $this->assertArrayNotHasKey($level4Collection, $level1[$level2Collection][0][$level3Collection][0]); // Make sure level 4 document was not created - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3new'); + $level3 = $database->getDocument($level3Collection, 'level3new'); $this->assertEquals(0, count($level3[$level4Collection])); - $level4 = static::getDatabase()->getDocument($level4Collection, 'level4new'); + $level4 = $database->getDocument($level4Collection, 'level4new'); $this->assertTrue($level4->isEmpty()); } public function testExceedMaxDepthOneToManyChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1420,31 +1444,31 @@ public function testExceedMaxDepthOneToManyChild(): void $level3Collection = 'level3OneToManyChild'; $level4Collection = 'level4OneToManyChild'; - static::getDatabase()->createCollection($level1Collection); - static::getDatabase()->createCollection($level2Collection); - static::getDatabase()->createCollection($level3Collection); - static::getDatabase()->createCollection($level4Collection); + $database->createCollection($level1Collection); + $database->createCollection($level2Collection); + $database->createCollection($level3Collection); + $database->createCollection($level4Collection); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level1Collection, relatedCollection: $level2Collection, type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level2Collection, relatedCollection: $level3Collection, type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level3Collection, relatedCollection: $level4Collection, type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - $level1 = static::getDatabase()->createDocument($level1Collection, new Document([ + $level1 = $database->createDocument($level1Collection, new Document([ '$id' => 'level1', '$permissions' => [ Permission::read(Role::any()), @@ -1473,23 +1497,23 @@ public function testExceedMaxDepthOneToManyChild(): void $this->assertArrayNotHasKey($level4Collection, $level1[$level2Collection][0][$level3Collection][0]); // Confirm the 4th level document does not exist - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertEquals(0, count($level3[$level4Collection])); // Create level 4 document $level3->setAttribute($level4Collection, [new Document([ '$id' => 'level4', ])]); - $level3 = static::getDatabase()->updateDocument($level3Collection, $level3->getId(), $level3); + $level3 = $database->updateDocument($level3Collection, $level3->getId(), $level3); $this->assertEquals('level4', $level3[$level4Collection][0]->getId()); // Verify level 4 document is set - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertArrayHasKey($level4Collection, $level3); $this->assertEquals('level4', $level3[$level4Collection][0]->getId()); // Exceed fetch depth - $level4 = static::getDatabase()->getDocument($level4Collection, 'level4'); + $level4 = $database->getDocument($level4Collection, 'level4'); $this->assertArrayHasKey($level3Collection, $level4); $this->assertEquals('level3', $level4[$level3Collection]->getId()); $this->assertArrayHasKey($level2Collection, $level4[$level3Collection]); @@ -1499,29 +1523,32 @@ public function testExceedMaxDepthOneToManyChild(): void public function testOneToManyRelationshipKeyWithSymbols(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('$symbols_coll.ection3'); - static::getDatabase()->createCollection('$symbols_coll.ection4'); + $database->createCollection('$symbols_coll.ection3'); + $database->createCollection('$symbols_coll.ection4'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: '$symbols_coll.ection3', relatedCollection: '$symbols_coll.ection4', type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - $doc1 = static::getDatabase()->createDocument('$symbols_coll.ection4', new Document([ + $doc1 = $database->createDocument('$symbols_coll.ection4', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()) ] ])); - $doc2 = static::getDatabase()->createDocument('$symbols_coll.ection3', new Document([ + $doc2 = $database->createDocument('$symbols_coll.ection3', new Document([ '$id' => ID::unique(), '$symbols_coll.ection4' => [$doc1->getId()], '$permissions' => [ @@ -1530,8 +1557,8 @@ public function testOneToManyRelationshipKeyWithSymbols(): void ] ])); - $doc1 = static::getDatabase()->getDocument('$symbols_coll.ection4', $doc1->getId()); - $doc2 = static::getDatabase()->getDocument('$symbols_coll.ection3', $doc2->getId()); + $doc1 = $database->getDocument('$symbols_coll.ection4', $doc1->getId()); + $doc2 = $database->getDocument('$symbols_coll.ection3', $doc2->getId()); $this->assertEquals($doc2->getId(), $doc1->getAttribute('$symbols_coll.ection3')->getId()); $this->assertEquals($doc1->getId(), $doc2->getAttribute('$symbols_coll.ection4')[0]->getId()); @@ -1539,11 +1566,14 @@ public function testOneToManyRelationshipKeyWithSymbols(): void public function testRecreateOneToManyOneWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1561,7 +1591,7 @@ public function testRecreateOneToManyOneWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1580,15 +1610,15 @@ public function testRecreateOneToManyOneWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, @@ -1596,17 +1626,20 @@ public function testRecreateOneToManyOneWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToManyTwoWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1624,7 +1657,7 @@ public function testRecreateOneToManyTwoWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1643,16 +1676,16 @@ public function testRecreateOneToManyTwoWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, @@ -1661,17 +1694,20 @@ public function testRecreateOneToManyTwoWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToManyTwoWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1689,7 +1725,7 @@ public function testRecreateOneToManyTwoWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1708,16 +1744,16 @@ public function testRecreateOneToManyTwoWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, twoWay: true, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, @@ -1726,17 +1762,20 @@ public function testRecreateOneToManyTwoWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToManyOneWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1754,7 +1793,7 @@ public function testRecreateOneToManyOneWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1773,15 +1812,15 @@ public function testRecreateOneToManyOneWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_MANY, @@ -1789,13 +1828,16 @@ public function testRecreateOneToManyOneWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testDeleteBulkDocumentsOneToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships() || !static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships() || !$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } @@ -1975,55 +2017,58 @@ public function testDeleteBulkDocumentsOneToManyRelationship(): void public function testOneToManyAndManyToOneDeleteRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('relation1'); - static::getDatabase()->createCollection('relation2'); + $database->createCollection('relation1'); + $database->createCollection('relation2'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'relation1', relatedCollection: 'relation2', type: Database::RELATION_ONE_TO_MANY, ); - $relation1 = static::getDatabase()->getCollection('relation1'); + $relation1 = $database->getCollection('relation1'); $this->assertCount(1, $relation1->getAttribute('attributes')); $this->assertCount(0, $relation1->getAttribute('indexes')); - $relation2 = static::getDatabase()->getCollection('relation2'); + $relation2 = $database->getCollection('relation2'); $this->assertCount(1, $relation2->getAttribute('attributes')); $this->assertCount(1, $relation2->getAttribute('indexes')); - static::getDatabase()->deleteRelationship('relation2', 'relation1'); + $database->deleteRelationship('relation2', 'relation1'); - $relation1 = static::getDatabase()->getCollection('relation1'); + $relation1 = $database->getCollection('relation1'); $this->assertCount(0, $relation1->getAttribute('attributes')); $this->assertCount(0, $relation1->getAttribute('indexes')); - $relation2 = static::getDatabase()->getCollection('relation2'); + $relation2 = $database->getCollection('relation2'); $this->assertCount(0, $relation2->getAttribute('attributes')); $this->assertCount(0, $relation2->getAttribute('indexes')); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'relation1', relatedCollection: 'relation2', type: Database::RELATION_MANY_TO_ONE, ); - $relation1 = static::getDatabase()->getCollection('relation1'); + $relation1 = $database->getCollection('relation1'); $this->assertCount(1, $relation1->getAttribute('attributes')); $this->assertCount(1, $relation1->getAttribute('indexes')); - $relation2 = static::getDatabase()->getCollection('relation2'); + $relation2 = $database->getCollection('relation2'); $this->assertCount(1, $relation2->getAttribute('attributes')); $this->assertCount(0, $relation2->getAttribute('indexes')); - static::getDatabase()->deleteRelationship('relation1', 'relation2'); + $database->deleteRelationship('relation1', 'relation2'); - $relation1 = static::getDatabase()->getCollection('relation1'); + $relation1 = $database->getCollection('relation1'); $this->assertCount(0, $relation1->getAttribute('attributes')); $this->assertCount(0, $relation1->getAttribute('indexes')); - $relation2 = static::getDatabase()->getCollection('relation2'); + $relation2 = $database->getCollection('relation2'); $this->assertCount(0, $relation2->getAttribute('attributes')); $this->assertCount(0, $relation2->getAttribute('indexes')); } diff --git a/tests/e2e/Adapter/Scopes/Relationships/OneToOneTests.php b/tests/e2e/Adapter/Scopes/Relationships/OneToOneTests.php index 9c25b468f..e78311332 100644 --- a/tests/e2e/Adapter/Scopes/Relationships/OneToOneTests.php +++ b/tests/e2e/Adapter/Scopes/Relationships/OneToOneTests.php @@ -19,26 +19,29 @@ trait OneToOneTests { public function testOneToOneOneWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('person'); - static::getDatabase()->createCollection('library'); + $database->createCollection('person'); + $database->createCollection('library'); - static::getDatabase()->createAttribute('person', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('library', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('library', 'area', Database::VAR_STRING, 255, true); + $database->createAttribute('person', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('library', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('library', 'area', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'person', relatedCollection: 'library', type: Database::RELATION_ONE_TO_ONE ); // Check metadata for collection - $collection = static::getDatabase()->getCollection('person'); + $collection = $database->getCollection('person'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { @@ -54,14 +57,14 @@ public function testOneToOneOneWayRelationship(): void } try { - static::getDatabase()->deleteAttribute('person', 'library'); + $database->deleteAttribute('person', 'library'); $this->fail('Failed to throw Exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete relationship as an attribute', $e->getMessage()); } // Create document with relationship with nested data - $person1 = static::getDatabase()->createDocument('person', new Document([ + $person1 = $database->createDocument('person', new Document([ '$id' => 'person1', '$permissions' => [ Permission::read(Role::any()), @@ -82,24 +85,24 @@ public function testOneToOneOneWayRelationship(): void ])); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', 'person1', $person1->setAttribute('library', 'no-library') ); - $person1Document = static::getDatabase()->getDocument('person', 'person1'); + $person1Document = $database->getDocument('person', 'person1'); // Assert document does not contain non existing relation document. $this->assertEquals(null, $person1Document->getAttribute('library')); - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', 'person1', $person1->setAttribute('library', 'library1') ); // Update through create - $library10 = static::getDatabase()->createDocument('library', new Document([ + $library10 = $database->createDocument('library', new Document([ '$id' => 'library10', '$permissions' => [ Permission::read(Role::any()), @@ -108,7 +111,7 @@ public function testOneToOneOneWayRelationship(): void 'name' => 'Library 10', 'area' => 'Area 10', ])); - $person10 = static::getDatabase()->createDocument('person', new Document([ + $person10 = $database->createDocument('person', new Document([ '$id' => 'person10', '$permissions' => [ Permission::read(Role::any()), @@ -123,11 +126,11 @@ public function testOneToOneOneWayRelationship(): void ], ])); $this->assertEquals('Library 10 Updated', $person10->getAttribute('library')->getAttribute('name')); - $library10 = static::getDatabase()->getDocument('library', $library10->getId()); + $library10 = $database->getDocument('library', $library10->getId()); $this->assertEquals('Library 10 Updated', $library10->getAttribute('name')); // Create document with relationship with related ID - static::getDatabase()->createDocument('library', new Document([ + $database->createDocument('library', new Document([ '$id' => 'library2', '$permissions' => [ Permission::read(Role::any()), @@ -136,7 +139,7 @@ public function testOneToOneOneWayRelationship(): void 'name' => 'Library 2', 'area' => 'Area 2', ])); - static::getDatabase()->createDocument('person', new Document([ + $database->createDocument('person', new Document([ '$id' => 'person2', '$permissions' => [ Permission::read(Role::any()), @@ -148,34 +151,34 @@ public function testOneToOneOneWayRelationship(): void ])); // Get documents with relationship - $person1 = static::getDatabase()->getDocument('person', 'person1'); + $person1 = $database->getDocument('person', 'person1'); $library = $person1->getAttribute('library'); $this->assertEquals('library1', $library['$id']); $this->assertArrayNotHasKey('person', $library); - $person = static::getDatabase()->getDocument('person', 'person2'); + $person = $database->getDocument('person', 'person2'); $library = $person->getAttribute('library'); $this->assertEquals('library2', $library['$id']); $this->assertArrayNotHasKey('person', $library); // Get related documents - $library = static::getDatabase()->getDocument('library', 'library1'); + $library = $database->getDocument('library', 'library1'); $this->assertArrayNotHasKey('person', $library); - $library = static::getDatabase()->getDocument('library', 'library2'); + $library = $database->getDocument('library', 'library2'); $this->assertArrayNotHasKey('person', $library); - $people = static::getDatabase()->find('person', [ + $people = $database->find('person', [ Query::select(['name']) ]); $this->assertArrayNotHasKey('library', $people[0]); - $people = static::getDatabase()->find('person'); + $people = $database->find('person'); $this->assertEquals(3, \count($people)); // Select related document attributes - $person = static::getDatabase()->findOne('person', [ + $person = $database->findOne('person', [ Query::select(['*', 'library.name']) ]); @@ -186,7 +189,7 @@ public function testOneToOneOneWayRelationship(): void $this->assertEquals('Library 1', $person->getAttribute('library')->getAttribute('name')); $this->assertArrayNotHasKey('area', $person->getAttribute('library')); - $person = static::getDatabase()->getDocument('person', 'person1', [ + $person = $database->getDocument('person', 'person1', [ Query::select(['*', 'library.name', '$id']) ]); @@ -195,36 +198,36 @@ public function testOneToOneOneWayRelationship(): void - $document = static::getDatabase()->getDocument('person', $person->getId(), [ + $document = $database->getDocument('person', $person->getId(), [ Query::select(['name']), ]); $this->assertArrayNotHasKey('library', $document); $this->assertEquals('Person 1', $document['name']); - $document = static::getDatabase()->getDocument('person', $person->getId(), [ + $document = $database->getDocument('person', $person->getId(), [ Query::select(['*']), ]); $this->assertEquals('library1', $document['library']); - $document = static::getDatabase()->getDocument('person', $person->getId(), [ + $document = $database->getDocument('person', $person->getId(), [ Query::select(['library.*']), ]); $this->assertEquals('Library 1', $document['library']['name']); $this->assertArrayNotHasKey('name', $document); // Update root document attribute without altering relationship - $person1 = static::getDatabase()->updateDocument( + $person1 = $database->updateDocument( 'person', $person1->getId(), $person1->setAttribute('name', 'Person 1 Updated') ); $this->assertEquals('Person 1 Updated', $person1->getAttribute('name')); - $person1 = static::getDatabase()->getDocument('person', 'person1'); + $person1 = $database->getDocument('person', 'person1'); $this->assertEquals('Person 1 Updated', $person1->getAttribute('name')); // Update nested document attribute - $person1 = static::getDatabase()->updateDocument( + $person1 = $database->updateDocument( 'person', $person1->getId(), $person1->setAttribute( @@ -236,11 +239,11 @@ public function testOneToOneOneWayRelationship(): void ); $this->assertEquals('Library 1 Updated', $person1->getAttribute('library')->getAttribute('name')); - $person1 = static::getDatabase()->getDocument('person', 'person1'); + $person1 = $database->getDocument('person', 'person1'); $this->assertEquals('Library 1 Updated', $person1->getAttribute('library')->getAttribute('name')); // Create new document with no relationship - $person3 = static::getDatabase()->createDocument('person', new Document([ + $person3 = $database->createDocument('person', new Document([ '$id' => 'person3', '$permissions' => [ Permission::read(Role::any()), @@ -251,7 +254,7 @@ public function testOneToOneOneWayRelationship(): void ])); // Update to relate to created document - $person3 = static::getDatabase()->updateDocument( + $person3 = $database->updateDocument( 'person', $person3->getId(), $person3->setAttribute('library', new Document([ @@ -266,23 +269,23 @@ public function testOneToOneOneWayRelationship(): void ); $this->assertEquals('library3', $person3->getAttribute('library')['$id']); - $person3 = static::getDatabase()->getDocument('person', 'person3'); + $person3 = $database->getDocument('person', 'person3'); $this->assertEquals('Library 3', $person3['library']['name']); - $libraryDocument = static::getDatabase()->getDocument('library', 'library3'); + $libraryDocument = $database->getDocument('library', 'library3'); $libraryDocument->setAttribute('name', 'Library 3 updated'); - static::getDatabase()->updateDocument('library', 'library3', $libraryDocument); - $libraryDocument = static::getDatabase()->getDocument('library', 'library3'); + $database->updateDocument('library', 'library3', $libraryDocument); + $libraryDocument = $database->getDocument('library', 'library3'); $this->assertEquals('Library 3 updated', $libraryDocument['name']); - $person3 = static::getDatabase()->getDocument('person', 'person3'); + $person3 = $database->getDocument('person', 'person3'); // Todo: This is failing $this->assertEquals($libraryDocument['name'], $person3['library']['name']); $this->assertEquals('library3', $person3->getAttribute('library')['$id']); // One to one can't relate to multiple documents, unique index throws duplicate try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', $person1->getId(), $person1->setAttribute('library', 'library2') @@ -293,7 +296,7 @@ public function testOneToOneOneWayRelationship(): void } // Create new document - $library4 = static::getDatabase()->createDocument('library', new Document([ + $library4 = $database->createDocument('library', new Document([ '$id' => 'library4', '$permissions' => [ Permission::read(Role::any()), @@ -304,33 +307,33 @@ public function testOneToOneOneWayRelationship(): void ])); // Relate existing document to new document - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', $person1->getId(), $person1->setAttribute('library', 'library4') ); // Relate existing document to new document as nested data - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', $person1->getId(), $person1->setAttribute('library', $library4) ); // Rename relationship key - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'person', id: 'library', newKey: 'newLibrary' ); // Get document with again - $person = static::getDatabase()->getDocument('person', 'person1'); + $person = $database->getDocument('person', 'person1'); $library = $person->getAttribute('newLibrary'); $this->assertEquals('library4', $library['$id']); // Create person with no relationship - static::getDatabase()->createDocument('person', new Document([ + $database->createDocument('person', new Document([ '$id' => 'person4', '$permissions' => [ Permission::read(Role::any()), @@ -341,22 +344,22 @@ public function testOneToOneOneWayRelationship(): void ])); // Can delete parent document with no relation with on delete set to restrict - $deleted = static::getDatabase()->deleteDocument('person', 'person4'); + $deleted = $database->deleteDocument('person', 'person4'); $this->assertEquals(true, $deleted); - $person4 = static::getDatabase()->getDocument('person', 'person4'); + $person4 = $database->getDocument('person', 'person4'); $this->assertEquals(true, $person4->isEmpty()); // Cannot delete document while still related to another with on delete set to restrict try { - static::getDatabase()->deleteDocument('person', 'person1'); + $database->deleteDocument('person', 'person1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Can delete child document while still related to another with on delete set to restrict - $person5 = static::getDatabase()->createDocument('person', new Document([ + $person5 = $database->createDocument('person', new Document([ '$id' => 'person5', '$permissions' => [ Permission::read(Role::any()), @@ -374,60 +377,60 @@ public function testOneToOneOneWayRelationship(): void 'area' => 'Area 5', ], ])); - $deleted = static::getDatabase()->deleteDocument('library', 'library5'); + $deleted = $database->deleteDocument('library', 'library5'); $this->assertEquals(true, $deleted); - $person5 = static::getDatabase()->getDocument('person', 'person5'); + $person5 = $database->getDocument('person', 'person5'); $this->assertEquals(null, $person5->getAttribute('newLibrary')); // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'person', id: 'newLibrary', onDelete: Database::RELATION_MUTATE_SET_NULL ); // Delete parent, no effect on children for one-way - static::getDatabase()->deleteDocument('person', 'person1'); + $database->deleteDocument('person', 'person1'); // Delete child, set parent relating attribute to null for one-way - static::getDatabase()->deleteDocument('library', 'library2'); + $database->deleteDocument('library', 'library2'); // Check relation was set to null - $person2 = static::getDatabase()->getDocument('person', 'person2'); + $person2 = $database->getDocument('person', 'person2'); $this->assertEquals(null, $person2->getAttribute('newLibrary', '')); // Relate to another document - static::getDatabase()->updateDocument( + $database->updateDocument( 'person', $person2->getId(), $person2->setAttribute('newLibrary', 'library4') ); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'person', id: 'newLibrary', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('person', 'person2'); + $database->deleteDocument('person', 'person2'); // Check parent and child were deleted - $person = static::getDatabase()->getDocument('person', 'person2'); + $person = $database->getDocument('person', 'person2'); $this->assertEquals(true, $person->isEmpty()); - $library = static::getDatabase()->getDocument('library', 'library4'); + $library = $database->getDocument('library', 'library4'); $this->assertEquals(true, $library->isEmpty()); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'person', 'newLibrary' ); // Check parent doesn't have relationship anymore - $person = static::getDatabase()->getDocument('person', 'person1'); + $person = $database->getDocument('person', 'person1'); $library = $person->getAttribute('newLibrary', ''); $this->assertEquals(null, $library); } @@ -441,26 +444,29 @@ public function testOneToOneOneWayRelationship(): void */ public function testOneToOneTwoWayRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('country'); - static::getDatabase()->createCollection('city'); + $database->createCollection('country'); + $database->createCollection('city'); - static::getDatabase()->createAttribute('country', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('city', 'code', Database::VAR_STRING, 3, true); - static::getDatabase()->createAttribute('city', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('country', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('city', 'code', Database::VAR_STRING, 3, true); + $database->createAttribute('city', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'country', relatedCollection: 'city', type: Database::RELATION_ONE_TO_ONE, twoWay: true ); - $collection = static::getDatabase()->getCollection('country'); + $collection = $database->getCollection('country'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'city') { @@ -474,7 +480,7 @@ public function testOneToOneTwoWayRelationship(): void } } - $collection = static::getDatabase()->getCollection('city'); + $collection = $database->getCollection('city'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'country') { @@ -509,40 +515,40 @@ public function testOneToOneTwoWayRelationship(): void ], ]); - static::getDatabase()->createDocument('country', new Document($doc->getArrayCopy())); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $database->createDocument('country', new Document($doc->getArrayCopy())); + $country1 = $database->getDocument('country', 'country1'); $this->assertEquals('London', $country1->getAttribute('city')->getAttribute('name')); // Update a document with non existing related document. It should not get added to the list. - static::getDatabase()->updateDocument('country', 'country1', (new Document($doc->getArrayCopy()))->setAttribute('city', 'no-city')); + $database->updateDocument('country', 'country1', (new Document($doc->getArrayCopy()))->setAttribute('city', 'no-city')); - $country1Document = static::getDatabase()->getDocument('country', 'country1'); + $country1Document = $database->getDocument('country', 'country1'); // Assert document does not contain non existing relation document. $this->assertEquals(null, $country1Document->getAttribute('city')); - static::getDatabase()->updateDocument('country', 'country1', (new Document($doc->getArrayCopy()))->setAttribute('city', 'city1')); + $database->updateDocument('country', 'country1', (new Document($doc->getArrayCopy()))->setAttribute('city', 'city1')); try { - static::getDatabase()->deleteDocument('country', 'country1'); + $database->deleteDocument('country', 'country1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertInstanceOf(RestrictedException::class, $e); } - $this->assertTrue(static::getDatabase()->deleteDocument('city', 'city1')); + $this->assertTrue($database->deleteDocument('city', 'city1')); - $city1 = static::getDatabase()->getDocument('city', 'city1'); + $city1 = $database->getDocument('city', 'city1'); $this->assertTrue($city1->isEmpty()); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $country1 = $database->getDocument('country', 'country1'); $this->assertTrue($country1->getAttribute('city')->isEmpty()); - $this->assertTrue(static::getDatabase()->deleteDocument('country', 'country1')); + $this->assertTrue($database->deleteDocument('country', 'country1')); - static::getDatabase()->createDocument('country', new Document($doc->getArrayCopy())); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $database->createDocument('country', new Document($doc->getArrayCopy())); + $country1 = $database->getDocument('country', 'country1'); $this->assertEquals('London', $country1->getAttribute('city')->getAttribute('name')); // Create document with relationship with related ID - static::getDatabase()->createDocument('city', new Document([ + $database->createDocument('city', new Document([ '$id' => 'city2', '$permissions' => [ Permission::read(Role::any()), @@ -552,7 +558,7 @@ public function testOneToOneTwoWayRelationship(): void 'name' => 'Paris', 'code' => 'PAR', ])); - static::getDatabase()->createDocument('country', new Document([ + $database->createDocument('country', new Document([ '$id' => 'country2', '$permissions' => [ Permission::read(Role::any()), @@ -564,7 +570,7 @@ public function testOneToOneTwoWayRelationship(): void ])); // Create from child side - static::getDatabase()->createDocument('city', new Document([ + $database->createDocument('city', new Document([ '$id' => 'city3', '$permissions' => [ Permission::read(Role::any()), @@ -583,7 +589,7 @@ public function testOneToOneTwoWayRelationship(): void 'name' => 'New Zealand', ], ])); - static::getDatabase()->createDocument('country', new Document([ + $database->createDocument('country', new Document([ '$id' => 'country4', '$permissions' => [ Permission::read(Role::any()), @@ -592,7 +598,7 @@ public function testOneToOneTwoWayRelationship(): void ], 'name' => 'Australia', ])); - static::getDatabase()->createDocument('city', new Document([ + $database->createDocument('city', new Document([ '$id' => 'city4', '$permissions' => [ Permission::read(Role::any()), @@ -605,53 +611,53 @@ public function testOneToOneTwoWayRelationship(): void ])); // Get document with relationship - $city = static::getDatabase()->getDocument('city', 'city1'); + $city = $database->getDocument('city', 'city1'); $country = $city->getAttribute('country'); $this->assertEquals('country1', $country['$id']); $this->assertArrayNotHasKey('city', $country); - $city = static::getDatabase()->getDocument('city', 'city2'); + $city = $database->getDocument('city', 'city2'); $country = $city->getAttribute('country'); $this->assertEquals('country2', $country['$id']); $this->assertArrayNotHasKey('city', $country); - $city = static::getDatabase()->getDocument('city', 'city3'); + $city = $database->getDocument('city', 'city3'); $country = $city->getAttribute('country'); $this->assertEquals('country3', $country['$id']); $this->assertArrayNotHasKey('city', $country); - $city = static::getDatabase()->getDocument('city', 'city4'); + $city = $database->getDocument('city', 'city4'); $country = $city->getAttribute('country'); $this->assertEquals('country4', $country['$id']); $this->assertArrayNotHasKey('city', $country); // Get inverse document with relationship - $country = static::getDatabase()->getDocument('country', 'country1'); + $country = $database->getDocument('country', 'country1'); $city = $country->getAttribute('city'); $this->assertEquals('city1', $city['$id']); $this->assertArrayNotHasKey('country', $city); - $country = static::getDatabase()->getDocument('country', 'country2'); + $country = $database->getDocument('country', 'country2'); $city = $country->getAttribute('city'); $this->assertEquals('city2', $city['$id']); $this->assertArrayNotHasKey('country', $city); - $country = static::getDatabase()->getDocument('country', 'country3'); + $country = $database->getDocument('country', 'country3'); $city = $country->getAttribute('city'); $this->assertEquals('city3', $city['$id']); $this->assertArrayNotHasKey('country', $city); - $country = static::getDatabase()->getDocument('country', 'country4'); + $country = $database->getDocument('country', 'country4'); $city = $country->getAttribute('city'); $this->assertEquals('city4', $city['$id']); $this->assertArrayNotHasKey('country', $city); - $countries = static::getDatabase()->find('country'); + $countries = $database->find('country'); $this->assertEquals(4, \count($countries)); // Select related document attributes - $country = static::getDatabase()->findOne('country', [ + $country = $database->findOne('country', [ Query::select(['*', 'city.name']) ]); @@ -662,41 +668,41 @@ public function testOneToOneTwoWayRelationship(): void $this->assertEquals('London', $country->getAttribute('city')->getAttribute('name')); $this->assertArrayNotHasKey('code', $country->getAttribute('city')); - $country = static::getDatabase()->getDocument('country', 'country1', [ + $country = $database->getDocument('country', 'country1', [ Query::select(['*', 'city.name']) ]); $this->assertEquals('London', $country->getAttribute('city')->getAttribute('name')); $this->assertArrayNotHasKey('code', $country->getAttribute('city')); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $country1 = $database->getDocument('country', 'country1'); // Update root document attribute without altering relationship - $country1 = static::getDatabase()->updateDocument( + $country1 = $database->updateDocument( 'country', $country1->getId(), $country1->setAttribute('name', 'Country 1 Updated') ); $this->assertEquals('Country 1 Updated', $country1->getAttribute('name')); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $country1 = $database->getDocument('country', 'country1'); $this->assertEquals('Country 1 Updated', $country1->getAttribute('name')); - $city2 = static::getDatabase()->getDocument('city', 'city2'); + $city2 = $database->getDocument('city', 'city2'); // Update inverse root document attribute without altering relationship - $city2 = static::getDatabase()->updateDocument( + $city2 = $database->updateDocument( 'city', $city2->getId(), $city2->setAttribute('name', 'City 2 Updated') ); $this->assertEquals('City 2 Updated', $city2->getAttribute('name')); - $city2 = static::getDatabase()->getDocument('city', 'city2'); + $city2 = $database->getDocument('city', 'city2'); $this->assertEquals('City 2 Updated', $city2->getAttribute('name')); // Update nested document attribute - $country1 = static::getDatabase()->updateDocument( + $country1 = $database->updateDocument( 'country', $country1->getId(), $country1->setAttribute( @@ -708,11 +714,11 @@ public function testOneToOneTwoWayRelationship(): void ); $this->assertEquals('City 1 Updated', $country1->getAttribute('city')->getAttribute('name')); - $country1 = static::getDatabase()->getDocument('country', 'country1'); + $country1 = $database->getDocument('country', 'country1'); $this->assertEquals('City 1 Updated', $country1->getAttribute('city')->getAttribute('name')); // Update inverse nested document attribute - $city2 = static::getDatabase()->updateDocument( + $city2 = $database->updateDocument( 'city', $city2->getId(), $city2->setAttribute( @@ -724,11 +730,11 @@ public function testOneToOneTwoWayRelationship(): void ); $this->assertEquals('Country 2 Updated', $city2->getAttribute('country')->getAttribute('name')); - $city2 = static::getDatabase()->getDocument('city', 'city2'); + $city2 = $database->getDocument('city', 'city2'); $this->assertEquals('Country 2 Updated', $city2->getAttribute('country')->getAttribute('name')); // Create new document with no relationship - $country5 = static::getDatabase()->createDocument('country', new Document([ + $country5 = $database->createDocument('country', new Document([ '$id' => 'country5', '$permissions' => [ Permission::read(Role::any()), @@ -739,7 +745,7 @@ public function testOneToOneTwoWayRelationship(): void ])); // Update to relate to created document - $country5 = static::getDatabase()->updateDocument( + $country5 = $database->updateDocument( 'country', $country5->getId(), $country5->setAttribute('city', new Document([ @@ -754,11 +760,11 @@ public function testOneToOneTwoWayRelationship(): void ); $this->assertEquals('city5', $country5->getAttribute('city')['$id']); - $country5 = static::getDatabase()->getDocument('country', 'country5'); + $country5 = $database->getDocument('country', 'country5'); $this->assertEquals('city5', $country5->getAttribute('city')['$id']); // Create new document with no relationship - $city6 = static::getDatabase()->createDocument('city', new Document([ + $city6 = $database->createDocument('city', new Document([ '$id' => 'city6', '$permissions' => [ Permission::read(Role::any()), @@ -770,7 +776,7 @@ public function testOneToOneTwoWayRelationship(): void ])); // Update to relate to created document - $city6 = static::getDatabase()->updateDocument( + $city6 = $database->updateDocument( 'city', $city6->getId(), $city6->setAttribute('country', new Document([ @@ -784,12 +790,12 @@ public function testOneToOneTwoWayRelationship(): void ); $this->assertEquals('country6', $city6->getAttribute('country')['$id']); - $city6 = static::getDatabase()->getDocument('city', 'city6'); + $city6 = $database->getDocument('city', 'city6'); $this->assertEquals('country6', $city6->getAttribute('country')['$id']); // One to one can't relate to multiple documents, unique index throws duplicate try { - static::getDatabase()->updateDocument( + $database->updateDocument( 'country', $country1->getId(), $country1->setAttribute('city', 'city2') @@ -799,21 +805,21 @@ public function testOneToOneTwoWayRelationship(): void $this->assertInstanceOf(DuplicateException::class, $e); } - $city1 = static::getDatabase()->getDocument('city', 'city1'); + $city1 = $database->getDocument('city', 'city1'); // Set relationship to null - $city1 = static::getDatabase()->updateDocument( + $city1 = $database->updateDocument( 'city', $city1->getId(), $city1->setAttribute('country', null) ); $this->assertEquals(null, $city1->getAttribute('country')); - $city1 = static::getDatabase()->getDocument('city', 'city1'); + $city1 = $database->getDocument('city', 'city1'); $this->assertEquals(null, $city1->getAttribute('country')); // Create a new city with no relation - $city7 = static::getDatabase()->createDocument('city', new Document([ + $city7 = $database->createDocument('city', new Document([ '$id' => 'city7', '$permissions' => [ Permission::read(Role::any()), @@ -825,21 +831,21 @@ public function testOneToOneTwoWayRelationship(): void ])); // Update document with relation to new document - static::getDatabase()->updateDocument( + $database->updateDocument( 'country', $country1->getId(), $country1->setAttribute('city', 'city7') ); // Relate existing document to new document as nested data - static::getDatabase()->updateDocument( + $database->updateDocument( 'country', $country1->getId(), $country1->setAttribute('city', $city7) ); // Create a new country with no relation - static::getDatabase()->createDocument('country', new Document([ + $database->createDocument('country', new Document([ '$id' => 'country7', '$permissions' => [ Permission::read(Role::any()), @@ -850,14 +856,14 @@ public function testOneToOneTwoWayRelationship(): void ])); // Update inverse document with new related document - static::getDatabase()->updateDocument( + $database->updateDocument( 'city', $city1->getId(), $city1->setAttribute('country', 'country7') ); // Rename relationship keys on both sides - static::getDatabase()->updateRelationship( + $database->updateRelationship( 'country', 'city', 'newCity', @@ -865,17 +871,17 @@ public function testOneToOneTwoWayRelationship(): void ); // Get document with new relationship key - $city = static::getDatabase()->getDocument('city', 'city1'); + $city = $database->getDocument('city', 'city1'); $country = $city->getAttribute('newCountry'); $this->assertEquals('country7', $country['$id']); // Get inverse document with new relationship key - $country = static::getDatabase()->getDocument('country', 'country7'); + $country = $database->getDocument('country', 'country7'); $city = $country->getAttribute('newCity'); $this->assertEquals('city1', $city['$id']); // Create a new country with no relation - static::getDatabase()->createDocument('country', new Document([ + $database->createDocument('country', new Document([ '$id' => 'country8', '$permissions' => [ Permission::read(Role::any()), @@ -886,87 +892,87 @@ public function testOneToOneTwoWayRelationship(): void ])); // Can delete parent document with no relation with on delete set to restrict - $deleted = static::getDatabase()->deleteDocument('country', 'country8'); + $deleted = $database->deleteDocument('country', 'country8'); $this->assertEquals(1, $deleted); - $country8 = static::getDatabase()->getDocument('country', 'country8'); + $country8 = $database->getDocument('country', 'country8'); $this->assertEquals(true, $country8->isEmpty()); // Cannot delete document while still related to another with on delete set to restrict try { - static::getDatabase()->deleteDocument('country', 'country1'); + $database->deleteDocument('country', 'country1'); $this->fail('Failed to throw exception'); } catch (Exception $e) { $this->assertEquals('Cannot delete document because it has at least one related document.', $e->getMessage()); } // Change on delete to set null - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'country', id: 'newCity', onDelete: Database::RELATION_MUTATE_SET_NULL ); - static::getDatabase()->updateDocument('city', 'city1', new Document(['newCountry' => null, '$id' => 'city1'])); - $city1 = static::getDatabase()->getDocument('city', 'city1'); + $database->updateDocument('city', 'city1', new Document(['newCountry' => null, '$id' => 'city1'])); + $city1 = $database->getDocument('city', 'city1'); $this->assertNull($city1->getAttribute('newCountry')); // Check Delete TwoWay TRUE && RELATION_MUTATE_SET_NULL && related value NULL - $this->assertTrue(static::getDatabase()->deleteDocument('city', 'city1')); - $city1 = static::getDatabase()->getDocument('city', 'city1'); + $this->assertTrue($database->deleteDocument('city', 'city1')); + $city1 = $database->getDocument('city', 'city1'); $this->assertTrue($city1->isEmpty()); // Delete parent, will set child relationship to null for two-way - static::getDatabase()->deleteDocument('country', 'country1'); + $database->deleteDocument('country', 'country1'); // Check relation was set to null - $city7 = static::getDatabase()->getDocument('city', 'city7'); + $city7 = $database->getDocument('city', 'city7'); $this->assertEquals(null, $city7->getAttribute('country', '')); // Delete child, set parent relationship to null for two-way - static::getDatabase()->deleteDocument('city', 'city2'); + $database->deleteDocument('city', 'city2'); // Check relation was set to null - $country2 = static::getDatabase()->getDocument('country', 'country2'); + $country2 = $database->getDocument('country', 'country2'); $this->assertEquals(null, $country2->getAttribute('city', '')); // Relate again - static::getDatabase()->updateDocument( + $database->updateDocument( 'city', $city7->getId(), $city7->setAttribute('newCountry', 'country2') ); // Change on delete to cascade - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'country', id: 'newCity', onDelete: Database::RELATION_MUTATE_CASCADE ); // Delete parent, will delete child - static::getDatabase()->deleteDocument('country', 'country7'); + $database->deleteDocument('country', 'country7'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('country', 'country7'); + $library = $database->getDocument('country', 'country7'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('city', 'city1'); + $library = $database->getDocument('city', 'city1'); $this->assertEquals(true, $library->isEmpty()); // Delete child, will delete parent for two-way - static::getDatabase()->deleteDocument('city', 'city7'); + $database->deleteDocument('city', 'city7'); // Check parent and child were deleted - $library = static::getDatabase()->getDocument('city', 'city7'); + $library = $database->getDocument('city', 'city7'); $this->assertEquals(true, $library->isEmpty()); - $library = static::getDatabase()->getDocument('country', 'country2'); + $library = $database->getDocument('country', 'country2'); $this->assertEquals(true, $library->isEmpty()); // Create new document to check after deleting relationship - static::getDatabase()->createDocument('city', new Document([ + $database->createDocument('city', new Document([ '$id' => 'city7', '$permissions' => [ Permission::read(Role::any()), @@ -982,33 +988,36 @@ public function testOneToOneTwoWayRelationship(): void ])); // Delete relationship - static::getDatabase()->deleteRelationship( + $database->deleteRelationship( 'country', 'newCity' ); // Try to get document again - $country = static::getDatabase()->getDocument('country', 'country4'); + $country = $database->getDocument('country', 'country4'); $city = $country->getAttribute('newCity'); $this->assertEquals(null, $city); // Try to get inverse document again - $city = static::getDatabase()->getDocument('city', 'city7'); + $city = $database->getDocument('city', 'city7'); $country = $city->getAttribute('newCountry'); $this->assertEquals(null, $country); } public function testIdenticalTwoWayKeyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('parent'); - static::getDatabase()->createCollection('child'); + $database->createCollection('parent'); + $database->createCollection('child'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'parent', relatedCollection: 'child', type: Database::RELATION_ONE_TO_ONE, @@ -1016,7 +1025,7 @@ public function testIdenticalTwoWayKeyRelationship(): void ); try { - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'parent', relatedCollection: 'child', type: Database::RELATION_ONE_TO_MANY, @@ -1027,7 +1036,7 @@ public function testIdenticalTwoWayKeyRelationship(): void $this->assertEquals('Related attribute already exists', $e->getMessage()); } - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'parent', relatedCollection: 'child', type: Database::RELATION_ONE_TO_MANY, @@ -1035,7 +1044,7 @@ public function testIdenticalTwoWayKeyRelationship(): void twoWayKey: 'parent_id' ); - $collection = static::getDatabase()->getCollection('parent'); + $collection = $database->getCollection('parent'); $attributes = $collection->getAttribute('attributes', []); foreach ($attributes as $attribute) { if ($attribute['key'] === 'child1') { @@ -1047,7 +1056,7 @@ public function testIdenticalTwoWayKeyRelationship(): void } } - static::getDatabase()->createDocument('parent', new Document([ + $database->createDocument('parent', new Document([ '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()), @@ -1065,7 +1074,7 @@ public function testIdenticalTwoWayKeyRelationship(): void ], ])); - $documents = static::getDatabase()->find('parent', []); + $documents = $database->find('parent', []); $document = array_pop($documents); $this->assertArrayHasKey('child1', $document); $this->assertEquals('foo', $document->getAttribute('child1')->getId()); @@ -1073,7 +1082,7 @@ public function testIdenticalTwoWayKeyRelationship(): void $this->assertEquals('bar', $document->getAttribute('children')[0]->getId()); try { - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'parent', id: 'children', newKey: 'child1' @@ -1084,7 +1093,7 @@ public function testIdenticalTwoWayKeyRelationship(): void } try { - static::getDatabase()->updateRelationship( + $database->updateRelationship( collection: 'parent', id: 'children', newTwoWayKey: 'parent' @@ -1097,20 +1106,23 @@ public function testIdenticalTwoWayKeyRelationship(): void public function testNestedOneToOne_OneToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('pattern'); - static::getDatabase()->createCollection('shirt'); - static::getDatabase()->createCollection('team'); + $database->createCollection('pattern'); + $database->createCollection('shirt'); + $database->createCollection('team'); - static::getDatabase()->createAttribute('pattern', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('shirt', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('team', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('pattern', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('shirt', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('team', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'pattern', relatedCollection: 'shirt', type: Database::RELATION_ONE_TO_ONE, @@ -1118,7 +1130,7 @@ public function testNestedOneToOne_OneToOneRelationship(): void id: 'shirt', twoWayKey: 'pattern' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'shirt', relatedCollection: 'team', type: Database::RELATION_ONE_TO_ONE, @@ -1127,7 +1139,7 @@ public function testNestedOneToOne_OneToOneRelationship(): void twoWayKey: 'shirt' ); - static::getDatabase()->createDocument('pattern', new Document([ + $database->createDocument('pattern', new Document([ '$id' => 'stripes', '$permissions' => [ Permission::read(Role::any()), @@ -1149,13 +1161,13 @@ public function testNestedOneToOne_OneToOneRelationship(): void ], ])); - $pattern = static::getDatabase()->getDocument('pattern', 'stripes'); + $pattern = $database->getDocument('pattern', 'stripes'); $this->assertEquals('red', $pattern['shirt']['$id']); $this->assertArrayNotHasKey('pattern', $pattern['shirt']); $this->assertEquals('reds', $pattern['shirt']['team']['$id']); $this->assertArrayNotHasKey('shirt', $pattern['shirt']['team']); - static::getDatabase()->createDocument('team', new Document([ + $database->createDocument('team', new Document([ '$id' => 'blues', '$permissions' => [ Permission::read(Role::any()), @@ -1177,7 +1189,7 @@ public function testNestedOneToOne_OneToOneRelationship(): void ], ])); - $team = static::getDatabase()->getDocument('team', 'blues'); + $team = $database->getDocument('team', 'blues'); $this->assertEquals('blue', $team['shirt']['$id']); $this->assertArrayNotHasKey('team', $team['shirt']); $this->assertEquals('plain', $team['shirt']['pattern']['$id']); @@ -1186,20 +1198,23 @@ public function testNestedOneToOne_OneToOneRelationship(): void public function testNestedOneToOne_OneToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('teachers'); - static::getDatabase()->createCollection('classrooms'); - static::getDatabase()->createCollection('children'); + $database->createCollection('teachers'); + $database->createCollection('classrooms'); + $database->createCollection('children'); - static::getDatabase()->createAttribute('children', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('teachers', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('classrooms', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('children', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('teachers', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('classrooms', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'teachers', relatedCollection: 'classrooms', type: Database::RELATION_ONE_TO_ONE, @@ -1207,7 +1222,7 @@ public function testNestedOneToOne_OneToManyRelationship(): void id: 'classroom', twoWayKey: 'teacher' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'classrooms', relatedCollection: 'children', type: Database::RELATION_ONE_TO_MANY, @@ -1215,7 +1230,7 @@ public function testNestedOneToOne_OneToManyRelationship(): void twoWayKey: 'classroom' ); - static::getDatabase()->createDocument('teachers', new Document([ + $database->createDocument('teachers', new Document([ '$id' => 'teacher1', '$permissions' => [ Permission::read(Role::any()), @@ -1246,14 +1261,14 @@ public function testNestedOneToOne_OneToManyRelationship(): void ], ])); - $teacher1 = static::getDatabase()->getDocument('teachers', 'teacher1'); + $teacher1 = $database->getDocument('teachers', 'teacher1'); $this->assertEquals('classroom1', $teacher1['classroom']['$id']); $this->assertArrayNotHasKey('teacher', $teacher1['classroom']); $this->assertEquals(2, \count($teacher1['classroom']['children'])); $this->assertEquals('Child 1', $teacher1['classroom']['children'][0]['name']); $this->assertEquals('Child 2', $teacher1['classroom']['children'][1]['name']); - static::getDatabase()->createDocument('children', new Document([ + $database->createDocument('children', new Document([ '$id' => 'child3', '$permissions' => [ Permission::read(Role::any()), @@ -1275,7 +1290,7 @@ public function testNestedOneToOne_OneToManyRelationship(): void ], ])); - $child3 = static::getDatabase()->getDocument('children', 'child3'); + $child3 = $database->getDocument('children', 'child3'); $this->assertEquals('classroom2', $child3['classroom']['$id']); $this->assertArrayNotHasKey('children', $child3['classroom']); $this->assertEquals('teacher2', $child3['classroom']['teacher']['$id']); @@ -1284,20 +1299,23 @@ public function testNestedOneToOne_OneToManyRelationship(): void public function testNestedOneToOne_ManyToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('users'); - static::getDatabase()->createCollection('profiles'); - static::getDatabase()->createCollection('avatars'); + $database->createCollection('users'); + $database->createCollection('profiles'); + $database->createCollection('avatars'); - static::getDatabase()->createAttribute('users', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('profiles', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('avatars', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('users', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('profiles', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('avatars', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'users', relatedCollection: 'profiles', type: Database::RELATION_ONE_TO_ONE, @@ -1305,7 +1323,7 @@ public function testNestedOneToOne_ManyToOneRelationship(): void id: 'profile', twoWayKey: 'user' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'profiles', relatedCollection: 'avatars', type: Database::RELATION_MANY_TO_ONE, @@ -1313,7 +1331,7 @@ public function testNestedOneToOne_ManyToOneRelationship(): void id: 'avatar', ); - static::getDatabase()->createDocument('users', new Document([ + $database->createDocument('users', new Document([ '$id' => 'user1', '$permissions' => [ Permission::read(Role::any()), @@ -1335,13 +1353,13 @@ public function testNestedOneToOne_ManyToOneRelationship(): void ], ])); - $user1 = static::getDatabase()->getDocument('users', 'user1'); + $user1 = $database->getDocument('users', 'user1'); $this->assertEquals('profile1', $user1['profile']['$id']); $this->assertArrayNotHasKey('user', $user1['profile']); $this->assertEquals('avatar1', $user1['profile']['avatar']['$id']); $this->assertArrayNotHasKey('profile', $user1['profile']['avatar']); - static::getDatabase()->createDocument('avatars', new Document([ + $database->createDocument('avatars', new Document([ '$id' => 'avatar2', '$permissions' => [ Permission::read(Role::any()), @@ -1365,7 +1383,7 @@ public function testNestedOneToOne_ManyToOneRelationship(): void ], ])); - $avatar2 = static::getDatabase()->getDocument('avatars', 'avatar2'); + $avatar2 = $database->getDocument('avatars', 'avatar2'); $this->assertEquals('profile2', $avatar2['profiles'][0]['$id']); $this->assertArrayNotHasKey('avatars', $avatar2['profiles'][0]); $this->assertEquals('user2', $avatar2['profiles'][0]['user']['$id']); @@ -1374,20 +1392,23 @@ public function testNestedOneToOne_ManyToOneRelationship(): void public function testNestedOneToOne_ManyToManyRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('addresses'); - static::getDatabase()->createCollection('houses'); - static::getDatabase()->createCollection('buildings'); + $database->createCollection('addresses'); + $database->createCollection('houses'); + $database->createCollection('buildings'); - static::getDatabase()->createAttribute('addresses', 'street', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('houses', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createAttribute('buildings', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('addresses', 'street', Database::VAR_STRING, 255, true); + $database->createAttribute('houses', 'name', Database::VAR_STRING, 255, true); + $database->createAttribute('buildings', 'name', Database::VAR_STRING, 255, true); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'addresses', relatedCollection: 'houses', type: Database::RELATION_ONE_TO_ONE, @@ -1395,14 +1416,14 @@ public function testNestedOneToOne_ManyToManyRelationship(): void id: 'house', twoWayKey: 'address' ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'houses', relatedCollection: 'buildings', type: Database::RELATION_MANY_TO_MANY, twoWay: true, ); - static::getDatabase()->createDocument('addresses', new Document([ + $database->createDocument('addresses', new Document([ '$id' => 'address1', '$permissions' => [ Permission::read(Role::any()), @@ -1433,7 +1454,7 @@ public function testNestedOneToOne_ManyToManyRelationship(): void ], ])); - $address1 = static::getDatabase()->getDocument('addresses', 'address1'); + $address1 = $database->getDocument('addresses', 'address1'); $this->assertEquals('house1', $address1['house']['$id']); $this->assertArrayNotHasKey('address', $address1['house']); $this->assertEquals('building1', $address1['house']['buildings'][0]['$id']); @@ -1441,7 +1462,7 @@ public function testNestedOneToOne_ManyToManyRelationship(): void $this->assertArrayNotHasKey('houses', $address1['house']['buildings'][0]); $this->assertArrayNotHasKey('houses', $address1['house']['buildings'][1]); - static::getDatabase()->createDocument('buildings', new Document([ + $database->createDocument('buildings', new Document([ '$id' => 'building3', '$permissions' => [ Permission::read(Role::any()), @@ -1468,7 +1489,10 @@ public function testNestedOneToOne_ManyToManyRelationship(): void public function testExceedMaxDepthOneToOne(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1478,24 +1502,24 @@ public function testExceedMaxDepthOneToOne(): void $level3Collection = 'level3OneToOne'; $level4Collection = 'level4OneToOne'; - static::getDatabase()->createCollection($level1Collection); - static::getDatabase()->createCollection($level2Collection); - static::getDatabase()->createCollection($level3Collection); - static::getDatabase()->createCollection($level4Collection); + $database->createCollection($level1Collection); + $database->createCollection($level2Collection); + $database->createCollection($level3Collection); + $database->createCollection($level4Collection); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level1Collection, relatedCollection: $level2Collection, type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level2Collection, relatedCollection: $level3Collection, type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level3Collection, relatedCollection: $level4Collection, type: Database::RELATION_ONE_TO_ONE, @@ -1503,7 +1527,7 @@ public function testExceedMaxDepthOneToOne(): void ); // Exceed create depth - $level1 = static::getDatabase()->createDocument($level1Collection, new Document([ + $level1 = $database->createDocument($level1Collection, new Document([ '$id' => 'level1', '$permissions' => [ Permission::read(Role::any()), @@ -1526,18 +1550,18 @@ public function testExceedMaxDepthOneToOne(): void $this->assertArrayNotHasKey($level4Collection, $level1[$level2Collection][$level3Collection]); // Confirm the 4th level document does not exist - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertNull($level3[$level4Collection]); // Create level 4 document $level3->setAttribute($level4Collection, new Document([ '$id' => 'level4', ])); - $level3 = static::getDatabase()->updateDocument($level3Collection, $level3->getId(), $level3); + $level3 = $database->updateDocument($level3Collection, $level3->getId(), $level3); $this->assertEquals('level4', $level3[$level4Collection]->getId()); // Exceed fetch depth - $level1 = static::getDatabase()->getDocument($level1Collection, 'level1'); + $level1 = $database->getDocument($level1Collection, 'level1'); $this->assertArrayHasKey($level2Collection, $level1); $this->assertEquals('level2', $level1[$level2Collection]->getId()); $this->assertArrayHasKey($level3Collection, $level1[$level2Collection]); @@ -1547,7 +1571,10 @@ public function testExceedMaxDepthOneToOne(): void public function testExceedMaxDepthOneToOneNull(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } @@ -1557,31 +1584,31 @@ public function testExceedMaxDepthOneToOneNull(): void $level3Collection = 'level3OneToOneNull'; $level4Collection = 'level4OneToOneNull'; - static::getDatabase()->createCollection($level1Collection); - static::getDatabase()->createCollection($level2Collection); - static::getDatabase()->createCollection($level3Collection); - static::getDatabase()->createCollection($level4Collection); + $database->createCollection($level1Collection); + $database->createCollection($level2Collection); + $database->createCollection($level3Collection); + $database->createCollection($level4Collection); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level1Collection, relatedCollection: $level2Collection, type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level2Collection, relatedCollection: $level3Collection, type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: $level3Collection, relatedCollection: $level4Collection, type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - $level1 = static::getDatabase()->createDocument($level1Collection, new Document([ + $level1 = $database->createDocument($level1Collection, new Document([ '$id' => 'level1', '$permissions' => [ Permission::read(Role::any()), @@ -1604,20 +1631,20 @@ public function testExceedMaxDepthOneToOneNull(): void $this->assertArrayNotHasKey($level4Collection, $level1[$level2Collection][$level3Collection]); // Confirm the 4th level document does not exist - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertNull($level3[$level4Collection]); // Create level 4 document $level3->setAttribute($level4Collection, new Document([ '$id' => 'level4', ])); - $level3 = static::getDatabase()->updateDocument($level3Collection, $level3->getId(), $level3); + $level3 = $database->updateDocument($level3Collection, $level3->getId(), $level3); $this->assertEquals('level4', $level3[$level4Collection]->getId()); - $level3 = static::getDatabase()->getDocument($level3Collection, 'level3'); + $level3 = $database->getDocument($level3Collection, 'level3'); $this->assertEquals('level4', $level3[$level4Collection]->getId()); // Exceed fetch depth - $level1 = static::getDatabase()->getDocument($level1Collection, 'level1'); + $level1 = $database->getDocument($level1Collection, 'level1'); $this->assertArrayHasKey($level2Collection, $level1); $this->assertEquals('level2', $level1[$level2Collection]->getId()); $this->assertArrayHasKey($level3Collection, $level1[$level2Collection]); @@ -1627,29 +1654,32 @@ public function testExceedMaxDepthOneToOneNull(): void public function testOneToOneRelationshipKeyWithSymbols(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('$symbols_coll.ection1'); - static::getDatabase()->createCollection('$symbols_coll.ection2'); + $database->createCollection('$symbols_coll.ection1'); + $database->createCollection('$symbols_coll.ection2'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: '$symbols_coll.ection1', relatedCollection: '$symbols_coll.ection2', type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - $doc1 = static::getDatabase()->createDocument('$symbols_coll.ection2', new Document([ + $doc1 = $database->createDocument('$symbols_coll.ection2', new Document([ '$id' => ID::unique(), '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()) ] ])); - $doc2 = static::getDatabase()->createDocument('$symbols_coll.ection1', new Document([ + $doc2 = $database->createDocument('$symbols_coll.ection1', new Document([ '$id' => ID::unique(), '$symbols_coll.ection2' => $doc1->getId(), '$permissions' => [ @@ -1658,8 +1688,8 @@ public function testOneToOneRelationshipKeyWithSymbols(): void ] ])); - $doc1 = static::getDatabase()->getDocument('$symbols_coll.ection2', $doc1->getId()); - $doc2 = static::getDatabase()->getDocument('$symbols_coll.ection1', $doc2->getId()); + $doc1 = $database->getDocument('$symbols_coll.ection2', $doc1->getId()); + $doc2 = $database->getDocument('$symbols_coll.ection1', $doc2->getId()); $this->assertEquals($doc2->getId(), $doc1->getAttribute('$symbols_coll.ection1')->getId()); $this->assertEquals($doc1->getId(), $doc2->getAttribute('$symbols_coll.ection2')->getId()); @@ -1667,11 +1697,14 @@ public function testOneToOneRelationshipKeyWithSymbols(): void public function testRecreateOneToOneOneWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1689,7 +1722,7 @@ public function testRecreateOneToOneOneWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1708,15 +1741,15 @@ public function testRecreateOneToOneOneWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, @@ -1724,17 +1757,20 @@ public function testRecreateOneToOneOneWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToOneTwoWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1752,7 +1788,7 @@ public function testRecreateOneToOneTwoWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1771,16 +1807,16 @@ public function testRecreateOneToOneTwoWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, @@ -1789,17 +1825,20 @@ public function testRecreateOneToOneTwoWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToOneTwoWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1817,7 +1856,7 @@ public function testRecreateOneToOneTwoWayRelationshipFromChild(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1836,16 +1875,16 @@ public function testRecreateOneToOneTwoWayRelationshipFromChild(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, twoWay: true, ); - static::getDatabase()->deleteRelationship('two', 'one'); + $database->deleteRelationship('two', 'one'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, @@ -1854,17 +1893,20 @@ public function testRecreateOneToOneTwoWayRelationshipFromChild(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testRecreateOneToOneOneWayRelationshipFromParent(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('one', [ + $database->createCollection('one', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1882,7 +1924,7 @@ public function testRecreateOneToOneOneWayRelationshipFromParent(): void Permission::update(Role::any()), Permission::delete(Role::any()) ]); - static::getDatabase()->createCollection('two', [ + $database->createCollection('two', [ new Document([ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -1901,15 +1943,15 @@ public function testRecreateOneToOneOneWayRelationshipFromParent(): void Permission::delete(Role::any()) ]); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, ); - static::getDatabase()->deleteRelationship('one', 'two'); + $database->deleteRelationship('one', 'two'); - $result = static::getDatabase()->createRelationship( + $result = $database->createRelationship( collection: 'one', relatedCollection: 'two', type: Database::RELATION_ONE_TO_ONE, @@ -1917,13 +1959,16 @@ public function testRecreateOneToOneOneWayRelationshipFromParent(): void $this->assertTrue($result); - static::getDatabase()->deleteCollection('one'); - static::getDatabase()->deleteCollection('two'); + $database->deleteCollection('one'); + $database->deleteCollection('two'); } public function testDeleteBulkDocumentsOneToOneRelationship(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships() || !static::getDatabase()->getAdapter()->getSupportForBatchOperations()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships() || !$database->getAdapter()->getSupportForBatchOperations()) { $this->expectNotToPerformAssertions(); return; } @@ -2119,15 +2164,18 @@ public function testDeleteBulkDocumentsOneToOneRelationship(): void public function testDeleteTwoWayRelationshipFromChild(): void { - if (!static::getDatabase()->getAdapter()->getSupportForRelationships()) { + /** @var Database $database */ + $database = static::getDatabase(); + + if (!$database->getAdapter()->getSupportForRelationships()) { $this->expectNotToPerformAssertions(); return; } - static::getDatabase()->createCollection('drivers'); - static::getDatabase()->createCollection('licenses'); + $database->createCollection('drivers'); + $database->createCollection('licenses'); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'drivers', relatedCollection: 'licenses', type: Database::RELATION_ONE_TO_ONE, @@ -2136,25 +2184,25 @@ public function testDeleteTwoWayRelationshipFromChild(): void twoWayKey: 'driver' ); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(1, \count($drivers->getAttribute('attributes'))); $this->assertEquals(1, \count($drivers->getAttribute('indexes'))); $this->assertEquals(1, \count($licenses->getAttribute('attributes'))); $this->assertEquals(1, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->deleteRelationship('licenses', 'driver'); + $database->deleteRelationship('licenses', 'driver'); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(0, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); $this->assertEquals(0, \count($licenses->getAttribute('attributes'))); $this->assertEquals(0, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'drivers', relatedCollection: 'licenses', type: Database::RELATION_ONE_TO_MANY, @@ -2163,25 +2211,25 @@ public function testDeleteTwoWayRelationshipFromChild(): void twoWayKey: 'driver' ); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(1, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); $this->assertEquals(1, \count($licenses->getAttribute('attributes'))); $this->assertEquals(1, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->deleteRelationship('licenses', 'driver'); + $database->deleteRelationship('licenses', 'driver'); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(0, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); $this->assertEquals(0, \count($licenses->getAttribute('attributes'))); $this->assertEquals(0, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'licenses', relatedCollection: 'drivers', type: Database::RELATION_MANY_TO_ONE, @@ -2190,25 +2238,25 @@ public function testDeleteTwoWayRelationshipFromChild(): void twoWayKey: 'licenses' ); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(1, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); $this->assertEquals(1, \count($licenses->getAttribute('attributes'))); $this->assertEquals(1, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->deleteRelationship('drivers', 'licenses'); + $database->deleteRelationship('drivers', 'licenses'); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); $this->assertEquals(0, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); $this->assertEquals(0, \count($licenses->getAttribute('attributes'))); $this->assertEquals(0, \count($licenses->getAttribute('indexes'))); - static::getDatabase()->createRelationship( + $database->createRelationship( collection: 'licenses', relatedCollection: 'drivers', type: Database::RELATION_MANY_TO_MANY, @@ -2217,9 +2265,9 @@ public function testDeleteTwoWayRelationshipFromChild(): void twoWayKey: 'licenses' ); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); - $junction = static::getDatabase()->getCollection('_' . $licenses->getSequence() . '_' . $drivers->getSequence()); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); + $junction = $database->getCollection('_' . $licenses->getSequence() . '_' . $drivers->getSequence()); $this->assertEquals(1, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes'))); @@ -2228,11 +2276,11 @@ public function testDeleteTwoWayRelationshipFromChild(): void $this->assertEquals(2, \count($junction->getAttribute('attributes'))); $this->assertEquals(2, \count($junction->getAttribute('indexes'))); - static::getDatabase()->deleteRelationship('drivers', 'licenses'); + $database->deleteRelationship('drivers', 'licenses'); - $drivers = static::getDatabase()->getCollection('drivers'); - $licenses = static::getDatabase()->getCollection('licenses'); - $junction = static::getDatabase()->getCollection('_licenses_drivers'); + $drivers = $database->getCollection('drivers'); + $licenses = $database->getCollection('licenses'); + $junction = $database->getCollection('_licenses_drivers'); $this->assertEquals(0, \count($drivers->getAttribute('attributes'))); $this->assertEquals(0, \count($drivers->getAttribute('indexes')));