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.
		
		
		
		
		
			
		
			
				
					
					
						
							237 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
	
	
							237 lines
						
					
					
						
							6.9 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace yiiunit\extensions\sphinx; | 
						|
 | 
						|
use yii\sphinx\ActiveQuery; | 
						|
use yiiunit\data\ar\sphinx\ActiveRecord; | 
						|
use yiiunit\data\ar\sphinx\ArticleIndex; | 
						|
use yiiunit\data\ar\sphinx\RuntimeIndex; | 
						|
 | 
						|
/** | 
						|
 * @group sphinx | 
						|
 */ | 
						|
class ActiveRecordTest extends SphinxTestCase | 
						|
{ | 
						|
	protected function setUp() | 
						|
	{ | 
						|
		parent::setUp(); | 
						|
		ActiveRecord::$db = $this->getConnection(); | 
						|
	} | 
						|
 | 
						|
	protected function tearDown() | 
						|
	{ | 
						|
		$this->truncateRuntimeIndex('yii2_test_rt_index'); | 
						|
		parent::tearDown(); | 
						|
	} | 
						|
 | 
						|
	// Tests : | 
						|
 | 
						|
	public function testFind() | 
						|
	{ | 
						|
		// find one | 
						|
		$result = ArticleIndex::find(); | 
						|
		$this->assertTrue($result instanceof ActiveQuery); | 
						|
		$article = $result->one(); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
 | 
						|
		// find all | 
						|
		$articles = ArticleIndex::find()->all(); | 
						|
		$this->assertEquals(2, count($articles)); | 
						|
		$this->assertTrue($articles[0] instanceof ArticleIndex); | 
						|
		$this->assertTrue($articles[1] instanceof ArticleIndex); | 
						|
 | 
						|
		// find fulltext | 
						|
		$article = ArticleIndex::find(2); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
		$this->assertEquals(2, $article->id); | 
						|
 | 
						|
		// find by column values | 
						|
		$article = ArticleIndex::find(['id' => 2, 'author_id' => 2]); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
		$this->assertEquals(2, $article->id); | 
						|
		$this->assertEquals(2, $article->author_id); | 
						|
		$article = ArticleIndex::find(['id' => 2, 'author_id' => 1]); | 
						|
		$this->assertNull($article); | 
						|
 | 
						|
		// find by attributes | 
						|
		$article = ArticleIndex::find()->where(['author_id' => 2])->one(); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
		$this->assertEquals(2, $article->id); | 
						|
 | 
						|
		// find custom column | 
						|
		$article = ArticleIndex::find()->select(['*', '(5*2) AS custom_column']) | 
						|
			->where(['author_id' => 1])->one(); | 
						|
		$this->assertEquals(1, $article->id); | 
						|
		$this->assertEquals(10, $article->custom_column); | 
						|
 | 
						|
		// find count, sum, average, min, max, scalar | 
						|
		$this->assertEquals(2, ArticleIndex::find()->count()); | 
						|
		$this->assertEquals(1, ArticleIndex::find()->where('id=1')->count()); | 
						|
		$this->assertEquals(3, ArticleIndex::find()->sum('id')); | 
						|
		$this->assertEquals(1.5, ArticleIndex::find()->average('id')); | 
						|
		$this->assertEquals(1, ArticleIndex::find()->min('id')); | 
						|
		$this->assertEquals(2, ArticleIndex::find()->max('id')); | 
						|
		$this->assertEquals(2, ArticleIndex::find()->select('COUNT(*)')->scalar()); | 
						|
 | 
						|
		// scope | 
						|
		$this->assertEquals(1, ArticleIndex::find()->favoriteAuthor()->count()); | 
						|
 | 
						|
		// asArray | 
						|
		$article = ArticleIndex::find()->where('id=2')->asArray()->one(); | 
						|
		unset($article['add_date']); | 
						|
		$this->assertEquals([ | 
						|
			'id' => '2', | 
						|
			'author_id' => '2', | 
						|
			'tag' => '3,4', | 
						|
		], $article); | 
						|
 | 
						|
		// indexBy | 
						|
		$articles = ArticleIndex::find()->indexBy('author_id')->orderBy('id DESC')->all(); | 
						|
		$this->assertEquals(2, count($articles)); | 
						|
		$this->assertTrue($articles['1'] instanceof ArticleIndex); | 
						|
		$this->assertTrue($articles['2'] instanceof ArticleIndex); | 
						|
 | 
						|
		// indexBy callable | 
						|
		$articles = ArticleIndex::find()->indexBy(function ($article) { | 
						|
			return $article->id . '-' . $article->author_id; | 
						|
		})->orderBy('id DESC')->all(); | 
						|
		$this->assertEquals(2, count($articles)); | 
						|
		$this->assertTrue($articles['1-1'] instanceof ArticleIndex); | 
						|
		$this->assertTrue($articles['2-2'] instanceof ArticleIndex); | 
						|
	} | 
						|
 | 
						|
	public function testFindBySql() | 
						|
	{ | 
						|
		// find one | 
						|
		$article = ArticleIndex::findBySql('SELECT * FROM yii2_test_article_index ORDER BY id DESC')->one(); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
		$this->assertEquals(2, $article->author_id); | 
						|
 | 
						|
		// find all | 
						|
		$articles = ArticleIndex::findBySql('SELECT * FROM yii2_test_article_index')->all(); | 
						|
		$this->assertEquals(2, count($articles)); | 
						|
 | 
						|
		// find with parameter binding | 
						|
		$article = ArticleIndex::findBySql('SELECT * FROM yii2_test_article_index WHERE id=:id', [':id' => 2])->one(); | 
						|
		$this->assertTrue($article instanceof ArticleIndex); | 
						|
		$this->assertEquals(2, $article->author_id); | 
						|
	} | 
						|
 | 
						|
	public function testInsert() | 
						|
	{ | 
						|
		$record = new RuntimeIndex; | 
						|
		$record->id = 15; | 
						|
		$record->title = 'test title'; | 
						|
		$record->content = 'test content'; | 
						|
		$record->type_id = 7; | 
						|
		$record->category = [1, 2]; | 
						|
 | 
						|
		$this->assertTrue($record->isNewRecord); | 
						|
 | 
						|
		$record->save(); | 
						|
 | 
						|
		$this->assertEquals(15, $record->id); | 
						|
		$this->assertFalse($record->isNewRecord); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testUpdate() | 
						|
	{ | 
						|
		$record = new RuntimeIndex; | 
						|
		$record->id = 2; | 
						|
		$record->title = 'test title'; | 
						|
		$record->content = 'test content'; | 
						|
		$record->type_id = 7; | 
						|
		$record->category = [1, 2]; | 
						|
		$record->save(); | 
						|
 | 
						|
		// save | 
						|
		$record = RuntimeIndex::find(['id' => 2]); | 
						|
		$this->assertTrue($record instanceof RuntimeIndex); | 
						|
		$this->assertEquals(7, $record->type_id); | 
						|
		$this->assertFalse($record->isNewRecord); | 
						|
 | 
						|
		$record->type_id = 9; | 
						|
		$record->save(); | 
						|
		$this->assertEquals(9, $record->type_id); | 
						|
		$this->assertFalse($record->isNewRecord); | 
						|
		$record2 = RuntimeIndex::find(['id' => 2]); | 
						|
		$this->assertEquals(9, $record2->type_id); | 
						|
 | 
						|
		// replace | 
						|
		$query = 'replace'; | 
						|
		$rows = RuntimeIndex::find($query); | 
						|
		$this->assertEmpty($rows); | 
						|
		$record = RuntimeIndex::find(['id' => 2]); | 
						|
		$record->content = 'Test content with ' . $query; | 
						|
		$record->save(); | 
						|
		$rows = RuntimeIndex::find()->match($query); | 
						|
		$this->assertNotEmpty($rows); | 
						|
 | 
						|
		// updateAll | 
						|
		$pk = ['id' => 2]; | 
						|
		$ret = RuntimeIndex::updateAll(['type_id' => 55], $pk); | 
						|
		$this->assertEquals(1, $ret); | 
						|
		$record = RuntimeIndex::find($pk); | 
						|
		$this->assertEquals(55, $record->type_id); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testInsert | 
						|
	 */ | 
						|
	public function testDelete() | 
						|
	{ | 
						|
		// delete | 
						|
		$record = new RuntimeIndex; | 
						|
		$record->id = 2; | 
						|
		$record->title = 'test title'; | 
						|
		$record->content = 'test content'; | 
						|
		$record->type_id = 7; | 
						|
		$record->category = [1, 2]; | 
						|
		$record->save(); | 
						|
 | 
						|
		$record = RuntimeIndex::find(['id' => 2]); | 
						|
		$record->delete(); | 
						|
		$record = RuntimeIndex::find(['id' => 2]); | 
						|
		$this->assertNull($record); | 
						|
 | 
						|
		// deleteAll | 
						|
		$record = new RuntimeIndex; | 
						|
		$record->id = 2; | 
						|
		$record->title = 'test title'; | 
						|
		$record->content = 'test content'; | 
						|
		$record->type_id = 7; | 
						|
		$record->category = [1, 2]; | 
						|
		$record->save(); | 
						|
 | 
						|
		$ret = RuntimeIndex::deleteAll('id = 2'); | 
						|
		$this->assertEquals(1, $ret); | 
						|
		$records = RuntimeIndex::find()->all(); | 
						|
		$this->assertEquals(0, count($records)); | 
						|
	} | 
						|
 | 
						|
	public function testCallSnippets() | 
						|
	{ | 
						|
		$query = 'pencil'; | 
						|
		$source = 'Some data sentence about ' . $query; | 
						|
 | 
						|
		$snippet = ArticleIndex::callSnippets($source, $query); | 
						|
		$this->assertNotEmpty($snippet, 'Unable to call snippets!'); | 
						|
		$this->assertContains('<b>' . $query . '</b>', $snippet, 'Query not present in the snippet!'); | 
						|
 | 
						|
		$rows = ArticleIndex::callSnippets([$source], $query); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call snippets!'); | 
						|
		$this->assertContains('<b>' . $query . '</b>', $rows[0], 'Query not present in the snippet!'); | 
						|
	} | 
						|
 | 
						|
	public function testCallKeywords() | 
						|
	{ | 
						|
		$text = 'table pencil'; | 
						|
		$rows = ArticleIndex::callKeywords($text); | 
						|
		$this->assertNotEmpty($rows, 'Unable to call keywords!'); | 
						|
		$this->assertArrayHasKey('tokenized', $rows[0], 'No tokenized keyword!'); | 
						|
		$this->assertArrayHasKey('normalized', $rows[0], 'No normalized keyword!'); | 
						|
	} | 
						|
} |