diff --git a/docs/examples/basic.php b/docs/examples/basic.php index edb3434..adbaa60 100644 --- a/docs/examples/basic.php +++ b/docs/examples/basic.php @@ -3,7 +3,7 @@ use TJVB\GitHash\Exceptions\GitHashException; use TJVB\GitHash\Factories\GitHashFinderFactory; -use TJVB\GitHash\Retriever\Retriever; +use TJVB\GitHash\Retrievers\Retriever; require_once 'vendor/autoload.php'; diff --git a/docs/examples/without_git.php b/docs/examples/without_git.php index 58a207e..8ae020b 100644 --- a/docs/examples/without_git.php +++ b/docs/examples/without_git.php @@ -4,7 +4,7 @@ use TJVB\GitHash\Exceptions\GitHashException; use TJVB\GitHash\Factories\GitHashFinderFactory; use TJVB\GitHash\HashFinders\GitFileSystemHashFinder; -use TJVB\GitHash\Retriever\Retriever; +use TJVB\GitHash\Retrievers\Retriever; require_once 'vendor/autoload.php'; diff --git a/src/Retrievers/Retriever.php b/src/Retrievers/Retriever.php index d07c95b..b1cc187 100644 --- a/src/Retrievers/Retriever.php +++ b/src/Retrievers/Retriever.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace TJVB\GitHash\Retriever; +namespace TJVB\GitHash\Retrievers; use TJVB\GitHash\Contracts\FinderFactory; use TJVB\GitHash\Contracts\GitHashRetriever; diff --git a/tests/Fixtures/GitHashFinderFixture.php b/tests/Fixtures/GitHashFinderFixture.php new file mode 100644 index 0000000..7328d0e --- /dev/null +++ b/tests/Fixtures/GitHashFinderFixture.php @@ -0,0 +1,34 @@ +exception !== null) { + throw $this->exception; + } + if ($this->gitHash === null) { + $this->gitHash = new GitHash('invalidhash'); + } + return $this->gitHash; + } + + public function isAvailable(): bool + { + return $this->available; + } +} diff --git a/tests/Retrievers/RetrieverTest.php b/tests/Retrievers/RetrieverTest.php new file mode 100644 index 0000000..b6b243c --- /dev/null +++ b/tests/Retrievers/RetrieverTest.php @@ -0,0 +1,230 @@ +assertNull($retriever->getFinderFactory()); + } + + /** + * @test + */ + public function weCanSetTheFinderFactory(): void + { + // setup / mock + $factory = new GitHashFinderFactory(); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + // verify/assert + $this->assertEquals($factory, $retriever->getFinderFactory()); + } + + /** + * @test + * + * @dataProvider hashMethodsProvider + */ + public function weCanNotGetAHashWithoutAFinderFactory(string $method): void + { + // setup / mock + $this->expectException(GitHashException::class); + $this->expectExceptionMessage('We can\'t find a hash if we didn\'t got a finder factory'); + + // run + $retriever = new Retriever(); + $retriever->$method(self::PROJECT_ROOT); + + // verify/assert + // no assertion because we expect the exception + } + + /** + * @test + * + * @dataProvider hashMethodsProvider + */ + public function weCanGetTheHashIfWeHaveAnAvailableFinder(string $method): void + { + // setup / mock + $gitHash = new GitHash(sha1('test' . rand())); + $finder = new GitHashFinderFixture(); + $finder->gitHash = $gitHash; + + $factory = new GitHashFinderFactory(); + $factory->register($finder); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + $result = $retriever->$method(self::PROJECT_ROOT); + + // verify/assert + $this->assertEquals($gitHash, $result); + } + + /** + * @test + * + * @dataProvider hashMethodsProvider + */ + public function weGetAnExceptionIfNoneOfTheFindersIsAvailable(string $method): void + { + // setup / mock + $this->expectException(GitHashException::class); + if ($method === 'getHash') { + $this->expectExceptionMessage('No finder available'); + } + if ($method === 'GitHashException') { + $this->expectExceptionMessage('Unable to find hash'); + } + + $finder = new GitHashFinderFixture(); + $finder->available = false; + + // run + $factory = new GitHashFinderFactory(); + $factory->register($finder); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + $retriever->$method(self::PROJECT_ROOT); + // verify/assert + // no assertion because we expect the exception + } + + /** + * @test + * + * @dataProvider hashMethodsProvider + */ + public function weGetTheHashIfThereAreFindersAvailableWhileOthersAreNotAvailable(string $method): void + { + // setup / mock + $gitHash = new GitHash(sha1('test' . rand())); + $finder1 = new GitHashFinderFixture(); + $finder1->available = false; + $finder2 = new GitHashFinderFixture(); + $finder2->gitHash = $gitHash; + + $factory = new GitHashFinderFactory(); + $factory->register($finder1); + $factory->register($finder2); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + $result = $retriever->$method(self::PROJECT_ROOT); + + // verify/assert + $this->assertEquals($gitHash, $result); + } + + /** + * @test + */ + public function weGetAnExceptionIfAFinderThrowsAnExceptionBeforeWeHaveTheHash(): void + { + // setup / mock + $exception = new GitHashException('test exception'); + $this->expectExceptionObject($exception); + + $gitHash = new GitHash(sha1('test' . rand())); + $finder1 = new GitHashFinderFixture(); + $finder1->exception = $exception; + + $finder2 = new GitHashFinderFixture(); + $finder2->gitHash = $gitHash; + + $factory = new GitHashFinderFactory(); + $factory->register($finder1); + $factory->register($finder2); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + $retriever->getHash(self::PROJECT_ROOT); + // verify/assert + // no assertion because we expect the exception + } + + /** + * @test + */ + public function weDontGetAnExceptionIfAFinderThrowsAnExceptionBeforeWeHaveTheHashAndIgnoreFailures(): void + { + // setup / mock + $exception = new GitHashException('test exception'); + + $gitHash = new GitHash(sha1('test' . rand())); + $finder1 = new GitHashFinderFixture(); + $finder1->exception = $exception; + + $finder2 = new GitHashFinderFixture(); + $finder2->gitHash = $gitHash; + + $factory = new GitHashFinderFactory(); + $factory->register($finder1); + $factory->register($finder2); + + // run + $retriever = new Retriever(); + $retriever->setFinderFactory($factory); + + $result = $retriever->getHashAndIgnoreFailures(self::PROJECT_ROOT); + // verify/assert + $this->assertEquals($gitHash, $result); + } + + /** + * @test + */ + public function weGetTheRetrieverWithTheFactoryIfWeInstantiateWithIt(): void + { + // setup / mock + $factory = new GitHashFinderFactory(); + + // run + $retriever = Retriever::getWithFactory($factory); + + // verify/assert + $this->assertEquals($factory, $retriever->getFinderFactory()); + } + + public function hashMethodsProvider(): array + { + return [ + 'with failures' => ['getHash'], + 'ignore failures' => ['getHashAndIgnoreFailures'], + ]; + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index d6bb5ee..e4bfa32 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -9,5 +9,5 @@ class TestCase extends BaseTestCase { - + public const PROJECT_ROOT = __DIR__ . DIRECTORY_SEPARATOR . '..'; }