. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace tests\unit\Espo\ORM\Repository; require_once 'tests/unit/testData/DB/Entities.php'; use Espo\ORM\CollectionFactory; use Espo\ORM\Entity; use Espo\ORM\EntityFactory; use Espo\ORM\EntityManager; use Espo\ORM\Mapper\BaseMapper; use Espo\ORM\Metadata; use Espo\ORM\MetadataDataProvider; use Espo\ORM\Query\Part\Condition as Cond; use Espo\ORM\Query\Part\Expression as Expr; use Espo\ORM\Query\Part\Join\JoinType; use Espo\ORM\Query\Part\Order as OrderExpr; use Espo\ORM\Query\Select; use Espo\ORM\QueryBuilder; use Espo\ORM\Repository\RDBRelation; use Espo\ORM\Repository\RDBRelationSelectBuilder; use Espo\ORM\Repository\RDBRepository as Repository; use Espo\ORM\SthCollection; use PHPUnit\Framework\TestCase; use RuntimeException; use tests\unit\testData\DB as Entities; class RDBRepositoryTest extends TestCase { /** @var Repository */ private $repository; private $entityManager; private $queryBuilder; private $metadata; private $collection; private $mapper; private $entityFactory; protected function setUp(): void { $entityManager = $this->entityManager = $this->getMockBuilder(EntityManager::class)->disableOriginalConstructor()->getMock(); $entityFactory = $this->entityFactory = $this->getMockBuilder(EntityFactory::class)->disableOriginalConstructor()->getMock(); $collectionFactory = new CollectionFactory($this->entityManager); $this->mapper = $this->getMockBuilder(BaseMapper::class)->disableOriginalConstructor()->getMock(); $entityManager ->method('getMapper') ->willReturn($this->mapper); $this->queryBuilder = new QueryBuilder(); $entityManager ->method('getQueryBuilder') ->willReturn($this->queryBuilder); $entityManager ->method('getQueryBuilder') ->willReturn($this->queryBuilder); $entityManager ->method('getCollectionFactory') ->willReturn($collectionFactory); $entityManager ->method('getEntityFactory') ->willReturn($this->entityFactory); $ormMetadata = include('tests/unit/testData/DB/ormMetadata.php'); $metadataDataProvider = $this->createMock(MetadataDataProvider::class); $metadataDataProvider ->expects($this->any()) ->method('get') ->willReturn($ormMetadata); $this->metadata = new Metadata($metadataDataProvider); $this->collection = $this->createCollectionMock(); $entityFactory ->method('create') ->willReturnCallback( function (string $entityType) { $className = 'tests\\unit\\testData\\DB\\' . ucfirst($entityType); return $this->createEntity($entityType, $className); } ); $this->repository = $this->createRepository('Test'); } protected function createCollectionMock(?array $itemList = null) : SthCollection { $collection = $this->getMockBuilder(SthCollection::class)->disableOriginalConstructor()->getMock(); $itemList = $itemList ?? []; $generator = (function () use ($itemList) { foreach ($itemList as $item) { yield $item; } })(); $collection ->expects($this->any()) ->method('getIterator') ->willReturn( $generator ); return $collection; } protected function createRepository(string $entityType) { $repository = new Repository($entityType, $this->entityManager, $this->entityFactory); $this->entityManager ->method('getRepository') ->willReturn($repository); return $repository; } protected function createEntity(string $entityType, string $className) { $defs = $this->metadata->get($entityType); return new $className($entityType, $defs, $this->entityManager); } /** * @deprecated */ public function testFind(): void { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->where([ 'name' => 'test', ]) ->find(); } public function testFindOne1(): void { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], 'offset' => 0, 'limit' => 1, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->where([ 'name' => 'test', ]) ->findOne(); } public function testFindOne2() { $select = $this->queryBuilder ->select() ->from('Test') ->where(['name' => 'test']) ->limit(0, 1) ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($select); $this->repository->where(['name' => 'test'])->findOne(); } public function testFindOne3() { $select = $this->queryBuilder ->select() ->distinct() ->from('Test') ->where(['name' => 'test']) ->limit(0, 1) ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($select); $this->repository ->distinct() ->where(['name' => 'test']) ->findOne(); } public function testFindOneWithDeletedLegacy(): void { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], 'withDeleted' => true, 'offset' => 0, 'limit' => 1, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->where(['name' => 'test']) ->findOne(['withDeleted' => true]); } /** * @deprecated */ public function testCount1() { $select = $this->queryBuilder ->select() ->from('Test') ->where(['name' => 'test']) ->build(); $this->mapper ->expects($this->once()) ->method('count') ->willReturn(1) ->with($select); $this->repository ->where(['name' => 'test']) ->count(); } public function testCount2() { $select = $this->queryBuilder ->select() ->from('Test') ->where(['name' => 'test']) ->build(); $this->mapper ->expects($this->once()) ->method('count') ->willReturn(1) ->with($select); $this->repository->where(['name' => 'test'])->count(); } public function testCount3() { $select = $this->queryBuilder ->select() ->from('Test') ->build(); $this->mapper ->expects($this->once()) ->method('count') ->willReturn(1) ->with($select); $this->repository->count(); } public function testMax1() { $select = $this->queryBuilder ->select() ->from('Test') ->build(); $this->mapper ->expects($this->once()) ->method('max') ->willReturn(1) ->with($select, 'test'); $this->repository->max('test'); } public function testWhere1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->where(['name' => 'test'])->find(); } public function testWhere2() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->where('name', 'test')->find(); } public function testWhere3() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name=' => 'test', ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->where(Cond::equal(Expr::column('name'), 'test')) ->find(); } public function testWhereFineOne() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'whereClause' => [ 'name' => 'test', ], 'offset' => 0, 'limit' => 1, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->where('name', 'test') ->findOne(); } public function testJoin1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ ['Test', null, null, ['type' => null]], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->join('Test') ->find(); } public function testJoin2() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ 'Test1', 'Test2', ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->join(['Test1', 'Test2'])->find(); } // Bc. public function testJoin3() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ ['Test1', 'test1'], ['Test2', 'test2'], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->join([['Test1', 'test1'], ['Test2', 'test2']]) ->find(); } public function testJoin4() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ ['Test1', 'test1', ['k' => 'v'], ['type' => null]], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->join('Test1', 'test1', ['k' => 'v']) ->find(); } public function testJoin5() { $paramsExpected = $this->queryBuilder ->select() ->from('Test') ->join('Test1', 'test1', Cond::equal(Expr::column('k'), 'v')) ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->join('Test1', 'test1', Cond::equal(Expr::column('k'), 'v')) ->find(); } public function testLeftJoin1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ ['Test', null, null, ['type' => JoinType::left]], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->leftJoin('Test') ->find(); } public function testLeftJoin2() { $paramsExpected = $this->queryBuilder ->select() ->from('Test') ->leftJoin('Test1', 'test1', Cond::equal(Expr::column('k'), 'v')) ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->leftJoin('Test1', 'test1', Cond::equal(Expr::column('k'), 'v')) ->find(); } public function testMultipleLeftJoins() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'joins' => [ ['Test1', null, null, ['type' => JoinType::left]], ['Test2', 'test2', null, ['type' => JoinType::left]], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->leftJoin('Test1') ->leftJoin('Test2', 'test2') ->find(); } public function testDistinct() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'distinct' => true, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->distinct()->find(); } public function testForUpdate() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'forUpdate' => true, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->forUpdate()->find(); } public function testSth() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', //'returnSthCollection' => true, ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->sth()->find(); } public function testOrder1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'orderBy' => [['name', 'ASC']], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->order('name') ->find(); } public function testOrder2() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'orderBy' => [['name', 'ASC']], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->order(Expr::create('name')) ->find(); } public function testOrder3() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'orderBy' => [['name', 'ASC']], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->order([ [Expr::create('name'), 'ASC'] ]) ->find(); } public function testOrder4() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'orderBy' => [ ['name', 'ASC'], ['hello', 'DESC'], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->order([ OrderExpr::fromString('name'), OrderExpr::fromString('hello')->withDesc(), ]) ->find(); } public function testOrder5() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'orderBy' => [ ['name', 'ASC'], ['hello', 'DESC'], ], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->order(OrderExpr::fromString('name')) ->order(OrderExpr::fromString('hello')->withDesc()) ->find(); } public function testGroupBy1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'groupBy' => ['id'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->group('id')->find(); } public function testGroupBy2() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'groupBy' => ['id', 'name'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->group('id') ->group('name') ->find(); } public function testGroupBy3() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'groupBy' => ['id', 'name'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->group('id') ->group(['id', 'name']) ->find(); } public function testGroupBy4() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'groupBy' => ['id', 'name'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->group(Expr::create('id')) ->group(Expr::create('name')) ->find(); } public function testGroupBy5() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'groupBy' => ['id', 'name'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository ->group([Expr::create('id'), Expr::create('name')]) ->find(); } public function testSelect1() { $paramsExpected = Select::fromRaw([ 'from' => 'Test', 'select' => ['name', 'date'], ]); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($paramsExpected); $this->repository->select(['name', 'date'])->find(); } public function testSelect2() { $select = $this->queryBuilder ->select() ->from('Test') ->select(['name']) ->select('date') ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($select); $this->repository ->select(['name']) ->select('date') ->find(); } public function testSelect3() { $select = $this->queryBuilder ->select(Expr::create('name')) ->from('Test') ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($select); $this->repository ->select(['name']) ->find(); } public function testSelect4() { $select = $this->queryBuilder ->select([ 'name1', ['name2', 'alias'], ['name3'], ]) ->from('Test') ->build(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($this->collection) ->with($select); $this->repository ->select([ Expr::create('name1'), [Expr::create('name2'), 'alias'], [Expr::create('name3')], ]) ->find(); } public function testClone1() { $select = $this->queryBuilder ->select() ->from('Test') ->build(); $selectExpected = $this->queryBuilder ->select() ->from('Test') ->select('id') ->build(); $collection = $this->createCollectionMock(); $this->mapper ->expects($this->once()) ->method('select') ->willReturn($collection) ->with($selectExpected); $this->repository ->clone($select) ->select('id') ->find(); } public function testGetById1() { $select = $this->queryBuilder ->select() ->from('Test') ->where(['id' => '1']) ->build(); $entity = $this->getMockBuilder(Entity::class)->getMock(); $this->mapper ->expects($this->once()) ->method('selectOne') ->willReturn($entity) ->with($select); $this->repository->getById('1'); } public function testRelationInstance() { $repository = $this->createRepository('Account'); $account = $this->entityFactory->create('Account'); $account->id = 'accountId'; $relation = $repository->getRelation($account, 'teams'); $this->assertInstanceOf(RDBRelation::class, $relation); } public function testRelationCloneInstance() { $repository = $this->createRepository('Account'); $account = $this->entityFactory->create('Account'); $account->id = 'accountId'; $select = $this->queryBuilder ->select() ->from('Team') ->build(); $relationSelectBuilder = $repository->getRelation($account, 'teams')->clone($select); $this->assertInstanceOf(RDBRelationSelectBuilder::class, $relationSelectBuilder); } public function testRelationCloneBelongsToParentException() { $repository = $this->createRepository('Note'); $note = $this->entityFactory->create('Note'); $note->id = 'noteId'; $select = $this->queryBuilder ->select() ->from('Post') ->build(); $this->expectException(RuntimeException::class); $repository->getRelation($note, 'parent')->clone($select); } public function testRelationCount() { $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $select = $this->queryBuilder ->select() ->from('Comment') ->build(); $this->mapper ->expects($this->once()) ->method('countRelated') ->willReturn(1) ->with($post, 'comments', $select); $this->createRepository('Post')->getRelation($post, 'comments')->count(); } public function testRelationFindHasMany() { $repository = $this->createRepository('Post'); $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Comment') ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'comments', $select); $repository->getRelation($post, 'comments')->find(); } public function testRelationFindBelongsTo() { $comment = $this->entityFactory->create('Comment'); $comment->id = 'commentId'; $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $select = $this->queryBuilder ->select() ->from('Post') ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($post) ->with($comment, 'post', $select); $result = $this->createRepository('Comment') ->getRelation($comment, 'post') ->find(); $this->assertEquals(1, count($result)); $this->assertEquals($post, $result[0]); } public function testRelationFindBelongsToParent() { $note = $this->entityFactory->create('Note'); $note->id = 'noteId'; $post = $this->entityFactory->create('Post'); $post->id = 'noteId'; $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($post) ->with($note, 'parent'); $result = $this->createRepository('Note')->getRelation($note, 'parent')->find(); $this->assertEquals(1, count($result)); $this->assertEquals($post, $result[0]); } public function testRelationFindOneBelongsToParent() { $note = $this->entityFactory->create('Note'); $note->id = 'noteId'; $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($post) ->with($note, 'parent'); $result = $this->createRepository('Note')->getRelation($note, 'parent')->findOne(); $this->assertEquals($post, $result); } public function testRelationIsRelated1() { $note = $this->entityFactory->create('Note'); $note->set('id', 'noteId'); $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $note->set('parentId', $post->id); $note->set('parentType', 'Post'); $result = $this->createRepository('Note')->getRelation($note, 'parent')->isRelated($post); $this->assertTrue($result); $note->set('parentId', 'anotherId'); $note->set('parentType', 'Post'); $result = $this->createRepository('Note')->getRelation($note, 'parent')->isRelated($post); $this->assertFalse($result); } public function testRelationIsRelated2() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $note = $this->entityFactory->create('Note'); $note->set('id', 'noteId'); $collection = $this->createCollectionMock([$note]); $select = $this->queryBuilder ->select() ->from('Note') ->select(['id']) ->where(['id' => $note->id]) ->limit(0, 1) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'notes', $select); $result = $this->createRepository('Post')->getRelation($post, 'notes')->isRelated($note); $this->assertTrue($result); } public function testRelationIsRelated3() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $note = $this->entityFactory->create('Note'); $note->set('id', 'noteId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Note') ->select(['id']) ->where(['id' => $note->id]) ->limit(0, 1) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'notes', $select); $result = $this->createRepository('Post')->getRelation($post, 'notes')->isRelated($note); $this->assertFalse($result); } public function testRelate1() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $note = $this->entityFactory->create('Note'); $note->set('id', 'noteId'); $this->mapper ->expects($this->once()) ->method('relate') ->with($post, 'notes', $note); $this->createRepository('Post')->getRelation($post, 'notes')->relate($note); } public function testUnrelate1() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $note = $this->entityFactory->create('Note'); $note->set('id', 'noteId'); $this->mapper ->expects($this->once()) ->method('unrelate') ->with($post, 'notes', $note); $this->createRepository('Post')->getRelation($post, 'notes')->unrelate($note); } public function testRelateById1() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $this->mapper ->expects($this->once()) ->method('relate') ->with($post, 'notes', $this->isInstanceOf(Entities\Note::class)); $this->createRepository('Post')->getRelation($post, 'notes')->relateById('noteId'); } public function testUnrelateById1() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $this->mapper ->expects($this->once()) ->method('unrelate') ->with($post, 'notes', $this->isInstanceOf(Entities\Note::class)); $this->createRepository('Post')->getRelation($post, 'notes')->unrelateById('noteId'); } public function testMassRelate() { $post = $this->entityFactory->create('Post'); $post->set('id', 'postId'); $select = $this->queryBuilder ->select() ->from('Note') ->build(); $this->mapper ->expects($this->once()) ->method('massRelate') ->with($post, 'notes', $select); $this->createRepository('Post')->getRelation($post, 'notes')->massRelate($select); } public function testGetColumn() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $team = $this->entityFactory->create('Team'); $team->set('id', 'teamId'); $this->mapper ->expects($this->once()) ->method('getRelationColumn') ->with($account, 'teams', $team->id, 'test'); $this->createRepository('Post')->getRelation($account, 'teams')->getColumn($team, 'test'); } public function testUpdateColumns() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $team = $this->entityFactory->create('Team'); $team->set('id', 'teamId'); $columns = [ 'column' => 'test', ]; $this->mapper ->expects($this->once()) ->method('updateRelationColumns') ->with($account, 'teams', $team->id, $columns); $this->createRepository('Post')->getRelation($account, 'teams')->updateColumns($team, $columns); } public function testRelationSelectBuilderFind1() { $repository = $this->createRepository('Post'); $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Comment') ->select(['id']) ->distinct() ->where(['name' => 'test']) ->join('Test', 'test', ['id:' => 'id']) ->order('id', 'DESC') ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'comments', $select); $repository->getRelation($post, 'comments') ->select(['id']) ->distinct() ->where(['name' => 'test']) ->join('Test', 'test', ['id:' => 'id']) ->order('id', 'DESC') ->find(); } public function testRelationSelectBuilderFind2() { $repository = $this->createRepository('Post'); $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Comment') ->select(['id']) ->distinct() ->where(Cond::equal(Expr::column('name'), 'test')) ->join('Test', 'test', Cond::equal(Expr::column('test.id'), Expr::column('id'))) ->order('id', 'DESC') ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'comments', $select); $repository->getRelation($post, 'comments') ->select(['id']) ->distinct() ->where(Cond::equal(Expr::column('name'), 'test')) ->join( 'Test', 'test', Cond::equal(Expr::column('test.id'), Expr::column('id')) ) ->order('id', 'DESC') ->find(); } public function testRelationSelectBuilderFindOne() { $repository = $this->createRepository('Post'); $post = $this->entityFactory->create('Post'); $post->id = 'postId'; $comment = $this->entityFactory->create('Comment'); $comment->set('id', 'commentId'); $collection = $this->createCollectionMock([$comment]); $select = $this->queryBuilder ->select() ->from('Comment') ->select(['id']) ->distinct() ->where(['name' => 'test']) ->join('Test', 'test', ['id:' => 'id']) ->order('id', 'DESC') ->limit(0, 1) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($post, 'comments', $select); $result = $repository->getRelation($post, 'comments') ->select(['id']) ->distinct() ->where(['name' => 'test']) ->join('Test', 'test', ['id:' => 'id']) ->order('id', 'DESC') ->findOne(); $this->assertEquals($comment, $result); } public function testRelationSelectBuilderColumnsWhere1() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where(['entityTeam.deleted' => false]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account')->getRelation($account, 'teams') ->columnsWhere(['deleted' => false]) ->find(); } public function testRelationSelectBuilderColumnsWhere2() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where([ 'OR' => [ ['entityTeam.deleted' => false], ['entityTeam.deleted' => null], ] ]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account')->getRelation($account, 'teams') ->columnsWhere([ 'OR' => [ ['deleted' => false], ['deleted' => null], ] ]) ->find(); } public function testRelationSelectBuilderRelationWhere1() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where(['entityTeam.deleted' => false]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account') ->getRelation($account, 'teams') ->where(['@relation.deleted' => false]) ->find(); } public function testRelationSelectBuilderRelationWhere2() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where([ 'OR' => [ ['entityTeam.deleted' => false], ['entityTeam.deleted' => null], ], 'deleted' => false, ]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account') ->getRelation($account, 'teams') ->where([ 'OR' => [ ['@relation.deleted' => false], ['@relation.deleted' => null], ], 'deleted' => false, ]) ->find(); } public function testRelationSelectBuilderRelationWhere3() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where(['entityTeam.deleted' => false]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account') ->getRelation($account, 'teams') ->where('@relation.deleted', false) ->find(); } public function testRelationSelectBuilderRelationWhere4() { $account = $this->entityFactory->create('Account'); $account->set('id', 'accountId'); $collection = $this->createCollectionMock(); $select = $this->queryBuilder ->select() ->from('Team') ->where(['entityTeam.deleted=' => false]) ->build(); $this->mapper ->expects($this->once()) ->method('selectRelated') ->willReturn($collection) ->with($account, 'teams', $select); $this->createRepository('Account') ->getRelation($account, 'teams') ->where( Cond::equal(Expr::column('@relation.deleted'), false) ) ->find(); } }