<?php
class ConsultaTest extends PHPUnit_Framework_TestCase
{

    /**
     * Testa o sucesso na consulta de disponibilidades.
     */
    public function testSucessoConsultaDisponivel() {

        $consultaModelMock = $this->getMockBuilder('Utils\Model\ConsultaModel')
            ->setMethods(['buscarConsulta'])
            ->disableOriginalConstructor()
            ->getMock();

        $consultaModelMock->expects($this->once())
            ->method('buscarConsulta')
            ->willReturn(true);

        $consultaRepository = new \Utils\ConsultaRepository($consultaModelMock);

        $medico = new \Utils\Entity\MedicoEntity();
        $medico->setId(1)
            ->setCrm('12123131');

        $especialidade = new \Utils\Entity\EspecialidadeEntity();
        $especialidade->setId(2)
            ->setNome('Clinico Geral');

        $disponivel = $consultaRepository->buscarConsulta($medico, $especialidade, new \DateTime());

        $this->assertTrue($disponivel);
    }

    /**
     * Testa Retorno de consulta indisponível.
     */
    public function testSucessoConsultaIndisponivel()
    {
        $consultaModelMock = $this->getMockBuilder('Utils\Model\ConsultaModel')
            ->setMethods(['buscarConsulta'])
            ->disableOriginalConstructor()
            ->getMock();

        $consultaModelMock->expects($this->once())
            ->method('buscarConsulta')
            ->willReturn('Dia e Horário indisponíveis para agendamento');

        $consultaRepository = new \Utils\ConsultaRepository($consultaModelMock);

        $medico = new \Utils\Entity\MedicoEntity();
        $medico->setId(1)
            ->setCrm('12123131');


        $disponivel = $consultaRepository->buscarConsulta($medico, null, new \DateTime());

        $this->assertEquals('Dia e Horário indisponíveis para agendamento', $disponivel);
    }

    /**
     * Testa Erro por falta de parâmetros de consulta.
     *
     * @expectedException \Exception
     * @expectedExceptionMessage Nao informado médico nem especialidade
     */
    public function testErroConsultaFaltaParametro()
    {
        $consultaModelMock = $this->getMockBuilder('Utils\Model\ConsultaModel')
            ->setMethods(['buscarConsulta'])
            ->disableOriginalConstructor()
            ->getMock();

        $consultaRepository = new \Utils\ConsultaRepository($consultaModelMock);

        $consultaRepository->buscarConsulta(null, null, new \DateTime());
    }

    /**
     * Testa Sucesso na marcação da consulta.
     */
    public function testSucessoMarcarConsulta()
    {
        $consultaModelMock = $this->getMockBuilder('Utils\Model\ConsultaModel')
            ->setMethods(['marcarConsulta'])
            ->disableOriginalConstructor()
            ->getMock();

        $consultaModelMock->expects($this->once())
            ->method('marcarConsulta')
            ->willReturn(true);

        $consultaRepository = new \Utils\ConsultaRepository($consultaModelMock);

        $medico = new \Utils\Entity\MedicoEntity();
        $medico->setId(1)
            ->setCrm('12123131');

        $marcada = $consultaRepository->marcarConsulta(
            $medico,
            null,
            new \DateTime()
        );

        $this->assertTrue($marcada);
    }
}