diff --git a/.codeclimate.yml b/.codeclimate.yml index 71918e5..8152b6b 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -5,7 +5,7 @@ engines: enabled: true config: file_extensions: "php" - rulesets: "controversial,design,naming,unusedcode,phpmd.xml" + rulesets: "controversial,naming,unusedcode,phpmd.xml" phpcodesniffer: enabled: true config: diff --git a/phpmd.xml b/phpmd.xml index 9aa449c..1cf21d6 100644 --- a/phpmd.xml +++ b/phpmd.xml @@ -9,6 +9,16 @@ + + + + + + + + + + diff --git a/src/Object/Tests/Fixture/2015/12/21/1.article/1.md b/src/Object/Tests/Fixture/2015/12/21/1.article/1.md index a5544b3..5104c11 100644 --- a/src/Object/Tests/Fixture/2015/12/21/1.article/1.md +++ b/src/Object/Tests/Fixture/2015/12/21/1.article/1.md @@ -32,7 +32,12 @@ relations: - !/repo/2016/01/08/2.contact/2 - ftp://example.com/blog/repo/2016/01/08/2.contact/2 - aprts://example.com/blog/repo/2016/01/08/2.contact/2 + refers-to: + - http://jkphl.is Joschi Kuphal + embeds: + - https://jkphl.is/avatar.jpg Joschi Kuphal ... # Example article object -This file is an example for an object of type `"article"`. +This file is an example for an object of type `"article"`. It has a link to [Joschi Kuphal's website](https://jkphl.is) and features his avatar: +![Joschi Kuphal](https://jkphl.is/avatar.jpg) diff --git a/src/Object/Tests/ObjectTest.php b/src/Object/Tests/ObjectTest.php index f7a1022..a7a2644 100644 --- a/src/Object/Tests/ObjectTest.php +++ b/src/Object/Tests/ObjectTest.php @@ -137,7 +137,7 @@ public function testLoadArticleObjectSystemProperties() $this->assertEquals(new \DateTimeImmutable('2015-12-21T22:45:00'), $articleObject->getPublished()); $this->assertEquals('en', $articleObject->getLanguage()); $this->assertEquals( - "# Example article object\n\nThis file is an example for an object of type `\"article\"`.\n", + "# Example article object\n\nThis file is an example for an object of type `\"article\"`. It has a link to [Joschi Kuphal's website](https://jkphl.is) and features his avatar:\n![Joschi Kuphal](https://jkphl.is/avatar.jpg)\n", $articleObject->getPayload() ); } diff --git a/src/Object/Tests/ObjectUrlTest.php b/src/Object/Tests/ObjectUrlTest.php new file mode 100644 index 0000000..d7b4497 --- /dev/null +++ b/src/Object/Tests/ObjectUrlTest.php @@ -0,0 +1,342 @@ + / @jkphl + * @copyright Copyright © 2016 Joschi Kuphal / @jkphl + * @license http://opensource.org/licenses/MIT The MIT License (MIT) + */ + +/*********************************************************************************** + * The MIT License (MIT) + * + * Copyright © 2016 Joschi Kuphal / @jkphl + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ***********************************************************************************/ + +namespace Apparat\Object\Tests; + +use Apparat\Object\Domain\Model\Object\Id; +use Apparat\Object\Domain\Model\Object\Revision; +use Apparat\Object\Domain\Model\Object\Type; +use Apparat\Object\Domain\Model\Path\ObjectUrl; +use Apparat\Object\Domain\Repository\Service; + +/** + * Object URL tests + * + * @package Apparat\Object + * @subpackage ApparatTest + */ +class ObjectUrlTest extends AbstractDisabledAutoconnectorTest +{ + /** + * Example query fragment + * + * @var string + */ + const QUERY_FRAGMENT = '?param=value#fragment'; + /** + * Repository URL + * + * @var string + */ + const REPOSITORY_URL = '/repo'; + /** + * Example path + * + * @var string + */ + const PATH = '/2015/10/01/36704.event/36704-1'; + /** + * Example path (draft mode) + * + * @var string + */ + const DRAFT_PATH = '/2015/10/01/36704.event/36704+'; + /** + * Example URL + * + * @var string + */ + const URL = self::REPOSITORY_URL.self::PATH.self::QUERY_FRAGMENT; + /** + * Example remote repository URL + * + * @var string + */ + const REMOTE_REPOSITORY_URL = 'http://apparat:tools@apparat.tools:80'; + /** + * Example remote URL + * + * @var string + */ + const REMOTE_URL = self::REMOTE_REPOSITORY_URL.self::PATH.self::QUERY_FRAGMENT; + + /** + * Test an URL + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1451515385 + */ + public function testInvalidRemoteUrl() + { + new ObjectUrl(self::REMOTE_URL); + } + + /** + * Test a remote URL + */ + public function testRemoteUrl() + { + $url = new ObjectUrl(self::REMOTE_URL, true); + $this->assertInstanceOf(ObjectUrl::class, $url); + $this->assertEquals(self::REMOTE_URL, strval($url)); + $this->assertEquals('http', $url->getScheme()); + $this->assertEquals('apparat', $url->getUser()); + $this->assertEquals('tools', $url->getPassword()); + $this->assertEquals('apparat.tools', $url->getHost()); + $this->assertEquals(80, $url->getPort()); + $this->assertEquals('', $url->getPath()); + $this->assertEquals(['param' => 'value'], $url->getQuery()); + $this->assertEquals('fragment', $url->getFragment()); + $this->assertInstanceOf(\DateTimeImmutable::class, $url->getCreationDate()); + $this->assertEquals('2015-10-01', $url->getCreationDate()->format('Y-m-d')); + $this->assertInstanceOf(Id::class, $url->getId()); + $this->assertEquals(new Id(36704), $url->getId()); + $this->assertInstanceOf(Type::class, $url->getType()); + $this->assertEquals(new Type('event'), $url->getType()); + $this->assertInstanceOf(Revision::class, $url->getRevision()); + $this->assertEquals(new Revision(1), $url->getRevision()); + $this->assertEquals(self::REMOTE_REPOSITORY_URL, Service::normalizeRepositoryUrl($url)); + $this->assertFalse($url->isDraft()); + $this->assertTrue($url->setDraft(true)->isDraft()); + } + + /** + * Test a remote draft URL + */ + public function testRemoteDraftUrl() + { + $url = new ObjectUrl(self::REMOTE_REPOSITORY_URL.self::DRAFT_PATH, true); + $this->assertInstanceOf(ObjectUrl::class, $url); + $this->assertTrue($url->isDraft()); + } + + /** + * Test a local URL with path prefix + */ + public function testLeadedLocalUrl() + { + $pathPrefix = '/prefix/path'; + $url = new ObjectUrl($pathPrefix.self::PATH); + $this->assertEquals($pathPrefix, $url->getPath()); + $this->assertEquals(self::PATH, $url->getLocalPath()); + } + + /** + * Test an invalid URL + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1449873819 + */ + public function testInvalidUrl() + { + new ObjectUrl('invalid://'); + } + + /** + * Test an invalid URL path + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1449874494 + */ + public function testInvalidUrlPath() + { + new ObjectUrl('http://invalid~url*path', true); + } + + /** + * Test the scheme setter + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1449924914 + */ + public function testUrlSchemeSetter() + { + $url = new ObjectUrl(self::URL); + $this->assertEquals(ObjectUrl::SCHEME_HTTPS, $url->setScheme(ObjectUrl::SCHEME_HTTPS)->getScheme()); + $url->setScheme('invalid'); + } + + /** + * Test the host setter + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1449925567 + */ + public function testUrlHostSetter() + { + $url = new ObjectUrl(self::URL); + $this->assertEquals('apparat.com', $url->setHost('apparat.com')->getHost()); + $url->setHost('_'); + } + + /** + * Test the port setter + * + * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException + * @expectedExceptionCode 1449925885 + */ + public function testUrlPortSetter() + { + $url = new ObjectUrl(self::URL); + $this->assertEquals(443, $url->setPort(443)->getPort()); + $url->setPort(123456789); + } + + /** + * Test the remaining setter methods + */ + public function testUrlSetters() + { + $url = new ObjectUrl(self::URL); + $this->assertEquals('test', $url->setUser('test')->getUser()); + $this->assertEquals(null, $url->setUser(null)->getUser()); + $this->assertEquals('password', $url->setPassword('password')->getPassword()); + $this->assertEquals(null, $url->setPassword(null)->getPassword()); + $this->assertEquals('/path/prefix', $url->setPath('/path/prefix')->getPath()); + $this->assertEquals(['param2' => 'value2'], $url->setQuery(['param2' => 'value2'])->getQuery()); + $this->assertEquals('fragment2', $url->setFragment('fragment2')->getFragment()); + + $this->assertEquals( + '2016-01-01', + $url->setCreationDate(new \DateTimeImmutable('@1451606400'))->getCreationDate()->format('Y-m-d') + ); + $this->assertEquals(123, $url->setId(new Id(123))->getId()->getId()); + $this->assertEquals('article', $url->setType(new Type('article'))->getType()->getType()); + $this->assertEquals( + Revision::CURRENT, + $url->setRevision(Revision::current())->getRevision()->getRevision() + ); + } + + /** + * Test the override functionality when getting the URL path + */ + public function testUrlPathOverride() + { + $url = new TestObjectUrl(self::URL); + $this->assertEquals( + 'https://user:password@another.host:443/path/prefix/2015/10/01/36704.event/36704-2?param2=value2#fragment2', + $url->getUrlOverride() + ); + } + + /** + * Test absolute URL + */ + public function testUrlAbsolute() + { + $url = new ObjectUrl(self::REMOTE_URL, true); + $this->assertEquals(true, $url->isAbsolute()); + $this->assertEquals(self::REMOTE_REPOSITORY_URL, $url->getRepositoryUrl()); + } + + /** + * Test absolute URL + */ + public function testUrlAbsoluteLocal() + { + $url = new ObjectUrl(rtrim(getenv('APPARAT_BASE_URL'), '/').self::REPOSITORY_URL.self::PATH, true); + $this->assertTrue($url->isAbsoluteLocal()); + } + + /** + * Test relative URL + */ + public function testUrlRelative() + { + $url = new ObjectUrl(self::PATH.self::QUERY_FRAGMENT); + $this->assertEquals(false, $url->isAbsolute()); + } + + /** + * Test remote URL + */ + public function testUrlRemote() + { + $url = new ObjectUrl(self::REMOTE_REPOSITORY_URL.self::REPOSITORY_URL.self::PATH, true); + $this->assertTrue($url->isRemote()); + $url = new ObjectUrl(rtrim(getenv('APPARAT_BASE_URL'), '/').self::REPOSITORY_URL.self::PATH, true); + $this->assertFalse($url->isRemote()); + } + + /** + * Test object URL comparison + */ + public function testObjectUrlComparison() + { + $this->assertFalse( + ( + new ObjectUrl( + 'http://example.com/2015/10/01/36704.event/36704-1', + true + ) + )->matches(new ObjectUrl('https://example.com/2015/10/01/36704.event/36704-1', true)) + ); + $this->assertFalse( + ( + new ObjectUrl( + 'http://example.com/2015/10/01/36704.event/36704-1', + true + ) + )->matches(new ObjectUrl('http://example.com/2016/10/01/36704.event/36704-1', true)) + ); + $this->assertFalse( + ( + new ObjectUrl( + 'http://example.com/2015/10/01/36704.event/36704-1', + true + ) + )->matches(new ObjectUrl('http://example.com/2015/10/01/36705.event/36705-1', true)) + ); + $this->assertFalse( + ( + new ObjectUrl( + 'http://example.com/2015/10/01/36704.event/36704-1', + true + ) + )->matches(new ObjectUrl('http://example.com/2015/10/01/36704.article/36704-1', true)) + ); + $this->assertFalse( + ( + new ObjectUrl( + 'http://example.com/2015/10/01/36704.event/36704-1', + true + ) + )->matches(new ObjectUrl('http://example.com/2015/10/01/36704.event/36704-2', true)) + ); + $this->assertTrue((new ObjectUrl(self::REMOTE_URL, true))->matches(new ObjectUrl(self::REMOTE_URL, true))); + } +} diff --git a/src/Object/Tests/PayloadTest.php b/src/Object/Tests/PayloadTest.php index ee06c29..9d14d5f 100644 --- a/src/Object/Tests/PayloadTest.php +++ b/src/Object/Tests/PayloadTest.php @@ -58,7 +58,7 @@ class PayloadTest extends AbstractRepositoryEnabledTest /** * Test setting the object payload */ - public function testObjectSetLocation() + public function testObjectSetPayload() { $article = Object::instance(getenv('REPOSITORY_URL').self::OBJECT_PATH); $this->assertInstanceOf(Article::class, $article); diff --git a/src/Object/Tests/RelationTest.php b/src/Object/Tests/RelationTest.php index 8b65e71..c4a881c 100644 --- a/src/Object/Tests/RelationTest.php +++ b/src/Object/Tests/RelationTest.php @@ -75,7 +75,7 @@ public function testObjectAddRelation() foreach ($article->findRelations([Relation::EMAIL => 'tollwerk.de']) as $relation) { $article->deleteRelation($relation); } - $this->assertEquals(4, count($article->getRelations())); + $this->assertEquals(6, count($article->getRelations())); $article->addRelation('http://example.com John Doe', 'invalid'); } diff --git a/src/Object/Tests/UrlTest.php b/src/Object/Tests/UrlTest.php index 51d2179..6689231 100644 --- a/src/Object/Tests/UrlTest.php +++ b/src/Object/Tests/UrlTest.php @@ -36,12 +36,8 @@ namespace Apparat\Object\Tests; -use Apparat\Object\Domain\Model\Object\Id; -use Apparat\Object\Domain\Model\Object\Revision; -use Apparat\Object\Domain\Model\Object\Type; use Apparat\Object\Domain\Model\Path\ApparatUrl; use Apparat\Object\Domain\Model\Path\LocalPath; -use Apparat\Object\Domain\Model\Path\ObjectUrl; use Apparat\Object\Domain\Model\Path\Url; use Apparat\Object\Domain\Repository\Service; use Apparat\Object\Infrastructure\Repository\FileAdapterStrategy; @@ -104,205 +100,6 @@ class UrlTest extends AbstractDisabledAutoconnectorTest */ const APPARAT_URL = 'aprts://apparat:tools@apparat.tools:80'.self::PATH.self::QUERY_FRAGMENT; - /** - * Test an URL - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1451515385 - */ - public function testInvalidRemoteUrl() - { - new ObjectUrl(self::REMOTE_URL); - } - - /** - * Test a remote URL - */ - public function testRemoteUrl() - { - $url = new ObjectUrl(self::REMOTE_URL, true); - $this->assertInstanceOf(ObjectUrl::class, $url); - $this->assertEquals(self::REMOTE_URL, strval($url)); - $this->assertEquals('http', $url->getScheme()); - $this->assertEquals('apparat', $url->getUser()); - $this->assertEquals('tools', $url->getPassword()); - $this->assertEquals('apparat.tools', $url->getHost()); - $this->assertEquals(80, $url->getPort()); - $this->assertEquals('', $url->getPath()); - $this->assertEquals(['param' => 'value'], $url->getQuery()); - $this->assertEquals('fragment', $url->getFragment()); - $this->assertInstanceOf(\DateTimeImmutable::class, $url->getCreationDate()); - $this->assertEquals('2015-10-01', $url->getCreationDate()->format('Y-m-d')); - $this->assertInstanceOf(Id::class, $url->getId()); - $this->assertEquals(new Id(36704), $url->getId()); - $this->assertInstanceOf(Type::class, $url->getType()); - $this->assertEquals(new Type('event'), $url->getType()); - $this->assertInstanceOf(Revision::class, $url->getRevision()); - $this->assertEquals(new Revision(1), $url->getRevision()); - $this->assertEquals(self::REMOTE_REPOSITORY_URL, Service::normalizeRepositoryUrl($url)); - $this->assertFalse($url->isDraft()); - $this->assertTrue($url->setDraft(true)->isDraft()); - } - - /** - * Test a remote draft URL - */ - public function testRemoteDraftUrl() - { - $url = new ObjectUrl(self::REMOTE_REPOSITORY_URL.self::DRAFT_PATH, true); - $this->assertInstanceOf(ObjectUrl::class, $url); - $this->assertTrue($url->isDraft()); - } - - /** - * Test a local URL with path prefix - */ - public function testLeadedLocalUrl() - { - $pathPrefix = '/prefix/path'; - $url = new ObjectUrl($pathPrefix.self::PATH); - $this->assertEquals($pathPrefix, $url->getPath()); - $this->assertEquals(self::PATH, $url->getLocalPath()); - } - - /** - * Test an invalid URL - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1449873819 - */ - public function testInvalidUrl() - { - new ObjectUrl('invalid://'); - } - - /** - * Test an invalid URL path - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1449874494 - */ - public function testInvalidUrlPath() - { - new ObjectUrl('http://invalid~url*path', true); - } - - /** - * Test the scheme setter - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1449924914 - */ - public function testUrlSchemeSetter() - { - $url = new ObjectUrl(self::URL); - $this->assertEquals(ObjectUrl::SCHEME_HTTPS, $url->setScheme(ObjectUrl::SCHEME_HTTPS)->getScheme()); - $url->setScheme('invalid'); - } - - /** - * Test the host setter - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1449925567 - */ - public function testUrlHostSetter() - { - $url = new ObjectUrl(self::URL); - $this->assertEquals('apparat.com', $url->setHost('apparat.com')->getHost()); - $url->setHost('_'); - } - - /** - * Test the port setter - * - * @expectedException \Apparat\Object\Domain\Model\Path\InvalidArgumentException - * @expectedExceptionCode 1449925885 - */ - public function testUrlPortSetter() - { - $url = new ObjectUrl(self::URL); - $this->assertEquals(443, $url->setPort(443)->getPort()); - $url->setPort(123456789); - } - - /** - * Test the remaining setter methods - */ - public function testUrlSetters() - { - $url = new ObjectUrl(self::URL); - $this->assertEquals('test', $url->setUser('test')->getUser()); - $this->assertEquals(null, $url->setUser(null)->getUser()); - $this->assertEquals('password', $url->setPassword('password')->getPassword()); - $this->assertEquals(null, $url->setPassword(null)->getPassword()); - $this->assertEquals('/path/prefix', $url->setPath('/path/prefix')->getPath()); - $this->assertEquals(['param2' => 'value2'], $url->setQuery(['param2' => 'value2'])->getQuery()); - $this->assertEquals('fragment2', $url->setFragment('fragment2')->getFragment()); - - $this->assertEquals( - '2016-01-01', - $url->setCreationDate(new \DateTimeImmutable('@1451606400'))->getCreationDate()->format('Y-m-d') - ); - $this->assertEquals(123, $url->setId(new Id(123))->getId()->getId()); - $this->assertEquals('article', $url->setType(new Type('article'))->getType()->getType()); - $this->assertEquals( - Revision::CURRENT, - $url->setRevision(Revision::current())->getRevision()->getRevision() - ); - } - - /** - * Test the override functionality when getting the URL path - */ - public function testUrlPathOverride() - { - $url = new TestObjectUrl(self::URL); - $this->assertEquals( - 'https://user:password@another.host:443/path/prefix/2015/10/01/36704.event/36704-2?param2=value2#fragment2', - $url->getUrlOverride() - ); - } - - /** - * Test absolute URL - */ - public function testUrlAbsolute() - { - $url = new ObjectUrl(self::REMOTE_URL, true); - $this->assertEquals(true, $url->isAbsolute()); - $this->assertEquals(self::REMOTE_REPOSITORY_URL, $url->getRepositoryUrl()); - } - - /** - * Test absolute URL - */ - public function testUrlAbsoluteLocal() - { - $url = new ObjectUrl(rtrim(getenv('APPARAT_BASE_URL'), '/').self::REPOSITORY_URL.self::PATH, true); - $this->assertTrue($url->isAbsoluteLocal()); - } - - /** - * Test relative URL - */ - public function testUrlRelative() - { - $url = new ObjectUrl(self::PATH.self::QUERY_FRAGMENT); - $this->assertEquals(false, $url->isAbsolute()); - } - - /** - * Test remote URL - */ - public function testUrlRemote() - { - $url = new ObjectUrl(self::REMOTE_REPOSITORY_URL.self::REPOSITORY_URL.self::PATH, true); - $this->assertTrue($url->isRemote()); - $url = new ObjectUrl(rtrim(getenv('APPARAT_BASE_URL'), '/').self::REPOSITORY_URL.self::PATH, true); - $this->assertFalse($url->isRemote()); - } - /** * Test URL comparison */ @@ -321,54 +118,6 @@ public function testUrlComparison() $this->assertTrue((new Url(self::REMOTE_URL))->matches(new Url(self::REMOTE_URL))); } - /** - * Test object URL comparison - */ - public function testObjectUrlComparison() - { - $this->assertFalse( - ( - new ObjectUrl( - 'http://example.com/2015/10/01/36704.event/36704-1', - true - ) - )->matches(new ObjectUrl('https://example.com/2015/10/01/36704.event/36704-1', true)) - ); - $this->assertFalse( - ( - new ObjectUrl( - 'http://example.com/2015/10/01/36704.event/36704-1', - true - ) - )->matches(new ObjectUrl('http://example.com/2016/10/01/36704.event/36704-1', true)) - ); - $this->assertFalse( - ( - new ObjectUrl( - 'http://example.com/2015/10/01/36704.event/36704-1', - true - ) - )->matches(new ObjectUrl('http://example.com/2015/10/01/36705.event/36705-1', true)) - ); - $this->assertFalse( - ( - new ObjectUrl( - 'http://example.com/2015/10/01/36704.event/36704-1', - true - ) - )->matches(new ObjectUrl('http://example.com/2015/10/01/36704.article/36704-1', true)) - ); - $this->assertFalse( - ( - new ObjectUrl( - 'http://example.com/2015/10/01/36704.event/36704-1', - true - ) - )->matches(new ObjectUrl('http://example.com/2015/10/01/36704.event/36704-2', true)) - ); - $this->assertTrue((new ObjectUrl(self::REMOTE_URL, true))->matches(new ObjectUrl(self::REMOTE_URL, true))); - } - /** * Test an invalid apparat URL *