Compare commits
4 Commits
3c958dc5df
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| ce77709d37 | |||
| a7eb83be44 | |||
| 3653513818 | |||
| 58df9cb476 |
@@ -166,4 +166,11 @@ class CloudObject {
|
||||
return $this->getString(Constants::PROPERTY_REVISION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the label of the object.
|
||||
*/
|
||||
public function getLabel() : ?string {
|
||||
return $this->getString(Constants::RDFS_LABEL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,5 +9,6 @@ namespace CloudObjects\SDK;
|
||||
class Constants {
|
||||
|
||||
const PROPERTY_REVISION = 'coid://cloudobjects.io/isAtRevision';
|
||||
const RDFS_LABEL = 'http://www.w3.org/2000/01/rdf-schema#label';
|
||||
|
||||
}
|
||||
80
CloudObjects/SDK/ObjectRetrieverFacade.php
Normal file
80
CloudObjects/SDK/ObjectRetrieverFacade.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
namespace CloudObjects\SDK;
|
||||
|
||||
use Exception;
|
||||
use ML\IRI\IRI;
|
||||
use ML\JsonLD\Node;
|
||||
|
||||
/**
|
||||
* Static facade for ObjectRetriever. Call setObjectRetriever() once to
|
||||
* initialize; all subsequent static calls are forwarded to that instance.
|
||||
*/
|
||||
class ObjectRetrieverFacade {
|
||||
|
||||
private static ?ObjectRetriever $instance = null;
|
||||
|
||||
public static function setObjectRetriever(ObjectRetriever $retriever) : void {
|
||||
self::$instance = $retriever;
|
||||
}
|
||||
|
||||
private static function getInstance() : ObjectRetriever {
|
||||
if (self::$instance === null)
|
||||
throw new Exception('ObjectRetrieverFacade has not been initialized. Call setObjectRetriever() first.');
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
public static function setDefaultReader(NodeReader $reader) : ObjectRetriever {
|
||||
return self::getInstance()->setDefaultReader($reader);
|
||||
}
|
||||
|
||||
public static function getDefaultReader() : NodeReader {
|
||||
return self::getInstance()->getDefaultReader();
|
||||
}
|
||||
|
||||
public static function getClient() {
|
||||
return self::getInstance()->getClient();
|
||||
}
|
||||
|
||||
public static function getCloudObject(IRI $coid) : ?CloudObject {
|
||||
return self::getInstance()->getCloudObject($coid);
|
||||
}
|
||||
|
||||
public static function getObjectNode(IRI $coid) : ?Node {
|
||||
return self::getInstance()->getObjectNode($coid);
|
||||
}
|
||||
|
||||
public static function fetchObjectsInNamespaceWithType(IRI $namespaceCoid, $type) : array {
|
||||
return self::getInstance()->fetchObjectsInNamespaceWithType($namespaceCoid, $type);
|
||||
}
|
||||
|
||||
public static function fetchAllObjectsInNamespace(IRI $namespaceCoid) : array {
|
||||
return self::getInstance()->fetchAllObjectsInNamespace($namespaceCoid);
|
||||
}
|
||||
|
||||
public static function getCOIDListForNamespace(IRI $namespaceCoid) : array {
|
||||
return self::getInstance()->getCOIDListForNamespace($namespaceCoid);
|
||||
}
|
||||
|
||||
public static function getCOIDListForNamespaceWithType(IRI $namespaceCoid, $type) : array {
|
||||
return self::getInstance()->getCOIDListForNamespaceWithType($namespaceCoid, $type);
|
||||
}
|
||||
|
||||
public static function getAttachment(IRI $coid, $filename) {
|
||||
return self::getInstance()->getAttachment($coid, $filename);
|
||||
}
|
||||
|
||||
public static function getAuthenticatingNamespaceObjectNode() : ?Node {
|
||||
return self::getInstance()->getAuthenticatingNamespaceObjectNode();
|
||||
}
|
||||
|
||||
public static function getAuthenticatingNamespaceCloudObject() : ?CloudObject {
|
||||
return self::getInstance()->getAuthenticatingNamespaceCloudObject();
|
||||
}
|
||||
|
||||
}
|
||||
23
CloudObjects/SDK/functions.php
Normal file
23
CloudObjects/SDK/functions.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use ML\IRI\IRI;
|
||||
use CloudObjects\SDK\CloudObject,
|
||||
CloudObjects\SDK\ObjectRetrieverFacade;
|
||||
|
||||
if (!function_exists('cloudobjects_get_object')) {
|
||||
/**
|
||||
* Retrieve a CloudObject by COID. Accepts a COID as an IRI object or a string.
|
||||
*/
|
||||
function cloudobjects_get_object($coid) : ?CloudObject {
|
||||
if (is_string($coid))
|
||||
$coid = new IRI($coid);
|
||||
elseif (!($coid instanceof IRI))
|
||||
throw new InvalidArgumentException('COID must be a string or an IRI object.');
|
||||
|
||||
return ObjectRetrieverFacade::getCloudObject($coid);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,10 @@
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"CloudObjects\\SDK" : ""
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"CloudObjects/SDK/functions.php"
|
||||
]
|
||||
},
|
||||
"require-dev" : {
|
||||
"phpunit/phpunit": "^10",
|
||||
|
||||
63
tests/OfflineTests/FunctionsTest.php
Normal file
63
tests/OfflineTests/FunctionsTest.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
namespace CloudObjects\SDK;
|
||||
|
||||
use ML\IRI\IRI;
|
||||
use ReflectionProperty,
|
||||
InvalidArgumentException;
|
||||
|
||||
class FunctionsTest extends \PHPUnit\Framework\TestCase {
|
||||
|
||||
protected function setUp(): void {
|
||||
$prop = new ReflectionProperty(ObjectRetrieverFacade::class, 'instance');
|
||||
$prop->setAccessible(true);
|
||||
$prop->setValue(null, null);
|
||||
}
|
||||
|
||||
private function makeMockRetrieverReturning(?CloudObject $object) : ObjectRetriever {
|
||||
$mock = $this->createMock(ObjectRetriever::class);
|
||||
$mock->method('getCloudObject')->willReturn($object);
|
||||
return $mock;
|
||||
}
|
||||
|
||||
public function testAcceptsIRI(): void {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$mockObject = $this->createMock(CloudObject::class);
|
||||
|
||||
$mockRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$mockRetriever->expects($this->once())
|
||||
->method('getCloudObject')
|
||||
->with($coid)
|
||||
->willReturn($mockObject);
|
||||
|
||||
ObjectRetrieverFacade::setObjectRetriever($mockRetriever);
|
||||
|
||||
$this->assertSame($mockObject, cloudobjects_get_object($coid));
|
||||
}
|
||||
|
||||
public function testConvertsStringToIRI(): void {
|
||||
$mockObject = $this->createMock(CloudObject::class);
|
||||
|
||||
$mockRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$mockRetriever->expects($this->once())
|
||||
->method('getCloudObject')
|
||||
->with($this->callback(fn($arg) => $arg instanceof IRI && (string)$arg === 'coid://cloudobjects.io'))
|
||||
->willReturn($mockObject);
|
||||
|
||||
ObjectRetrieverFacade::setObjectRetriever($mockRetriever);
|
||||
|
||||
$this->assertSame($mockObject, cloudobjects_get_object('coid://cloudobjects.io'));
|
||||
}
|
||||
|
||||
public function testThrowsOnInvalidArgumentType(): void {
|
||||
ObjectRetrieverFacade::setObjectRetriever($this->makeMockRetrieverReturning(null));
|
||||
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
cloudobjects_get_object(42);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -126,6 +126,15 @@ class NodeReaderMockTest extends \PHPUnit\Framework\TestCase {
|
||||
$this->assertEquals('coid://cloudobjects.io/Public', $object->getNode('co:isVisibleTo')->getId());
|
||||
}
|
||||
|
||||
public function testConstants() {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$this->useRootResourceMock();
|
||||
$object = $this->retriever->getCloudObject($coid);
|
||||
|
||||
$this->assertEquals('6-fbea0c90b2c5e5300e4039ed99be9b2d', $object->getRevision());
|
||||
$this->assertEquals('CloudObjects', $object->getLabel());
|
||||
}
|
||||
|
||||
public function testGetAllValuesString1() {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$this->useRootResourceMock();
|
||||
|
||||
76
tests/OfflineTests/ObjectRetrieverFacadeTest.php
Normal file
76
tests/OfflineTests/ObjectRetrieverFacadeTest.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
namespace CloudObjects\SDK;
|
||||
|
||||
use Exception;
|
||||
use ML\IRI\IRI;
|
||||
use ML\JsonLD\Node;
|
||||
use ReflectionProperty;
|
||||
|
||||
class ObjectRetrieverFacadeTest extends \PHPUnit\Framework\TestCase {
|
||||
|
||||
protected function setUp(): void {
|
||||
$prop = new ReflectionProperty(ObjectRetrieverFacade::class, 'instance');
|
||||
$prop->setAccessible(true);
|
||||
$prop->setValue(null, null);
|
||||
}
|
||||
|
||||
public function testThrowsExceptionBeforeInitialization(): void {
|
||||
$this->expectException(Exception::class);
|
||||
ObjectRetrieverFacade::getObjectNode(new IRI('coid://cloudobjects.io'));
|
||||
}
|
||||
|
||||
public function testForwardsGetObjectNodeToInstance(): void {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$mockNode = $this->createMock(Node::class);
|
||||
|
||||
$mockRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$mockRetriever->expects($this->once())
|
||||
->method('getObjectNode')
|
||||
->with($coid)
|
||||
->willReturn($mockNode);
|
||||
|
||||
ObjectRetrieverFacade::setObjectRetriever($mockRetriever);
|
||||
|
||||
$this->assertSame($mockNode, ObjectRetrieverFacade::getObjectNode($coid));
|
||||
}
|
||||
|
||||
public function testForwardsGetCloudObjectToInstance(): void {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$mockCloudObject = $this->createMock(CloudObject::class);
|
||||
|
||||
$mockRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$mockRetriever->expects($this->once())
|
||||
->method('getCloudObject')
|
||||
->with($coid)
|
||||
->willReturn($mockCloudObject);
|
||||
|
||||
ObjectRetrieverFacade::setObjectRetriever($mockRetriever);
|
||||
|
||||
$this->assertSame($mockCloudObject, ObjectRetrieverFacade::getCloudObject($coid));
|
||||
}
|
||||
|
||||
public function testReplacingRetrieverUsesNewInstance(): void {
|
||||
$coid = new IRI('coid://cloudobjects.io');
|
||||
$mockNode = $this->createMock(Node::class);
|
||||
|
||||
$firstRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$firstRetriever->expects($this->never())->method('getObjectNode');
|
||||
|
||||
$secondRetriever = $this->createMock(ObjectRetriever::class);
|
||||
$secondRetriever->expects($this->once())
|
||||
->method('getObjectNode')
|
||||
->with($coid)
|
||||
->willReturn($mockNode);
|
||||
|
||||
ObjectRetrieverFacade::setObjectRetriever($firstRetriever);
|
||||
ObjectRetrieverFacade::setObjectRetriever($secondRetriever);
|
||||
|
||||
$this->assertSame($mockNode, ObjectRetrieverFacade::getObjectNode($coid));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user