createMock(MetadataDataProvider::class); $metadataDataProvider ->expects($this->any()) ->method('get') ->willReturn($ormMetadata); $metadata = new Metadata($metadataDataProvider); $this->queryBuilder = new QueryBuilder(); $pdo = $this->createMock('MockPDO'); $pdo ->expects($this->any()) ->method('quote') ->will($this->returnCallback(function() { $args = func_get_args(); return "'" . $args[0] . "'"; })); $this->entityManager = $this->createMock(EntityManager::class); $entityFactory = $this->createMock(EntityFactory::class); $entityFactory ->expects($this->any()) ->method('create') ->will( $this->returnCallback(function () use ($metadata) { $args = func_get_args(); $className = "tests\\unit\\testData\\DB\\" . $args[0]; $defs = $metadata->get($args[0]) ?? []; return new $className($args[0], $defs, $this->entityManager); }) ); $this->queryComposer = new QueryComposer($pdo, $entityFactory, $metadata); $this->post = $entityFactory->create('Post'); $this->comment = $entityFactory->create('Comment'); $this->tag = $entityFactory->create('Tag'); $this->note = $entityFactory->create('Note'); $this->contact = $entityFactory->create('Contact'); $this->account = $entityFactory->create('Account'); } public function testUpdate1(): void { $query = UpdateBuilder::create() ->in('Comment') ->set(['name' => '1']) ->where(['name' => 'post.name']) ->join('post') ->limit(1) ->order('name') ->build(); $sql = $this->queryComposer->composeUpdate($query); $expectedSql = 'UPDATE "comment" SET "name" = \'1\' WHERE "comment"."id" IN ' . '(SELECT "comment"."id" AS "id" FROM "comment" ' . 'JOIN "post" AS "post" ON "comment"."post_id" = "post"."id" ' . 'WHERE "comment"."name" = \'post.name\' AND "comment"."deleted" = false ' . 'ORDER BY "comment"."name" ASC LIMIT 1 OFFSET 0 FOR UPDATE)'; $this->assertEquals($expectedSql, $sql); } public function testDelete1(): void { $query = DeleteBuilder::create() ->from('Account') ->where(['name' => 'test']) ->build(); $sql = $this->queryComposer->composeDelete($query); $expectedSql = "DELETE FROM \"account\" " . "WHERE \"account\".\"name\" = 'test'"; $this->assertEquals($expectedSql, $sql); } public function testDelete2(): void { $query = DeleteBuilder::create() ->from('Comment') ->join('post') ->where(['name' => 'post.name']) ->limit(1) ->order('name') ->build(); $sql = $this->queryComposer->composeDelete($query); $expectedSql = 'DELETE FROM "comment" WHERE "comment"."id" IN ' . '(SELECT "comment"."id" AS "id" FROM "comment" ' . 'JOIN "post" AS "post" ON "comment"."post_id" = "post"."id" ' . 'WHERE "comment"."name" = \'post.name\' AND "comment"."deleted" = false ' . 'ORDER BY "comment"."name" ASC LIMIT 1 OFFSET 0)'; $this->assertEquals($expectedSql, $sql); } public function testInsertUpdate1(): void { $query = InsertBuilder::create() ->into('PostTag') ->columns(['id', 'postId', 'tagId']) ->values([ 'id' => '1', 'postId' => 'post-id', 'tagId' => 'tag-id', ]) ->updateSet([ 'deleted' => 0 ]) ->build(); $sql = $this->queryComposer->composeInsert($query); $expectedSql = "INSERT INTO \"post_tag\" (\"id\", \"post_id\", \"tag_id\") VALUES ('1', 'post-id', 'tag-id') " . "ON CONFLICT(\"post_id\", \"tag_id\") DO UPDATE SET \"deleted\" = 0"; $this->assertEquals($expectedSql, $sql); } public function testInsertUpdate2(): void { $query = InsertBuilder::create() ->into('Account') ->columns(['id', 'name']) ->values([ 'id' => '1', 'name' => 'name', ]) ->updateSet([ 'deleted' => 0 ]) ->build(); $sql = $this->queryComposer->composeInsert($query); $expectedSql = "INSERT INTO \"account\" (\"id\", \"name\") VALUES ('1', 'name') " . "ON CONFLICT(\"id\") DO UPDATE SET \"deleted\" = 0"; $this->assertEquals($expectedSql, $sql); } }