|  |  |  | <?php
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace yiiunit\extensions\mongo;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use yii\mongo\Query;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @group mongo
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | class QueryTest extends MongoTestCase
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  | 	public function testSelect()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		// default
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$select = [];
 | 
					
						
							|  |  |  | 		$query->select($select);
 | 
					
						
							|  |  |  | 		$this->assertEquals($select, $query->select);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$select = ['name', 'something'];
 | 
					
						
							|  |  |  | 		$query->select($select);
 | 
					
						
							|  |  |  | 		$this->assertEquals($select, $query->select);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function testFrom()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$from = 'customer';
 | 
					
						
							|  |  |  | 		$query->from($from);
 | 
					
						
							|  |  |  | 		$this->assertEquals($from, $query->from);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$from = ['', 'customer'];
 | 
					
						
							|  |  |  | 		$query->from($from);
 | 
					
						
							|  |  |  | 		$this->assertEquals($from, $query->from);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function testWhere()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$query->where(['name' => 'name1']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(['name' => 'name1'], $query->where);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->andWhere(['address' => 'address1']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(
 | 
					
						
							|  |  |  | 			[
 | 
					
						
							|  |  |  | 				'name' => 'name1',
 | 
					
						
							|  |  |  | 				'address' => 'address1'
 | 
					
						
							|  |  |  | 			],
 | 
					
						
							|  |  |  | 			$query->where
 | 
					
						
							|  |  |  | 		);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->orWhere(['name' => 'name2']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(
 | 
					
						
							|  |  |  | 			[
 | 
					
						
							|  |  |  | 				'or' => [
 | 
					
						
							|  |  |  | 					[
 | 
					
						
							|  |  |  | 						'name' => 'name1',
 | 
					
						
							|  |  |  | 						'address' => 'address1'
 | 
					
						
							|  |  |  | 					],
 | 
					
						
							|  |  |  | 					['name' => 'name2']
 | 
					
						
							|  |  |  | 				]
 | 
					
						
							|  |  |  | 			],
 | 
					
						
							|  |  |  | 			$query->where
 | 
					
						
							|  |  |  | 		);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->orWhere(['name' => 'name3']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(
 | 
					
						
							|  |  |  | 			[
 | 
					
						
							|  |  |  | 				'or' => [
 | 
					
						
							|  |  |  | 					[
 | 
					
						
							|  |  |  | 						'name' => 'name1',
 | 
					
						
							|  |  |  | 						'address' => 'address1'
 | 
					
						
							|  |  |  | 					],
 | 
					
						
							|  |  |  | 					['name' => 'name2'],
 | 
					
						
							|  |  |  | 					['name' => 'name3']
 | 
					
						
							|  |  |  | 				]
 | 
					
						
							|  |  |  | 			],
 | 
					
						
							|  |  |  | 			$query->where
 | 
					
						
							|  |  |  | 		);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->andWhere(['address' => 'address2']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(
 | 
					
						
							|  |  |  | 			[
 | 
					
						
							|  |  |  | 				'or' => [
 | 
					
						
							|  |  |  | 					[
 | 
					
						
							|  |  |  | 						'name' => 'name1',
 | 
					
						
							|  |  |  | 						'address' => 'address1'
 | 
					
						
							|  |  |  | 					],
 | 
					
						
							|  |  |  | 					['name' => 'name2'],
 | 
					
						
							|  |  |  | 					['name' => 'name3']
 | 
					
						
							|  |  |  | 				],
 | 
					
						
							|  |  |  | 				'address' => 'address2'
 | 
					
						
							|  |  |  | 			],
 | 
					
						
							|  |  |  | 			$query->where
 | 
					
						
							|  |  |  | 		);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->orWhere(['name' => 'name4']);
 | 
					
						
							|  |  |  | 		$this->assertEquals(
 | 
					
						
							|  |  |  | 			[
 | 
					
						
							|  |  |  | 				'or' => [
 | 
					
						
							|  |  |  | 					[
 | 
					
						
							|  |  |  | 						'or' => [
 | 
					
						
							|  |  |  | 							[
 | 
					
						
							|  |  |  | 								'name' => 'name1',
 | 
					
						
							|  |  |  | 								'address' => 'address1'
 | 
					
						
							|  |  |  | 							],
 | 
					
						
							|  |  |  | 							['name' => 'name2'],
 | 
					
						
							|  |  |  | 							['name' => 'name3']
 | 
					
						
							|  |  |  | 						],
 | 
					
						
							|  |  |  | 						'address' => 'address2'
 | 
					
						
							|  |  |  | 					],
 | 
					
						
							|  |  |  | 					['name' => 'name4']
 | 
					
						
							|  |  |  | 				],
 | 
					
						
							|  |  |  | 			],
 | 
					
						
							|  |  |  | 			$query->where
 | 
					
						
							|  |  |  | 		);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function testOrder()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$query->orderBy('team');
 | 
					
						
							|  |  |  | 		$this->assertEquals(['team' => SORT_ASC], $query->orderBy);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->addOrderBy('company');
 | 
					
						
							|  |  |  | 		$this->assertEquals(['team' => SORT_ASC, 'company' => SORT_ASC], $query->orderBy);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->addOrderBy('age');
 | 
					
						
							|  |  |  | 		$this->assertEquals(['team' => SORT_ASC, 'company' => SORT_ASC, 'age' => SORT_ASC], $query->orderBy);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->addOrderBy(['age' => SORT_DESC]);
 | 
					
						
							|  |  |  | 		$this->assertEquals(['team' => SORT_ASC, 'company' => SORT_ASC, 'age' => SORT_DESC], $query->orderBy);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$query->addOrderBy('age ASC, company DESC');
 | 
					
						
							|  |  |  | 		$this->assertEquals(['team' => SORT_ASC, 'company' => SORT_DESC, 'age' => SORT_ASC], $query->orderBy);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function testLimitOffset()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$query = new Query;
 | 
					
						
							|  |  |  | 		$query->limit(10)->offset(5);
 | 
					
						
							|  |  |  | 		$this->assertEquals(10, $query->limit);
 | 
					
						
							|  |  |  | 		$this->assertEquals(5, $query->offset);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |