<?php

Yii::import('application.modules.usuario.models.Usuario');

class UsuarioTest extends CDbTestCase {

    protected $fixtures = array(
        'usuarios' => 'Usuario',
        'perfiles' => 'Perfil',
    );

    protected function setUp() {
        $this->getFixtureManager()->basePath = Yii::getPathOfAlias('application.tests.modules.usuario.fixtures');
        parent::setUp();
    }

    public function testCrear() {
                
        $usuario_correcto = array(
            'username' => 'username_correcto',
            'password' => 'pass word',
            'email' => 'prueba@prueba.com',
            'superusuario' => 0,
            'estado' => Usuario::ESTADO_ACTIVO,
        );

        $nuevoUsuario = new Usuario;
        $nuevoUsuario->username = $usuario_correcto['username'];
        $nuevoUsuario->password = UsuarioModule::cifrar($usuario_correcto['password']);
        $nuevoUsuario->email = $usuario_correcto['email'];
        $nuevoUsuario->superusuario = $usuario_correcto['superusuario'];
        $nuevoUsuario->estado = $usuario_correcto['estado'];

        // Guardar usuario
        $this->assertTrue($nuevoUsuario->save(false));

        // Recuperar y comprobar
        $usuarioRecuperado = Usuario::model()->findByPk($nuevoUsuario->id);
        $this->assertTrue($usuarioRecuperado instanceof Usuario);        
        $this->assertEquals($nuevoUsuario->username, $usuarioRecuperado->username);
        $this->assertEquals($nuevoUsuario->email, $usuarioRecuperado->email);
        $this->assertEquals($nuevoUsuario->superusuario, $usuarioRecuperado->superusuario);
        $this->assertEquals($nuevoUsuario->estado, $usuarioRecuperado->estado);
    }

    public function testLeer() {
        $usuarioRecuperado = $this->usuarios('admin');
        $this->assertTrue($usuarioRecuperado instanceof Usuario);
        $this->assertEquals($this->usuarios['admin']['username'], $usuarioRecuperado->username);
    }

    public function testValidaciones() {

        $usuario = new Usuario;

        // nombre de usuario en blanco
        $usuario->username = '';
        $this->assertFalse($usuario->validate(array('username')));

        // nombre de usuario con espacios en blanco
        $usuario->username = 'con espacios en blanco';
        $this->assertFalse($usuario->validate(array('username')));

        // nombre de usuario muy corto
        $usuario->username = 'ab';
        $this->assertFalse($usuario->validate(array('username')));

        // nombre de usuario muy largo
        $usuario->username = 'abcdefghijklmnopqrstuvwxyz';
        $this->assertFalse($usuario->validate(array('username')));

        // nombre de usuario OK
        $usuario->username = 'username_correcto';
        $this->assertTrue($usuario->validate(array('username')));

        // email incorrecto
        $usuario->email = 'email_incorrecto';
        $this->assertFalse($usuario->validate(array('email')));

        // email nulo
        $usuario->email = '';
        $this->assertFalse($usuario->validate(array('email')));
        
        // email OK
        $usuario->email = 'prueba@prueba.com';
        $this->assertTrue($usuario->validate(array('email')));
        
        // sin password
        $usuario->password = '';
        $this->assertFalse($usuario->validate(array('password')));

        // password muy corta
        $usuario->password = 'abc';
        $this->assertFalse($usuario->validate(array('password')));

        // password OK
        $usuario->password = 'la contraseña';
        $this->assertTrue($usuario->validate(array('password')));

        // estado no válido
        $usuario->estado = -999;
        $this->assertFalse($usuario->validate());

        // estado no nomérico
        $usuario->estado = 'abc';
        $this->assertFalse($usuario->validate());
        
        // estado OK
        $usuario->estado = Usuario::ESTADO_ACTIVO;
        $this->assertTrue($usuario->validate());
        
        // superusuario no válido
        $usuario->superusuario = 9;
        $this->assertFalse($usuario->validate());

        // superusuario no nomérico
        $usuario->superusuario = 'abc';
        $this->assertFalse($usuario->validate());

        // superusuario OK
        $usuario->superusuario = 0;
        $this->assertTrue($usuario->validate());        
    }

}