mirror of
				https://github.com/elyby/accounts.git
				synced 2025-05-31 14:11:46 +05:30 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
namespace common\tests\unit\validators;
 | 
						||
 | 
						||
use common\tests\fixtures\AccountFixture;
 | 
						||
use common\tests\unit\TestCase;
 | 
						||
use common\validators\UsernameValidator;
 | 
						||
use yii\base\Model;
 | 
						||
 | 
						||
class UsernameValidatorTest extends TestCase {
 | 
						||
 | 
						||
    /**
 | 
						||
     * @var UsernameValidator
 | 
						||
     */
 | 
						||
    private $validator;
 | 
						||
 | 
						||
    public function _before() {
 | 
						||
        parent::_before();
 | 
						||
        $this->validator = new UsernameValidator();
 | 
						||
    }
 | 
						||
 | 
						||
    public function testValidateTrimming() {
 | 
						||
        $model = $this->createModel("HereIsJohnny#\u{feff}"); // Zero width no-break space (U+FEFF)
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertSame(['error.username_invalid'], $model->getErrors('field'));
 | 
						||
        $this->assertSame('HereIsJohnny#', $model->field);
 | 
						||
    }
 | 
						||
 | 
						||
    public function testValidateAttributeRequired() {
 | 
						||
        $model = $this->createModel('');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertSame(['error.username_required'], $model->getErrors('field'));
 | 
						||
 | 
						||
        $model = $this->createModel('username');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertNotSame(['error.username_required'], $model->getErrors('field'));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testValidateAttributeLength() {
 | 
						||
        $model = $this->createModel('at');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertSame(['error.username_too_short'], $model->getErrors('field'));
 | 
						||
 | 
						||
        $model = $this->createModel('erickskrauch_erickskrauch');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertSame(['error.username_too_long'], $model->getErrors('field'));
 | 
						||
 | 
						||
        $model = $this->createModel('username');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertNotSame(['error.username_too_short'], $model->getErrors('field'));
 | 
						||
        $this->assertNotSame(['error.username_too_long'], $model->getErrors('field'));
 | 
						||
    }
 | 
						||
 | 
						||
    // TODO: rewrite this test with @provider usage
 | 
						||
    public function testValidateAttributePattern() {
 | 
						||
        $shouldBeValid = [
 | 
						||
            'русский_ник', 'русский_ник_на_грани!', 'numbers1132', '*__*-Stars-*__*', '1-_.!$%^&*()[]',
 | 
						||
            '[ESP]Эрик', 'Свят_помидор;', 'зроблена_ў_беларусі:)',
 | 
						||
        ];
 | 
						||
        foreach ($shouldBeValid as $nickname) {
 | 
						||
            $model = $this->createModel($nickname);
 | 
						||
            $this->validator->validateAttribute($model, 'field');
 | 
						||
            $this->assertNotSame(['error.username_invalid'], $model->getErrors('field'));
 | 
						||
        }
 | 
						||
 | 
						||
        $shouldBeInvalid = [
 | 
						||
            'nick@name', 'spaced nick', 'im#hashed', 'quest?ion',
 | 
						||
        ];
 | 
						||
        foreach ($shouldBeInvalid as $nickname) {
 | 
						||
            $model = $this->createModel($nickname);
 | 
						||
            $this->validator->validateAttribute($model, 'field');
 | 
						||
            $this->assertSame(['error.username_invalid'], $model->getErrors('field'));
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    public function testValidateAttributeUnique() {
 | 
						||
        $this->tester->haveFixtures([
 | 
						||
            'accounts' => AccountFixture::class,
 | 
						||
        ]);
 | 
						||
 | 
						||
        /** @var \common\models\Account $accountFixture */
 | 
						||
        $accountFixture = $this->tester->grabFixture('accounts', 'admin');
 | 
						||
 | 
						||
        $model = $this->createModel($accountFixture->username);
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertSame(['error.username_not_available'], $model->getErrors('field'));
 | 
						||
 | 
						||
        $model = $this->createModel($accountFixture->username);
 | 
						||
        $this->validator->accountCallback = function() use ($accountFixture) {
 | 
						||
            return $accountFixture->id;
 | 
						||
        };
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertNotSame(['error.username_not_available'], $model->getErrors('field'));
 | 
						||
        $this->validator->accountCallback = null;
 | 
						||
 | 
						||
        $model = $this->createModel('some-unique-username');
 | 
						||
        $this->validator->validateAttribute($model, 'field');
 | 
						||
        $this->assertNotSame(['error.username_not_available'], $model->getErrors('field'));
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * @param string $fieldValue
 | 
						||
     * @return Model
 | 
						||
     */
 | 
						||
    private function createModel(string $fieldValue): Model {
 | 
						||
        $class = new class extends Model {
 | 
						||
            public $field;
 | 
						||
        };
 | 
						||
 | 
						||
        $class->field = $fieldValue;
 | 
						||
 | 
						||
        return $class;
 | 
						||
    }
 | 
						||
 | 
						||
}
 |