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.
		
		
		
		
		
			
		
			
				
					
					
						
							274 lines
						
					
					
						
							7.7 KiB
						
					
					
				
			
		
		
	
	
							274 lines
						
					
					
						
							7.7 KiB
						
					
					
				| <?php | |
|  | |
| namespace yiiunit\framework\base; | |
|  | |
| use yii\base\Model; | |
| use yiiunit\TestCase; | |
| use yiiunit\data\base\Speaker; | |
| use yiiunit\data\base\Singer; | |
| use yiiunit\data\base\InvalidRulesModel; | |
|  | |
| /** | |
|  * @group base | |
|  */ | |
| class ModelTest extends TestCase | |
| { | |
| 	protected function setUp() | |
| 	{ | |
| 		parent::setUp(); | |
| 		$this->mockApplication(); | |
| 	} | |
|  | |
| 	public function testGetAttributeLabel() | |
| 	{ | |
| 		$speaker = new Speaker(); | |
| 		$this->assertEquals('First Name', $speaker->getAttributeLabel('firstName')); | |
| 		$this->assertEquals('This is the custom label', $speaker->getAttributeLabel('customLabel')); | |
| 		$this->assertEquals('Underscore Style', $speaker->getAttributeLabel('underscore_style')); | |
| 	} | |
|  | |
| 	public function testGetAttributes() | |
| 	{ | |
| 		$speaker = new Speaker(); | |
| 		$speaker->firstName = 'Qiang'; | |
| 		$speaker->lastName = 'Xue'; | |
|  | |
| 		$this->assertEquals([ | |
| 			'firstName' => 'Qiang', | |
| 			'lastName' => 'Xue', | |
| 			'customLabel' => null, | |
| 			'underscore_style' => null, | |
| 		], $speaker->getAttributes()); | |
|  | |
| 		$this->assertEquals([ | |
| 			'firstName' => 'Qiang', | |
| 			'lastName' => 'Xue', | |
| 		], $speaker->getAttributes(['firstName', 'lastName'])); | |
|  | |
| 		$this->assertEquals([ | |
| 			'firstName' => 'Qiang', | |
| 			'lastName' => 'Xue', | |
| 		], $speaker->getAttributes(null, ['customLabel', 'underscore_style'])); | |
|  | |
| 		$this->assertEquals([ | |
| 			'firstName' => 'Qiang', | |
| 		], $speaker->getAttributes(['firstName', 'lastName'], ['lastName', 'customLabel', 'underscore_style'])); | |
| 	} | |
|  | |
| 	public function testSetAttributes() | |
| 	{ | |
| 		// by default mass assignment doesn't work at all | |
| 		$speaker = new Speaker(); | |
| 		$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test']); | |
| 		$this->assertNull($speaker->firstName); | |
| 		$this->assertNull($speaker->underscore_style); | |
|  | |
| 		// in the test scenario | |
| 		$speaker = new Speaker(); | |
| 		$speaker->setScenario('test'); | |
| 		$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test']); | |
| 		$this->assertNull($speaker->underscore_style); | |
| 		$this->assertEquals('Qiang', $speaker->firstName); | |
|  | |
| 		$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test'], false); | |
| 		$this->assertEquals('test', $speaker->underscore_style); | |
| 		$this->assertEquals('Qiang', $speaker->firstName); | |
| 	} | |
|  | |
| 	public function testLoad() | |
| 	{ | |
| 		$singer = new Singer(); | |
| 		$this->assertEquals('Singer', $singer->formName()); | |
|  | |
| 		$post = ['firstName' => 'Qiang']; | |
|  | |
| 		Speaker::$formName = ''; | |
| 		$model = new Speaker(); | |
| 		$model->setScenario('test'); | |
| 		$this->assertTrue($model->load($post)); | |
| 		$this->assertEquals('Qiang', $model->firstName); | |
|  | |
| 		Speaker::$formName = 'Speaker'; | |
| 		$model = new Speaker(); | |
| 		$model->setScenario('test'); | |
| 		$this->assertTrue($model->load(['Speaker' => $post])); | |
| 		$this->assertEquals('Qiang', $model->firstName); | |
|  | |
| 		Speaker::$formName = 'Speaker'; | |
| 		$model = new Speaker(); | |
| 		$model->setScenario('test'); | |
| 		$this->assertFalse($model->load(['Example' => []])); | |
| 		$this->assertEquals('', $model->firstName); | |
| 	} | |
|  | |
| 	public function testActiveAttributes() | |
| 	{ | |
| 		// by default mass assignment doesn't work at all | |
| 		$speaker = new Speaker(); | |
| 		$this->assertEmpty($speaker->activeAttributes()); | |
|  | |
| 		$speaker = new Speaker(); | |
| 		$speaker->setScenario('test'); | |
| 		$this->assertEquals(['firstName', 'lastName', 'underscore_style'], $speaker->activeAttributes()); | |
| 	} | |
|  | |
| 	public function testIsAttributeSafe() | |
| 	{ | |
| 		// by default mass assignment doesn't work at all | |
| 		$speaker = new Speaker(); | |
| 		$this->assertFalse($speaker->isAttributeSafe('firstName')); | |
|  | |
| 		$speaker = new Speaker(); | |
| 		$speaker->setScenario('test'); | |
| 		$this->assertTrue($speaker->isAttributeSafe('firstName')); | |
|  | |
| 	} | |
|  | |
| 	public function testErrors() | |
| 	{ | |
| 		$speaker = new Speaker(); | |
|  | |
| 		$this->assertEmpty($speaker->getErrors()); | |
| 		$this->assertEmpty($speaker->getErrors('firstName')); | |
| 		$this->assertEmpty($speaker->getFirstErrors()); | |
|  | |
| 		$this->assertFalse($speaker->hasErrors()); | |
| 		$this->assertFalse($speaker->hasErrors('firstName')); | |
|  | |
| 		$speaker->addError('firstName', 'Something is wrong!'); | |
| 		$this->assertEquals(['firstName' => ['Something is wrong!']], $speaker->getErrors()); | |
| 		$this->assertEquals(['Something is wrong!'], $speaker->getErrors('firstName')); | |
|  | |
| 		$speaker->addError('firstName', 'Totally wrong!'); | |
| 		$this->assertEquals(['firstName' => ['Something is wrong!', 'Totally wrong!']], $speaker->getErrors()); | |
| 		$this->assertEquals(['Something is wrong!', 'Totally wrong!'], $speaker->getErrors('firstName')); | |
|  | |
| 		$this->assertTrue($speaker->hasErrors()); | |
| 		$this->assertTrue($speaker->hasErrors('firstName')); | |
| 		$this->assertFalse($speaker->hasErrors('lastName')); | |
|  | |
| 		$this->assertEquals(['Something is wrong!'], $speaker->getFirstErrors()); | |
| 		$this->assertEquals('Something is wrong!', $speaker->getFirstError('firstName')); | |
| 		$this->assertNull($speaker->getFirstError('lastName')); | |
|  | |
| 		$speaker->addError('lastName', 'Another one!'); | |
| 		$this->assertEquals([ | |
| 			'firstName' => [ | |
| 				'Something is wrong!', | |
| 				'Totally wrong!', | |
| 			], | |
| 			'lastName' => ['Another one!'], | |
| 		], $speaker->getErrors()); | |
|  | |
| 		$speaker->clearErrors('firstName'); | |
| 		$this->assertEquals([ | |
| 			'lastName' => ['Another one!'], | |
| 		], $speaker->getErrors()); | |
|  | |
| 		$speaker->clearErrors(); | |
| 		$this->assertEmpty($speaker->getErrors()); | |
| 		$this->assertFalse($speaker->hasErrors()); | |
| 	} | |
|  | |
| 	public function testArraySyntax() | |
| 	{ | |
| 		$speaker = new Speaker(); | |
|  | |
| 		// get | |
| 		$this->assertNull($speaker['firstName']); | |
|  | |
| 		// isset | |
| 		$this->assertFalse(isset($speaker['firstName'])); | |
|  | |
| 		// set | |
| 		$speaker['firstName'] = 'Qiang'; | |
|  | |
| 		$this->assertEquals('Qiang', $speaker['firstName']); | |
| 		$this->assertTrue(isset($speaker['firstName'])); | |
|  | |
| 		// iteration | |
| 		$attributes = []; | |
| 		foreach ($speaker as $key => $attribute) { | |
| 			$attributes[$key] = $attribute; | |
| 		} | |
| 		$this->assertEquals([ | |
| 			'firstName' => 'Qiang', | |
| 			'lastName' => null, | |
| 			'customLabel' => null, | |
| 			'underscore_style' => null, | |
| 		], $attributes); | |
|  | |
| 		// unset | |
| 		unset($speaker['firstName']); | |
|  | |
| 		// exception isn't expected here | |
| 		$this->assertNull($speaker['firstName']); | |
| 		$this->assertFalse(isset($speaker['firstName'])); | |
| 	} | |
|  | |
| 	public function testDefaults() | |
| 	{ | |
| 		$singer = new Model(); | |
| 		$this->assertEquals([], $singer->rules()); | |
| 		$this->assertEquals([], $singer->attributeLabels()); | |
| 	} | |
|  | |
| 	public function testDefaultScenarios() | |
| 	{ | |
| 		$singer = new Singer(); | |
| 		$this->assertEquals(['default' => ['lastName', 'underscore_style']], $singer->scenarios()); | |
|  | |
| 		$scenarios = [ | |
| 			'default' => ['id', 'name', 'description'], | |
| 			'administration' => ['name', 'description', 'is_disabled'], | |
| 		]; | |
| 		$model = new ComplexModel1(); | |
| 		$this->assertEquals($scenarios, $model->scenarios()); | |
| 		$scenarios = [ | |
| 			'default' => ['id', 'name', 'description'], | |
| 			'suddenlyUnexpectedScenario' => ['name', 'description'], | |
| 			'administration' => ['id', 'name', 'description', 'is_disabled'], | |
| 		]; | |
| 		$model = new ComplexModel2(); | |
| 		$this->assertEquals($scenarios, $model->scenarios()); | |
| 	} | |
|  | |
| 	public function testIsAttributeRequired() | |
| 	{ | |
| 		$singer = new Singer(); | |
| 		$this->assertFalse($singer->isAttributeRequired('firstName')); | |
| 		$this->assertTrue($singer->isAttributeRequired('lastName')); | |
| 	} | |
|  | |
| 	public function testCreateValidators() | |
| 	{ | |
| 		$this->setExpectedException('yii\base\InvalidConfigException', 'Invalid validation rule: a rule must specify both attribute names and validator type.'); | |
|  | |
| 		$invalid = new InvalidRulesModel(); | |
| 		$invalid->createValidators(); | |
| 	} | |
| } | |
|  | |
| class ComplexModel1 extends Model | |
| { | |
| 	public function rules() | |
| 	{ | |
| 		return [ | |
| 			[['id'], 'required', 'except' => 'administration'], | |
| 			[['name', 'description'], 'filter', 'filter' => 'trim'], | |
| 			[['is_disabled'], 'boolean', 'on' => 'administration'], | |
| 		]; | |
| 	} | |
| } | |
|  | |
| class ComplexModel2 extends Model | |
| { | |
| 	public function rules() | |
| 	{ | |
| 		return [ | |
| 			[['id'], 'required', 'except' => 'suddenlyUnexpectedScenario'], | |
| 			[['name', 'description'], 'filter', 'filter' => 'trim'], | |
| 			[['is_disabled'], 'boolean', 'on' => 'administration'], | |
| 		]; | |
| 	} | |
| }
 | |
| 
 |