Source of file StaticSchemaTest.php
Size: 10,992 Bytes - Last Modified: 2021-12-23T10:31:47+00:00
/var/www/docs.ssmods.com/process/src/tests/Scaffolding/StaticSchemaTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 | <?php namespace SilverStripe\GraphQL\Tests\Scaffolding; use GraphQL\Type\Definition\ObjectType; use InvalidArgumentException; use PHPUnit\Framework\Error\Notice; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\StaticSchema; use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; use SilverStripe\GraphQL\Tests\Fake\FakeFieldAccessor; use SilverStripe\GraphQL\Tests\Fake\FakePage; use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; use SilverStripe\ORM\FieldType\DBField; use SilverStripe\View\ArrayData; class StaticSchemaTest extends SapphireTest { protected function setUp(): void { parent::setUp(); StaticSchema::reset(); } public function testTypeNameForDataObject() { $typeNames = [ DataObjectFake::class => 'testType', ]; $schema = new StaticSchema(); $schema->setTypeNames($typeNames); $typename = $schema->typeNameForDataObject(DataObjectFake::class); $this->assertEquals('testType', $typename); $typename = $schema->typeNameForDataObject(FakePage::class); $this->assertEquals('SilverStripeFakePage', $typename); $typename = $schema->typeNameForDataObject('UnNamespacedClass'); $this->assertEquals('UnNamespacedClass', $typename); } public function testEnsureDataObject() { $this->expectException(\InvalidArgumentException::class); $schema = new StaticSchema(); $schema->setTypeNames(['fail' => 'fail']); } public function testEnsureUnique() { $this->expectException(\InvalidArgumentException::class); $typeNames = [ DataObjectFake::class => 'test1', FakePage::class => 'test2', FakeRedirectorPage::class => 'test1', ]; $schema = new StaticSchema(); $schema->setTypeNames($typeNames); } public function testEnsureAssoc() { $this->expectException(\InvalidArgumentException::class); $typeNames = [ 'test1', 'test2', ]; $schema = new StaticSchema(); $schema->setTypeNames($typeNames); } public function testTypeName() { $schema = new StaticSchema(); $this->assertEquals('NicelyFormatted_Type', $schema->typeName('Nicely Formatted/Type')); } public function testIsValidFieldName() { $schema = new StaticSchema(); $fake = new DataObjectFake(); $this->assertTrue($schema->isValidFieldName($fake, 'MyField')); $this->assertTrue($schema->isValidFieldName($fake, 'CustomGetter')); $this->assertFalse($schema->isValidFieldName($fake, 'fail')); } public function testLoadsFromConfig() { $config = [ 'typeNames' => [ DataObjectFake::class => 'testType', ] ]; Manager::create()->applyConfig($config); $this->assertEquals('testType', StaticSchema::inst()->typeNameForDataObject(DataObjectFake::class)); StaticSchema::inst()->setTypeNames([ DataObjectFake::class => 'otherTestType' ]); $this->assertEquals('otherTestType', StaticSchema::inst()->typeNameForDataObject(DataObjectFake::class)); } public function testLoadSchemaName() { $config = [ 'schema1' => [ 'typeNames' => [ DataObjectFake::class => 'testType1', ], ], 'schema2' => [], 'schema3' => [ 'typeNames' => [ DataObjectFake::class => 'testType3', ] ] ]; $inst = StaticSchema::inst(); Config::modify()->set(Manager::class, 'schemas', $config); $this->assertEquals( 'SilverStripeDataObjectFake', $inst->typeNameForDataObject(DataObjectFake::class) ); $inst->load('schema1'); $this->assertEquals( 'testType1', $inst->typeNameForDataObject(DataObjectFake::class) ); $inst->load('schema2'); $this->assertEquals( 'SilverStripeDataObjectFake', $inst->typeNameForDataObject(DataObjectFake::class) ); $inst->load('schema3'); $this->assertEquals( 'testType3', $inst->typeNameForDataObject(DataObjectFake::class) ); $inst->load('notASchema'); $this->assertEquals( 'SilverStripeDataObjectFake', $inst->typeNameForDataObject(DataObjectFake::class) ); } public function testInheritanceTypeNames() { Config::modify()->set(StaticSchema::class, 'inheritanceTypeSuffix', 'MySuffix'); $schema = new StaticSchema(); $type = $schema->typeNameForDataObject(FakeSiteTree::class); $union = $schema->inheritanceTypeNameForDataObject(FakeSiteTree::class); $this->assertEquals($type . 'MySuffix', $union); $union = $schema->inheritanceTypeNameForType($type); $this->assertEquals($type . 'MySuffix', $union); } public function testAncestry() { $ancestry = StaticSchema::inst()->getAncestry(FakeRedirectorPage::class); $this->assertCount(2, $ancestry); $this->assertContains(FakePage::class, $ancestry); $this->assertContains(FakeSiteTree::class, $ancestry); $ancestry = StaticSchema::inst()->getAncestry(FakeSiteTree::class); $this->assertCount(0, $ancestry); } public function testDescendants() { $descendants = StaticSchema::inst()->getDescendants(FakeSiteTree::class); $this->assertCount(2, $descendants); $this->assertContains(FakePage::class, $descendants); $this->assertContains(FakeRedirectorPage::class, $descendants); $descendants = StaticSchema::inst()->getDescendants(FakeRedirectorPage::class); $this->assertCount(0, $descendants); } public function testFetchFromManager() { $manager = new Manager(); $typeName = StaticSchema::inst()->typeNameForDataObject(FakeSiteTree::class); $inheritedTypeName = StaticSchema::inst()->inheritanceTypeNameForDataObject(FakeSiteTree::class); $singleType = new ObjectType(['name' => $typeName]); $unionType = new ObjectType(['name' => $inheritedTypeName]); $manager->addType($singleType); $manager->addType($unionType); $result = StaticSchema::inst() ->fetchFromManager(FakeSiteTree::class, $manager, StaticSchema::PREFER_UNION); $this->assertSame($result, $unionType); $result = StaticSchema::inst() ->fetchFromManager(FakeSiteTree::class, $manager, StaticSchema::PREFER_SINGLE); $this->assertSame($result, $singleType); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/illegal mode/'); StaticSchema::inst() ->fetchFromManager(FakeSiteTree::class, $manager, 'fail'); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/could not be resolved/'); StaticSchema::inst() ->fetchFromManager('fail', $manager); } public function testInstance() { $inst1 = StaticSchema::inst(); $inst2 = StaticSchema::inst(); $this->assertSame($inst1, $inst2); $new = new StaticSchema(); StaticSchema::setInstance($new); $this->assertSame($new, StaticSchema::inst()); StaticSchema::reset(); $this->assertNotSame($new, StaticSchema::inst()); } public function testFormatField() { $result = StaticSchema::inst()->formatField('Foo'); $this->assertEquals('Foo', $result); StaticSchema::inst()->setFieldFormatter('strrev'); $result = StaticSchema::inst()->formatField('abc'); $this->assertEquals('cba', $result); } public function testFormatFields() { $result = StaticSchema::inst()->formatFields(['Foo', 'Bar']); $this->assertEquals(['Foo', 'Bar'], $result); StaticSchema::inst()->setFieldFormatter('strrev'); $result = StaticSchema::inst()->formatFields(['abc', '123']); $this->assertEquals(['cba', '321'], $result); } public function testFormatKeys() { $result = StaticSchema::inst()->formatKeys(['Foo', 'Bar']); $this->assertEquals(['Foo', 'Bar'], $result); StaticSchema::inst()->setFieldFormatter('strrev'); $result = StaticSchema::inst()->formatKeys(['Foo', 'Bar']); $this->assertEquals(['Foo', 'Bar'], $result); $result = StaticSchema::inst()->formatKeys(['Foo' => 'test1', 'Bar' => 'test2']); $this->assertArrayHasKey('ooF', $result); $this->assertArrayHasKey('raB', $result); $this->assertEquals('test1', $result['ooF']); $this->assertEquals('test2', $result['raB']); } public function testExtractKeys() { $arr = ['Foo' => 'test1', 'Bar' => 'test2']; $result = StaticSchema::inst()->extractKeys(['Foo', 'Bar'], $arr); $this->assertEquals(['test1', 'test2'], $result); $arr = ['ooF' => 'test1', 'raB' => 'test2']; StaticSchema::inst()->setFieldFormatter('strrev'); $result = StaticSchema::inst()->extractKeys(['Foo', 'Bar'], $arr); $this->assertEquals(['test1', 'test2'], $result); $result = StaticSchema::inst()->extractKeys(['Foo', 'NotExists'], $arr); $this->assertEquals(['test1', null], $result); if (PHP_VERSION_ID < 80000) { $this->expectNotice('StaticSchema throws notice when extracting on non-existent key on PHP 7'); } else { $this->expectWarning('StaticSchema throws warning when extracting on non-existent key on PHP 8'); } StaticSchema::inst()->extractKeys(['Foo', 'NotExists'], $arr, false); } public function testAccessField() { StaticSchema::inst()->setFieldAccessor(new FakeFieldAccessor()); $obj = new ArrayData(['Foo' => 'test1', 'Bar' => 'test2']); $result = StaticSchema::inst()->accessField($obj, 'Foo'); $this->assertInstanceOf(DBField::class, $result); $this->assertEquals('test1', $result->getValue()); $result = StaticSchema::inst()->accessField($obj, 'ooF'); $this->assertInstanceOf(DBField::class, $result); $this->assertEquals('test1', $result->getValue()); $result = StaticSchema::inst()->isValidFieldName($obj, 'Foo'); $this->assertTrue($result); $result = StaticSchema::inst()->isValidFieldName($obj, 'ooF'); $this->assertTrue($result); $result = StaticSchema::inst()->isValidFieldName($obj, 'ofo'); $this->assertFalse($result); } } |