diff --git a/lib/Alchemy/Phrasea/Databox/DataboxBoundRepositoryFactory.php b/lib/Alchemy/Phrasea/Databox/DataboxBoundRepositoryFactory.php new file mode 100644 index 0000000000..74662001f8 --- /dev/null +++ b/lib/Alchemy/Phrasea/Databox/DataboxBoundRepositoryFactory.php @@ -0,0 +1,22 @@ +factory = $factory; + } + + /** + * @param int $databoxId + * @return object + */ + public function getRepositoryForDatabox($databoxId) + { + if (!isset($this->repositories[$databoxId])) { + $this->repositories[$databoxId] = $this->factory->createRepositoryFor($databoxId); + } + + return $this->repositories[$databoxId]; + } +} diff --git a/tests/Alchemy/Tests/Phrasea/Databox/DataboxBoundRepositoryProviderTest.php b/tests/Alchemy/Tests/Phrasea/Databox/DataboxBoundRepositoryProviderTest.php new file mode 100644 index 0000000000..99859f2f08 --- /dev/null +++ b/tests/Alchemy/Tests/Phrasea/Databox/DataboxBoundRepositoryProviderTest.php @@ -0,0 +1,57 @@ +prophesize(DataboxBoundRepositoryFactory::class); + + $factory + ->createRepositoryFor(Argument::type('integer')) + ->will(function ($args) { + return (object)['databoxId' => $args[0]]; + }); + + $this->sut = new DataboxBoundRepositoryProvider($factory->reveal()); + } + + public function testItCreatesRepositoriesIfUnknown() + { + $repository = $this->sut->getRepositoryForDatabox(42); + + $this->assertNotNull($repository, 'Failed to create a repository'); + $this->assertSame($repository, $this->sut->getRepositoryForDatabox(42)); + } + + public function testItShouldNotCreateTwoRepositoriesPerDatabox() + { + $repository1 = $this->sut->getRepositoryForDatabox(1); + $repository2 = $this->sut->getRepositoryForDatabox(2); + + $this->assertNotNull($repository1, 'Failed to create first repository'); + $this->assertNotNull($repository2, 'Failed to create second repository'); + $this->assertNotSame($repository1, $repository2, 'Different Databoxes should have different repositories'); + + $this->assertSame($repository2, $this->sut->getRepositoryForDatabox(2), 'Second Repository should be returned'); + $this->assertSame($repository1, $this->sut->getRepositoryForDatabox(1), 'First Repository should be returned'); + } +}