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.
		
		
		
		
		
			
		
			
				
					
					
						
							410 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							410 lines
						
					
					
						
							11 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace yiiunit\extensions\sphinx; | 
						|
 | 
						|
use yii\sphinx\DataReader; | 
						|
use yii\db\Expression; | 
						|
 | 
						|
/** | 
						|
 * @group sphinx | 
						|
 */ | 
						|
class CommandTest extends SphinxTestCase | 
						|
{ | 
						|
	protected function tearDown() | 
						|
	{ | 
						|
		$this->truncateRuntimeIndex('yii2_test_rt_index'); | 
						|
		parent::tearDown(); | 
						|
	} | 
						|
 | 
						|
	// Tests : | 
						|
 | 
						|
	public function testConstruct() | 
						|
	{ | 
						|
		$db = $this->getConnection(false); | 
						|
 | 
						|
		// null | 
						|
		$command = $db->createCommand(); | 
						|
		$this->assertEquals(null, $command->sql); | 
						|
 | 
						|
		// string | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index'; | 
						|
		$params = [ | 
						|
			'name' => 'value' | 
						|
		]; | 
						|
		$command = $db->createCommand($sql, $params); | 
						|
		$this->assertEquals($sql, $command->sql); | 
						|
		$this->assertEquals($params, $command->params); | 
						|
	} | 
						|
 | 
						|
	public function testGetSetSql() | 
						|
	{ | 
						|
		$db = $this->getConnection(false); | 
						|
 | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$this->assertEquals($sql, $command->sql); | 
						|
 | 
						|
		$sql2 = 'SELECT * FROM yii2_test_item_index'; | 
						|
		$command->sql = $sql2; | 
						|
		$this->assertEquals($sql2, $command->sql); | 
						|
	} | 
						|
 | 
						|
	public function testAutoQuoting() | 
						|
	{ | 
						|
		$db = $this->getConnection(false); | 
						|
 | 
						|
		$sql = 'SELECT [[id]], [[t.name]] FROM {{yii2_test_item_index}} t'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$this->assertEquals("SELECT `id`, `t`.`name` FROM `yii2_test_item_index` t", $command->sql); | 
						|
	} | 
						|
 | 
						|
	public function testPrepareCancel() | 
						|
	{ | 
						|
		$db = $this->getConnection(false); | 
						|
 | 
						|
		$command = $db->createCommand('SELECT * FROM yii2_test_item_index'); | 
						|
		$this->assertEquals(null, $command->pdoStatement); | 
						|
		$command->prepare(); | 
						|
		$this->assertNotEquals(null, $command->pdoStatement); | 
						|
		$command->cancel(); | 
						|
		$this->assertEquals(null, $command->pdoStatement); | 
						|
	} | 
						|
 | 
						|
	public function testExecute() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$sql = 'SELECT COUNT(*) FROM yii2_test_item_index WHERE MATCH(\'wooden\')'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$this->assertEquals(1, $command->queryScalar()); | 
						|
 | 
						|
		$command = $db->createCommand('bad SQL'); | 
						|
		$this->setExpectedException('\yii\db\Exception'); | 
						|
		$command->execute(); | 
						|
	} | 
						|
 | 
						|
	public function testQuery() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		// query | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index'; | 
						|
		$reader = $db->createCommand($sql)->query(); | 
						|
		$this->assertTrue($reader instanceof DataReader); | 
						|
 | 
						|
		// queryAll | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_item_index')->queryAll(); | 
						|
		$this->assertEquals(2, count($rows)); | 
						|
		$row = $rows[1]; | 
						|
		$this->assertEquals(2, $row['id']); | 
						|
		$this->assertEquals(2, $row['category_id']); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_item_index WHERE id=10')->queryAll(); | 
						|
		$this->assertEquals([], $rows); | 
						|
 | 
						|
		// queryOne | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; | 
						|
		$row = $db->createCommand($sql)->queryOne(); | 
						|
		$this->assertEquals(1, $row['id']); | 
						|
		$this->assertEquals(1, $row['category_id']); | 
						|
 | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$command->prepare(); | 
						|
		$row = $command->queryOne(); | 
						|
		$this->assertEquals(1, $row['id']); | 
						|
		$this->assertEquals(1, $row['category_id']); | 
						|
 | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index WHERE id=10'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$this->assertFalse($command->queryOne()); | 
						|
 | 
						|
		// queryColumn | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index'; | 
						|
		$column = $db->createCommand($sql)->queryColumn(); | 
						|
		$this->assertEquals(range(1, 2), $column); | 
						|
 | 
						|
		$command = $db->createCommand('SELECT id FROM yii2_test_item_index WHERE id=10'); | 
						|
		$this->assertEquals([], $command->queryColumn()); | 
						|
 | 
						|
		// queryScalar | 
						|
		$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; | 
						|
		$this->assertEquals($db->createCommand($sql)->queryScalar(), 1); | 
						|
 | 
						|
		$sql = 'SELECT id FROM yii2_test_item_index ORDER BY id ASC'; | 
						|
		$command = $db->createCommand($sql); | 
						|
		$command->prepare(); | 
						|
		$this->assertEquals(1, $command->queryScalar()); | 
						|
 | 
						|
		$command = $db->createCommand('SELECT id FROM yii2_test_item_index WHERE id=10'); | 
						|
		$this->assertFalse($command->queryScalar()); | 
						|
 | 
						|
		$command = $db->createCommand('bad SQL'); | 
						|
		$this->setExpectedException('\yii\db\Exception'); | 
						|
		$command->query(); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testQuery | 
						|
	 */ | 
						|
	public function testInsert() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$command = $db->createCommand()->insert('yii2_test_rt_index', [ | 
						|
			'title' => 'Test title', | 
						|
			'content' => 'Test content', | 
						|
			'type_id' => 2, | 
						|
			'category' => [1, 2], | 
						|
			'id' => 1, | 
						|
		]); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to execute insert!'); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals(1, count($rows), 'No row inserted!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testBatchInsert() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$command = $db->createCommand()->batchInsert( | 
						|
			'yii2_test_rt_index', | 
						|
			[ | 
						|
				'title', | 
						|
				'content', | 
						|
				'type_id', | 
						|
				'category', | 
						|
				'id', | 
						|
			], | 
						|
			[ | 
						|
				[ | 
						|
					'Test title 1', | 
						|
					'Test content 1', | 
						|
					1, | 
						|
					[1, 2], | 
						|
					1, | 
						|
				], | 
						|
				[ | 
						|
					'Test title 2', | 
						|
					'Test content 2', | 
						|
					2, | 
						|
					[3, 4], | 
						|
					2, | 
						|
				], | 
						|
			] | 
						|
		); | 
						|
		$this->assertEquals(2, $command->execute(), 'Unable to execute batch insert!'); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals(2, count($rows), 'No rows inserted!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testReplace() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$command = $db->createCommand()->replace('yii2_test_rt_index', [ | 
						|
			'title' => 'Test title', | 
						|
			'content' => 'Test content', | 
						|
			'type_id' => 2, | 
						|
			'category' => [1, 2], | 
						|
			'id' => 1, | 
						|
		]); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to execute replace!'); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals(1, count($rows), 'No row inserted!'); | 
						|
 | 
						|
		$newTypeId = 5; | 
						|
		$command = $db->createCommand()->replace('yii2_test_rt_index',[ | 
						|
			'type_id' => $newTypeId, | 
						|
			'category' => [3, 4], | 
						|
			'id' => 1, | 
						|
		]); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to update via replace!'); | 
						|
 | 
						|
		list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testReplace | 
						|
	 */ | 
						|
	public function testBatchReplace() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$command = $db->createCommand()->batchReplace( | 
						|
			'yii2_test_rt_index', | 
						|
			[ | 
						|
				'title', | 
						|
				'content', | 
						|
				'type_id', | 
						|
				'category', | 
						|
				'id', | 
						|
			], | 
						|
			[ | 
						|
				[ | 
						|
					'Test title 1', | 
						|
					'Test content 1', | 
						|
					1, | 
						|
					[1, 2], | 
						|
					1, | 
						|
				], | 
						|
				[ | 
						|
					'Test title 2', | 
						|
					'Test content 2', | 
						|
					2, | 
						|
					[3, 4], | 
						|
					2, | 
						|
				], | 
						|
			] | 
						|
		); | 
						|
		$this->assertEquals(2, $command->execute(), 'Unable to execute batch replace!'); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals(2, count($rows), 'No rows inserted!'); | 
						|
 | 
						|
		$newTypeId = 5; | 
						|
		$command = $db->createCommand()->replace('yii2_test_rt_index',[ | 
						|
			'type_id' => $newTypeId, | 
						|
			'id' => 1, | 
						|
		]); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to update via replace!'); | 
						|
		list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testUpdate() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$db->createCommand()->insert('yii2_test_rt_index', [ | 
						|
			'title' => 'Test title', | 
						|
			'content' => 'Test content', | 
						|
			'type_id' => 2, | 
						|
			'id' => 1, | 
						|
		])->execute(); | 
						|
 | 
						|
		$newTypeId = 5; | 
						|
		$command = $db->createCommand()->update( | 
						|
			'yii2_test_rt_index', | 
						|
			[ | 
						|
				'type_id' => $newTypeId, | 
						|
				'category' => [3, 4], | 
						|
			], | 
						|
			'id = 1' | 
						|
		); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to execute update!'); | 
						|
 | 
						|
		list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testUpdate | 
						|
	 */ | 
						|
	public function testUpdateWithOptions() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$db->createCommand()->insert('yii2_test_rt_index', [ | 
						|
			'title' => 'Test title', | 
						|
			'content' => 'Test content', | 
						|
			'type_id' => 2, | 
						|
			'id' => 1, | 
						|
		])->execute(); | 
						|
 | 
						|
		$newTypeId = 5; | 
						|
		$command = $db->createCommand()->update( | 
						|
			'yii2_test_rt_index', | 
						|
			[ | 
						|
				'type_id' => $newTypeId, | 
						|
				'non_existing_attribute' => 10, | 
						|
			], | 
						|
			'id = 1', | 
						|
			[], | 
						|
			[ | 
						|
				'ignore_nonexistent_columns' => 1 | 
						|
			] | 
						|
		); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to execute update!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testDelete() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$db->createCommand()->insert('yii2_test_rt_index', [ | 
						|
			'title' => 'Test title', | 
						|
			'content' => 'Test content', | 
						|
			'type_id' => 2, | 
						|
			'id' => 1, | 
						|
		])->execute(); | 
						|
 | 
						|
		$command = $db->createCommand()->delete('yii2_test_rt_index', 'id = 1'); | 
						|
		$this->assertEquals(1, $command->execute(), 'Unable to execute delete!'); | 
						|
 | 
						|
		$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); | 
						|
		$this->assertEquals(0, count($rows), 'Unable to delete record!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testQuery | 
						|
	 */ | 
						|
	public function testCallSnippets() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$query = 'pencil'; | 
						|
		$source = 'Some data sentence about ' . $query; | 
						|
 | 
						|
		$rows = $db->createCommand()->callSnippets('yii2_test_item_index', $source, $query)->queryColumn(); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call snippets!'); | 
						|
		$this->assertContains('<b>' . $query . '</b>', $rows[0], 'Query not present in the snippet!'); | 
						|
 | 
						|
		$rows = $db->createCommand()->callSnippets('yii2_test_item_index', [$source], $query)->queryColumn(); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call snippets for array source!'); | 
						|
 | 
						|
		$options = [ | 
						|
			'before_match' => '[', | 
						|
			'after_match' => ']', | 
						|
			'limit' => 20, | 
						|
		]; | 
						|
		$snippet = $db->createCommand()->callSnippets('yii2_test_item_index', $source, $query, $options)->queryScalar(); | 
						|
		$this->assertContains($options['before_match'] . $query . $options['after_match'], $snippet, 'Unable to apply options!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testQuery | 
						|
	 */ | 
						|
	public function testCallKeywords() | 
						|
	{ | 
						|
		$db = $this->getConnection(); | 
						|
 | 
						|
		$text = 'table pencil'; | 
						|
		$rows = $db->createCommand()->callKeywords('yii2_test_item_index', $text)->queryAll(); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call keywords!'); | 
						|
		$this->assertArrayHasKey('tokenized', $rows[0], 'No tokenized keyword!'); | 
						|
		$this->assertArrayHasKey('normalized', $rows[0], 'No normalized keyword!'); | 
						|
 | 
						|
		$text = 'table pencil'; | 
						|
		$rows = $db->createCommand()->callKeywords('yii2_test_item_index', $text, true)->queryAll(); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call keywords with statistic!'); | 
						|
		$this->assertArrayHasKey('docs', $rows[0], 'No docs!'); | 
						|
		$this->assertArrayHasKey('hits', $rows[0], 'No hits!'); | 
						|
	} | 
						|
} |