3
respostas

ERRO NA ValidadorPacienteSemOutraConsultaNoDia

Este meu if : de confirmação se paciente existe consulta no mesmo dia esta sempre disparando mesmo com a tabela consultas vasia.!Insira aqui a descrição dessa imagem para ajudar na acessibilidade@Component public class ValidadorPacienteSemOutraConsultaNoDia implements ValidadorDeAgendamento {

@Autowired
private ConsultaRepository repository;

public void validar(DadosAgendamentoConsulta dados) {
    var dadosIdPaciente = dados.idPaciente();
    var primeiraHora = dados.data().withHour(7).withMinute(0).withSecond(0);
    var ultimaHora = dados.data().withHour(18).withMinute(59).withSecond(59);
    boolean consulta = repository.existsByPacienteIdAndDataBetween(dadosIdPaciente, primeiraHora, ultimaHora);
    if (consulta) {
        System.out.println(dados.idPaciente() + "," + primeiraHora + "," + ultimaHora);
        throw new ValidacaoException("Paciente já possui uma consulta agendada nesse dia");
    }
}

} @Service public class AgendamentoDeConsultas { @Autowired private ConsultaRepository consultaRepository; @Autowired private PacienteRepository pacienteRepository; @Autowired private MedicoRepository medicoRepository; @Autowired private List validador;

public DadosDetalhamentoConsulta agendar(@Valid DadosAgendamentoConsulta dados) {
if(!pacienteRepository.existsById(dados.idPaciente())){
    throw  new ValidacaoException("Id do paciente informado não existe");
}

if(dados.idMedico() != null &&!medicoRepository.existsById(dados.idMedico())){
    throw new ValidacaoException("Id do medico informado não existe");
}
validador.forEach(v-> v.validar(dados));
    var medico_id = escolherMedico(dados);
    if(medico_id== null){
        throw new ValidacaoException("não existe medico disponivel nessa data!");
    }
    var paciente_id = pacienteRepository.getReferenceById(dados.idPaciente());

    var consulta = new Consulta(null,medico_id, paciente_id, dados.data());

    consultaRepository.save(consulta);
    return new DadosDetalhamentoConsulta(consulta);
}


private Medico escolherMedico(@Valid DadosAgendamentoConsulta dados) {
    if (dados.idMedico() != null) {
        return medicoRepository.getReferenceById(dados.idMedico());
    }
    if (dados.especialidade() == null) {
        throw new ValidacaoException("Especialidade é obrigadoria quando medico não foi escolhido");
    }
    return medicoRepository.EscolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());
}

} @Getter @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode(of= "id") @Entity @Table(name ="consultas") public class Consulta { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name ="medico_id")
private Medico medico;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name ="paciente_id")
private Paciente paciente;

private LocalDateTime data;

}

3 respostas

Oi!

O código está certinho.

Confre então se você está no banco de dados correto, verificando o database da aplicação no arquivo application.properties.

Ola ,

acredito que sim pois consigo adicionar dados na outras tabelas q quando eu forço dados na tabela de consultas eu consigo sigo mas o estranho é que quando faço isso eu espero que o ID começa no numero um mas não começa em 10 ou 6. parece que ele esta mandando duas requisições de uma vez , e tenho feito teste e de query dado a resposta que quero. vou enviar um exemplo de teste e application.properties

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("test")
class ConsultaRepositoryTest {
   
   @Autowired
   
   private ConsultaRepository consultaRepository;

 @Autowired
private TestEntityManager em;

@Test
void existsByPacienteIdAndDataBetween() {
    var proximaSegundaAs10 = LocalDate.now()
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .atTime(10, 0);

    var medico = cadastrarMedico("Medico", "medico@voll.med", "123456", Especialidade.CARDIOLOGIA);
    var paciente = cadastrarPaciente("Paciente", "paciente@email.com", "00000000000");
    cadastrarConsulta(medico, paciente, proximaSegundaAs10);

        Long pacienteId = paciente.getId();
        LocalDateTime primeiroHorario = LocalDateTime.of(2024, 10, 26, 7, 0);
        LocalDateTime ultimaHora = LocalDateTime.of(2024, 10, 26, 18, 59, 59);

        boolean existe = consultaRepository.existsByPacienteIdAndDataBetween(pacienteId, primeiroHorario, ultimaHora);
        assertFalse(existe); // Espera-se que não exista consulta, então deve retornar false
        System.out.println(existe);
    }


//metodos para cadastrar no banco de dados..

private void cadastrarConsulta(Medico medico, Paciente paciente, LocalDateTime data) {
    em.persist(new Consulta(null, medico, paciente, data, null));
}

private Medico cadastrarMedico(String nome, String email, String crm, Especialidade especialidade) {
    var medico = new Medico(dadosMedico(nome, email, crm, especialidade));
    em.persist(medico);
    return medico;
}

private Paciente cadastrarPaciente(String nome, String email, String cpf) {
    var paciente = new Paciente(dadosPaciente(nome, email, cpf));
    em.persist(paciente);
    return paciente;
}

private DadosCadastroMedico dadosMedico(String nome, String email, String crm, Especialidade especialidade) {
    return new DadosCadastroMedico(
            nome,
            email,
            "61999999999",
            crm,
            especialidade,
            dadosEndereco()
    );
}

private DadosCadastroPaciente dadosPaciente(String nome, String email, String cpf) {
    return new DadosCadastroPaciente(
            nome,
            email,
            "61999999999",
            cpf,
            dadosEndereco()
    );
}

private DadosEndereco dadosEndereco() {
    return new DadosEndereco(
            "rua xpto",
            "bairro",
            "00000000",
            "Brasilia",
            "DF",
            null,
            null
    );
}
}

spring.application.name=api server.port:8090 spring.datasource.url=jdbc:mysql://localhost/vollmed_api spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true

#para tratar o erro e o trace não aparecer no erro. para os codiogos 500 server.error.include-stacktrace=never

api.security.token.secret=${TOKEN_JWT:12345678}

e fiz o teste do ValidadorMedicoComOutraConsultaNoMesmoHorario(existsByMedicoIdAndDataAndMotivoCancelamentoIsNull) e estou a receber true quando o experado é false.

    @Test
    void   existsByMedicoIdAndDataAndMotivoCancelamentoIsNull(){
        var proximaSegundaAs10 = LocalDate.now()
                .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
                .atTime(10, 0);

        var medico = cadastrarMedico("Medico", "medico@voll.med", "123456", Especialidade.CARDIOLOGIA);
        var paciente = cadastrarPaciente("Paciente", "paciente@email.com", "00000000000");
        cadastrarConsulta(medico, paciente, proximaSegundaAs10);

        long medico_id = medico.getId();

        Long pacienteId = paciente.getId();
        LocalDateTime primeiroHorario = LocalDateTime.of(2024, 10, 26, 7, 0);
        LocalDateTime ultimaHora = LocalDateTime.of(2024, 10, 26, 18, 59, 59);



        boolean existe = consultaRepository.existsByMedicoIdAndDataAndMotivoCancelamentoIsNull(medico_id,  proximaSegundaAs10);
        assertFalse(existe); // Espera-se que não exista consulta, então deve retornar false
        System.out.println(existe);

    }
    

resposta:

org.opentest4j.AssertionFailedError: Expected :false Actual :true