You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							313 lines
						
					
					
						
							7.2 KiB
						
					
					
				
			
		
		
	
	
							313 lines
						
					
					
						
							7.2 KiB
						
					
					
				| <?php | |
|  | |
| namespace yiiunit\extensions\mongodb; | |
|  | |
| /** | |
|  * @group mongodb | |
|  */ | |
| class CollectionTest extends MongoDbTestCase | |
| { | |
| 	protected function tearDown() | |
| 	{ | |
| 		$this->dropCollection('customer'); | |
| 		$this->dropCollection('mapReduceOut'); | |
| 		parent::tearDown(); | |
| 	} | |
|  | |
| 	// Tests : | |
|  | |
| 	public function testGetName() | |
| 	{ | |
| 		$collectionName = 'customer'; | |
| 		$collection = $this->getConnection()->getCollection($collectionName); | |
| 		$this->assertEquals($collectionName, $collection->getName()); | |
| 		$this->assertEquals($this->mongoDbConfig['defaultDatabaseName'] . '.' . $collectionName, $collection->getFullName()); | |
| 	} | |
|  | |
| 	public function testFind() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$cursor = $collection->find(); | |
| 		$this->assertTrue($cursor instanceof \MongoCursor); | |
| 	} | |
|  | |
| 	public function testInsert() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$id = $collection->insert($data); | |
| 		$this->assertTrue($id instanceof \MongoId); | |
| 		$this->assertNotEmpty($id->__toString()); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testInsert | |
| 	 * @depends testFind | |
| 	 */ | |
| 	public function testFindAll() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$id = $collection->insert($data); | |
|  | |
| 		$cursor = $collection->find(); | |
| 		$rows = []; | |
| 		foreach ($cursor as $row) { | |
| 			$rows[] = $row; | |
| 		} | |
| 		$this->assertEquals(1, count($rows)); | |
| 		$this->assertEquals($id, $rows[0]['_id']); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testFind | |
| 	 */ | |
| 	public function testBatchInsert() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$rows = [ | |
| 			[ | |
| 				'name' => 'customer 1', | |
| 				'address' => 'customer 1 address', | |
| 			], | |
| 			[ | |
| 				'name' => 'customer 2', | |
| 				'address' => 'customer 2 address', | |
| 			], | |
| 		]; | |
| 		$insertedRows = $collection->batchInsert($rows); | |
| 		$this->assertTrue($insertedRows[0]['_id'] instanceof \MongoId); | |
| 		$this->assertTrue($insertedRows[1]['_id'] instanceof \MongoId); | |
| 		$this->assertEquals(count($rows), $collection->find()->count()); | |
| 	} | |
|  | |
| 	public function testSave() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$id = $collection->save($data); | |
| 		$this->assertTrue($id instanceof \MongoId); | |
| 		$this->assertNotEmpty($id->__toString()); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testSave | |
| 	 */ | |
| 	public function testUpdateBySave() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$newId = $collection->save($data); | |
|  | |
| 		$updatedId = $collection->save($data); | |
| 		$this->assertEquals($newId, $updatedId, 'Unable to update data!'); | |
|  | |
| 		$data['_id'] = $newId->__toString(); | |
| 		$updatedId = $collection->save($data); | |
| 		$this->assertEquals($newId, $updatedId, 'Unable to updated data by string id!'); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testFindAll | |
| 	 */ | |
| 	public function testRemove() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$id = $collection->insert($data); | |
|  | |
| 		$count = $collection->remove(['_id' => $id]); | |
| 		$this->assertEquals(1, $count); | |
|  | |
| 		$rows = $this->findAll($collection); | |
| 		$this->assertEquals(0, count($rows)); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testFindAll | |
| 	 */ | |
| 	public function testUpdate() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$data = [ | |
| 			'name' => 'customer 1', | |
| 			'address' => 'customer 1 address', | |
| 		]; | |
| 		$id = $collection->insert($data); | |
|  | |
| 		$newData = [ | |
| 			'name' => 'new name' | |
| 		]; | |
| 		$count = $collection->update(['_id' => $id], $newData); | |
| 		$this->assertEquals(1, $count); | |
|  | |
| 		list($row) = $this->findAll($collection); | |
| 		$this->assertEquals($newData['name'], $row['name']); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testBatchInsert | |
| 	 */ | |
| 	public function testGroup() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$rows = [ | |
| 			[ | |
| 				'name' => 'customer 1', | |
| 				'address' => 'customer 1 address', | |
| 			], | |
| 			[ | |
| 				'name' => 'customer 2', | |
| 				'address' => 'customer 2 address', | |
| 			], | |
| 		]; | |
| 		$collection->batchInsert($rows); | |
|  | |
| 		$keys = ['address' => 1]; | |
| 		$initial = ['items' => []]; | |
| 		$reduce = "function (obj, prev) { prev.items.push(obj.name); }"; | |
| 		$result = $collection->group($keys, $initial, $reduce); | |
| 		$this->assertEquals(2, count($result)); | |
| 		$this->assertNotEmpty($result[0]['address']); | |
| 		$this->assertNotEmpty($result[0]['items']); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testBatchInsert | |
| 	 */ | |
| 	public function testMapReduce() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$rows = [ | |
| 			[ | |
| 				'name' => 'customer 1', | |
| 				'status' => 1, | |
| 				'amount' => 100, | |
| 			], | |
| 			[ | |
| 				'name' => 'customer 2', | |
| 				'status' => 1, | |
| 				'amount' => 200, | |
| 			], | |
| 			[ | |
| 				'name' => 'customer 2', | |
| 				'status' => 2, | |
| 				'amount' => 400, | |
| 			], | |
| 			[ | |
| 				'name' => 'customer 2', | |
| 				'status' => 3, | |
| 				'amount' => 500, | |
| 			], | |
| 		]; | |
| 		$collection->batchInsert($rows); | |
|  | |
| 		$result = $collection->mapReduce( | |
| 			'function () {emit(this.status, this.amount)}', | |
| 			'function (key, values) {return Array.sum(values)}', | |
| 			'mapReduceOut', | |
| 			['status' => ['$lt' => 3]] | |
| 		); | |
| 		$this->assertEquals('mapReduceOut', $result); | |
|  | |
| 		$outputCollection = $this->getConnection()->getCollection($result); | |
| 		$rows = $this->findAll($outputCollection); | |
| 		$expectedRows = [ | |
| 			[ | |
| 				'_id' => 1, | |
| 				'value' => 300, | |
| 			], | |
| 			[ | |
| 				'_id' => 2, | |
| 				'value' => 400, | |
| 			], | |
| 		]; | |
| 		$this->assertEquals($expectedRows, $rows); | |
| 	} | |
|  | |
| 	public function testCreateIndex() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$columns = [ | |
| 			'name', | |
| 			'status' => \MongoCollection::DESCENDING, | |
| 		]; | |
| 		$this->assertTrue($collection->createIndex($columns)); | |
| 		$indexInfo = $collection->mongoCollection->getIndexInfo(); | |
| 		$this->assertEquals(2, count($indexInfo)); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testCreateIndex | |
| 	 */ | |
| 	public function testDropIndex() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
|  | |
| 		$collection->createIndex('name'); | |
| 		$this->assertTrue($collection->dropIndex('name')); | |
| 		$indexInfo = $collection->mongoCollection->getIndexInfo(); | |
| 		$this->assertEquals(1, count($indexInfo)); | |
|  | |
| 		$this->setExpectedException('\yii\mongodb\Exception'); | |
| 		$collection->dropIndex('name'); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testCreateIndex | |
| 	 */ | |
| 	public function testDropAllIndexes() | |
| 	{ | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
| 		$collection->createIndex('name'); | |
| 		$this->assertEquals(2, $collection->dropAllIndexes()); | |
| 		$indexInfo = $collection->mongoCollection->getIndexInfo(); | |
| 		$this->assertEquals(1, count($indexInfo)); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @depends testBatchInsert | |
| 	 * @depends testCreateIndex | |
| 	 */ | |
| 	public function testFullTextSearch() | |
| 	{ | |
| 		if (version_compare('2.4', $this->getServerVersion(), '>')) { | |
| 			$this->markTestSkipped("Mongo Server 2.4 required."); | |
| 		} | |
|  | |
| 		$collection = $this->getConnection()->getCollection('customer'); | |
|  | |
| 		$rows = [ | |
| 			[ | |
| 				'name' => 'customer 1', | |
| 				'status' => 1, | |
| 				'amount' => 100, | |
| 			], | |
| 			[ | |
| 				'name' => 'some customer', | |
| 				'status' => 1, | |
| 				'amount' => 200, | |
| 			], | |
| 		]; | |
| 		$collection->batchInsert($rows); | |
| 		$collection->createIndex(['name' => 'text']); | |
|  | |
| 		$result = $collection->fullTextSearch('some'); | |
| 		$this->assertNotEmpty($result); | |
| 	} | |
| } |