<?php

class PacienteTest extends PHPUnit_Framework_TestCase
{
    /**
     * Testa sucesso ao deletar um paciente.
     */
    public function testSucessoDeletarPaciente()
    {
        $pacienteModelMock = $this->getMockBuilder('Utils\Model\PacienteModel')
            ->setMethods(['delete'])
            ->disableOriginalConstructor()
            ->getMock();

        $pacienteModelMock->expects($this->once())
            ->method('delete')
            ->willReturn(true);

        $pacienteRepository = new \Utils\PacienteRepository($pacienteModelMock);

        $paciente = $this->getDefaultPaciente();

        $deleted = $pacienteRepository->deletarPaciente($paciente);

        $this->assertTrue($deleted);
    }

    /**
     * Testa erro ao tentar deletar um paciente sem informar um id.
     */
    public function testErroDeletarPacienteSemIdentificador()
    {
        $pacienteModelMock = $this->getMockBuilder('Utils\Model\PacienteModel')
            ->setMethods(['delete'])
            ->disableOriginalConstructor()
            ->getMock();

        $pacienteModelMock->method('delete')
            ->willReturn(true);

        $pacienteRepository = new \Utils\PacienteRepository($pacienteModelMock);

        $paciente = $this->getDefaultPaciente();
        $paciente->setId(null);

        try {
            $deleted = $pacienteRepository->deletarPaciente($paciente);
        } catch (\Exception $e) {
            $this->expectExceptionMessage('Identificador de paciente não informado.');
        }
    }

    /**
     * Testa buscas de pacientes.
     */
    public function testBuscarUmPaciente()
    {
        $pacienteModelMock = $this->getMockBuilder('Utils\Model\PacienteModel')
            ->setMethods(['find'])
            ->disableOriginalConstructor()
            ->getMock();

        $pacienteModelMock->method('find')
            ->willReturn($this->getDefaultPaciente());

        $pacienteRepository = new \Utils\PacienteRepository($pacienteModelMock);

        $response = $pacienteRepository->buscarPacientes($this->getDefaultPaciente());

        $this->assertEquals($this->getDefaultPaciente(), $response);
    }

    /**
     * Testa sucesso ao salvar/atualizar um paciente.
     */
    public function testSucessoSalvarAtualizarPaciente()
    {
        $pacienteModelMock = $this->getMockBuilder('Utils\Model\PacienteModel')
            ->setMethods(['persist'])
            ->disableOriginalConstructor()
            ->getMock();

        $pacienteModelMock->method('persist')
            ->willReturn(true);

        $pacienteRepository = new \Utils\PacienteRepository($pacienteModelMock);

        $response = $pacienteRepository->salvarPaciente($this->getDefaultPaciente());

        $this->assertTrue($response);
    }

    /**
     * Testa erros de validação por falta de campos obrigatórios ao tentar salvar/atualizar um paciente.
     *
     * @dataProvider testErroSalvarPacienteDataProvider
     *
     * @expectedException Exception
     * @expectedExceptionCode 111
     * @expectedExceptionMessage Campos Obrigatórios não informados
     *
     * @param $paciente
     */
    public function testErrosFaltaCamposObrigatoriosSalvarPaciente($paciente)
    {
        $pacienteModelMock = $this->getMockBuilder('Utils\Model\PacienteModel')
            ->setMethods(['persist'])
            ->disableOriginalConstructor()
            ->getMock();

        $pacienteModelMock->method('persist')
            ->willReturn(true);

        $pacienteRepository = new \Utils\PacienteRepository($pacienteModelMock);

        $pacienteRepository->salvarPaciente($paciente);
    }

    public function testErroSalvarPacienteDataProvider()
    {
        $defaultPaciente = $this->getDefaultPaciente();

        return [
            [
                'paciente' => $defaultPaciente->setCpf(null)
            ],
            [
                'paciente' => $defaultPaciente->setRg(null)
            ],
            [
                'paciente' => $defaultPaciente->setNome(null)
            ]
        ];
    }

    /**
     * Retorna um paciente padrão para os testes.
     *
     * @return \Utils\Entity\PacienteEntity
     */
    public function getDefaultPaciente()
    {
        $defaultPaciente = new \Utils\Entity\PacienteEntity();

        $defaultPaciente->setId(1)
            ->setNome('Gabriel')
            ->setCpf(11111111)
            ->setRg(81111211212)
            ->setEmail('test@test.com')
            ->setEndereco('Rua Test')
            ->setNumero(1515)
            ->setCep(9495544)
            ->setBairro('Bairro Test')
            ->setCelular(911155454)
            ->setSobrenome('Test')
            ->setTelefone(341414444);

        return $defaultPaciente;
    }
}