MedicoControllerTest
package med.voll.api.controller;
import med.voll.api.domain.consulta.DatosDetalleConsulta;
import med.voll.api.domain.consulta.DatosReservaConsulta;
import med.voll.api.domain.consulta.ReservaDeConsultas;
import med.voll.api.domain.direccion.DatosDireccion;
import med.voll.api.domain.direccion.Direccion;
import med.voll.api.domain.medico.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
class MedicoControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private ReservaDeConsultas reservaDeConsultas;
@Autowired
private JacksonTester<DatosReservaConsulta> datosReservaConsultaJson;
@Autowired
private JacksonTester<DatosDetalleConsulta> datosDetalleConsultaJson;
@Test
@DisplayName("Debería devolver código http 400 cuando las informaciones son inválidas")
@WithMockUser
void registrar_escenario1() throws Exception {
var response = mvc
.perform(post("/medicos"))
.andReturn().getResponse();
assertThat(response.getStatus())
.isEqualTo(HttpStatus.BAD_REQUEST.value());
}
@Test
@DisplayName("Deberia devolver http 200 cuando la request reciba un json valido")
@WithMockUser
void reservar_escenario2() throws Exception {
var fecha = LocalDateTime.now().plusHours(1);
var especialidad = Especialidad.CARDIOLOGIA;
var datosDetalle = new DatosDetalleConsulta(null, 2L, 5L, fecha);
when(reservaDeConsultas.reservar(any())).thenReturn(datosDetalle);
var response = mvc.perform(post("/consultas")
.contentType(MediaType.APPLICATION_JSON)
.content(datosReservaConsultaJson.write(
new DatosReservaConsulta(2L, 5L, fecha, especialidad)
).getJson()
)
)
.andReturn().getResponse();
var jsonEsperado = datosDetalleConsultaJson.write(
datosDetalle
).getJson();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
// Usamos JSONAssert para permitir comparación leniente
JSONAssert.assertEquals(jsonEsperado, response.getContentAsString(), JSONCompareMode.LENIENT);
}
private DatosDireccion datosDireccion() {
return new DatosDireccion(
"calle ejemplo",
"distrito",
"Buenos Aires",
"123",
"complemento"
);
}
}